Commit 1edf8ff4 by Tuomas Riihimäki

Invite stuff:

 * Login after accepting invite
 * Allow accepting of invite with existing user
 * Minor auth validation stuff
1 parent 82b831f5
...@@ -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);
......
...@@ -16,12 +16,25 @@ ...@@ -16,12 +16,25 @@
</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:form>
<p:inputText label="#{i18n['login.username']}" id="login" value="#{acceptInviteView.login}" /> <h:panelGrid columns="2">
<p:password label="#{i18n['login.password']}" id="pwd" value="#{acceptInviteView.password}" /> <h:outputLabel for="login" />
<p:commandButton id="submit" action="#{acceptInviteView.loginWithExisting}" ajax="false" value="#{i18n['login.submit']}" /> <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> </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>
......
...@@ -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.
......
...@@ -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");
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!