keycloak-aplcache

Details

diff --git a/forms/common-themes/src/main/resources/theme/account/base/account.ftl b/forms/common-themes/src/main/resources/theme/account/base/account.ftl
index 49ac9d7..f83a62e 100755
--- a/forms/common-themes/src/main/resources/theme/account/base/account.ftl
+++ b/forms/common-themes/src/main/resources/theme/account/base/account.ftl
@@ -57,8 +57,8 @@
             <div id="kc-form-buttons" class="col-md-offset-2 col-md-10 submit">
                 <div class="">
                     <#if url.referrerURI??><a href="${url.referrerURI}">Back to application</a></#if>
-                    <button type="submit" class="btn btn-primary btn-lg">Save</button>
-                    <button type="submit" class="btn btn-default btn-lg">Cancel</button>
+                    <button type="submit" class="btn btn-primary btn-lg" name="submitAction" value="Save">Save</button>
+                    <button type="submit" class="btn btn-default btn-lg" name="submitAction" value="Cancel">Cancel</button>
                 </div>
             </div>
         </div>
diff --git a/forms/common-themes/src/main/resources/theme/account/base/password.ftl b/forms/common-themes/src/main/resources/theme/account/base/password.ftl
index 95ab5f7..e5d5531 100755
--- a/forms/common-themes/src/main/resources/theme/account/base/password.ftl
+++ b/forms/common-themes/src/main/resources/theme/account/base/password.ftl
@@ -44,8 +44,8 @@
         <div class="form-group">
             <div id="kc-form-buttons" class="col-md-offset-2 col-md-10 submit">
                 <div class="">
-                    <button type="submit" class="btn btn-primary btn-lg">Save</button>
-                    <button type="submit" class="btn btn-default btn-lg">Cancel</button>
+                    <button type="submit" class="btn btn-primary btn-lg" name="submitAction" value="Save">Save</button>
+                    <button type="submit" class="btn btn-default btn-lg" name="submitAction" value="Cancel">Cancel</button>
                 </div>
             </div>
         </div>
diff --git a/forms/common-themes/src/main/resources/theme/account/base/totp.ftl b/forms/common-themes/src/main/resources/theme/account/base/totp.ftl
index e5886ad..171a0b6 100755
--- a/forms/common-themes/src/main/resources/theme/account/base/totp.ftl
+++ b/forms/common-themes/src/main/resources/theme/account/base/totp.ftl
@@ -50,8 +50,8 @@
             <div class="form-group">
                 <div id="kc-form-buttons" class="col-md-offset-2 col-md-10 submit">
                     <div class="">
-                        <button type="submit" class="btn btn-primary btn-lg">Save</button>
-                        <button type="submit" class="btn btn-default btn-lg">Cancel</button>
+                        <button type="submit" class="btn btn-primary btn-lg" name="submitAction" value="Save">Save</button>
+                        <button type="submit" class="btn btn-default btn-lg" name="submitAction" value="Cancel">Cancel</button>
                     </div>
                 </div>
             </div>
diff --git a/services/src/main/java/org/keycloak/services/resources/AccountService.java b/services/src/main/java/org/keycloak/services/resources/AccountService.java
index dca8ad1..3c4a1fa 100755
--- a/services/src/main/java/org/keycloak/services/resources/AccountService.java
+++ b/services/src/main/java/org/keycloak/services/resources/AccountService.java
@@ -192,10 +192,7 @@ public class AccountService {
                 return Flows.forms(session, realm, null, uriInfo).setError("No access").createErrorPage();
             }
 
-            String[] referrer = getReferrer();
-            if (referrer != null) {
-                account.setReferrer(referrer);
-            }
+            setReferrerOnPage();
 
             return account.createResponse(page);
         } else {
@@ -203,6 +200,13 @@ public class AccountService {
         }
     }
 
