Search in sources :

Example 1 with Theme

use of org.keycloak.theme.Theme in project keycloak by keycloak.

the class QuarkusWelcomeResource method createWelcomePage.

private Response createWelcomePage(String successMessage, String errorMessage) {
    try {
        Theme theme = getTheme();
        Map<String, Object> map = new HashMap<>();
        map.put("productName", Version.NAME);
        map.put("productNameFull", Version.NAME_FULL);
        map.put("properties", theme.getProperties());
        map.put("adminUrl", session.getContext().getUri(UrlType.ADMIN).getBaseUriBuilder().path("/admin/").build());
        map.put("resourcesPath", "resources/" + Version.RESOURCES_VERSION + "/" + theme.getType().toString().toLowerCase() + "/" + theme.getName());
        map.put("resourcesCommonPath", "resources/" + Version.RESOURCES_VERSION + "/common/keycloak");
        boolean bootstrap = shouldBootstrap();
        map.put("bootstrap", bootstrap);
        if (bootstrap) {
            boolean isLocal = isLocal();
            map.put("localUser", isLocal);
            String localAdminUrl = getLocalAdminUrl();
            map.put("localAdminUrl", localAdminUrl);
            map.put("adminUserCreationMessage", "or set the environment variables KEYCLOAK_ADMIN and KEYCLOAK_ADMIN_PASSWORD before starting the server");
            if (isLocal) {
                String stateChecker = setCsrfCookie();
                map.put("stateChecker", stateChecker);
            }
        }
        if (successMessage != null) {
            map.put("successMessage", successMessage);
        }
        if (errorMessage != null) {
            map.put("errorMessage", errorMessage);
        }
        FreeMarkerUtil freeMarkerUtil = new FreeMarkerUtil();
        String result = freeMarkerUtil.processTemplate(map, "index.ftl", theme);
        ResponseBuilder rb = Response.status(errorMessage == null ? Status.OK : Status.BAD_REQUEST).entity(result).cacheControl(CacheControlUtil.noCache());
        return rb.build();
    } catch (Exception e) {
        throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
    }
}
Also used : FreeMarkerUtil(org.keycloak.theme.FreeMarkerUtil) WebApplicationException(javax.ws.rs.WebApplicationException) HashMap(java.util.HashMap) Theme(org.keycloak.theme.Theme) ResponseBuilder(javax.ws.rs.core.Response.ResponseBuilder) URISyntaxException(java.net.URISyntaxException) IOException(java.io.IOException) UnknownHostException(java.net.UnknownHostException) ForbiddenException(org.keycloak.services.ForbiddenException) WebApplicationException(javax.ws.rs.WebApplicationException)

Example 2 with Theme

use of org.keycloak.theme.Theme in project keycloak by keycloak.

the class FreeMarkerAccountProvider method createResponse.

