maded applications editable, made UUID visible

This commit is contained in:
2019-08-14 10:33:35 +02:00
parent 119fb04520
commit 54f2e56a4c
6 changed files with 236 additions and 186 deletions

View File

@ -4,14 +4,14 @@ ldap.url = ldaps://host:port
## we will use provided username / password from webapplication ## we will use provided username / password from webapplication
ldap.user = user ldap.user = user
ldap.password = secret ldap.password = secret
ldap.suffix = @diebold.com ldap.principalSuffix = @primarySuffix
ldap.fallbackSuffix = @dieboldnixdorf.com ldap.fallbackPrincipalSuffixes = @fallback1, @fallback2
ldap.searchBase = dc=ad,dc=diebold,dc=com ldap.searchBase = dc=domain,dc=com
ldap.searchFilter = (&(objectClass=*)(mail={0})) ldap.searchFilter = (&(objectClass=*)(mail={0}))
## NO CHANGES BEHIND THIS LINE REQUIRED ## NO CHANGES BEHIND THIS LINE REQUIRED
shiro.contextFactory = contextFactory = org.apache.shiro.realm.ldap.JndiLdapContextFactory${line.separator}contextFactory.url = ${ldap.url}${line.separator}contextFactory.systemUsername = ${ldap.user}${line.separator}contextFactory.systemPassword = ${ldap.password}${line.separator}contextFactory.environment[java.naming.security.protocol] = ssl shiro.contextFactory = contextFactory = org.apache.shiro.realm.ldap.JndiLdapContextFactory${line.separator}contextFactory.url = ${ldap.url}${line.separator}contextFactory.systemUsername = ${ldap.user}${line.separator}contextFactory.systemPassword = ${ldap.password}${line.separator}contextFactory.environment[java.naming.security.protocol] = ssl
shiro.passwordMatcher= passwordMatcher=org.apache.shiro.authc.credential.AllowAllCredentialsMatcher shiro.passwordMatcher= passwordMatcher=org.apache.shiro.authc.credential.AllowAllCredentialsMatcher
shiro.ldapRealm = ldapRealm = de.muehlencord.shared.account.shiro.realm.UserNameActiveDirectoryRealm${line.separator}ldapRealm.principalSuffix = ${ldap.suffix}${line.separator}ldapRealm.fallbackPrincipalSuffix = ${ldap.fallbackSuffix}${line.separator}ldapRealm.ldapContextFactory = $contextFactory${line.separator}ldapRealm.searchBase = ${ldap.searchBase}${line.separator}ldapRealm.searchFilter = ${ldap.searchFilter}${line.separator}ldapRealm.permissionsLookupEnabled=false shiro.ldapRealm = ldapRealm = de.muehlencord.shared.account.shiro.realm.UserNameActiveDirectoryRealm${line.separator}ldapRealm.principalSuffix = ${ldap.principalSuffix}${line.separator}ldapRealm.fallbackPrincipalSuffixes = ${ldap.fallbackPrincipalSuffixes}${line.separator}ldapRealm.ldapContextFactory = $contextFactory${line.separator}ldapRealm.searchBase = ${ldap.searchBase}${line.separator}ldapRealm.searchFilter = ${ldap.searchFilter}${line.separator}ldapRealm.permissionsLookupEnabled=false
shiro.authcStrategy = org.apache.shiro.authc.pam.AllSuccessfulStrategy shiro.authcStrategy = org.apache.shiro.authc.pam.AllSuccessfulStrategy
shiro.realms=$jdbcRealm,$ldapRealm shiro.realms=$jdbcRealm,$ldapRealm

View File

