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;

import org.apache.http.client.methods.HttpHead;
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 java.util.List;

import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
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>
*/
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;

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.keycloak.account.AccountPages;
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.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.MessageType;
import org.keycloak.freemarker.beans.MessagesPerFieldBean;
import org.keycloak.models.KeycloakSession;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
import org.keycloak.models.UserSessionModel;
import org.keycloak.models.utils.FormMessage;
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>
*/
Expand All @@ -43,13 +72,10 @@ public class FreeMarkerAccountProvider implements AccountProvider {
private FreeMarkerUtil freeMarker;
private HttpHeaders headers;

public static enum MessageType {SUCCESS, WARNING, ERROR}

private UriInfo uriInfo;

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

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

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

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

if (message != null) {
String formattedMessage;
if(messages.containsKey(message)){
formattedMessage = new MessageFormat(messages.getProperty(message),locale).format(parameters);
}else{
formattedMessage = message;
MessagesPerFieldBean messagesPerField = new MessagesPerFieldBean();
if (messages != null) {
MessageBean wholeMessage = new MessageBean(null, messageType);
for (FormMessage message : this.messages) {
String formattedMessageText = formatMessage(message, messagesBundle, locale);
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) {
attributes.put("referrer", new ReferrerBean(referrer));
Expand All @@ -134,7 +164,7 @@ public Response createResponse(AccountPages page) {
b = UriBuilder.fromUri(baseQueryUri).path(uriInfo.getPath());
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));
Expand Down Expand Up @@ -173,28 +203,47 @@ public AccountProvider setPasswordSet(boolean passwordSet) {
this.passwordSet = passwordSet;
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
public AccountProvider setError(String message, Object ... parameters) {
this.message = message;
this.parameters = parameters;
this.messageType = MessageType.ERROR;
setMessage(MessageType.ERROR, message, parameters);
return this;
}

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

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

Expand Down

This file was deleted.

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

import org.keycloak.login.freemarker.FreeMarkerLoginFormsProvider;
package org.keycloak.freemarker.beans;

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

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.type = type;
}
Expand All @@ -55,15 +53,15 @@ public String getType() {
}

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

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

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.