Skip to content

Commit

Permalink
KEYCLOAK-1113 - profile update now uses correct form validation also
Browse files Browse the repository at this point in the history
  • Loading branch information
velias committed Mar 30, 2015
1 parent 31a80a9 commit 0109466
Show file tree
Hide file tree
Showing 14 changed files with 200 additions and 174 deletions.
@@ -1,52 +1,55 @@
package org.keycloak.account; package org.keycloak.account;


import org.apache.http.client.methods.HttpHead; import java.util.List;
import org.keycloak.events.Event;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
import org.keycloak.models.UserSessionModel;
import org.keycloak.provider.Provider;


import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo; import javax.ws.rs.core.UriInfo;
import java.util.List;
import org.keycloak.events.Event;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
import org.keycloak.models.UserSessionModel;
import org.keycloak.models.utils.FormMessage;
import org.keycloak.provider.Provider;


/** /**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a> * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/ */
public interface AccountProvider extends Provider { public interface AccountProvider extends Provider {


AccountProvider setUriInfo(UriInfo uriInfo); AccountProvider setUriInfo(UriInfo uriInfo);

AccountProvider setHttpHeaders(HttpHeaders httpHeaders);


AccountProvider setHttpHeaders(HttpHeaders httpHeaders); Response createResponse(AccountPages page);


Response createResponse(AccountPages page); AccountProvider setError(String message, Object... parameters);


AccountProvider setError(String message, Object ... parameters); AccountProvider setErrors(List<FormMessage> messages);


AccountProvider setSuccess(String message, Object ... parameters); AccountProvider setSuccess(String message, Object... parameters);


AccountProvider setWarning(String message, Object ... parameters); AccountProvider setWarning(String message, Object... parameters);


AccountProvider setUser(UserModel user); AccountProvider setUser(UserModel user);


AccountProvider setProfileFormData(MultivaluedMap<String, String> formData); AccountProvider setProfileFormData(MultivaluedMap<String, String> formData);


AccountProvider setStatus(Response.Status status); AccountProvider setStatus(Response.Status status);


AccountProvider setRealm(RealmModel realm); AccountProvider setRealm(RealmModel realm);


AccountProvider setReferrer(String[] referrer); AccountProvider setReferrer(String[] referrer);


AccountProvider setEvents(List<Event> events); AccountProvider setEvents(List<Event> events);


AccountProvider setSessions(List<UserSessionModel> sessions); AccountProvider setSessions(List<UserSessionModel> sessions);


AccountProvider setPasswordSet(boolean passwordSet); AccountProvider setPasswordSet(boolean passwordSet);


AccountProvider setStateChecker(String stateChecker); AccountProvider setStateChecker(String stateChecker);


AccountProvider setFeatures(boolean social, boolean events, boolean passwordUpdateSupported); AccountProvider setFeatures(boolean social, boolean events, boolean passwordUpdateSupported);
} }
@@ -1,25 +1,54 @@
package org.keycloak.account.freemarker; package org.keycloak.account.freemarker;


import java.io.IOException;
import java.net.URI;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;

import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;

import org.jboss.logging.Logger; import org.jboss.logging.Logger;
import org.keycloak.account.AccountPages; import org.keycloak.account.AccountPages;
import org.keycloak.account.AccountProvider; import org.keycloak.account.AccountProvider;
import org.keycloak.account.freemarker.model.*; import org.keycloak.account.freemarker.model.AccountBean;
import org.keycloak.account.freemarker.model.AccountFederatedIdentityBean;
import org.keycloak.account.freemarker.model.FeaturesBean;
import org.keycloak.account.freemarker.model.LogBean;
import org.keycloak.account.freemarker.model.PasswordBean;
import org.keycloak.account.freemarker.model.RealmBean;
import org.keycloak.account.freemarker.model.ReferrerBean;
import org.keycloak.account.freemarker.model.SessionsBean;
import org.keycloak.account.freemarker.model.TotpBean;
import org.keycloak.account.freemarker.model.UrlBean;
import org.keycloak.events.Event; import org.keycloak.events.Event;
import org.keycloak.freemarker.*; import org.keycloak.freemarker.BrowserSecurityHeaderSetup;
import org.keycloak.freemarker.FreeMarkerException;
import org.keycloak.freemarker.FreeMarkerUtil;
import org.keycloak.freemarker.LocaleHelper;
import org.keycloak.freemarker.Theme;
import org.keycloak.freemarker.ThemeProvider;
import org.keycloak.freemarker.beans.LocaleBean;
import org.keycloak.freemarker.beans.MessageBean;
import org.keycloak.freemarker.beans.MessageFormatterMethod; import org.keycloak.freemarker.beans.MessageFormatterMethod;
import org.keycloak.freemarker.beans.MessageType;
import org.keycloak.freemarker.beans.MessagesPerFieldBean;
import org.keycloak.models.KeycloakSession; import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel; import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel; import org.keycloak.models.UserModel;
import org.keycloak.models.UserSessionModel; import org.keycloak.models.UserSessionModel;
import org.keycloak.models.utils.FormMessage;
import org.keycloak.services.resources.flows.Urls; import org.keycloak.services.resources.flows.Urls;