@Override
public Response createResponse(AccountPages page) {
    Map<String, Object> attributes = new HashMap<>();
    if (this.attributes != null) {
        attributes.putAll(this.attributes);
    }
    Theme theme;
    try {
        theme = getTheme();
    } catch (IOException e) {
        logger.error("Failed to create theme", e);
        return Response.serverError().build();
    }
    Locale locale = session.getContext().resolveLocale(user);
    Properties messagesBundle = handleThemeResources(theme, locale, attributes);
    URI baseUri = uriInfo.getBaseUri();
    UriBuilder baseUriBuilder = uriInfo.getBaseUriBuilder();
    for (Map.Entry<String, List<String>> e : uriInfo.getQueryParameters().entrySet()) {
        baseUriBuilder.queryParam(e.getKey(), e.getValue().toArray());
    }
    URI baseQueryUri = baseUriBuilder.build();
    if (stateChecker != null) {
        attributes.put("stateChecker", stateChecker);
    }
    handleMessages(locale, messagesBundle, attributes);
    if (referrer != null) {
        attributes.put("referrer", new ReferrerBean(referrer));
    }
    if (realm != null) {
        attributes.put("realm", new RealmBean(realm));
    }
    attributes.put("url", new UrlBean(realm, theme, baseUri, baseQueryUri, uriInfo.getRequestUri(), stateChecker));
    if (realm.isInternationalizationEnabled()) {
        UriBuilder b = UriBuilder.fromUri(baseQueryUri).path(uriInfo.getPath());
        attributes.put("locale", new LocaleBean(realm, locale, b, messagesBundle));
    }
    attributes.put("features", new FeaturesBean(identityProviderEnabled, eventsEnabled, passwordUpdateSupported, authorizationSupported));
    attributes.put("account", new AccountBean(user, profileFormData));
    switch(page) {
        case TOTP:
            attributes.put("totp", new TotpBean(session, realm, user, uriInfo.getRequestUriBuilder()));
            break;
        case FEDERATED_IDENTITY:
            attributes.put("federatedIdentity", new AccountFederatedIdentityBean(session, realm, user, uriInfo.getBaseUri(), stateChecker));
            break;
        case LOG:
            attributes.put("log", new LogBean(events));
            break;
        case SESSIONS:
            attributes.put("sessions", new SessionsBean(realm, sessions));
            break;
        case APPLICATIONS:
            attributes.put("applications", new ApplicationsBean(session, realm, user));
            attributes.put("advancedMsg", new AdvancedMessageFormatterMethod(locale, messagesBundle));
            break;
        case PASSWORD:
            attributes.put("password", new PasswordBean(passwordSet));
            break;
        case RESOURCES:
            if (!realm.isUserManagedAccessAllowed()) {
                return Response.status(Status.FORBIDDEN).build();
            }
            attributes.put("authorization", new AuthorizationBean(session, user, uriInfo));
        case RESOURCE_DETAIL:
            if (!realm.isUserManagedAccessAllowed()) {
                return Response.status(Status.FORBIDDEN).build();
            }
            attributes.put("authorization", new AuthorizationBean(session, user, uriInfo));
    }
    return processTemplate(theme, page, attributes, locale);
}
Also used : Locale(java.util.Locale) ApplicationsBean(org.keycloak.forms.account.freemarker.model.ApplicationsBean) AccountFederatedIdentityBean(org.keycloak.forms.account.freemarker.model.AccountFederatedIdentityBean) PasswordBean(org.keycloak.forms.account.freemarker.model.PasswordBean) HashMap(java.util.HashMap) Properties(java.util.Properties) FeaturesBean(org.keycloak.forms.account.freemarker.model.FeaturesBean) URI(java.net.URI) LocaleBean(org.keycloak.theme.beans.LocaleBean) UrlBean(org.keycloak.forms.account.freemarker.model.UrlBean) TotpBean(org.keycloak.forms.account.freemarker.model.TotpBean) RealmBean(org.keycloak.forms.account.freemarker.model.RealmBean) ArrayList(java.util.ArrayList) List(java.util.List) UriBuilder(javax.ws.rs.core.UriBuilder) AccountBean(org.keycloak.forms.account.freemarker.model.AccountBean) AdvancedMessageFormatterMethod(org.keycloak.theme.beans.AdvancedMessageFormatterMethod) SessionsBean(org.keycloak.forms.account.freemarker.model.SessionsBean) IOException(java.io.IOException) AuthorizationBean(org.keycloak.forms.account.freemarker.model.AuthorizationBean) Theme(org.keycloak.theme.Theme) LogBean(org.keycloak.forms.account.freemarker.model.LogBean) HashMap(java.util.HashMap) Map(java.util.Map) MultivaluedMap(javax.ws.rs.core.MultivaluedMap) ReferrerBean(org.keycloak.forms.account.freemarker.model.ReferrerBean)

Example 3 with Theme

use of org.keycloak.theme.Theme in project keycloak by keycloak.

the class WelcomeResource method createWelcomePage.