@ -1,151 +1,155 @@
package de.muehlencord.shared.account.web.presentation; package de.muehlencord.shared.account.web.presentation;
import de.muehlencord.shared.account.business.application.control.ApplicationControl; import de.muehlencord.shared.account.business.application.control.ApplicationControl;
import de.muehlencord.shared.account.business.application.entity.ApplicationEntity; import de.muehlencord.shared.account.business.application.entity.ApplicationEntity;
import de.muehlencord.shared.account.util.AccountSecurityException; import de.muehlencord.shared.account.util.AccountSecurityException;
import de.muehlencord.shared.jeeutil.FacesUtil; import de.muehlencord.shared.jeeutil.FacesUtil;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy; import javax.annotation.PreDestroy;
import javax.enterprise.context.SessionScoped; import javax.enterprise.context.SessionScoped;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
/** /**
* *
* @author Joern Muehlencord <joern at muehlencord.de> * @author Joern Muehlencord <joern at muehlencord.de>
*/ */
@SessionScoped @SessionScoped
@Named("applicationView") @Named("applicationView")
public class ApplicationView implements Serializable { public class ApplicationView implements Serializable {
private static final long serialVersionUID = -5515249316880163539L; private static final long serialVersionUID = -5515249316880163539L;
private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationView.class); private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationView.class);
@Inject @Inject
ApplicationControl applicationService; ApplicationControl applicationService;
@Inject @Inject
InstanceView instanceView; InstanceView instanceView;
@Inject @Inject
Locale locale; Locale locale;
private ApplicationEntity currentApplication = null; private ApplicationEntity currentApplication = null;
private ApplicationEntity editApplication = null; private ApplicationEntity editApplication = null;
private List<ApplicationEntity> applicationList = null; private List<ApplicationEntity> applicationList = null;
@PostConstruct @PostConstruct
public void selectDefaultCurrentApplication() { public void selectDefaultCurrentApplication() {
// force applications to be loaded from database // force applications to be loaded from database
getAllApplications(); getAllApplications();
if ((applicationList != null) && (!applicationList.isEmpty())) { if ((applicationList != null) && (!applicationList.isEmpty())) {
currentApplication = applicationList.get(0); currentApplication = applicationList.get(0);
} }
if (LOGGER.isDebugEnabled()) { if (LOGGER.isDebugEnabled()) {
LOGGER.debug("post construct executed"); LOGGER.debug("post construct executed");
} }
} }
@PreDestroy @PreDestroy
public void predestroy() { public void predestroy() {
if (LOGGER.isDebugEnabled()) { if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Predestroy executed"); LOGGER.debug("Predestroy executed");
} }
} }
public List<ApplicationEntity> getAllApplications() { public List<ApplicationEntity> getAllApplications() {
if (applicationList == null) { if (applicationList == null) {
try { try {
applicationList = applicationService.getAllApplications(); applicationList = applicationService.getAllApplications();
// if no role is assigned to user, ensure that at least current application is added // if no role is assigned to user, ensure that at least current application is added
if ((applicationList == null) || (applicationList.isEmpty())) { if ((applicationList == null) || (applicationList.isEmpty())) {
applicationList = new ArrayList<>(); applicationList = new ArrayList<>();
applicationList.add(instanceView.getInstanceApplication()); applicationList.add(instanceView.getInstanceApplication());
} }
return applicationList; return applicationList;
} catch (AccountSecurityException ex) { } catch (AccountSecurityException ex) {
if (LOGGER.isDebugEnabled()) { if (LOGGER.isDebugEnabled()) {
LOGGER.debug("Detailed stacktrace", new Object[]{ex}); LOGGER.debug("Detailed stacktrace", new Object[]{ex});
} }
FacesUtil.addGlobalErrorMessage("Error " + ex.getErrorCode(), ex.getLocalizedMessage(locale)); FacesUtil.addGlobalErrorMessage("Error " + ex.getErrorCode(), ex.getLocalizedMessage(locale));
return new ArrayList<>(); return new ArrayList<>();
} }
} }
return applicationList; return applicationList;
} }
public void selectApplication() { public void selectApplication() {
if (currentApplication != null) { if (currentApplication != null) {
LOGGER.info("selected application: {}", currentApplication.getApplicationName()); LOGGER.info("selected application: {}", currentApplication.getApplicationName());
FacesUtil.addGlobalInfoMessage("Success", "Selected application " + currentApplication.getApplicationName()); FacesUtil.addGlobalInfoMessage("Success", "Selected application " + currentApplication.getApplicationName());
} }
} }
public void newApplication() { public void startEditApplication() {
this.editApplication = new ApplicationEntity(); this.editApplication = currentApplication;
} }
public void cancelEditApplication() { public void newApplication() {
this.editApplication = null; this.editApplication = new ApplicationEntity();
} }
public void saveEditApplication() { public void cancelEditApplication() {
if (editApplication == null) { this.editApplication = null;
FacesUtil.addGlobalErrorMessage("Error", "Need to provide data"); }
} else if ((editApplication.getApplicationName() == null) || (editApplication.getApplicationName().trim().equals(""))) {
String hint; public void saveEditApplication() {
if (editApplication.getId() == null) { if (editApplication == null) {
hint = "Cannot create application"; FacesUtil.addGlobalErrorMessage("Error", "Need to provide data");
} else { } else if ((editApplication.getApplicationName() == null) || (editApplication.getApplicationName().trim().equals(""))) {
hint = "Cannot save application"; String hint;
} if (editApplication.getId() == null) {
FacesUtil.addGlobalErrorMessage(hint, "Application name must not be empty"); hint = "Cannot create application";
} else { } else {
currentApplication = applicationService.createOrUpdate(editApplication); hint = "Cannot save application";
// force reload of to update view }
applicationList = null; FacesUtil.addGlobalErrorMessage(hint, "Application name must not be empty");
FacesUtil.addGlobalInfoMessage("Info", "Application saved"); } else {
} currentApplication = applicationService.createOrUpdate(editApplication);
} // force reload of to update view
applicationList = null;
public void deleteApplication() { FacesUtil.addGlobalInfoMessage("Info", "Application saved");
if (currentApplication == null) { }
FacesUtil.addGlobalErrorMessage("Error", "Need to provide data"); }
} else if (currentApplication.getId() == null) {
FacesUtil.addGlobalErrorMessage("Error", "Cannot delete non persistent data"); public void deleteApplication() {
} else { if (currentApplication == null) {
String applicationName = currentApplication.getApplicationName(); FacesUtil.addGlobalErrorMessage("Error", "Need to provide data");
applicationService.delete(currentApplication); } else if (currentApplication.getId() == null) {
applicationList = null; // force reload to update view FacesUtil.addGlobalErrorMessage("Error", "Cannot delete non persistent data");
currentApplication = null; } else {
selectDefaultCurrentApplication(); String applicationName = currentApplication.getApplicationName();
FacesUtil.addGlobalInfoMessage("Info", "Application " + applicationName + " deleted"); applicationService.delete(currentApplication);
} applicationList = null; // force reload to update view
} currentApplication = null;
selectDefaultCurrentApplication();
/* *** getter / setter *** */ FacesUtil.addGlobalInfoMessage("Info", "Application " + applicationName + " deleted");
public ApplicationEntity getCurrentApplication() { }
return currentApplication; }
}
/* *** getter / setter *** */
public void setCurrentApplication(ApplicationEntity currentApplication) { public ApplicationEntity getCurrentApplication() {
this.currentApplication = currentApplication; return currentApplication;
} }
public ApplicationEntity getEditApplication() { public void setCurrentApplication(ApplicationEntity currentApplication) {
return editApplication; this.currentApplication = currentApplication;
} }
public void setEditApplication(ApplicationEntity editApplication) { public ApplicationEntity getEditApplication() {
this.editApplication = editApplication; return editApplication;
} }
}
public void setEditApplication(ApplicationEntity editApplication) {
this.editApplication = editApplication;
}
}

