Commit aa1d190a by Juho Salli

Merge branch 'randomfixes' into 'master'

Randomfixes

Few minor random fixes.

* invitestuff
* Primefaces 5.0-RC2
* etc
2 parents 72df7970 fd5b3512
...@@ -41,7 +41,7 @@ public class BootstrapBean implements BootstrapBeanLocal { ...@@ -41,7 +41,7 @@ public class BootstrapBean implements BootstrapBeanLocal {
"ALTER TABLE org_roles ADD ldap_weight integer NOT NULL default 100" "ALTER TABLE org_roles ADD ldap_weight integer NOT NULL default 100"
}); });
// barcodefuckup // barcodefuckup
dbUpdates.add(new String[] { dbUpdates.add(new String[] {
"DROP TABLE card_barcode", "DROP TABLE card_barcode",
"ALTER TABLE printed_cards DROP COLUMN barcode;", "ALTER TABLE printed_cards DROP COLUMN barcode;",
"ALTER TABLE printed_cards DROP COLUMN rfid_uid;", "ALTER TABLE printed_cards DROP COLUMN rfid_uid;",
...@@ -53,6 +53,11 @@ public class BootstrapBean implements BootstrapBeanLocal { ...@@ -53,6 +53,11 @@ public class BootstrapBean implements BootstrapBeanLocal {
"ALTER TABLE reader_events ALTER COLUMN type DROP DEFAULT;", "ALTER TABLE reader_events ALTER COLUMN type DROP DEFAULT;",
}); });
dbUpdates.add(new String[] {
"delete from menu_navigation where item_id in (select id from menuitem where url in ( '/actionlog/messagelist'))",
"delete from menuitem where url in ('/actionlog/messagelist')",
});
} }
@EJB @EJB
...@@ -78,7 +83,8 @@ public class BootstrapBean implements BootstrapBeanLocal { ...@@ -78,7 +83,8 @@ public class BootstrapBean implements BootstrapBeanLocal {
throw new RuntimeException("Sanity check failed! DB is newer than the codebase!"); throw new RuntimeException("Sanity check failed! DB is newer than the codebase!");
} }
} else { } else {
// DB is up to date by default! We need to mark the current version down though. // DB is up to date by default! We need to mark the current version
// down though.
dBm = new DBModel(); dBm = new DBModel();
dBm.setRevision(upIdx); dBm.setRevision(upIdx);
dbModelFacade.create(dBm); dbModelFacade.create(dBm);
......
...@@ -493,7 +493,9 @@ public class UserBean implements UserBeanLocal { ...@@ -493,7 +493,9 @@ public class UserBean implements UserBeanLocal {
MailMessage msg = new MailMessage(); MailMessage msg = new MailMessage();
msg.setSubject(eventBean.getPropertyString(LanEventPropertyKey.INVITEMAIL_SUBJECT)); msg.setSubject(eventBean.getPropertyString(LanEventPropertyKey.INVITEMAIL_SUBJECT));
msg.setMessage(MessageFormat.format(eventBean.getPropertyString(LanEventPropertyKey.INVITEMAIL_CONTENT), MessageFormat.format(url, token), creator.getUser().getWholeName())); String formatUrl = MessageFormat.format(url, token);
logger.info("Sending invite url {}", formatUrl);
msg.setMessage(MessageFormat.format(eventBean.getPropertyString(LanEventPropertyKey.INVITEMAIL_CONTENT), formatUrl, creator.getUser().getWholeName()));
msg.setToAddress(invitemail); msg.setToAddress(invitemail);
utilbean.sendMail(msg); utilbean.sendMail(msg);
return true; return true;
...@@ -507,13 +509,35 @@ public class UserBean implements UserBeanLocal { ...@@ -507,13 +509,35 @@ public class UserBean implements UserBeanLocal {
@Override @Override
@PermitAll @PermitAll
public void createFromToken(EventUser user, String token) { public EventUser acceptInviteForExistingUser(String username, String password, String token) {
GroupMembership gm = findToken(token); GroupMembership gm = findToken(token);
if (gm == null || gm.getUser() != null || gm.getInviteAccepted() != null) {
return null;
}
User u = userFacade.findByLogin(username);
EventUser eu = this.getEventUser(u, true);
gm.setUser(eu);
gm.setInviteAccepted(Calendar.getInstance());
return eu;
}
@Override
@PermitAll
public boolean createFromInviteToken(EventUser user, String token) {
GroupMembership gm = findToken(token);
// Check that invite has not already been accepted!
if (gm == null || gm.getUser() != null || gm.getInviteAccepted() != null) {
return false;
}
user.setEvent(eventBean.getCurrentEvent()); user.setEvent(eventBean.getCurrentEvent());
gm.setUser(user); gm.setUser(user);
gm.setInviteAccepted(Calendar.getInstance()); gm.setInviteAccepted(Calendar.getInstance());
eventUserFacade.create(user); eventUserFacade.create(user);
return true;
} }
// private void jaiCrop() // private void jaiCrop()
...@@ -885,4 +909,5 @@ public class UserBean implements UserBeanLocal { ...@@ -885,4 +909,5 @@ public class UserBean implements UserBeanLocal {
return eventUserFacade.getOtherOrganisationsEventuser(user, event); return eventUserFacade.getOtherOrganisationsEventuser(user, event);
} }
} }
\ No newline at end of file
...@@ -57,7 +57,9 @@ public interface UserBeanLocal { ...@@ -57,7 +57,9 @@ public interface UserBeanLocal {
GroupMembership findToken(String token); GroupMembership findToken(String token);
void createFromToken(EventUser user, String token); boolean createFromInviteToken(EventUser user, String token);
EventUser acceptInviteForExistingUser(String username, String password, String token);
UserImage findUserimageFORCE(Integer id); UserImage findUserimageFORCE(Integer id);
......
...@@ -32,6 +32,12 @@ ...@@ -32,6 +32,12 @@
<id>iudex</id> <id>iudex</id>
<url>http://iudex.fi/maven/</url> <url>http://iudex.fi/maven/</url>
</repository> </repository>
<repository>
<id>prime-repo</id>
<name>PrimeFaces Maven Repository</name>
<url>http://repository.primefaces.org</url>
<layout>default</layout>
</repository>
</repositories> </repositories>
<dependencies> <dependencies>
<dependency> <dependency>
...@@ -47,7 +53,7 @@ ...@@ -47,7 +53,7 @@
<dependency> <dependency>
<groupId>org.primefaces</groupId> <groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId> <artifactId>primefaces</artifactId>
<version>4.0</version> <version>5.0-RC2</version>
</dependency> </dependency>
......
...@@ -3,15 +3,6 @@ ...@@ -3,15 +3,6 @@
<wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/> <wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
<wb-resource deploy-path="/" source-path="/WebContent" tag="defaultRootSource"/> <wb-resource deploy-path="/" source-path="/WebContent" tag="defaultRootSource"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src"/> <wb-resource deploy-path="/WEB-INF/classes" source-path="/src"/>
<dependent-module archiveName="moya-beans-client-0.2.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/MoyaBeansClient/MoyaBeansClient">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="moya-database-0.2.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/MoyaDatabase/MoyaDatabase">
<dependency-type>uses</dependency-type>
</dependent-module>
<dependent-module archiveName="moya-utils-0.2.0.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/MoyaUtilities/MoyaUtilities">
<dependency-type>uses</dependency-type>
</dependent-module>
<property name="java-output-path" value="/MoyaTerminalWeb/build/classes"/> <property name="java-output-path" value="/MoyaTerminalWeb/build/classes"/>
<property name="context-root" value="moya-terminal-web"/> <property name="context-root" value="moya-terminal-web"/>
</wb-module> </wb-module>
......
<root> <root>
<facet id="jst.jsf"> <facet id="jst.jsf">
<node name="libprov"> <node name="libprov">
<attribute name="provider-id" value="jsf-no-op-library-provider"/> <attribute name="provider-id" value="GlassFish-4-SystemLibrary-JSF"/>
</node> </node>
</facet> </facet>
<facet id="jst.jaxrs"> <facet id="jst.jaxrs">
......
...@@ -2,11 +2,9 @@ ...@@ -2,11 +2,9 @@
<faceted-project> <faceted-project>
<runtime name="GlassFish 4.0"/> <runtime name="GlassFish 4.0"/>
<fixed facet="wst.jsdt.web"/> <fixed facet="wst.jsdt.web"/>
<fixed facet="jst.web"/>
<fixed facet="java"/>
<installed facet="jst.web" version="3.0"/>
<installed facet="wst.jsdt.web" version="1.0"/> <installed facet="wst.jsdt.web" version="1.0"/>
<installed facet="java" version="1.7"/> <installed facet="java" version="1.7"/>
<installed facet="jst.jsf" version="2.0"/> <installed facet="jst.jsf" version="2.2"/>
<installed facet="jst.web" version="3.1"/>
<installed facet="jst.jaxrs" version="2.0"/> <installed facet="jst.jaxrs" version="2.0"/>
</faceted-project> </faceted-project>
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<display-name>MoyaTerminalWeb</display-name> xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
<context-param> version="3.1">
<display-name>MoyaTerminalWeb</display-name>
<context-param>
<param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name> <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
<param-value>true</param-value> <param-value>true</param-value>
</context-param> </context-param>
<welcome-file-list>
<welcome-file-list> <welcome-file>index.html</welcome-file>
<welcome-file>index.html</welcome-file> <welcome-file>index.jsf</welcome-file>
<welcome-file>index.jsf</welcome-file> </welcome-file-list>
</welcome-file-list> <session-config>
<session-timeout>30</session-timeout>
<session-config> </session-config>
<session-timeout>30</session-timeout> <servlet>
</session-config> <servlet-name>Faces Servlet</servlet-name>
<servlet> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<servlet-name>Faces Servlet</servlet-name> <load-on-startup>1</load-on-startup>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class> </servlet>
<load-on-startup>1</load-on-startup> <servlet-mapping>
</servlet> <servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
<servlet-mapping> </servlet-mapping>
<servlet-name>Faces Servlet</servlet-name> <context-param>
<url-pattern>*.jsf</url-pattern> <param-name>javax.faces.PROJECT_STAGE</param-name>
</servlet-mapping> <param-value>Development</param-value>
</context-param>
<context-param> <context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name> <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
<param-value>Development</param-value> <param-value>true</param-value>
</context-param> </context-param>
<context-param> <login-config>
<param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name> <auth-method>CLIENT-CERT</auth-method>
<param-value>true</param-value> <realm-name>certificate</realm-name>
</context-param> </login-config>
<security-constraint>
<!--
<filter>
<display-name>PrimefacesFileupload</display-name>
<filter-name>PrimefacesFileupload</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PrimefacesFileupload</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
-->
<login-config>
<auth-method>CLIENT-CERT</auth-method>
<realm-name>certificate</realm-name>
</login-config>
<security-constraint>
<display-name>Forbidden resource</display-name> <display-name>Forbidden resource</display-name>
<web-resource-collection> <web-resource-collection>
<web-resource-name>Forbidden</web-resource-name> <web-resource-name>Forbidden</web-resource-name>
...@@ -68,39 +51,20 @@ ...@@ -68,39 +51,20 @@
<transport-guarantee>CONFIDENTIAL</transport-guarantee> <transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint> </user-data-constraint>
</security-constraint> </security-constraint>
<security-constraint>
<security-constraint> <display-name>Resource that needs cert auth</display-name>
<display-name>Resource that needs cert auth</display-name> <web-resource-collection>
<web-resource-collection> <web-resource-name>Forbidden</web-resource-name>
<web-resource-name>Forbidden</web-resource-name> <url-pattern>/info/*</url-pattern>
<url-pattern>/info/*</url-pattern> </web-resource-collection>
</web-resource-collection> <auth-constraint>
<auth-constraint> <role-name>TERMINAL/INFO</role-name>
<role-name>TERMINAL/INFO</role-name> </auth-constraint>
</auth-constraint> <user-data-constraint>
<user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee>
<transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint>
</user-data-constraint> </security-constraint>
</security-constraint> <persistence-unit-ref>
<persistence-unit-ref-name>BortalEMF</persistence-unit-ref-name>
<!-- </persistence-unit-ref>
<security-constraint>
<display-name>Resource that needs cert auth</display-name>
<web-resource-collection>
<web-resource-name>BortalTerminalWebResource</web-resource-name>
<url-pattern>/faces/*</url-pattern>
<url-pattern>*.jsf</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>TERMINAL</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint> -->
<persistence-unit-ref>
<persistence-unit-ref-name>BortalEMF</persistence-unit-ref-name>
</persistence-unit-ref>
</web-app> </web-app>
\ No newline at end of file
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<modelVersion>4.0.0</modelVersion> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<groupId>fi.codecrew.moya</groupId> <modelVersion>4.0.0</modelVersion>
<artifactId>moya-terminal-web</artifactId> <groupId>fi.codecrew.moya</groupId>
<version>0.2.0</version> <artifactId>moya-terminal-web</artifactId>
<packaging>war</packaging> <version>0.2.0</version>
<build> <packaging>war</packaging>
<sourceDirectory>src</sourceDirectory> <build>
<resources> <sourceDirectory>src</sourceDirectory>
<resource> <resources>
<directory>src</directory> <resource>
<excludes> <directory>src</directory>
<exclude>**/*.java</exclude> <excludes>
</excludes> <exclude>**/*.java</exclude>
</resource> </excludes>
</resources> </resource>
<plugins> </resources>
<plugin> <plugins>
<artifactId>maven-compiler-plugin</artifactId> <plugin>
<version>3.1</version> <artifactId>maven-compiler-plugin</artifactId>
<configuration> <version>3.1</version>
<source>1.7</source> <configuration>
<target>1.7</target> <source>1.7</source>
</configuration> <target>1.7</target>
</plugin> </configuration>
<plugin> </plugin>
<artifactId>maven-war-plugin</artifactId> <plugin>
<version>2.3</version> <artifactId>maven-war-plugin</artifactId>
<configuration> <version>2.4</version>
<warSourceDirectory>WebContent</warSourceDirectory> <configuration>
<failOnMissingWebXml>false</failOnMissingWebXml> <warSourceDirectory>WebContent</warSourceDirectory>
</configuration> <failOnMissingWebXml>false</failOnMissingWebXml>
</plugin> <packagingIncludes>WEB-INF/lib/javamelody-core*,WEB-INF/lib/primefaces*,**/*.xml,**/*.xhtml,**/*.properties,**/*.class,**/*.png,**/*.css,**/*.js,resources/*</packagingIncludes>
</plugins> </configuration>
</build> </plugin>
<dependencies> </plugins>
<dependency> </build>
<groupId>fi.codecrew.moya</groupId> <repositories>
<artifactId>moya-beans-client</artifactId> <repository>
<version>0.2.0</version> <id>iudex</id>
</dependency> <url>http://iudex.fi/maven/</url>
<dependency> </repository>
<repository>
<id>prime-repo</id>
<name>PrimeFaces Maven Repository</name>
<url>http://repository.primefaces.org</url>
<layout>default</layout>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>fi.codecrew.moya</groupId>
<artifactId>moya-beans-client</artifactId>
<version>0.2.0</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId> <groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId> <artifactId>commons-fileupload</artifactId>
<version>1.3</version> <version>1.3</version>
...@@ -47,7 +61,12 @@ ...@@ -47,7 +61,12 @@
<dependency> <dependency>
<groupId>org.primefaces</groupId> <groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId> <artifactId>primefaces</artifactId>
<version>4.0</version> <version>5.0-RC2</version>
</dependency>
<dependency>
<groupId>net.bull.javamelody</groupId>
<artifactId>javamelody-core</artifactId>
<version>1.46.0</version>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>
\ No newline at end of file
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
</composite:interface> </composite:interface>
<composite:implementation> <composite:implementation>
<reader:bacendReader /> <reader:backendReader />
</composite:implementation> </composite:implementation>
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
<link rel="stylesheet" type="text/css" href="#{request.contextPath}/resources/templates/template1/css/style.css" /> <link rel="stylesheet" type="text/css" href="#{request.contextPath}/resources/templates/template1/css/style.css" />
<link rel="stylesheet" type="text/css" href="#{request.contextPath}/resources/templates/template1/css/general.css" /> <link rel="stylesheet" type="text/css" href="#{request.contextPath}/resources/templates/template1/css/general.css" />
<script src="#{request.contextPath}/resources/templates/template1/js/modernizr-2.6.2.min.js"></script> <script src="#{request.contextPath}/resources/templates/template1/js/modernizr-2.6.2.min.js"></script>
<h:outputStylesheet> <h:outputStylesheet>
.bgColor1 { .bgColor1 {
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
<h:body> <h:body>
<!-- Javascript-lokalisaatiolippupuljausta --> <!-- Javascript-lokalisaatiolippupuljausta -->
<script type="text/javascript"> <script type="text/javascript">
$(document) $(document)
.ready( .ready(
...@@ -62,7 +62,7 @@ ...@@ -62,7 +62,7 @@
<header class="bgColor1 box"> <header class="bgColor1 box">
<div id="header_left"> <div id="header_left">
<h:link outcome="/index"> <h:link outcome="/index">
<c:choose> <c:choose>
<c:when test="#{sessionHandler.isInDevelopmentMode()}"> <c:when test="#{sessionHandler.isInDevelopmentMode()}">
<img src="#{request.contextPath}/resources/templates/insomnia2/img/devel_logo.png" /> <img src="#{request.contextPath}/resources/templates/insomnia2/img/devel_logo.png" />
...@@ -79,15 +79,15 @@ ...@@ -79,15 +79,15 @@
</h:link> </h:link>
</div> </div>
<div id="header_center" class="flex1"> <div id="header_center" class="flex1">
<ui:fragment rendered="#{layoutView.canManageContent}"> <ui:fragment rendered="#{layoutView.canManageContent}">
<div> <div>
<h:form> <h:form>
<h:outputLabel for="manageBtn" value="#{i18n['content.showContentEditLinks']}" /> <h:outputLabel for="manageBtn" value="#{i18n['content.showContentEditLinks']}" />
<h:selectBooleanCheckbox value="#{sessionStore.manageContentLinks}" onclick="this.form.submit()" /> <h:selectBooleanCheckbox value="#{sessionStore.manageContentLinks}" onclick="this.form.submit()" />
</h:form> </h:form>
</div> </div>
</ui:fragment> </ui:fragment>
</div> </div>
<div id="header_right"> <div id="header_right">
...@@ -103,7 +103,7 @@ ...@@ -103,7 +103,7 @@
<nav> <nav>
<div id="menu"> <div id="menu">
<p:panelMenu model="#{primeMenuView.menuModel}" /> <p:panelMenu model="#{primeMenuView.menuModel}" />
<h:link style="font-size: 10px;" rendered="#{readerView.shopToOthers}" outcome="/shop/showReaderEvents" value="Readers" /> <h:link style="font-size: 10px;" rendered="#{readerView.shopToOthers}" outcome="/shop/showReaderEvents" value="Readers" />
</div> </div>
</nav> </nav>
...@@ -115,9 +115,9 @@ ...@@ -115,9 +115,9 @@
<p:ajax update="@all" event="change" /> <p:ajax update="@all" event="change" />
</p:selectOneButton> </p:selectOneButton>
</h:form> </h:form>
<h:link rendered="#{layoutView.manageContent}" styleClass="editorlink" value="#{i18n['layout.editTop']}" outcome="/pages/manage"> <h:link rendered="#{layoutView.manageContent}" styleClass="editorlink" value="#{i18n['layout.editTop']}" outcome="/pages/manage">
<f:param name="pagename" value="#{layoutView.pagepath}:top" /> <f:param name="pagename" value="#{layoutView.pagepath}:top" />
</h:link> </h:link>
...@@ -143,16 +143,24 @@ ...@@ -143,16 +143,24 @@
<aside class="flex1"> <aside class="flex1">
<div id="aside"> <div id="aside">
<div class="ui-widget-header">Login</div> <div class="ui-widget-header">Login</div>
<div class="ui-widget-content" style="text-align: center"> <div class="ui-widget-content" style="text-align: center;">
<ui:fragment rendered="#{sessionHandler.loggedIn}"> <ui:fragment rendered="#{sessionHandler.loggedIn}">
<h:outputText value="#{i18n['template.loggedInAs']}" /> <h:outputText value="#{i18n['template.loggedInAs']}" />
<br /> <br />
<b><h:outputText value="#{sessionHandler.currentUser.nick}" /></b> <b><h:outputText value="#{sessionHandler.currentUser.nick}" /></b>
</ui:fragment> </ui:fragment>
<div> <ui:fragment rendered="#{!sessionHandler.loggedIn}">
<tools:loginLogout /> <div style="text-align: left; padding: 0.7em;">
</div> <h:form>
<p:inputText styleClass="form" id="linelogin" value="#{authView.login}" />
<br />
<p:password styleClass="form" id="linepwd" value="#{authView.password}" />
<br />
<p:commandButton styleClass="button" id="onelinesubmit" action="#{authView.executeLoginAction}" ajax="false" value="#{i18n['login.submit']}" />
</h:form>
</div>
</ui:fragment>
</div> </div>
<br /> <br />
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:users="http://java.sun.com/jsf/composite/cditools/user" <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:users="http://java.sun.com/jsf/composite/cditools/user"
xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core"> xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:p="http://primefaces.org/ui">
<h:body> <h:body>
<ui:composition template="#{sessionHandler.template}"> <ui:composition template="#{sessionHandler.template}">
<f:metadata> <f:metadata>
...@@ -10,10 +10,31 @@ ...@@ -10,10 +10,31 @@
<f:viewParam name="token" value="#{inviteAcceptView.token}" /> <f:viewParam name="token" value="#{inviteAcceptView.token}" />
</f:metadata> </f:metadata>
<ui:define name="title"> <ui:define name="title">
<h1><h:outputText value="#{i18n['user.invite.header']}" /></h1> <h1>
<h:outputText value="#{i18n['user.invite.header']}" />
</h1>
</ui:define> </ui:define>
<ui:define name="content"> <ui:define name="content">
<ui:fragment rendered="#{!inviteAcceptView.done}"> <ui:fragment rendered="#{!inviteAcceptView.done}">
<h2>
<h:outputText value="#{i18n['invite.existingUserHeader']}" />
</h2>
<h:form>
<h:panelGrid columns="2">
<h:outputLabel for="login" />
<p:inputText label="#{i18n['login.username']}" id="login" value="#{inviteAcceptView.username}" />
<h:outputLabel for="pwd" />
<p:password label="#{i18n['login.password']}" id="pwd" value="#{inviteAcceptView.password}" />
</h:panelGrid>
<p:commandButton id="submit" action="#{inviteAcceptView.loginWithExisting()}" ajax="false" value="#{i18n['login.submit']}" />
</h:form>
<h2>
<h:outputText value="#{i18n['invite.createNewUserHeader']}" />
</h2>
<users:create creating="true" commitaction="#{inviteAcceptView.createUser()}" commitvalue="#{i18n['user.create']}" /> <users:create creating="true" commitaction="#{inviteAcceptView.createUser()}" commitvalue="#{i18n['user.create']}" />
</ui:fragment> </ui:fragment>
</ui:define> </ui:define>
......
...@@ -5,7 +5,9 @@ ...@@ -5,7 +5,9 @@
xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core"> xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:body> <h:body>
<ui:composition template="#{sessionHandler.template}"> <ui:composition template="#{sessionHandler.template}">
<f:metadata>
<f:event type="preRenderView" listener="#{inviteView.initView}" />
</f:metadata>
<ui:define name="title"> <ui:define name="title">
<h1>#{i18n['user.page.invite']}</h1> <h1>#{i18n['user.page.invite']}</h1>
</ui:define> </ui:define>
......
...@@ -36,11 +36,16 @@ ...@@ -36,11 +36,16 @@
</plugins> </plugins>
</build> </build>
<repositories> <repositories>
<repository> <repository>
<id>iudex</id> <id>iudex</id>
<url>http://iudex.fi/maven/</url> <url>http://iudex.fi/maven/</url>
</repository> </repository>
<repository>
<id>prime-repo</id>
<name>PrimeFaces Maven Repository</name>
<url>http://repository.primefaces.org</url>
<layout>default</layout>
</repository>
</repositories> </repositories>
<dependencies> <dependencies>
<dependency> <dependency>
...@@ -76,7 +81,7 @@ ...@@ -76,7 +81,7 @@
<dependency> <dependency>
<groupId>org.primefaces</groupId> <groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId> <artifactId>primefaces</artifactId>
<version>4.0</version> <version>5.0-RC2</version>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>
\ No newline at end of file
...@@ -66,6 +66,10 @@ public class HostnameFilter implements Filter { ...@@ -66,6 +66,10 @@ public class HostnameFilter implements Filter {
// Nothing... // Nothing...
} }
private enum AuthType {
UNKNOWN, ANON, REST, USER
}
/** /**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/ */
...@@ -74,7 +78,7 @@ public class HostnameFilter implements Filter { ...@@ -74,7 +78,7 @@ public class HostnameFilter implements Filter {
FilterChain chain) throws IOException, ServletException { FilterChain chain) throws IOException, ServletException {
// logger.info("HostnameFilter called!"); // logger.info("HostnameFilter called!");
HttpServletRequest httpRequest = null; HttpServletRequest httpRequest = null;
AuthType authtype = AuthType.UNKNOWN;
if (request != null && request instanceof HttpServletRequest) { if (request != null && request instanceof HttpServletRequest) {
httpRequest = ((HttpServletRequest) request); httpRequest = ((HttpServletRequest) request);
parseHostname(httpRequest); parseHostname(httpRequest);
...@@ -82,6 +86,7 @@ public class HostnameFilter implements Filter { ...@@ -82,6 +86,7 @@ public class HostnameFilter implements Filter {
if (httpRequest.getUserPrincipal() == null) { if (httpRequest.getUserPrincipal() == null) {
// Check if we are logging in with rest // Check if we are logging in with rest
if (RestApplicationEntrypoint.REST_PATH.equals(httpRequest.getServletPath())) { if (RestApplicationEntrypoint.REST_PATH.equals(httpRequest.getServletPath())) {
authtype = AuthType.REST;
if (!restAuth(httpRequest, response)) { if (!restAuth(httpRequest, response)) {
response.getWriter().write("REST authentication failed!"); response.getWriter().write("REST authentication failed!");
if (response instanceof HttpServletResponse) { if (response instanceof HttpServletResponse) {
...@@ -92,6 +97,7 @@ public class HostnameFilter implements Filter { ...@@ -92,6 +97,7 @@ public class HostnameFilter implements Filter {
} }
} else { } else {
try { try {
authtype = AuthType.ANON;
httpRequest.login(User.ANONYMOUS_LOGINNAME, null); httpRequest.login(User.ANONYMOUS_LOGINNAME, null);
} catch (Throwable t) { } catch (Throwable t) {
logger.warn("Error logging in as anonymous... ignoring.. ", t); logger.warn("Error logging in as anonymous... ignoring.. ", t);
...@@ -100,6 +106,7 @@ public class HostnameFilter implements Filter { ...@@ -100,6 +106,7 @@ public class HostnameFilter implements Filter {
} }
else if (!httpRequest.getUserPrincipal().getName().equals(User.ANONYMOUS_LOGINNAME)) else if (!httpRequest.getUserPrincipal().getName().equals(User.ANONYMOUS_LOGINNAME))
{ {
authtype = AuthType.USER;
sessionmgmt.updateSessionUser(httpRequest.getSession().getId(), httpRequest.getUserPrincipal().getName()); sessionmgmt.updateSessionUser(httpRequest.getSession().getId(), httpRequest.getUserPrincipal().getName());
} }
...@@ -107,6 +114,11 @@ public class HostnameFilter implements Filter { ...@@ -107,6 +114,11 @@ public class HostnameFilter implements Filter {
// pass the request along the filter chain // pass the request along the filter chain
try { try {
chain.doFilter(request, response); chain.doFilter(request, response);
} catch (Throwable t) {
if (AuthType.REST == authtype) {
logger.warn("Caught exception at rest:", t);
}
throw t;
} finally { } finally {
BortalLocalContextHolder.cleanupThread(); BortalLocalContextHolder.cleanupThread();
} }
...@@ -124,6 +136,7 @@ public class HostnameFilter implements Filter { ...@@ -124,6 +136,7 @@ public class HostnameFilter implements Filter {
// } // }
private boolean restAuth(HttpServletRequest httpRequest, ServletResponse response) { private boolean restAuth(HttpServletRequest httpRequest, ServletResponse response) {
// logger.info("Trying to authenticate for REST query. url {}, params '{}' method: {}, content type {}, and length {}", httpRequest.getRequestURL(), httpRequest.getQueryString(), httpRequest.getMethod(), httpRequest.getContentType(), httpRequest.getContentLength());
StringBuilder hashBuilder = new StringBuilder(); StringBuilder hashBuilder = new StringBuilder();
hashBuilder.append("rest:"); hashBuilder.append("rest:");
...@@ -161,14 +174,14 @@ public class HostnameFilter implements Filter { ...@@ -161,14 +174,14 @@ public class HostnameFilter implements Filter {
protected void parseHostname(HttpServletRequest httpRequest) protected void parseHostname(HttpServletRequest httpRequest)
{ {
// logger.info("Path info {}", httpRequest.getPathInfo()); // logger.info("Path info {}", httpRequest.getPathInfo()); // null
// logger.info("querystring {}", httpRequest.getQueryString()); // logger.info("querystring {}", httpRequest.getQueryString()); // ln=primefaces&amp;v=4.0
// logger.info("ctxpath {}", httpRequest.getContextPath()); // logger.info("ctxpath {}", httpRequest.getContextPath()); // /MoyaWeb
// logger.info("pathTranslated {}", httpRequest.getPathTranslated()); // logger.info("pathTranslated {}", httpRequest.getPathTranslated()); // null
// logger.info("requestUri {}", httpRequest.getRequestURI()); // logger.info("requestUri {}", httpRequest.getRequestURI()); // /MoyaWeb/javax.faces.resource/jquery/jquery.js.jsf
// logger.info("URL {}", httpRequest.getRequestURL().toString()); // logger.info("URL {}", httpRequest.getRequestURL().toString()); // http://localhost:8080/MoyaWeb/javax.faces.resource/jquery/jquery.js.jsf
// logger.info("servletpath {}", httpRequest.getServletPath()); // logger.info("servletpath {}", httpRequest.getServletPath()); // /javax.faces.resource/jquery/jquery.js.jsf
// logger.info("servletCtx {}", httpRequest.getServletContext()); // logger.info("servletCtx {}", httpRequest.getServletContext()); // org.apache.catalina.core.ApplicationContextFacade@6dd89c3d
StringBuffer url = httpRequest.getRequestURL(); StringBuffer url = httpRequest.getRequestURL();
// logger.info("Original hostname {}", url); // logger.info("Original hostname {}", url);
// Subject subj = Subject.getSubject(AccessController.getContext()); // Subject subj = Subject.getSubject(AccessController.getContext());
......
...@@ -241,7 +241,7 @@ submenu.info.index = Infon\u00E4kym\u00E4 ...@@ -241,7 +241,7 @@ submenu.info.index = Infon\u00E4kym\u00E4
subnavi.cards = \u0009\u0009 subnavi.cards = \u0009\u0009
subnavi.info = Info subnavi.info = Info
topnavi.license = Lisenssikoodit topnavi.license = Lisenssikoodit
user.cropImage = Crop user.cropImage = Crop
user.imageUpload.imageNotFound = Select image to upload user.imageUpload.imageNotFound = Select image to upload
......
...@@ -429,7 +429,9 @@ inventory.product.quantity = Quantatity ...@@ -429,7 +429,9 @@ inventory.product.quantity = Quantatity
inventory.product.submitButton = Add inventory.product.submitButton = Add
inventory.product.title = Add items to storage inventory.product.title = Add items to storage
invite.createNewUserHeader = Create new user
invite.emailexists = User with that email address already exists in the system. invite.emailexists = User with that email address already exists in the system.
invite.existingUserHeader = Login with existing username
invite.notFound = Invite invalid or already used invite.notFound = Invite invalid or already used
invite.successfull = Invite sent successfully invite.successfull = Invite sent successfully
invite.userCreateSuccessfull = User successfully created. You can now login. invite.userCreateSuccessfull = User successfully created. You can now login.
......
...@@ -440,7 +440,9 @@ inventory.product.quantity = M\u00E4\u00E4r\u00E4 ...@@ -440,7 +440,9 @@ inventory.product.quantity = M\u00E4\u00E4r\u00E4
inventory.product.submitButton = Lis\u00E4\u00E4 inventory.product.submitButton = Lis\u00E4\u00E4
inventory.product.title = Lis\u00E4\u00E4 tuottetta varastoon inventory.product.title = Lis\u00E4\u00E4 tuottetta varastoon
invite.createNewUserHeader = Luo uusi k\u00E4ytt\u00E4j\u00E4tunnus
invite.emailexists = J\u00E4rjestelm\u00E4ss\u00E4 on jo k\u00E4ytt\u00E4j\u00E4tunnus samalla s\u00E4hk\u00F6postiosoitteella. invite.emailexists = J\u00E4rjestelm\u00E4ss\u00E4 on jo k\u00E4ytt\u00E4j\u00E4tunnus samalla s\u00E4hk\u00F6postiosoitteella.
invite.existingUserHeader = Kirjaudu sis\u00E4\u00E4n olemassaolevalla tunnuksella
invite.notFound = Kutsu virheellinen tai jo k\u00E4ytetty. invite.notFound = Kutsu virheellinen tai jo k\u00E4ytetty.
invite.successfull = Kutsu l\u00E4hetetty invite.successfull = Kutsu l\u00E4hetetty
invite.userCreateSuccessfull = K\u00E4ytt\u00E4j\u00E4tunnus luotu onnistuneesti. Voit nyt kirjautua sis\u00E4\u00E4n j\u00E4rjeselm\u00E4\u00E4n. invite.userCreateSuccessfull = K\u00E4ytt\u00E4j\u00E4tunnus luotu onnistuneesti. Voit nyt kirjautua sis\u00E4\u00E4n j\u00E4rjeselm\u00E4\u00E4n.
......
...@@ -14,6 +14,8 @@ import javax.ws.rs.PathParam; ...@@ -14,6 +14,8 @@ import javax.ws.rs.PathParam;
import javax.ws.rs.Produces; import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.Response.Status;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
...@@ -92,6 +94,15 @@ public class MapAdminView { ...@@ -92,6 +94,15 @@ public class MapAdminView {
return Response.ok().build(); return Response.ok().build();
} }
@GET
@Path("/place/")
public Response getPlaceError() {
ResponseBuilder ret = Response.ok();
ret = ret.status(Status.METHOD_NOT_ALLOWED);
ret.entity("Method not allowed!\nGET is not supported for /place/. See api for correct use!");
return ret.build();
}
@POST @POST
@Path("/place/") @Path("/place/")
public Response createPlace(PlaceInputPojo create) { public Response createPlace(PlaceInputPojo create) {
......
...@@ -4,7 +4,6 @@ import java.io.PrintWriter; ...@@ -4,7 +4,6 @@ import java.io.PrintWriter;
import java.io.Serializable; import java.io.Serializable;
import java.io.StringWriter; import java.io.StringWriter;
import java.util.Arrays; import java.util.Arrays;
import java.util.Calendar;
import java.util.Map; import java.util.Map;
import java.util.zip.CRC32; import java.util.zip.CRC32;
...@@ -55,9 +54,8 @@ public class ErrorPageView implements Serializable { ...@@ -55,9 +54,8 @@ public class ErrorPageView implements Serializable {
public String getStackTraceHash() { public String getStackTraceHash() {
FacesContext context = FacesContext.getCurrentInstance(); FacesContext context = FacesContext.getCurrentInstance();
Map requestMap = context.getExternalContext().getRequestMap(); Map<?, ?> requestMap = context.getExternalContext().getRequestMap();
Throwable ex = Throwable ex = (Throwable) requestMap.get("javax.servlet.error.exception");
(Throwable) requestMap.get("javax.servlet.error.exception");
CRC32 stackHash = new CRC32(); CRC32 stackHash = new CRC32();
stackHash.update(Arrays.toString(ex.getStackTrace()).getBytes()); stackHash.update(Arrays.toString(ex.getStackTrace()).getBytes());
...@@ -66,7 +64,7 @@ public class ErrorPageView implements Serializable { ...@@ -66,7 +64,7 @@ public class ErrorPageView implements Serializable {
} }
public String getTime() { public String getTime() {
String stamp = "0x" + Long.toHexString(Calendar.getInstance().getTimeInMillis()); String stamp = "0x" + Long.toHexString(System.currentTimeMillis());
logger.error("Error occured at {} trail {}", stamp, getTrail()); logger.error("Error occured at {} trail {}", stamp, getTrail());
return stamp; return stamp;
} }
......
...@@ -2,8 +2,15 @@ package fi.codecrew.moya.web.cdiview.shop; ...@@ -2,8 +2,15 @@ package fi.codecrew.moya.web.cdiview.shop;
import javax.ejb.EJB; import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped; import javax.enterprise.context.ConversationScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.codecrew.moya.beans.UserBeanLocal; import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.model.EventUser; import fi.codecrew.moya.model.EventUser;
...@@ -19,6 +26,8 @@ public class InviteAcceptView extends GenericCDIView { ...@@ -19,6 +26,8 @@ public class InviteAcceptView extends GenericCDIView {
private static final long serialVersionUID = 1972813452261491814L; private static final long serialVersionUID = 1972813452261491814L;
private String token; private String token;
private String username;
private String password;
@Inject @Inject
private UserView userview; private UserView userview;
...@@ -31,6 +40,8 @@ public class InviteAcceptView extends GenericCDIView { ...@@ -31,6 +40,8 @@ public class InviteAcceptView extends GenericCDIView {
private GroupMembership membership; private GroupMembership membership;
private static final Logger logger = LoggerFactory.getLogger(InviteAcceptView.class);
public void initView() { public void initView() {
if (membership == null) { if (membership == null) {
...@@ -48,10 +59,57 @@ public class InviteAcceptView extends GenericCDIView { ...@@ -48,10 +59,57 @@ public class InviteAcceptView extends GenericCDIView {
} }
private HttpServletRequest getRequest() {
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
Object request = externalContext.getRequest();
return request instanceof HttpServletRequest ? (HttpServletRequest) request : null;
}
public String loginWithExisting() {
EventUser eu = userbean.acceptInviteForExistingUser(username, password, token);
if (eu != null) {
login(username, password);
}
this.username = null;
this.password = null;
super.addFaceMessage("invite.userCreateSuccessfull");
return null;
}
private void login(String usr, String pwd) {
HttpServletRequest req = getRequest();
String existingUsername = null;
if (req.getUserPrincipal() != null) {
if (User.ANONYMOUS_LOGINNAME.equals(req.getUserPrincipal().getName())) {
try {
req.logout();
} catch (ServletException e) {
logger.warn("Logging out anonymous failed!", e);
}
} else {
existingUsername = req.getUserPrincipal().getName();
}
}
if (existingUsername == null) {
try {
req.login(usr, pwd);
} catch (ServletException e) {
logger.warn("Login failed for invite user " + usr, e);
}
}
}
public String createUser() { public String createUser() {
user.getUser().resetPassword(userview.getPassword()); user.getUser().resetPassword(userview.getPassword());
userbean.createFromToken(user, token); if (userbean.createFromInviteToken(user, token)) {
login(user.getUser().getLogin(), userview.getPassword());
}
super.addFaceMessage("invite.userCreateSuccessfull"); super.addFaceMessage("invite.userCreateSuccessfull");
done = true; done = true;
user = null; user = null;
...@@ -81,4 +139,21 @@ public class InviteAcceptView extends GenericCDIView { ...@@ -81,4 +139,21 @@ public class InviteAcceptView extends GenericCDIView {
public void setDone(boolean done) { public void setDone(boolean done) {
this.done = done; this.done = done;
} }
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
} }
...@@ -6,7 +6,11 @@ import javax.faces.context.ExternalContext; ...@@ -6,7 +6,11 @@ import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext; import javax.faces.context.FacesContext;
import javax.inject.Named; import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fi.codecrew.moya.beans.UserBeanLocal; import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.enums.apps.UserPermission;
import fi.codecrew.moya.web.cdiview.GenericCDIView; import fi.codecrew.moya.web.cdiview.GenericCDIView;
@Named @Named
...@@ -20,6 +24,12 @@ public class InviteView extends GenericCDIView { ...@@ -20,6 +24,12 @@ public class InviteView extends GenericCDIView {
@EJB @EJB
private transient UserBeanLocal userbean; private transient UserBeanLocal userbean;
private static final Logger logger = LoggerFactory.getLogger(InviteView.class);
public void initView() {
super.requirePermissions(UserPermission.INVITE_USERS);
}
public String invite() { public String invite() {
ExternalContext extcontext = FacesContext.getCurrentInstance().getExternalContext(); ExternalContext extcontext = FacesContext.getCurrentInstance().getExternalContext();
...@@ -40,7 +50,6 @@ public class InviteView extends GenericCDIView { ...@@ -40,7 +50,6 @@ public class InviteView extends GenericCDIView {
path.append("/") path.append("/")
.append(FacesContext.getCurrentInstance().getExternalContext().getContextName()) .append(FacesContext.getCurrentInstance().getExternalContext().getContextName())
.append("/user/acceptInvite.jsf?token={0}"); .append("/user/acceptInvite.jsf?token={0}");
boolean ret = userbean.invite(invitemail, path.toString()); boolean ret = userbean.invite(invitemail, path.toString());
if (ret) { if (ret) {
this.addFaceMessage("invite.successfull"); this.addFaceMessage("invite.successfull");
......
...@@ -102,8 +102,7 @@ public class UserSearchView extends PaginationView<UserWrapper> { ...@@ -102,8 +102,7 @@ public class UserSearchView extends PaginationView<UserWrapper> {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@Override @Override
public List<EventUser> load(int first, int pageSize, String sortField, public List<EventUser> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
SortOrder sortOrder, Map<String, String> filters) {
UserSearchQuery sq = getSearchQuery(); UserSearchQuery sq = getSearchQuery();
sq.setPagesize(pageSize); sq.setPagesize(pageSize);
if (pageSize > 0) { if (pageSize > 0) {
...@@ -140,8 +139,7 @@ public class UserSearchView extends PaginationView<UserWrapper> { ...@@ -140,8 +139,7 @@ public class UserSearchView extends PaginationView<UserWrapper> {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@Override @Override
public List<UserWrapper> load(int first, int pageSize, String sortField, public List<UserWrapper> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
SortOrder sortOrder, Map<String, String> filters) {
UserSearchQuery sq = getSearchQuery(); UserSearchQuery sq = getSearchQuery();
sq.setPagesize(pageSize); sq.setPagesize(pageSize);
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!