private Response createWelcomePage(String successMessage, String errorMessage) {
    try {
        Theme theme = getTheme();
        Map<String, Object> map = new HashMap<>();
        map.put("productName", Version.NAME);
        map.put("productNameFull", Version.NAME_FULL);
        map.put("properties", theme.getProperties());
        map.put("adminUrl", session.getContext().getUri(UrlType.ADMIN).getBaseUriBuilder().path("/admin/").build());
        map.put("resourcesPath", "resources/" + Version.RESOURCES_VERSION + "/" + theme.getType().toString().toLowerCase() + "/" + theme.getName());
        map.put("resourcesCommonPath", "resources/" + Version.RESOURCES_VERSION + "/common/keycloak");
        boolean bootstrap = shouldBootstrap();
        map.put("bootstrap", bootstrap);
        if (bootstrap) {
            boolean isLocal = isLocal();
            map.put("localUser", isLocal);
            map.put("localAdminUrl", "http://localhost:8080/auth");
            map.put("adminUserCreationMessage", "or use the add-user-keycloak script");
            if (isLocal) {
                String stateChecker = setCsrfCookie();
                map.put("stateChecker", stateChecker);
            }
        }
        if (successMessage != null) {
            map.put("successMessage", successMessage);
        }
        if (errorMessage != null) {
            map.put("errorMessage", errorMessage);
        }
        FreeMarkerUtil freeMarkerUtil = new FreeMarkerUtil();
        String result = freeMarkerUtil.processTemplate(map, "index.ftl", theme);
        ResponseBuilder rb = Response.status(errorMessage == null ? Status.OK : Status.BAD_REQUEST).entity(result).cacheControl(CacheControlUtil.noCache());
        return rb.build();
    } catch (Exception e) {
        throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
    }
}
Also used : FreeMarkerUtil(org.keycloak.theme.FreeMarkerUtil) WebApplicationException(javax.ws.rs.WebApplicationException) HashMap(java.util.HashMap) Theme(org.keycloak.theme.Theme) ResponseBuilder(javax.ws.rs.core.Response.ResponseBuilder) URISyntaxException(java.net.URISyntaxException) IOException(java.io.IOException) UnknownHostException(java.net.UnknownHostException) ForbiddenException(org.keycloak.services.ForbiddenException) WebApplicationException(javax.ws.rs.WebApplicationException)

Example 4 with Theme

use of org.keycloak.theme.Theme in project keycloak by keycloak.

the class FreeMarkerEmailTemplateProvider method processTemplate.

protected EmailTemplate processTemplate(String subjectKey, List<Object> subjectAttributes, String template, Map<String, Object> attributes) throws EmailException {
    try {
        Theme theme = getTheme();
        Locale locale = session.getContext().resolveLocale(user);
        attributes.put("locale", locale);
        Properties rb = new Properties();
        rb.putAll(theme.getMessages(locale));
        rb.putAll(realm.getRealmLocalizationTextsByLocale(locale.toLanguageTag()));
        attributes.put("msg", new MessageFormatterMethod(locale, rb));
        attributes.put("properties", theme.getProperties());
        String subject = new MessageFormat(rb.getProperty(subjectKey, subjectKey), locale).format(subjectAttributes.toArray());
        String textTemplate = String.format("text/%s", template);
        String textBody;
        try {
            textBody = freeMarker.processTemplate(attributes, textTemplate, theme);
        } catch (final FreeMarkerException e) {
            throw new EmailException("Failed to template plain text email.", e);
        }
        String htmlTemplate = String.format("html/%s", template);
        String htmlBody;
        try {
            htmlBody = freeMarker.processTemplate(attributes, htmlTemplate, theme);
        } catch (final FreeMarkerException e) {
            throw new EmailException("Failed to template html email.", e);
        }
        return new EmailTemplate(subject, textBody, htmlBody);
    } catch (Exception e) {
        throw new EmailException("Failed to template email", e);
    }
}
Also used : Locale(java.util.Locale) MessageFormat(java.text.MessageFormat) EmailException(org.keycloak.email.EmailException) Theme(org.keycloak.theme.Theme) FreeMarkerException(org.keycloak.theme.FreeMarkerException) Properties(java.util.Properties) MessageFormatterMethod(org.keycloak.theme.beans.MessageFormatterMethod) EmailException(org.keycloak.email.EmailException) IOException(java.io.IOException) FreeMarkerException(org.keycloak.theme.FreeMarkerException)

Example 5 with Theme

use of org.keycloak.theme.Theme in project keycloak by keycloak.

the class AdminConsole method getMainPage.

/**
 * Main page of this realm's admin console
 *
 * @return
 * @throws URISyntaxException
 */
@GET
@NoCache
public Response getMainPage() throws IOException, FreeMarkerException {
    if (!session.getContext().getUri(UrlType.ADMIN).getRequestUri().getPath().endsWith("/")) {
        return Response.status(302).location(session.getContext().getUri(UrlType.ADMIN).getRequestUriBuilder().path("/").build()).build();
    } else {
        Theme theme = AdminRoot.getTheme(session, realm);
        Map<String, Object> map = new HashMap<>();
        URI adminBaseUri = session.getContext().getUri(UrlType.ADMIN).getBaseUri();
        String adminBaseUrl = adminBaseUri.toString();
        if (adminBaseUrl.endsWith("/")) {
            adminBaseUrl = adminBaseUrl.substring(0, adminBaseUrl.length() - 1);
        }
        URI authServerBaseUri = session.getContext().getUri(UrlType.FRONTEND).getBaseUri();
        String authServerBaseUrl = authServerBaseUri.toString();
        if (authServerBaseUrl.endsWith("/")) {
            authServerBaseUrl = authServerBaseUrl.substring(0, authServerBaseUrl.length() - 1);
        }
        map.put("authServerUrl", authServerBaseUrl);
        map.put("authUrl", adminBaseUrl);
        map.put("consoleBaseUrl", Urls.adminConsoleRoot(adminBaseUri, realm.getName()).getPath());
        map.put("resourceUrl", Urls.themeRoot(adminBaseUri).getPath() + "/admin/" + theme.getName());
        map.put("resourceCommonUrl", Urls.themeRoot(adminBaseUri).getPath() + "/common/keycloak");
        map.put("masterRealm", Config.getAdminRealm());
        map.put("resourceVersion", Version.RESOURCES_VERSION);
        map.put("loginRealm", realm.getName());
        map.put("properties", theme.getProperties());
        FreeMarkerUtil freeMarkerUtil = new FreeMarkerUtil();
        String result = freeMarkerUtil.processTemplate(map, "index.ftl", theme);
        Response.ResponseBuilder builder = Response.status(Response.Status.OK).type(MediaType.TEXT_HTML_UTF_8).language(Locale.ENGLISH).entity(result);
        // Replace CSP if admin is hosted on different URL
        if (!adminBaseUri.equals(authServerBaseUri)) {
            session.getProvider(SecurityHeadersProvider.class).options().allowFrameSrc(UriUtils.getOrigin(authServerBaseUri));
        }
        return builder.build();
    }
}
Also used : Response(javax.ws.rs.core.Response) HttpResponse(org.jboss.resteasy.spi.HttpResponse) FreeMarkerUtil(org.keycloak.theme.FreeMarkerUtil) HashMap(java.util.HashMap) Theme(org.keycloak.theme.Theme) URI(java.net.URI) GET(javax.ws.rs.GET) NoCache(org.jboss.resteasy.annotations.cache.NoCache)

Aggregations

Theme (org.keycloak.theme.Theme)21 IOException (java.io.IOException)17 Locale (java.util.Locale)9 Properties (java.util.Properties)7 Test (org.junit.Test)7 HashMap (java.util.HashMap)5 AbstractTestRealmKeycloakTest (org.keycloak.testsuite.AbstractTestRealmKeycloakTest)5 FreeMarkerUtil (org.keycloak.theme.FreeMarkerUtil)5 UriBuilder (javax.ws.rs.core.UriBuilder)4 URI (java.net.URI)3 GET (javax.ws.rs.GET)3 Path (javax.ws.rs.Path)3 WebApplicationException (javax.ws.rs.WebApplicationException)3 Response (javax.ws.rs.core.Response)3 RealmModel (org.keycloak.models.RealmModel)3 InputStream (java.io.InputStream)2 URISyntaxException (java.net.URISyntaxException)2 UnknownHostException (java.net.UnknownHostException)2 Map (java.util.Map)2 ResponseBuilder (javax.ws.rs.core.Response.ResponseBuilder)2