package org.alfresco.repo.invitation; import static org.alfresco.repo.invitation.WorkflowModelNominatedInvitation.wfVarAcceptUrl; import static org.alfresco.repo.invitation.WorkflowModelNominatedInvitation.wfVarInviteTicket; import static org.alfresco.repo.invitation.WorkflowModelNominatedInvitation.wfVarInviteeGenPassword; import static org.alfresco.repo.invitation.WorkflowModelNominatedInvitation.wfVarInviteeUserName; import static org.alfresco.repo.invitation.WorkflowModelNominatedInvitation.wfVarInviterUserName; import static org.alfresco.repo.invitation.WorkflowModelNominatedInvitation.wfVarRejectUrl; import static org.alfresco.repo.invitation.WorkflowModelNominatedInvitation.wfVarResourceName; import static org.alfresco.repo.invitation.WorkflowModelNominatedInvitation.wfVarRole; import static org.alfresco.repo.invitation.WorkflowModelNominatedInvitation.wfVarServerPath; import java.util.Arrays; import java.util.Collection; import java.util.Map; import org.alfresco.repo.i18n.MessageService; import org.alfresco.repo.invitation.site.InviteSender; import org.alfresco.repo.invitation.site.KoyaInviteSender; import org.alfresco.repo.jscript.ScriptNode; import org.alfresco.repo.model.Repository; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; import org.alfresco.repo.workflow.WorkflowModel; import org.alfresco.service.ServiceRegistry; import org.alfresco.service.cmr.action.ActionService; import org.alfresco.service.cmr.invitation.InvitationService; import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.TemplateService; import org.alfresco.service.cmr.security.MutableAuthenticationService; import org.alfresco.service.cmr.security.PersonService; import org.alfresco.service.cmr.site.SiteService; import org.alfresco.service.cmr.workflow.WorkflowService; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.util.collections.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.InitializingBean; import fr.itldev.koya.alfservice.CompanyPropertiesService; import fr.itldev.koya.alfservice.CompanyService; import fr.itldev.koya.alfservice.KoyaMailService; import fr.itldev.koya.alfservice.KoyaNodeService; import fr.itldev.koya.alfservice.UserService; import fr.itldev.koya.alfservice.security.SpaceAclService; /** * * */ public class KoyaInviteHelper extends InviteHelper implements InitializingBean { private static final Log logger = LogFactory .getLog(ModeratedActionReject.class); private static final Collection<String> sendInvitePropertyNames = Arrays .asList(wfVarInviteeUserName,// wfVarResourceName,// wfVarInviterUserName,// wfVarInviteeUserName,// wfVarRole,// wfVarInviteeGenPassword,// wfVarResourceName,// wfVarInviteTicket,// wfVarServerPath,// wfVarAcceptUrl,// wfVarRejectUrl, InviteSender.WF_INSTANCE_ID); private Repository repositoryHelper; private ServiceRegistry serviceRegistry; private ActionService actionService; private InvitationService invitationService; private MutableAuthenticationService authenticationService; private MessageService messageService; private NamespaceService namespaceService; private PersonService personService; private SiteService siteService; private TemplateService templateService; private WorkflowService workflowService; private NodeService nodeService; private CompanyPropertiesService companyPropertiesService; private UserService userService; private InviteSender inviteSender; /** * * Koya specific property */ private KoyaMailService koyaMailService; private KoyaNodeService koyaNodeService; private SpaceAclService spaceAclService; private CompanyService companyService; public void setKoyaMailService(KoyaMailService koyaMailService) { this.koyaMailService = koyaMailService; } public void setKoyaNodeService(KoyaNodeService koyaNodeService) { this.koyaNodeService = koyaNodeService; } public void setSpaceAclService(SpaceAclService companyAclService) { this.spaceAclService = spaceAclService; } public void setCompanyService(CompanyService companyService) { this.companyService = companyService; } public void setCompanyPropertiesService( CompanyPropertiesService companyPropertiesService) { this.companyPropertiesService = companyPropertiesService; } public void setUserService(UserService userService) { this.userService = userService; } @Override public void afterPropertiesSet() { super.afterPropertiesSet(); this.actionService = serviceRegistry.getActionService(); this.authenticationService = serviceRegistry.getAuthenticationService(); this.invitationService = serviceRegistry.getInvitationService(); this.namespaceService = serviceRegistry.getNamespaceService(); this.personService = serviceRegistry.getPersonService(); this.siteService = serviceRegistry.getSiteService(); this.templateService = serviceRegistry.getTemplateService(); this.workflowService = serviceRegistry.getWorkflowService(); this.nodeService = serviceRegistry.getNodeService(); this.inviteSender = new KoyaInviteSender(serviceRegistry, repositoryHelper, messageService, koyaMailService, koyaNodeService, spaceAclService, companyService, companyPropertiesService,userService, koyaMailService.getKoyaClientParams()); } /** * redefined method in order to execute membership setting as system user so * collaborator can send invitations that are acceptable. * * @param invitee * @param siteName * @param role * @param runAsUser * @param overrideExisting */ @Override public void addSiteMembership(final String invitee, final String siteName, final String role, final String runAsUser, final boolean overrideExisting) { AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork<Void>() { @Override public Void doWork() throws Exception { if (overrideExisting || !siteService.isMember(siteName, invitee)) { siteService.setMembership(siteName, invitee, role); } return null; } }, AuthenticationUtil.getSystemUserName()); } @Override public void acceptNominatedInvitation(Map<String, Object> executionVariables) { final String invitee = (String) executionVariables .get(WorkflowModelNominatedInvitation.wfVarInviteeUserName); String siteShortName = (String) executionVariables .get(WorkflowModelNominatedInvitation.wfVarResourceName); String inviter = (String) executionVariables .get(WorkflowModelNominatedInvitation.wfVarInviterUserName); String role = (String) executionVariables .get(WorkflowModelNominatedInvitation.wfVarRole); AuthenticationUtil.runAsSystem(new RunAsWork<Void>() { @Override public Void doWork() throws Exception { if (authenticationService.isAuthenticationMutable(invitee)) { authenticationService.setAuthenticationEnabled(invitee, true); } return null; } }); addSiteMembership(invitee, siteShortName, role, inviter, false); } @Override public void sendNominatedInvitation(String inviteId, Map<String, Object> executionVariables) { if (invitationService.isSendEmails()) { Map<String, String> properties = makePropertiesFromContextVariables( executionVariables, sendInvitePropertyNames); String packageName = WorkflowModel.ASSOC_PACKAGE.toPrefixString( namespaceService).replace(":", "_"); ScriptNode packageNode = (ScriptNode) executionVariables .get(packageName); String packageRef = packageNode.getNodeRef().toString(); properties.put(InviteSender.WF_PACKAGE, packageRef); properties.put(InviteSender.WF_INSTANCE_ID, inviteId); //DO NOT SEND MAIL AT INVITATION PROCESS START. //do it in companyAclService.inviteMember after addSharedNode to //created user // inviteSender.sendMail(properties); } } @SuppressWarnings("unchecked") private Map<String, String> makePropertiesFromContextVariables( Map<?, ?> executionVariables, Collection<String> propertyNames) { return CollectionUtils.filterKeys( (Map<String, String>) executionVariables, CollectionUtils.containsFilter(propertyNames)); } /** * @param messageService * the messageService to set */ @Override public void setMessageService(MessageService messageService) { super.setMessageService(messageService); this.messageService = messageService; } /** * @param repositoryHelper * the repositoryHelper to set */ @Override public void setRepositoryHelper(Repository repositoryHelper) { super.setRepositoryHelper(repositoryHelper); this.repositoryHelper = repositoryHelper; } /** * @param serviceRegistry * the serviceRegistry to set */ @Override public void setServiceRegistry(ServiceRegistry serviceRegistry) { super.setServiceRegistry(serviceRegistry); this.serviceRegistry = serviceRegistry; } }