View File

@ -1,32 +1,38 @@
admin.loginPage=login.xhtml admin.loginPage=login.xhtml
admin.indexPage=web/index.xhtml admin.indexPage=web/index.xhtml
#admin.dateFormat= #admin.dateFormat=
#admin.breadcrumbSize=5 #admin.breadcrumbSize=5
admin.renderMessages=true admin.renderMessages=true
#admin.renderAjaxStatus=true admin.renderAjaxStatus=false
## disable filter to redirect to login page - shiro security filter is already doing this
admin.disableFilter=true admin.disableFilter=true
#admin.renderBreadCrumb=true admin.renderBreadCrumb=false
#admin.enableSlideMenu=true #admin.extensionLessUrls=false
#admin.enableRipple=true #admin.enableSlideMenu=true
#admin.rippleElements= .ripplelink,button.ui-button,.ui-selectlistbox-item,.ui-multiselectlistbox-item,.ui-selectonemenu-label,.ui-selectcheckboxmenu,\ #admin.enableRipple=true
#.ui-autocomplete-dropdown, .ui-autocomplete-item ... (the list goes on) #admin.rippleMobileOnly=true
admin.skin=skin-purple-light
#admin.autoShowNavbar=true
#admin.ignoredResources=
#admin.loadingImage=ajaxloadingbar.gif
#admin.extensionLessUrls=false
admin.renderControlSidebar=false
#admin.controlSidebar.showOnMobile=false
#admin.controlSidebar.leftMenuTemplate=true
#admin.controlSidebar.fixedLayout=false
#admin.controlSidebar.boxedLayout=false
#admin.controlSidebar.sidebarCollapsed=false
#admin.controlSidebar.expandOnHover=false
#admin.controlSidebar.fixed=false
#admin.controlSidebar.darkSkin=true
#admin.rippleMobileOnly=true
admin.renderMenuSearch=false admin.renderMenuSearch=false
## do not autohide #admin.renderControlSidebar=false
#admin.controlSidebar.showOnMobile=false
#admin.controlSidebar.leftMenuTemplate=true
#admin.controlSidebar.fixedLayout=false
#admin.controlSidebar.boxedLayout=false
#admin.controlSidebar.sidebarCollapsed=false
#admin.controlSidebar.expandOnHover=false
#admin.controlSidebar.fixed=false
admin.controlSidebar.darkSkin=false
admin.autoHideMessages=false admin.autoHideMessages=false
#admin.messagesHideTimeout=2500 admin.renderFormAsterisks=true
#admin.enableMobileHeader=true
#admin.closableLoading=true
#admin.messagesHideTimeout=2500
admin.skin=skin-purple-light
#admin.autoShowNavbar=true
#admin.loadingImage=ajaxloadingbar.gif
#admin.iconsEffect=true
#admin.rippleElements=.ripplelink,button.ui-button:not([class*=ui-picklist]):not([class*=ui-orderlist]),li.ui-selectlistbox-item,li.ui-multiselectlistbox-item,.ui-selectonemenu-label,.ui-selectcheckboxmenu,\
# .ui-autocomplete-dropdown, .ui-autocomplete-item, .ui-splitbutton-menubutton, .ui-splitbutton button.ui-button,.input-group, .ui-selectbooleanbutton, \
# div.ui-button,.ui-chkbox-icon, .ui-link, .form-control, .btn, .ui-sortable-column,.ui-link, .ui-tabs-nav > li,.ui-selectonemenu-trigger, \
# .ui-accordion-header, .treeview, .sidebar-toggle, .ui-radiobutton-icon, td[role="gridcell"], .ui-selectcheckboxmenu-trigger,.ui-paginator-page, \
# .ui-panelmenu-header > a, a#layout-setup, .control-sidebar div#restore-defaults > a, .control-sidebar div.ui-selectbooleancheckbox .ui-chkbox, \
# .control-sidebar span.control-sidebar-subheading > label, .control-sidebar a.skin-link, button.navbar-toggle, li.dropdown > a

