/* This file is part of Cyclos (www.cyclos.org). A project of the Social Trade Organisation (www.socialtrade.org). Cyclos is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. Cyclos is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Cyclos; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package nl.strohalm.cyclos.controls.members; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import nl.strohalm.cyclos.controls.BasePublicFormAction; import nl.strohalm.cyclos.entities.access.MemberUser; import nl.strohalm.cyclos.entities.access.User; import nl.strohalm.cyclos.entities.exceptions.DaoException; import nl.strohalm.cyclos.entities.groups.MemberGroup; import nl.strohalm.cyclos.entities.members.PendingMember; import nl.strohalm.cyclos.entities.members.RegisteredMember; import nl.strohalm.cyclos.entities.members.RegistrationAgreement; import nl.strohalm.cyclos.utils.ActionHelper; import nl.strohalm.cyclos.utils.LoginHelper; import nl.strohalm.cyclos.utils.validation.ValidationException; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; /** * Action used to accept a registration agreement * * @author luis */ public class AcceptRegistrationAgreementAction extends BasePublicFormAction { @Override protected ActionForward handleDisplay(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) { // Find the RegisteredMember final RegisteredMember registeredMember = findRegisteredMember(actionForm, request); // Find the group / agreement final RegistrationAgreement registrationAgreement = findAgreement(registeredMember); if (registrationAgreement == null) { // No agreement? throw new ValidationException(); } // Store the attributes request.setAttribute("registeredMember", registeredMember); request.setAttribute("registrationAgreement", registrationAgreement); return mapping.getInputForward(); } @Override protected ActionForward handleSubmit(final ActionMapping mapping, final ActionForm actionForm, final HttpServletRequest request, final HttpServletResponse response) { // Find the RegisteredMember And agreement final RegisteredMember registeredMember = findRegisteredMember(actionForm, request); // Ensure the member won't be asked again to accept the agreement request.getSession().removeAttribute("shallAcceptRegistrationAgreement"); // Accept the agreement if (registeredMember instanceof PendingMember) { // A pending member, probably registered by broker or admin final PendingMember pendingMember = (PendingMember) registeredMember; try { elementService.setRegistrationAgreementAgreed(pendingMember); } catch (final DaoException e) { // The pending member has been removed final String validationKeyMessage = messageHelper.message("pendingMember.validationKey"); return ActionHelper.sendError(mapping, request, response, "errors.invalid", validationKeyMessage); } // Go to the regular registration validation return ActionHelper.redirectWithParam(request, mapping.findForward("validateRegistration"), "key", pendingMember.getValidationKey()); } else { // A member, probably changed from a group which had another registration agreement elementService.acceptAgreement(request.getRemoteAddr()); return mapping.findForward("login"); } } private RegistrationAgreement findAgreement(final RegisteredMember registeredMember) { final MemberGroup group = groupService.load(registeredMember.getMemberGroup().getId(), MemberGroup.Relationships.REGISTRATION_AGREEMENT); return group.getRegistrationAgreement(); } private RegisteredMember findRegisteredMember(final ActionForm actionForm, final HttpServletRequest request) { RegisteredMember registeredMember = null; final User loggedUser = LoginHelper.getLoggedUser(request); if (loggedUser == null) { // No logged user means the user is coming from a public e-mail validation: get a PendingMember by validation key final AcceptRegistrationAgreementForm form = (AcceptRegistrationAgreementForm) actionForm; try { final String validationKey = form.getKey(); registeredMember = elementService.loadPendingMemberByKey(validationKey); } catch (final Exception e) { // ignore: will break later } } else if (loggedUser instanceof MemberUser) { registeredMember = ((MemberUser) loggedUser).getMember(); } // Not found if (registeredMember == null) { throw new ValidationException(); } return registeredMember; } }