import javax.ws.rs.core.*;
import java.io.IOException;
import java.net.URI;
import java.text.MessageFormat;
import java.util.*;
import org.keycloak.freemarker.beans.LocaleBean;

/** /**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a> * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/ */
Expand All @@ -43,13 +72,10 @@ public class FreeMarkerAccountProvider implements AccountProvider {
private FreeMarkerUtil freeMarker; private FreeMarkerUtil freeMarker;
private HttpHeaders headers; private HttpHeaders headers;


public static enum MessageType {SUCCESS, WARNING, ERROR}

private UriInfo uriInfo; private UriInfo uriInfo;


private String message; private List<FormMessage> messages = null;
private Object[] parameters; private MessageType messageType = MessageType.ERROR;
private MessageType messageType;


public FreeMarkerAccountProvider(KeycloakSession session, FreeMarkerUtil freeMarker) { public FreeMarkerAccountProvider(KeycloakSession session, FreeMarkerUtil freeMarker) {
this.session = session; this.session = session;
Expand Down Expand Up @@ -87,13 +113,13 @@ public Response createResponse(AccountPages page) {
} }


Locale locale = LocaleHelper.getLocale(realm, user, uriInfo, headers); Locale locale = LocaleHelper.getLocale(realm, user, uriInfo, headers);
Properties messages; Properties messagesBundle;
try { try {
messages = theme.getMessages(locale); messagesBundle = theme.getMessages(locale);
attributes.put("msg", new MessageFormatterMethod(locale, messages)); attributes.put("msg", new MessageFormatterMethod(locale, messagesBundle));
} catch (IOException e) { } catch (IOException e) {
logger.warn("Failed to load messages", e); logger.warn("Failed to load messages", e);
messages = new Properties(); messagesBundle = new Properties();
} }


URI baseUri = uriInfo.getBaseUri(); URI baseUri = uriInfo.getBaseUri();
Expand All @@ -107,15 +133,19 @@ public Response createResponse(AccountPages page) {
attributes.put("stateChecker", stateChecker); attributes.put("stateChecker", stateChecker);
} }


if (message != null) { MessagesPerFieldBean messagesPerField = new MessagesPerFieldBean();
String formattedMessage; if (messages != null) {
if(messages.containsKey(message)){ MessageBean wholeMessage = new MessageBean(null, messageType);
formattedMessage = new MessageFormat(messages.getProperty(message),locale).format(parameters); for (FormMessage message : this.messages) {
}else{ String formattedMessageText = formatMessage(message, messagesBundle, locale);
formattedMessage = message; if (formattedMessageText != null) {
wholeMessage.appendSummaryLine(formattedMessageText);
messagesPerField.addMessage(message.getField(), formattedMessageText, messageType);
}
} }
attributes.put("message", new MessageBean(formattedMessage, messageType)); attributes.put("message", wholeMessage);
} }
attributes.put("messagesPerField", messagesPerField);


if (referrer != null) { if (referrer != null) {
attributes.put("referrer", new ReferrerBean(referrer)); attributes.put("referrer", new ReferrerBean(referrer));
Expand All @@ -134,7 +164,7 @@ public Response createResponse(AccountPages page) {
b = UriBuilder.fromUri(baseQueryUri).path(uriInfo.getPath()); b = UriBuilder.fromUri(baseQueryUri).path(uriInfo.getPath());
break; break;
} }
attributes.put("locale", new LocaleBean(realm, locale, b, messages)); attributes.put("locale", new LocaleBean(realm, locale, b, messagesBundle));
} }


