001    /*
002     * Copyright 2010 the original author or authors.
003     * 
004     *  Licensed under the Apache License, Version 2.0 (the "License");
005     *  you may not use this file except in compliance with the License.
006     *  You may obtain a copy of the License at
007     *
008     *      http://www.apache.org/licenses/LICENSE-2.0
009     *
010     *  Unless required by applicable law or agreed to in writing, software
011     *  distributed under the License is distributed on an "AS IS" BASIS,
012     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     *  See the License for the specific language governing permissions and
014     *  limitations under the License.
015     */
016    package com.hs.mail.sieve;
017    
018    import java.io.BufferedInputStream;
019    import java.io.File;
020    import java.io.FileInputStream;
021    import java.io.InputStream;
022    
023    import org.apache.commons.io.IOUtils;
024    import org.apache.jsieve.ConfigurationManager;
025    import org.apache.jsieve.SieveConfigurationException;
026    import org.apache.jsieve.SieveFactory;
027    import org.apache.log4j.Logger;
028    
029    import com.hs.mail.container.config.Config;
030    import com.hs.mail.mailet.MailetContext;
031    import com.hs.mail.smtp.message.Recipient;
032    import com.hs.mail.smtp.message.SmtpMessage;
033    
034    public class Sieve {
035    
036            static Logger logger = Logger.getLogger(Sieve.class);
037                            
038            public static final String DEFAULT_SIEVE = "default.sieve";
039    
040            private static SieveFactory  factory = null;
041            static {
042                    try {
043                            ConfigurationManager config = new ConfigurationManager();
044                            factory = config.build();
045                    } catch (SieveConfigurationException e) {
046                            logger.error(e.getMessage(), e);
047                    }
048            }
049            
050            public static boolean runSieve(MailetContext context, Recipient recipient,
051                            SmtpMessage msg) {
052                    File script = getScript(context, recipient);
053                    if (script != null) {
054                            InputStream is = null;
055                            try {
056                                    SieveMailAdapter adapter = new SieveMailAdapter(context,
057                                                    recipient.getMailbox(), recipient.getID());
058                                    adapter.setMessage(msg);
059                                    is = new BufferedInputStream(new FileInputStream(script));
060                                    factory.interpret(adapter, is);
061                                    return true;
062                            } catch (Exception e) {
063                                    logger.error(e.getMessage());
064                            } finally {
065                                    IOUtils.closeQuietly(is);
066                            }
067                    }
068                    return false;
069            }
070            
071            private static File getScript(MailetContext context, Recipient recipient) {
072                    File dir = context.getUserManager().getUserHome(recipient);
073                    File script = new File(dir, DEFAULT_SIEVE);
074                    if (script.exists()) {
075                            return script;
076                    }
077                    // If user's sieve script does not exist, then check for domain's
078                    // default sieve script.
079                    String domain = (recipient.getHost() != null) ? recipient.getHost()
080                                    : Config.getDefaultDomain();
081                    dir = new File(Config.getDataDirectory(), domain);
082                    script = new File(dir, DEFAULT_SIEVE);
083                    return (script.exists()) ? script : null;
084            }
085            
086    }