001package org.nuxeo.ecm.platform.groups.audit.service.acl.job.publish;
002
003import java.io.Serializable;
004import java.util.List;
005
006import org.apache.commons.logging.Log;
007import org.apache.commons.logging.LogFactory;
008import org.nuxeo.ecm.automation.AutomationService;
009import org.nuxeo.ecm.automation.InvalidChainException;
010import org.nuxeo.ecm.automation.OperationChain;
011import org.nuxeo.ecm.automation.OperationContext;
012import org.nuxeo.ecm.automation.OperationException;
013import org.nuxeo.ecm.automation.OperationParameters;
014import org.nuxeo.ecm.automation.core.mail.Mailer;
015import org.nuxeo.ecm.automation.core.operations.notification.SendMail;
016import org.nuxeo.ecm.automation.core.util.StringList;
017import org.nuxeo.ecm.core.api.Blob;
018import org.nuxeo.ecm.core.api.CoreSession;
019import org.nuxeo.ecm.core.api.DocumentModel;
020import org.nuxeo.ecm.core.api.NuxeoException;
021import org.nuxeo.ecm.core.api.UnrestrictedSessionRunner;
022import org.nuxeo.ecm.core.api.impl.blob.FileBlob;
023import org.nuxeo.ecm.platform.groups.audit.service.acl.utils.MessageAccessor;
024import org.nuxeo.runtime.api.Framework;
025
026public class PublishByMail implements IResultPublisher {
027
028    private static final long serialVersionUID = 1L;
029
030    private static final Log log = LogFactory.getLog(PublishByMail.class);
031
032    public static final String PROPERTY_ACLAUDIT_SENDMAIL_CHAIN = "ACL.Audit.SendMail";
033
034    public static final String PROPERTY_MAILFROM = "mail.from";
035
036    public static final String PROPERTY_MAIL_SUBJECT = "message.acl.audit.mail.title";
037
038    public static final String PROPERTY_MAIL_BODY = "message.acl.audit.mail.body";
039
040    public static String OUTPUT_FILE_NAME = "permissions.xls";
041
042    public static String FROM = "noreply@nuxeo.com";
043
044    protected String repositoryName;
045
046    protected String to;
047
048    protected String defaultFrom;
049
050    public PublishByMail(String to, String defaultFrom, String repositoryName) {
051        this.repositoryName = repositoryName;
052        this.to = to;
053        this.defaultFrom = defaultFrom;
054    }
055
056    @Override
057    public void publish(final Blob file) {
058        file.setFilename(OUTPUT_FILE_NAME);
059        new UnrestrictedSessionRunner(repositoryName) {
060            @Override
061            public void run() {
062                DocumentModel docToSend = createDocument(session, file, "", "");
063                doCallOperationSendMail(session, docToSend, to, defaultFrom);
064                log.debug("audit sent");
065            }
066        }.runUnrestricted();
067    }
068
069    protected void doCallOperationSendMail(CoreSession session, DocumentModel docToSend, String to, String defaultFrom)
070            {
071        String title = MessageAccessor.get(session, PROPERTY_MAIL_SUBJECT);
072        String body = MessageAccessor.get(session, PROPERTY_MAIL_BODY);
073        String from = Framework.getProperty(PROPERTY_MAILFROM, defaultFrom);
074        AutomationService automation = Framework.getLocalService(AutomationService.class);
075
076        OperationContext ctx = new OperationContext(session);
077        ctx.setInput(docToSend);
078
079        try {
080            OperationChain chain = new OperationChain(PROPERTY_ACLAUDIT_SENDMAIL_CHAIN);
081            OperationParameters params = chain.add(SendMail.ID);
082            if (params == null) {
083                log.error("failed to retrieve operation " + SendMail.ID + " in chain " + chain);
084                return;
085            }
086
087            // configure email
088            params.set("from", from);
089            params.set("to", to);
090            params.set("subject", title);
091            params.set("message", body);
092            String[] str = { "file:content" };
093            params.set("files", new StringList(str));
094            // TODO: see SendMail test case where we can directly pass a blob
095
096            // do send mail
097            log.debug("Automation run " + PROPERTY_ACLAUDIT_SENDMAIL_CHAIN + " for " + to);
098            automation.run(ctx, chain);
099            log.debug("Automation done " + PROPERTY_ACLAUDIT_SENDMAIL_CHAIN + " for " + to);
100        } catch (OperationException e) {
101            throw new NuxeoException(e);
102        }
103    }
104
105    protected OperationParameters findParameters(OperationChain chain, String id) {
106        List<OperationParameters> params = chain.getOperations();
107        for (OperationParameters p : params)
108            if (p.id().equals(id))
109                return p;
110        return null;
111    }
112
113    protected DocumentModel createDocument(CoreSession session, Blob blob, String title, String filename)
114            {
115        DocumentModel document = session.createDocumentModel("File");
116        document.setPropertyValue("file:content", (Serializable) blob);
117        document.setPropertyValue("file:filename", filename);
118        document.setPropertyValue("dublincore:title", title);
119        return document;
120    }
121
122    protected void logMailerConfiguration() {
123        Mailer m = SendMail.COMPOSER.getMailer();
124        log.info("mail.smtp.auth:" + m.getConfiguration().get("mail.smtp.auth"));
125        log.info("mail.smtp.starttls.enable:" + m.getConfiguration().get("mail.smtp.starttls.enable"));
126        log.info("mail.smtp.host:" + m.getConfiguration().get("mail.smtp.host"));
127        log.info("mail.smtp.user:" + m.getConfiguration().get("mail.smtp.user"));
128        log.info("mail.smtp.password:" + m.getConfiguration().get("mail.smtp.password"));
129    }
130}