attributes.put("features", new FeaturesBean(identityProviderEnabled, eventsEnabled, passwordUpdateSupported)); attributes.put("features", new FeaturesBean(identityProviderEnabled, eventsEnabled, passwordUpdateSupported));
Expand Down Expand Up @@ -173,28 +203,47 @@ public AccountProvider setPasswordSet(boolean passwordSet) {
this.passwordSet = passwordSet; this.passwordSet = passwordSet;
return this; return this;
} }

protected void setMessage(MessageType type, String message, Object... parameters) {
messageType = type;
messages = new ArrayList<>();
messages.add(new FormMessage(null, message, parameters));
}

protected String formatMessage(FormMessage message, Properties messagesBundle, Locale locale) {
if (message == null)
return null;
if (messagesBundle.containsKey(message.getMessage())) {
return new MessageFormat(messagesBundle.getProperty(message.getMessage()), locale)
.format(message.getParameters());
} else {
return message.getMessage();
}
}

@Override
public AccountProvider setErrors(List<FormMessage> messages) {
this.messageType = MessageType.ERROR;
this.messages = new ArrayList<>(messages);
return this;
}



@Override @Override
public AccountProvider setError(String message, Object ... parameters) { public AccountProvider setError(String message, Object ... parameters) {
this.message = message; setMessage(MessageType.ERROR, message, parameters);
this.parameters = parameters;
this.messageType = MessageType.ERROR;
return this; return this;
} }


@Override @Override
public AccountProvider setSuccess(String message, Object ... parameters) { public AccountProvider setSuccess(String message, Object ... parameters) {
this.message = message; setMessage(MessageType.SUCCESS, message, parameters);
this.parameters = parameters;
this.messageType = MessageType.SUCCESS;
return this; return this;
} }


@Override @Override
public AccountProvider setWarning(String message, Object ... parameters) { public AccountProvider setWarning(String message, Object ... parameters) {
this.message = message; setMessage(MessageType.WARNING, message, parameters);
this.parameters = parameters;
this.messageType = MessageType.WARNING;
return this; return this;
} }


Expand Down

This file was deleted.

Expand Up @@ -19,9 +19,7 @@
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org. * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/ */
package org.keycloak.login.freemarker.model; package org.keycloak.freemarker.beans;

import org.keycloak.login.freemarker.FreeMarkerLoginFormsProvider;


/** /**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a> * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
Expand All @@ -30,9 +28,9 @@ public class MessageBean {


private String summary; private String summary;


private FreeMarkerLoginFormsProvider.MessageType type; private MessageType type;


public MessageBean(String message, FreeMarkerLoginFormsProvider.MessageType type) { public MessageBean(String message, MessageType type) {
this.summary = message; this.summary = message;
this.type = type; this.type = type;
} }
Expand All @@ -55,15 +53,15 @@ public String getType() {
} }


public boolean isSuccess() { public boolean isSuccess() {
return FreeMarkerLoginFormsProvider.MessageType.SUCCESS.equals(this.type); return MessageType.SUCCESS.equals(this.type);
} }


public boolean isWarning() { public boolean isWarning() {
return FreeMarkerLoginFormsProvider.MessageType.WARNING.equals(this.type); return MessageType.WARNING.equals(this.type);
} }


public boolean isError() { public boolean isError() {
return FreeMarkerLoginFormsProvider.MessageType.ERROR.equals(this.type); return MessageType.ERROR.equals(this.type);
} }


} }
@@ -0,0 +1,17 @@
/*
* JBoss, Home of Professional Open Source
* Copyright 2015 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @authors tag. All rights reserved.
*/
package org.keycloak.freemarker.beans;

/**
* Enum with types of messages.
*
* @author Vlastimil Elias (velias at redhat dot com)
*/
public enum MessageType {

SUCCESS, WARNING, ERROR

}

0 comments on commit 0109466

Please sign in to comment.