View File

@ -36,7 +36,7 @@
</session-timeout> </session-timeout>
</session-config> </session-config>
<welcome-file-list> <welcome-file-list>
<welcome-file>web/index.xhtml</welcome-file> <welcome-file>index.xhtml</welcome-file>
</welcome-file-list> </welcome-file-list>
<!-- Shiro Web Environment --> <!-- Shiro Web Environment -->
<listener> <listener>

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
template="/resources/templates/template.xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:shiro="http://shiro.apache.org/tags">
<ui:define name="head">
<meta http-equiv="refresh" content="0; URL=web/index.xhtml" />
</ui:define>
<ui:define name="body">
<p:panel id = "redirectPanel" header="Redirect" styleClass="card box-info">
<h:form id="redirectForm">
<p:link href="web/index.xhtml" value="Home" />
</h:form>
</p:panel>
</ui:define>
</ui:composition>

View File

@ -19,7 +19,7 @@
<h:form id="applicationForm" prependId="false"> <h:form id="applicationForm" prependId="false">
<div class="ui-g ui-fluid"> <div class="ui-g ui-fluid">
<div class="col-sm-12 col-md-6"> <div class="col-sm-12 col-md-4">
<p:selectOneMenu id="applicationSelect" value="#{applicationView.currentApplication}" converter="omnifaces.SelectItemsConverter" required="true"> <p:selectOneMenu id="applicationSelect" value="#{applicationView.currentApplication}" converter="omnifaces.SelectItemsConverter" required="true">
<f:selectItems value="#{applicationView.allApplications}" var="app" itemLabel="#{app.applicationName}" itemValue="#{app}" /> <f:selectItems value="#{applicationView.allApplications}" var="app" itemLabel="#{app.applicationName}" itemValue="#{app}" />
</p:selectOneMenu> </p:selectOneMenu>
@ -27,6 +27,12 @@
<div class="col-sm-12 col-md-2"> <div class="col-sm-12 col-md-2">
<p:commandButton value="Select" styleClass="btn-primary btn-solid}" actionListener="#{applicationView.selectApplication}" /> <p:commandButton value="Select" styleClass="btn-primary btn-solid}" actionListener="#{applicationView.selectApplication}" />
</div> </div>
<div class="col-sm-12 col-md-2">
<p:commandButton value="Edit" id="editButton" icon="fa fa-pen"
update="editDialog" oncomplete="PF('editDialogVar').show();"
actionListener="#{applicationView.startEditApplication}" styleClass="btn-teal btn-block" />
</div>
<div class="col-sm-12 col-md-2"> <div class="col-sm-12 col-md-2">
<p:commandButton value="New" id="newButton" icon="fa fa-plus" <p:commandButton value="New" id="newButton" icon="fa fa-plus"
update="editDialog" oncomplete="PF('editDialogVar').show();" update="editDialog" oncomplete="PF('editDialogVar').show();"
@ -52,11 +58,22 @@
</p:messages> </p:messages>
<div class="ui-g ui-fluid"> <div class="ui-g ui-fluid">
<div class="col-sm-12 col-md-3">
<p:outputLabel for="applicationId" value="ID" />
</div>
<div class="col-sm-12 col-md-9">
<c:if test="#{empty applicationView.editApplication.id}">
<p:inputText id="applicationId" value="#{applicationView.editApplication.id}" required="false"/>
</c:if>
<c:if test="#{!empty applicationView.editApplication.id}">
<p:outputLabel id="applicationId" value="#{applicationView.editApplication.id}" />
</c:if>
</div>
<div class="col-sm-12 col-md-3"> <div class="col-sm-12 col-md-3">
<p:outputLabel for="applicationName" value="Application name" /> <p:outputLabel for="applicationName" value="Application name" />
</div> </div>
<div class="col-sm-12 col-md-6"> <div class="col-sm-12 col-md-9">
<p:inputText id="applicationName" value="#{applicationView.editApplication.applicationName}"> <p:inputText id="applicationName" value="#{applicationView.editApplication.applicationName}" required="true">
<f:validator validatorId="uniqueApplicationValidator"/> <f:validator validatorId="uniqueApplicationValidator"/>
</p:inputText> </p:inputText>
</div> </div>