Commit 739bbb2b by Tuomas Riihimäki

Merge branch 'asm-placegive' into 'master'

Asm placegive

Paikan antaminen toiselle sähköpostilla

See merge request !142
2 parents 2465b0a9 e394936f
......@@ -89,7 +89,19 @@ public interface UserBeanLocal {
boolean userExists(String login);
boolean invite(String invitemail, String url);
boolean userExistsByEmail(String email);
/**
*
* @param invitemail Target mail
* @param url Url to send
* @param membership target group membership, if null we generate new one
* @return
*/
boolean invite(String invitemail, String url, GroupMembership membership);
void cancelInvite(GroupMembership ship);
EventUser mergeEventUserChanges(EventUser shoppingUser);
......
......@@ -298,6 +298,8 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
throw new EJBAccessException("Not enough rights to release token");
}
gmem.setUser(null);
gmem.setInviteEmail(null);
gmem.setInviteName(null);
gmem.setInviteToken(gmemfacade.createInviteToken());
logger.info("Place released. {} new token {}", gmem.getInviteToken());
}
......
......@@ -419,6 +419,7 @@ public class UserBean implements UserBeanLocal {
// return userFacade.searchForName(name);
// }
@Override
@RolesAllowed(UserPermission.S_CREATE_NEW)
public void createNewUser(EventUser user, String password) {
......@@ -546,21 +547,42 @@ public class UserBean implements UserBeanLocal {
@Override
@RolesAllowed(UserPermission.S_INVITE_USERS)
public boolean invite(String invitemail, String url) {
public boolean invite(String invitemail, String url, GroupMembership inviteGm) {
invitemail = invitemail.trim();
List<User> usercheck = userFacade.findByEmail(invitemail);
if (usercheck.size() > 0) {
if (usercheck.size() > 0 && inviteGm == null) {
logger.info("Email already exists {}", invitemail);
return false;
}
EventUser creator = permbean.getCurrentUser();
LanEvent ev = eventBean.getCurrentEvent();
PlaceGroup pg = new PlaceGroup(ev, Calendar.getInstance(), Calendar.getInstance(), false);
String token;
do {
token = PasswordFunctions.generateRandomString(30, PasswordFunctions.ALL_CHARS);
} while (gmfacade.findByToken(token) != null); // newer trust random
PlaceGroup pg;
if(inviteGm != null) {
inviteGm.setInviteToken(token);
inviteGm.setInviteEmail(invitemail);
gmfacade.merge(inviteGm);
pg = inviteGm.getPlaceGroup();
} else {
pg = new PlaceGroup(ev, Calendar.getInstance(), Calendar.getInstance(), false);
pg.setCreator(creator);
pg.setName("Invite to " + invitemail);
String token = PasswordFunctions.generateRandomString(30, PasswordFunctions.ALL_CHARS);
pg.getMembers().add(new GroupMembership(pg, null, token));
GroupMembership gm = new GroupMembership(pg, null, token);
gm.setInviteEmail(invitemail);
pg.getMembers().add(gm);
pgfacade.create(pg);
}
MailMessage msg = new MailMessage();
msg.setSubject(eventBean.getPropertyString(LanEventPropertyKey.INVITEMAIL_SUBJECT));
......@@ -573,6 +595,15 @@ public class UserBean implements UserBeanLocal {
}
@Override
public void cancelInvite(GroupMembership ship) {
ship = gmfacade.merge(ship);
ship.setInviteToken(gmfacade.createInviteToken());
ship.setInviteEmail(null);
ship.setInviteName(null);
}
@Override
@PermitAll
public GroupMembership findToken(String token) {
return gmfacade.findByToken(token);
......@@ -599,13 +630,19 @@ public class UserBean implements UserBeanLocal {
public boolean createFromInviteToken(EventUser user, String token) {
if (user == null || user.getLogin() == null)
return false;
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());
if(user.getLogin() == null || user.getLogin().trim().isEmpty()) {
user.setLogin(user.getEmail());
}
gm.setUser(user);
gm.setInviteAccepted(Calendar.getInstance());
......@@ -724,6 +761,13 @@ public class UserBean implements UserBeanLocal {
}
@Override
public boolean userExistsByEmail(String email) {
List<User> usr = userFacade.findByEmail(email);
return (usr != null && usr.size() > 0);
}
@Override
public EventUser findByEventUserId(Integer integer) {
return eventUserFacade.find(integer);
}
......
......@@ -93,7 +93,7 @@ public class UserFacade extends IntegerPkGenericFacade<User> {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(User.class);
Root<User> root = cq.from(User.class);
cq.where(cb.equal(root.get(User_.login), login));
cq.where(cb.equal(cb.lower(root.get(User_.login)), login.toLowerCase()));
return getSingleNullableResult(getEm().createQuery(cq));
}
......@@ -139,7 +139,7 @@ public class UserFacade extends IntegerPkGenericFacade<User> {
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(User.class);
Root<User> root = cq.from(User.class);
cq.where(cb.equal(root.get(User_.email), email));
cq.where(cb.equal(cb.upper(root.get(User_.email)), email.toUpperCase()));
return getEm().createQuery(cq).getResultList();
}
......
......@@ -18,7 +18,7 @@
<h:outputText rendered="#{empty placeGroupView.groupMemberships}" value="#{i18n['placegroupview.noMemberships']}" />
<h:form rendered="#{!empty placeGroupView.groupMemberships}" id="placelistform">
<p:dataTable value="#{placeGroupView.groupMemberships}" var="member">
<p:dataTable value="#{placeGroupView.groupMemberships}" var="member" id="placestable">
<p:column>
<f:facet name="header">
......@@ -38,7 +38,6 @@
</f:facet>
<h:outputText rendered="#{empty member.user}" value="#{member.inviteToken}" />
<h:outputText rendered="#{!empty member.user}" value="#{member.user.firstnames} #{member.user.lastname} (#{member.user.nick})" />
</p:column>
<p:column>
<f:facet name="header">
......@@ -50,9 +49,22 @@
<p:column>
<h:commandButton rendered="#{placeGroupView.canModifyCurrent and placeGroupView.currentMemberUserNotNull and placeGroupView.currentReleaseAllowed}" action="#{placeGroupView.releasePlace()}" value="#{i18n['placegroupview.releasePlace']}" />
<p:inputText immediate="true" rendered="#{placeGroupView.canSendInviteCurrent}" value="#{placeGroupView.inviteMail}" />
<p:commandButton rendered="#{placeGroupView.canSendInviteCurrent}" value="#{i18n['user.invite']}" actionListener="#{placeGroupView.sendInvite}" update=":messages placestable" />
<h:outputText rendered="#{placeGroupView.showCancelInviteCurrent}" value="#{member.inviteEmail}" />&nbsp;&nbsp;
<p:commandButton rendered="#{placeGroupView.showCancelInviteCurrent}" value="#{i18n['user.cancelInvite']}" actionListener="#{placeGroupView.cancelInvite}" update=":messages placestable" />
</p:column>
</p:dataTable>
<p:dialog header="Basic Dialog" widgetVar="dlg1" minHeight="40">
<h:outputText value="Resistance to PrimeFaces is futile!" />
</p:dialog>
</h:form>
<p>
......
......@@ -11,14 +11,13 @@
</f:metadata>
<ui:define name="title">
<h1>
<h:outputText value="#{i18n['user.invite.header']}" />
<h:outputText rendered="#{!inviteAcceptView.placeGroupMembership}" value="#{i18n['user.invite.header']}" />
<h:outputText rendered="#{inviteAcceptView.placeGroupMembership}" value="#{i18n['user.invite.placeInvite.header']}" />
</h1>
</ui:define>
<ui:define name="content">
<ui:fragment rendered="#{!inviteAcceptView.done}">
<h2>
<h:outputText value="#{i18n['invite.existingUserHeader']}" />
</h2>
<p:fieldset legend="#{i18n['invite.existingUserHeader']}">
<h:form>
<h:panelGrid columns="2">
<h:outputLabel for="login" />
......@@ -29,13 +28,12 @@
</h:panelGrid>
<p:commandButton id="submit" action="#{inviteAcceptView.loginWithExisting()}" ajax="false" value="#{i18n['login.submit']}" />
</h:form>
</p:fieldset>
<h2>
<h:outputText value="#{i18n['invite.createNewUserHeader']}" />
</h2>
<br /><br /><br />
<p:fieldset legend="#{i18n['invite.createNewUserHeader']}">
<users:create creating="true" commitaction="#{inviteAcceptView.createUser()}" commitvalue="#{i18n['user.create']}" />
</p:fieldset>
</ui:fragment>
</ui:define>
</ui:composition>
......
......@@ -19,7 +19,9 @@
package fi.codecrew.moya.web.cdiview.map;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.enterprise.context.ConversationScoped;
......@@ -28,6 +30,7 @@ import javax.inject.Inject;
import javax.inject.Named;
import fi.codecrew.moya.beans.PlaceGroupBeanLocal;
import fi.codecrew.moya.beans.UserBeanLocal;
import fi.codecrew.moya.enums.apps.MapPermission;
import fi.codecrew.moya.model.EventUser;
import fi.codecrew.moya.model.GroupMembership;
......@@ -35,12 +38,17 @@ import fi.codecrew.moya.model.Place;
import fi.codecrew.moya.model.PlaceGroup;
import fi.codecrew.moya.web.annotations.SelectedUser;
import fi.codecrew.moya.web.cdiview.GenericCDIView;
import fi.codecrew.moya.web.cdiview.shop.InviteView;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Named("placeGroupView")
@ConversationScoped
public class PlacegroupView extends GenericCDIView {
private static final long serialVersionUID = -3934253910818396155L;
private static final Logger logger = LoggerFactory.getLogger(PlacegroupView.class);
// @Inject
// private UserView userview;
......@@ -51,6 +59,12 @@ public class PlacegroupView extends GenericCDIView {
@EJB
private transient PlaceGroupBeanLocal placegroupBean;
@EJB
UserBeanLocal userBean;
@Inject
private InviteView inviteView;
private Place place;
private PlaceGroup group;
......@@ -59,6 +73,8 @@ public class PlacegroupView extends GenericCDIView {
private transient ListDataModel<GroupMembership> memberlist;
private Map<Integer, String> inviteMails = new HashMap<>();
public String editGroup() {
setGroup(placegroups.getRowData());
setPlacelist(new ListDataModel<Place>(group.getPlaces()));
......@@ -80,6 +96,35 @@ public class PlacegroupView extends GenericCDIView {
return canModify(memberlist.getRowData());
}
public boolean isShowCancelInviteCurrent() {
GroupMembership row = memberlist.getRowData();
if(row == null)
return false;
if(!isCanModifyCurrent())
return false;
if(row.getUser() == null && (row.getInviteEmail() != null && !row.getInviteEmail().trim().isEmpty()))
return true;
return false;
}
public boolean isCanSendInviteCurrent() {
GroupMembership row = memberlist.getRowData();
if(row == null)
return false;
if(!isCanModifyCurrent())
return false;
if(row.getUser() == null && (row.getInviteEmail() == null || row.getInviteEmail().trim().isEmpty()))
return true;
return false;
}
public boolean isCurrentMemberUserNotNull() {
GroupMembership row = memberlist.getRowData();
if (row != null && row.getUser() != null)
......@@ -169,4 +214,45 @@ public class PlacegroupView extends GenericCDIView {
public void setUser(EventUser user) {
this.user = user;
}
public void sendInvite() {
GroupMembership row = memberlist.getRowData();
if (row != null) {
if (permbean.isCurrentUser(row.getPlaceGroup().getCreator()) || permbean.hasPermission(MapPermission.MANAGE_OTHERS)) {
String inviteMail = inviteMails.get(row.getId());
inviteView.setInviteGm(row);
inviteView.setInvitemail(inviteMail);
inviteView.invite();
}
}
}
public void cancelInvite() {
GroupMembership row = memberlist.getRowData();
if (row != null) {
if (permbean.isCurrentUser(row.getPlaceGroup().getCreator()) || permbean.hasPermission(MapPermission.MANAGE_OTHERS)) {
userBean.cancelInvite(row);
}
}
}
public String getInviteMail() {
GroupMembership row = memberlist.getRowData();
if(row != null) {
return inviteMails.get(row.getId());
}
return null;
}
public void setInviteMail(String inviteMail) {
GroupMembership row = memberlist.getRowData();
if(row != null) {
inviteMails.put(row.getId(), inviteMail);
}
}
}
......@@ -27,6 +27,7 @@ import javax.inject.Named;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import fi.codecrew.moya.web.cdiview.user.AuthView;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -50,6 +51,9 @@ public class InviteAcceptView extends GenericCDIView {
@Inject
private UserView userview;
@Inject
private AuthView authView;
private EventUser user;
private boolean done = false;
......@@ -60,6 +64,8 @@ public class InviteAcceptView extends GenericCDIView {
private static final Logger logger = LoggerFactory.getLogger(InviteAcceptView.class);
private boolean placeGroupMembership = false;
public void initView() {
if (membership == null) {
......@@ -72,6 +78,10 @@ public class InviteAcceptView extends GenericCDIView {
} else if (user == null) {
user = new EventUser(new User(), null, permbean.getCurrentUser());
userview.setUser(user);
if(membership.getPlaceReservation() != null)
setPlaceGroupMembership(true);
super.beginConversation();
}
......@@ -89,6 +99,14 @@ public class InviteAcceptView extends GenericCDIView {
EventUser eu = userbean.acceptInviteForExistingUser(username, password, token);
if (eu != null) {
login(username, password);
this.username = null;
this.password = null;
super.addFaceMessage("invite.userCreateSuccessfull");
if(isPlaceGroupMembership())
return "/place/myGroups.jsf";
else
return "/index.jsf";
}
this.username = null;
this.password = null;
......@@ -102,11 +120,11 @@ public class InviteAcceptView extends GenericCDIView {
String existingUsername = null;
if (req.getUserPrincipal() != null) {
if (User.ANONYMOUS_LOGINNAME.equals(req.getUserPrincipal().getName())) {
if (req.getUserPrincipal() != null) {
try {
req.logout();
} catch (ServletException e) {
logger.warn("Logging out anonymous failed!", e);
logger.warn("Logging out previous user failed!", e);
}
} else {
existingUsername = req.getUserPrincipal().getName();
......@@ -127,6 +145,16 @@ public class InviteAcceptView extends GenericCDIView {
user.getUser().resetPassword(userview.getPassword());
if (userbean.createFromInviteToken(user, token)) {
login(user.getUser().getLogin(), userview.getPassword());
super.addFaceMessage("invite.userCreateSuccessfull");
done = true;
user = null;
if(isPlaceGroupMembership())
return "/place/myGroups.jsf";
else
return "/index.jsf";
}
super.addFaceMessage("invite.userCreateSuccessfull");
done = true;
......@@ -174,4 +202,11 @@ public class InviteAcceptView extends GenericCDIView {
this.password = password;
}
public boolean isPlaceGroupMembership() {
return placeGroupMembership;
}
public void setPlaceGroupMembership(boolean placeGroupMembership) {
this.placeGroupMembership = placeGroupMembership;
}
}
......@@ -24,6 +24,7 @@ import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import fi.codecrew.moya.model.GroupMembership;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -39,6 +40,9 @@ public class InviteView extends GenericCDIView {
private String invitemail;
private GroupMembership inviteGm;
@EJB
private transient UserBeanLocal userbean;
......@@ -68,7 +72,9 @@ public class InviteView extends GenericCDIView {
path.append("/")
.append(FacesContext.getCurrentInstance().getExternalContext().getContextName())
.append("/user/acceptInvite.jsf?token={0}");
boolean ret = userbean.invite(invitemail, path.toString());
boolean ret = userbean.invite(invitemail, path.toString(), inviteGm);
if (ret) {
this.addFaceMessage("invite.successfull");
invitemail = "";
......@@ -87,4 +93,13 @@ public class InviteView extends GenericCDIView {
return invitemail;
}
public GroupMembership getInviteGm() {
return inviteGm;
}
public void setInviteGm(GroupMembership inviteGm) {
this.inviteGm = inviteGm;
}
}
......@@ -65,6 +65,10 @@ public class UserValidator implements Serializable {
message(context, ui, "user.emailtooshortmessage", EMAIL_MIN_LENGTH);
}
if(userbean.userExistsByEmail(email) || userbean.userExists(email)) {
message(context, ui, "userview.userExistsByEmail");
}
if (!permbean.hasPermission(UserPermission.MODIFY) && (email == null || email.indexOf('@') == -1)) {
message(context, ui, "userview.invalidEmail");
}
......
......@@ -426,3 +426,6 @@ user.createdmessage=K\u00E4ytt\u00E4j\u00E4tunnus on luotu onnistuneesti.
product.vat=ALV-%
productFlag.CREATE_NEW_PLACE_WHEN_BOUGHT=Luo uusi paikka ostettaessa
submenu.neomap.view=Paikkakartta
user.cancelInvite=Peruuta kutsu
user.invite.placeInvite.header=Liit\u00E4 paikka itsellesi
userview.userExistsByEmail=
......@@ -1559,7 +1559,7 @@ usertitle.managingUser = Shop
userview.header = Users
userview.invalidEmail = Invalid email address
userview.loginstringFaulty = Username has to be atleast 2 characters long!
userview.loginstringFaulty = Username has to be atleast 2 characters long\!
userview.oldPasswordError = Invalid password!
userview.passwordTooShort = Password has to be atleast {0} characters long\!
userview.passwordsChanged = Password changed
......@@ -1623,3 +1623,6 @@ user.emailAgain=Email (again)
required=Required
usercart.showoverview=
submenu.neomap.view=Map
user.cancelInvite=Cancel invite
user.invite.placeInvite.header=Receive sendet place
userview.userExistsByEmail=Email already exists\! You may already have an account.
......@@ -1604,3 +1604,6 @@ user.emailsunmatch=S\u00E4hk\u00F6postiosoitteet eiv\u00E4t t\u00E4sm\u00E4\u00E
user.emailAgain=S\u00E4hk\u00F6posti (uudelleen)
required=Vaaditaan
submenu.neomap.view=Paikkakartta
user.cancelInvite=Peruuta kutsu
user.invite.placeInvite.header=Vastaanota l\u00E4hetetty paikka
userview.userExistsByEmail=S\u00E4hk\u00F6posti on jo olemassa. Sinulla saattaa jo olla tunnus j\u00E4rjestelm\u00E4ss\u00E4.
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!