Commit 46cd8c2c by Tuukka Kivilahti

ny paikan voi antaa etiäpäin ja se häviää itelle, samalla invite rewriteä

1 parent e7532fc7
......@@ -141,6 +141,12 @@ public class PlaceGroupBean implements PlaceGroupBeanLocal {
boolean ret = false;
if (mem != null && mem.getUser() == null) {
loggerbean.sendMessage(MoyaEventType.INVITE_ACCEPTED, user, "Moya place accepted by user. ", mem);
// change token, just in case
mem.setInviteToken(gmemfacade.createInviteToken());
mem.setUser(user);
// gmemfacade.merge(mem);
ret = true;
......
......@@ -48,6 +48,7 @@ import javax.imageio.ImageIO;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import fi.codecrew.moya.enums.apps.MapPermission;
import org.apache.commons.codec.binary.Hex;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -546,7 +547,6 @@ public class UserBean implements UserBeanLocal {
// }
@Override
@RolesAllowed(UserPermission.S_INVITE_USERS)
public boolean invite(String invitemail, String url, GroupMembership inviteGm) {
invitemail = invitemail.trim();
......@@ -560,19 +560,29 @@ public class UserBean implements UserBeanLocal {
LanEvent ev = eventBean.getCurrentEvent();
String token;
do {
token = PasswordFunctions.generateRandomString(30, PasswordFunctions.ALL_CHARS);
} while (gmfacade.findByToken(token) != null); // newer trust random
String token = gmfacade.createInviteToken();
PlaceGroup pg;
if(inviteGm != null) {
if(!permbean.hasPermission(MapPermission.MANAGE_OTHERS)) {
if (inviteGm.getUser() != null && !permbean.isCurrentUser(inviteGm.getUser())) {
throw new EJBAccessException("No permission to reinvite to that place");
}
if (inviteGm.getUser() == null && !permbean.isCurrentUser(inviteGm.getPlaceGroup().getCreator())) {
throw new EJBAccessException("No permission to invite to that place");
}
}
inviteGm.setInviteToken(token);
inviteGm.setInviteEmail(invitemail);
gmfacade.merge(inviteGm);
pg = inviteGm.getPlaceGroup();
} else {
if(!permbean.hasPermission(UserPermission.INVITE_USERS)) {
throw new EJBAccessException("No permission to invite other people");
}
pg = new PlaceGroup(ev, Calendar.getInstance(), Calendar.getInstance(), false);
pg.setCreator(creator);
pg.setName("Invite to " + invitemail);
......@@ -613,15 +623,26 @@ public class UserBean implements UserBeanLocal {
@PermitAll
public EventUser acceptInviteForExistingUser(String username, String password, String token) {
GroupMembership gm = findToken(token);
if (gm == null || gm.getUser() != null || gm.getInviteAccepted() != null) {
if (gm == null || ((gm.getUser() != null || gm.getInviteAccepted() != null) && gm.getPlaceReservation() == null)) {
return null;
}
User u = userFacade.findByLogin(username);
EventUser eu = this.getEventUser(u, true);
// it's nice to check password also
EventUser eu = validateUser(username, password, true);
if(eu == null)
return null;
loggerbean.sendMessage(MoyaEventType.INVITE_ACCEPTED, eu, "Ivite accepted by current user", gm, gm.getUser());
gm.setUser(eu);
gm.setInviteAccepted(Calendar.getInstance());
gm.setInviteEmail(null);
// change token, just in case
gm.setInviteToken(gmfacade.createInviteToken());
return eu;
}
......@@ -634,7 +655,7 @@ public class UserBean implements UserBeanLocal {
GroupMembership gm = findToken(token);
// Check that invite has not already been accepted!
if (gm == null || gm.getUser() != null || gm.getInviteAccepted() != null) {
if (gm == null || ((gm.getUser() != null || gm.getInviteAccepted() != null) && gm.getPlaceReservation() == null)) {
return false;
}
user.setEvent(eventBean.getCurrentEvent());
......@@ -646,6 +667,9 @@ public class UserBean implements UserBeanLocal {
gm.setUser(user);
gm.setInviteAccepted(Calendar.getInstance());
// change token, just in case
gm.setInviteToken(gmfacade.createInviteToken());
eventUserFacade.create(user);
return true;
}
......@@ -814,17 +838,20 @@ public class UserBean implements UserBeanLocal {
return ret;
}
@Override
public EventUser validateUser(String username, String password)
{
private EventUser validateUser(String username, String password, boolean createEventUser) {
User user = userFacade.findByLogin(username);
EventUser ret = null;
if (user != null && user.checkPassword(password))
{
ret = this.getEventUser(user, false);
ret = this.getEventUser(user, createEventUser);
}
return ret;
}
@Override
public EventUser validateUser(String username, String password)
{
return validateUser(username, password,false);
}
@Override
......
......@@ -65,13 +65,16 @@ public class GroupMembershipFacade extends IntegerPkGenericFacade<GroupMembershi
logger.info("Generated token {} found from GoupMembership: {} Generating new!", token, gm);
}
token = eventbean.getCurrentEvent().getId().toString();
token += PasswordFunctions.generateRandomString(15);
token += PasswordFunctions.generateRandomString(30);
gm = findByToken(token);
} while (gm != null);
return token;
}
public GroupMembership findByToken(String token) {
if(token == null || token.trim().isEmpty())
return null;
CriteriaBuilder cb = getEm().getCriteriaBuilder();
CriteriaQuery<GroupMembership> cq = cb.createQuery(GroupMembership.class);
Root<GroupMembership> root = cq.from(GroupMembership.class);
......
......@@ -12,6 +12,7 @@ public enum MoyaEventType {
PLACE_ERROR(MoyaEventSource.PLACEMAP),
ACCOUNTEVENT_INFO(MoyaEventSource.USER),
USER_PERMISSION_VIOLATION(MoyaEventSource.USER),
INVITE_ACCEPTED(MoyaEventSource.USER),
;
......
<!DOCTYPE html
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"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"
......
......@@ -136,7 +136,7 @@
</tr>
<tr>
<td colspan="2"><b><h:outputLabel value="#{i18n['user.email']}" for="email" /></b> <br /> <p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText validator="#{userValidator.validateEmail}" size="45" id="email" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.email}" />
<p:inputText validator="#{userValidator.validateEmailEdit}" size="45" id="email" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.email}" />
</p:inplace></td>
</tr>
<tr>
......
......@@ -37,7 +37,8 @@
<h:outputText value="#{i18n['placegroupview.token']}" />
</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})" />
<h:outputText rendered="#{(!empty member.user) and placeGroupView.canModifyCurrent}" value="#{member.user.firstnames} #{member.user.lastname} (#{member.user.nick})" />
<h:outputText rendered="#{(!empty member.user) and !placeGroupView.canModifyCurrent}" value="#{i18n['placegroupview.placetransferred']}" />
</p:column>
<p:column>
<f:facet name="header">
......@@ -48,11 +49,11 @@
</p:column>
<p:column>
<h:commandButton rendered="#{placeGroupView.canModifyCurrent and placeGroupView.currentMemberUserNotNull and placeGroupView.currentReleaseAllowed}" action="#{placeGroupView.releasePlace()}" value="#{i18n['placegroupview.releasePlace']}" />
<h:commandButton rendered="#{placeGroupView.currentReleaseAllowed}" action="#{placeGroupView.releasePlace()}" value="#{i18n['placegroupview.releasePlace']}" />
<p:inputText immediate="true" rendered="#{placeGroupView.canSendInviteCurrent}" value="#{placeGroupView.inviteMail}" />
<p:inputText id="inviteEmail" immediate="true" rendered="#{placeGroupView.canSendInviteCurrent}" value="#{placeGroupView.inviteMail}" />
<p:commandButton rendered="#{placeGroupView.canSendInviteCurrent}" value="#{i18n['user.invite']}" actionListener="#{placeGroupView.sendInvite}" update=":messages placestable" />
<p:watermark for="inviteEmail" rendered="#{placeGroupView.canSendInviteCurrent}" value="#{i18n['user.email']}" id="inviteEmailWatermark" />
<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" />
......
......@@ -124,7 +124,7 @@
<p:message for="town" />
<p:outputLabel value="#{i18n['user.email']}" for="email" />
<p:inputText validator="#{userValidator.validateEmail}" size="25" id="email" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.email}" />
<p:inputText validator="#{userValidator.validateEmailEdit}" size="25" id="email" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.email}" />
<p:message for="email" />
<p:outputLabel value="#{i18n['user.phone']}" for="phone" />
......
......@@ -128,7 +128,7 @@
<tr>
<td colspan="2"><h:outputLabel value="#{i18n['user.email']}" for="email" /> <br />
<p:inplace emptyLabel="#{i18n['user.insert']}">
<p:inputText validator="#{userValidator.validateEmail}" size="45" id="email" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.email}" />
<p:inputText validator="#{userValidator.validateEmailEdit}" size="45" id="email" disabled="#{!cc.attrs.creating and !userView.canSave}" value="#{userView.selectedUser.email}" />
</p:inplace></td>
</tr>
......
......@@ -49,6 +49,7 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import fi.codecrew.moya.clientutils.BortalLocalContextHolder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -92,10 +93,14 @@ public class IrcServlet extends HttpServlet {
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
IrcBot bot = new IrcBot("irc.cc.tut.fi", "#moya-debug", "moya-bot");
botbean.add(bot);
bots.add(bot);
bot.start();
// tuotannossa rakastan tätä, devauspuolella en.
if(!BortalLocalContextHolder.isInDevelopmentMode()) {
IrcBot bot = new IrcBot("irc.cc.tut.fi", "#moya-debug", "moya-bot");
botbean.add(bot);
bots.add(bot);
bot.start();
}
}
......
......@@ -82,18 +82,24 @@ public class PlacegroupView extends GenericCDIView {
return "/place/editGroup";
}
public boolean canModify(GroupMembership row) {
boolean ret = false;
if (row != null
&& (permbean.isCurrentUser(row.getPlaceGroup().getCreator()) || permbean
.hasPermission(MapPermission.MANAGE_OTHERS))) {
ret = true;
}
return ret;
}
public boolean isCanModifyCurrent() {
return canModify(memberlist.getRowData());
GroupMembership row = memberlist.getRowData();
if (row == null)
return false;
// if you are sitting on place, or can modify other users, then you can possibly modify this place
if(permbean.isCurrentUser(row.getUser()) || permbean.hasPermission(MapPermission.MANAGE_OTHERS) )
return true;
// or you are the creator, and no-one is sitting on the place
if(row.getUser() == null && permbean.isCurrentUser(row.getPlaceGroup().getCreator()))
return true;
return false;
}
public boolean isShowCancelInviteCurrent() {
......@@ -104,7 +110,7 @@ public class PlacegroupView extends GenericCDIView {
if(!isCanModifyCurrent())
return false;
if(row.getUser() == null && (row.getInviteEmail() != null && !row.getInviteEmail().trim().isEmpty()))
if((row.getInviteEmail() != null && !row.getInviteEmail().trim().isEmpty()))
return true;
return false;
......@@ -118,7 +124,10 @@ public class PlacegroupView extends GenericCDIView {
if(!isCanModifyCurrent())
return false;
if(row.getUser() == null && (row.getInviteEmail() == null || row.getInviteEmail().trim().isEmpty()))
if(isCurrentReleaseAllowed())
return false;
if(row.getInviteEmail() == null || row.getInviteEmail().trim().isEmpty())
return true;
return false;
......@@ -133,17 +142,35 @@ public class PlacegroupView extends GenericCDIView {
}
public boolean isCurrentReleaseAllowed() {
//placeGroupView.canModifyCurrent and placeGroupView.currentMemberUserNotNull and
GroupMembership row = memberlist.getRowData();
if(row == null || row.getUser() == null)
return false;
if(!isCanModifyCurrent())
return false;
if(row.getEnteredEvent() != null && !permbean.hasPermission(MapPermission.MANAGE_OTHERS))
return false;
return true;
// if it's your own place, and you are sitting on it, you can free it
if(permbean.isCurrentUser(row.getPlaceGroup().getCreator()) && permbean.isCurrentUser(row.getUser()))
return true;
// And ofcourse you can free it, if you are superadmin
if(permbean.hasPermission(MapPermission.MANAGE_OTHERS))
return true;
return false;
}
public ListDataModel<GroupMembership> getGroupMemberships() {
memberlist = new ListDataModel<GroupMembership>(
placegroupBean.getMembershipsAndCreations(user));
memberlist = new ListDataModel<GroupMembership>(placegroupBean.getMembershipsAndCreations(user));
return memberlist;
}
......@@ -217,20 +244,22 @@ public class PlacegroupView extends GenericCDIView {
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();
}
if(!isCanModifyCurrent()) {
this.addFaceMessage("invite.permissionDenied");
}
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)) {
if (isCanModifyCurrent()) {
userBean.cancelInvite(row);
}
}
......
......@@ -139,7 +139,6 @@ public class MenuView {
}
if (out != null) {
logger.info("Adding topmenu {}", out);
viewchangeTopmenu.add(new JsfMenuitem(topmenu.getKey(), out));
}
}
......
......@@ -72,10 +72,23 @@ public class InviteAcceptView extends GenericCDIView {
membership = userbean.findToken(token);
}
if (membership == null || membership.getInviteAccepted() != null) {
if (membership == null) {
this.addFaceMessage("invite.notFound");
done = true;
return;
}
// if there is place for this invitation, we can assume that this is resend
// (token is also regenerated afther every inviteaccept)
if(membership.getInviteAccepted() != null && membership.getPlaceReservation() == null) {
this.addFaceMessage("invite.notFound");
done = true;
} else if (user == null) {
return;
}
if (user == null) {
user = new EventUser(new User(), null, permbean.getCurrentUser());
userview.setUser(user);
......@@ -98,62 +111,78 @@ public class InviteAcceptView extends GenericCDIView {
EventUser eu = userbean.acceptInviteForExistingUser(username, password, token);
if (eu != null) {
login(username, password);
authView.setLogin(username);
authView.setPassword(password);
if(isPlaceGroupMembership())
navihandler.saveNavigation("/place/myGroups");
else
navihandler.saveNavigation("/index");
authView.executeLogin();
// code afther this should newer be run
this.username = null;
this.password = null;
super.addFaceMessage("invite.userCreateSuccessfull");
super.addFaceMessage("invite.userLoginSuccessfull");
if(isPlaceGroupMembership())
return "/place/myGroups";
return "/place/myGroups.jsf";
else
return "/index";
return "/index.jsf";
}
this.username = null;
this.password = null;
super.addFaceMessage("invite.userCreateSuccessfull");
super.addFaceMessage("invite.userLoginUnSuccessfull");
return null;
}
private void login(String usr, String pwd) {
HttpServletRequest req = getRequest();
public String createUser() {
if (req.getUserPrincipal() != null) {
try {
req.logout();
} catch (ServletException e) {
logger.warn("Logging out previous user failed!", e);
}
}
try {
req.login(usr.trim().toLowerCase(), pwd);
} catch (ServletException e) {
logger.warn("Login failed for invite user " + usr, e);
}
}
userbean.createNewUser(user, userview.getPassword());
public String createUser() {
password = userview.getPassword();
username = user.getLogin();
user.getUser().resetPassword(userview.getPassword());
// still there, ewerything must be ok, let's just login with our new user
return loginWithExisting();
/*
// user.getUser().resetPassword(userview.getPassword());
if (userbean.createFromInviteToken(user, token)) {
login(user.getUser().getLogin(), userview.getPassword());
authView.setLogin(username);
authView.setPassword(password);
if(isPlaceGroupMembership())
navihandler.saveNavigation("/place/myGroups");
else
navihandler.saveNavigation("/index");
authView.executeLogin();
// And rest should newer be run, if all works, I will maybe remove them
super.addFaceMessage("invite.userCreateSuccessfull");
done = true;
user = null;
if(isPlaceGroupMembership())
return "/place/myGroups";
return "/place/myGroups.jsf";
else
return "/index";
return "/index.jsf";
}
super.addFaceMessage("invite.userCreateSuccessfull");
done = true;
user = null;
return null;
return null;*/
}
public void setToken(String token) {
......
......@@ -56,6 +56,24 @@ public class UserValidator implements Serializable {
private static final Logger logger = LoggerFactory.getLogger(UserValidator.class);
//validateEmailEdit
public void validateEmailEdit(FacesContext context, UIComponent ui, Object value) {
String email = (String) value;
// I think that a@a.fi is shortest form of possible email?
if(email.trim().length() < EMAIL_MIN_LENGTH ) {
message(context, ui, "user.emailtooshortmessage", EMAIL_MIN_LENGTH);
}
if (!permbean.hasPermission(UserPermission.MODIFY) && (email == null || email.indexOf('@') == -1)) {
message(context, ui, "userview.invalidEmail");
}
}
public void validateEmail(FacesContext context, UIComponent ui, Object value) {
String email = (String) value;
......
......@@ -429,3 +429,7 @@ submenu.neomap.view=Paikkakartta
user.cancelInvite=Peruuta kutsu
user.invite.placeInvite.header=Liit\u00E4 paikka itsellesi
userview.userExistsByEmail=
invite.permissionDenied=Sinulla ei ole oikeutta luovuttaa paikkaa eteenp\u00E4in.
invite.userLoginSuccessfull=Kutsu vastaanotettu onnistuneesti
invite.userLoginUnSuccessfull=Kirjautuminen ep\u00E4onnistui
placegroupview.placetransferred=Paikka annettu eteenp\u00E4in
......@@ -1626,3 +1626,7 @@ 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.
invite.permissionDenied=You don't have permission to regive this place.
invite.userLoginSuccessfull=Invite accepted successfully
invite.userLoginUnSuccessfull=Login unsuccessfull
placegroupview.placetransferred=Place is transferred
......@@ -1607,3 +1607,7 @@ 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.
invite.permissionDenied=Sinulla ei ole oikeutta luovuttaa paikkaa eteenp\u00E4in.
invite.userLoginSuccessfull=Kutsu vastaanotettu onnistuneesti
invite.userLoginUnSuccessfull=Kirjautuminen ep\u00E4onnistui
placegroupview.placetransferred=Paikka on annettu eteenp\u00E4in.
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!