+    protected void setReferrerOnPage() {
+        String[] referrer = getReferrer();
+        if (referrer != null) {
+            account.setReferrer(referrer);
+        }
+    }
+
     /**
      * CORS preflight
      *
@@ -324,10 +328,17 @@ public class AccountService {
 
         require(AccountRoles.MANAGE_ACCOUNT);
 
+        String action = formData.getFirst("submitAction");
+        if (action != null && action.equals("Cancel")) {
+            setReferrerOnPage();
+            return account.createResponse(AccountPages.ACCOUNT);
+        }
+
         UserModel user = auth.getUser();
 
         String error = Validation.validateUpdateProfileForm(formData);
         if (error != null) {
+            setReferrerOnPage();
             return account.setError(error).createResponse(AccountPages.ACCOUNT);
         }
 
@@ -346,7 +357,7 @@ public class AccountService {
             user.setEmailVerified(false);
             audit.clone().event(EventType.UPDATE_EMAIL).detail(Details.PREVIOUS_EMAIL, oldEmail).detail(Details.UPDATED_EMAIL, email).success();
         }
-
+        setReferrerOnPage();
         return account.setSuccess("accountUpdated").createResponse(AccountPages.ACCOUNT);
     }
 
@@ -364,6 +375,7 @@ public class AccountService {
 
         audit.event(EventType.REMOVE_TOTP).client(auth.getClient()).user(auth.getUser()).success();
 
+        setReferrerOnPage();
         return account.setSuccess("successTotpRemoved").createResponse(AccountPages.TOTP);
     }
 
@@ -380,7 +392,14 @@ public class AccountService {
         UserModel user = auth.getUser();
         session.sessions().removeUserSessions(realm, user);
 
-        return Response.seeOther(Urls.accountSessionsPage(uriInfo.getBaseUri(), realm.getName())).build();
+        UriBuilder builder = Urls.accountBase(uriInfo.getBaseUri()).path(AccountService.class, "sessionsPage");
+        String referrer = uriInfo.getQueryParameters().getFirst("referrer");
+        if (referrer != null) {
+            builder.queryParam("referrer", referrer);
+
+        }
+        URI location = builder.build(realm.getName());
+        return Response.seeOther(location).build();
     }
 
     /**
@@ -404,14 +423,22 @@ public class AccountService {
 
         require(AccountRoles.MANAGE_ACCOUNT);
 
+        String action = formData.getFirst("submitAction");
+        if (action != null && action.equals("Cancel")) {
+            setReferrerOnPage();
+            return account.createResponse(AccountPages.TOTP);
+        }
+
         UserModel user = auth.getUser();
 
         String totp = formData.getFirst("totp");
         String totpSecret = formData.getFirst("totpSecret");
 
         if (Validation.isEmpty(totp)) {
+            setReferrerOnPage();
             return account.setError(Messages.MISSING_TOTP).createResponse(AccountPages.TOTP);
         } else if (!new TimeBasedOTP().validate(totp, totpSecret.getBytes())) {
+            setReferrerOnPage();
             return account.setError(Messages.INVALID_TOTP).createResponse(AccountPages.TOTP);
         }
 
@@ -424,6 +451,7 @@ public class AccountService {
 
         audit.event(EventType.UPDATE_TOTP).client(auth.getClient()).user(auth.getUser()).success();
 
+        setReferrerOnPage();
         return account.setSuccess("successTotp").createResponse(AccountPages.TOTP);
     }
 
@@ -449,6 +477,12 @@ public class AccountService {
 
         require(AccountRoles.MANAGE_ACCOUNT);
 
+        String action = formData.getFirst("submitAction");
+        if (action != null && action.equals("Cancel")) {
+            setReferrerOnPage();
+            return account.createResponse(AccountPages.PASSWORD);
+        }
+
         UserModel user = auth.getUser();
 
         String password = formData.getFirst("password");
@@ -456,16 +490,20 @@ public class AccountService {
         String passwordConfirm = formData.getFirst("password-confirm");
 
         if (Validation.isEmpty(passwordNew)) {
+            setReferrerOnPage();
             return account.setError(Messages.MISSING_PASSWORD).createResponse(AccountPages.PASSWORD);
         } else if (!passwordNew.equals(passwordConfirm)) {
+            setReferrerOnPage();
             return account.setError(Messages.INVALID_PASSWORD_CONFIRM).createResponse(AccountPages.PASSWORD);
         }
 
         UserCredentialModel cred = UserCredentialModel.password(password);
         if (Validation.isEmpty(password)) {
+            setReferrerOnPage();
             return account.setError(Messages.MISSING_PASSWORD).createResponse(AccountPages.PASSWORD);
         } else {
             if (!session.users().validCredentials(realm, user, cred)) {
+                setReferrerOnPage();
                 return account.setError(Messages.INVALID_PASSWORD_EXISTING).createResponse(AccountPages.PASSWORD);
             }
         }
@@ -474,11 +512,13 @@ public class AccountService {
             session.users().updateCredential(realm, user, UserCredentialModel.password(passwordNew));
          } catch (Exception ape) {
             logger.error("Failed to update password", ape);
+            setReferrerOnPage();
             return account.setError(ape.getMessage()).createResponse(AccountPages.PASSWORD);
         }
 
         audit.event(EventType.UPDATE_PASSWORD).client(auth.getClient()).user(auth.getUser()).success();
 
+        setReferrerOnPage();
         return account.setSuccess("accountPasswordUpdated").createResponse(AccountPages.PASSWORD);
     }
 
@@ -494,19 +534,23 @@ public class AccountService {
         UserModel user = auth.getUser();
 
         if (Validation.isEmpty(providerId)) {
+            setReferrerOnPage();
             return account.setError(Messages.MISSING_SOCIAL_PROVIDER).createResponse(AccountPages.SOCIAL);
         }
         AccountSocialAction accountSocialAction = AccountSocialAction.getAction(action);
         if (accountSocialAction == null) {
+            setReferrerOnPage();
             return account.setError(Messages.INVALID_SOCIAL_ACTION).createResponse(AccountPages.SOCIAL);
         }
 
         SocialProvider provider = SocialLoader.load(providerId);
         if (provider == null) {
+            setReferrerOnPage();
             return account.setError(Messages.SOCIAL_PROVIDER_NOT_FOUND).createResponse(AccountPages.SOCIAL);
         }
 
         if (!user.isEnabled()) {
+            setReferrerOnPage();
             return account.setError(Messages.ACCOUNT_DISABLED).createResponse(AccountPages.SOCIAL);
         }
 
@@ -522,6 +566,7 @@ public class AccountService {
                             .putClientAttribute(OAuth2Constants.REDIRECT_URI, redirectUri)
                             .redirectToSocialProvider();
                 } catch (SocialProviderException spe) {
+                    setReferrerOnPage();
                     return account.setError(Messages.SOCIAL_REDIRECT_ERROR).createResponse(AccountPages.SOCIAL);
                 }
             case REMOVE:
@@ -538,11 +583,14 @@ public class AccountService {
                                 .detail(Details.USERNAME, link.getSocialUserId() + "@" + link.getSocialProvider())
                                 .success();
 
+                        setReferrerOnPage();
                         return account.setSuccess(Messages.SOCIAL_PROVIDER_REMOVED).createResponse(AccountPages.SOCIAL);
                     } else {
+                        setReferrerOnPage();
                         return account.setError(Messages.SOCIAL_REMOVING_LAST_PROVIDER).createResponse(AccountPages.SOCIAL);
                     }
                 } else {
+                    setReferrerOnPage();
                     return account.setError(Messages.SOCIAL_LINK_NOT_ACTIVE).createResponse(AccountPages.SOCIAL);
                 }
             default: