From 2fe77cc186721312413aa76659edc0a0cae4fcbe Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Tue, 3 Dec 2019 20:35:16 +0100 Subject: [PATCH] Ported user banner FTL lib Former-commit-id: 3165ff44428b4a8131d7da512f0eba98d38a45a7 --- .../pagemodel/AbstractPageRenderer.java | 58 ++++++++- .../freemarker/ccm-core/user-banner.ftl | 120 ++++++++++++++++++ 2 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 ccm-core/src/main/resources/themes/freemarker/ccm-core/user-banner.ftl diff --git a/ccm-core/src/main/java/org/libreccm/pagemodel/AbstractPageRenderer.java b/ccm-core/src/main/java/org/libreccm/pagemodel/AbstractPageRenderer.java index 1660e193e..ff1deff8a 100644 --- a/ccm-core/src/main/java/org/libreccm/pagemodel/AbstractPageRenderer.java +++ b/ccm-core/src/main/java/org/libreccm/pagemodel/AbstractPageRenderer.java @@ -18,14 +18,24 @@ */ package org.libreccm.pagemodel; +import com.arsdigita.ui.UI; +import com.arsdigita.ui.login.LoginConstants; +import com.arsdigita.ui.login.LoginServlet; +import com.arsdigita.web.URL; + +import org.apache.shiro.subject.Subject; +import org.libreccm.security.Shiro; +import org.libreccm.security.User; + import java.util.HashMap; import java.util.Map; -import java.util.Objects; import javax.inject.Inject; import java.util.Optional; +import javax.servlet.http.HttpServletRequest; + /** * An abstract base class for implementations of the {@link PageRenderer} * interface providing some functionality needed by all implementations of the @@ -39,6 +49,12 @@ public abstract class AbstractPageRenderer implements PageRenderer { @Inject private ComponentRendererManager componentRendererManager; + @Inject + private HttpServletRequest request; + + @Inject + private Shiro shiro; + /** * Renders a {@code Page} based on a {@link PageModel}. This implementation * first calls {@link #renderPage()} to create the page object. After that @@ -60,6 +76,46 @@ public abstract class AbstractPageRenderer implements PageRenderer { final Map page = renderPage(parameters); + final Map currentUserData = new HashMap<>(); + if (shiro.getUser().isPresent()) { + final User currentUser = shiro.getUser().get(); + final Subject currentSubject = shiro.getSubject(); + currentUserData.put( + "authenticated", currentSubject.isAuthenticated() + ); + currentUserData.put("username", currentUser.getName()); + currentUserData.put( + "email", currentUser.getPrimaryEmailAddress().toString() + ); + currentUserData.put("familyName", currentUser.getFamilyName()); + currentUserData.put("givenName", currentUser.getGivenName()); + + currentUserData.put( + "workspaceUrl", + URL.there(request, UI.getWorkspaceURL()).toString() + ); + currentUserData.put( + "loginUrl", + URL.there(request, LoginConstants.LOGIN_PAGE_URL).toString() + ); + currentUserData.put( + "logoutUrl", + URL.there( + request, + LoginServlet.getLogoutPageURL()).toString() + ); + currentUserData.put( + "changePasswordUrl", + URL.there( + request, + LoginServlet.getLogoutPageURL()).toString() + ); + + } else { + currentUserData.put("authenticated", false); + } + page.put("currentUser", currentUserData); + for (final ContainerModel containerModel : pageModel.getContainers()) { final Map container = renderContainer( diff --git a/ccm-core/src/main/resources/themes/freemarker/ccm-core/user-banner.ftl b/ccm-core/src/main/resources/themes/freemarker/ccm-core/user-banner.ftl new file mode 100644 index 000000000..d0064a6d6 --- /dev/null +++ b/ccm-core/src/main/resources/themes/freemarker/ccm-core/user-banner.ftl @@ -0,0 +1,120 @@ +<#--filedoc + The user banner component provides several informations about the current + user. +--> + +<#--doc + Retreives the value the `greeting` property from the user banner. + + Not supported. + + @depcreated Without replacement. + + @return Empty string. +--> +<#function getGreeting> + <#return ""> + + +<#--doc + Determines if the current user is logged in. + + @depcrecated Use `isAuthenticated` + + @return `true` if the current user is logged in, `false` if not. +--> +<#function isLoggedIn> + <#return isAuthenticated()> + + +<#--doc + Determines if the current user is *not* logged in. + + @depcrecated Use `isNotAuthenticated` + + @return `true` if the current user is *not* logged in, `false` if the user + is logged in. +--> +<#function isNotLoggedIn> + <#return isNotAuthenticated()> + + +<#--doc + Determines if the current user is authenticated. + + @return `true` if the current user is authenticated, `false` if not. +--> +<#function isAuthenticated> + <#return currentUser.authenticated> + + +<#--doc + Determines if the current user is *not* authenticated. + + @return `true` if the current user is *not* authenticated, `false` if the user + is authenticated. +--> +<#function isNotAuthenticated> + <#return !currentUser.authenticated> + + +<#--doc + Retrieves the URL for changing the password. Only available if the current + user is logged in. + + @return The URL for changing the password. +--> +<#function getChangePasswordUrl> + <#return currentUser.changePasswordUrl> + + +<#--doc + Retrieves the link to the login form. Only available if the current user + is not logged in. + + @return The link to the login form. +--> +<#function getLoginLink> + <#return currentUser.loginLink> + + +<#--doc + Retrieves the link for logging out. Only available if the current user + is logged in. + + @return The link for logging out. +--> +<#function getLogoutLink> + <#return currentUser.logoutUrl> + + +<#--doc + Retrieves the screen name (user name) of the current user. Only available + if the current user is logged in. + + @return The screen name of the current user. +--> +<#function getScreenName> + <#return currentUser.username> + + +<#--doc + The given name of the current user. Only available if the current user is + logged in. + + @return The given name of the current user. +--> +<#function getUserGivenName> + <#return currentUser.givenName> + + +<#--doc + The family name of the current user. Only available if the current user is + logged in. + + @return The family name of the current user. +--> +<#function getUserFamilyName> + <#return currentUser.familyName> + +