Changeset 140

Show
Ignore:
Timestamp:
04/08/06 00:03:14 (3 years ago)
Author:
jfp
Message:

fixed maildir writer (tested with solid-pop3d), added a wrapper to chown

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/jsmtpd/etc/jsmtpd-plugin-config.xml

    r29 r140  
    1313         
    1414        <ACLSetup name="Basic ACL" class="org.jsmtpd.plugins.acls.SimpleACL"> 
    15                 <propertyset name="RelayedHosts" value="10.0.0.0/255.255.0.0,127.0.0.1"/> 
    16                 <propertyset name="ValidUsers" value="*@localhost,*@yourdomain.com"/> 
     15                <propertyset name="relayedHosts" value="10.0.0.0/255.255.0.0,127.0.0.1"/> 
     16                <propertyset name="validUsers" value="*@localhost,*@yourdomain.com"/> 
    1717        </ACLSetup> 
    1818         
    1919        <DNSSetup class="org.jsmtpd.plugins.dnsServices.DNSJavaResolver" name="DNS Java"> 
    20                 <propertyset name="DnsServers" value="192.168.10.1"/> 
     20                <propertyset name="dnsServers" value="192.168.10.1"/> 
    2121        </DNSSetup> 
    2222         
     
    2424 
    2525        <LocalDeliveryService name="umw" class="org.jsmtpd.plugins.deliveryServices.UnixMailboxWriter"> 
    26                 <propertyset name="MailDir" value="mailboxes/"/> 
     26                <propertyset name="mailDir" value="mailboxes/"/> 
    2727        </LocalDeliveryService> 
    2828         
  • trunk/jsmtpd/src/org/jsmtpd/plugins/deliveryServices/MaildirWriter.java

    r123 r140  
    3535import org.jsmtpd.core.common.delivery.IDeliveryService; 
    3636import org.jsmtpd.core.common.delivery.TemporaryDeliveryException; 
    37 import org.jsmtpd.core.common.io.InvalidStreamParserInitialisation; 
    38 import org.jsmtpd.core.common.io.dataStream.DataStreamParser; 
    3937import org.jsmtpd.core.mail.Email; 
    4038import org.jsmtpd.core.mail.Rcpt; 
    4139import org.jsmtpd.tools.ByteArrayTool; 
    42 import org.jsmtpd.tools.DateUtil; 
     40import org.jsmtpd.tools.rights.IChown; 
     41import org.jsmtpd.tools.rights.RightException; 
     42import org.jsmtpd.tools.rights.UnixChown; 
    4343/** 
    44  * Maildir delivery plugin 
    45  * Experimental and not yet tested 
     44 * This has been tested with solid-pop3d, under linux. 
     45 * There is nothing in java to change the owner of a file (as far as I know ;),  
     46 * but some (many) pop/imap daemons working with mdir requires permissions to be set. 
     47 * The current impl to change right invokes a system command (fork process ...), it's not 
     48 * really beautifull, you have to run Jsmtpd as root, but it works. 
     49 *  
     50 * Don't use in production/stressed environment, behavior should not be good. 
     51 *  
    4652 * @author Jean-Francois POUX 
    4753 * 
    4854 */ 
    4955public class MaildirWriter implements IDeliveryService { 
    50         private String basePath="/var/jsmtpd/mails"; 
    51         private String postPath="/./"; 
     56        private String basePath="/var/mail"; 
     57        private String postPath=""; 
    5258        private String host = ReadConfig.getInstance().getLocalDomain(); 
    5359        private Log log = LogFactory.getLog(MaildirWriter.class); 
    54          
     60        private IChown chown = new UnixChown(); 
     61        private boolean tryChown=false; 
     62        private boolean crlf=false; 
     63         
     64        public void setCrlf(boolean crlf) { 
     65                this.crlf = crlf; 
     66        } 
     67 
     68        public void setChown(IChown chown) { 
     69                this.chown = chown; 
     70        } 
     71 
    5572        public void doDelivery(Email in, List<Rcpt> rcpts) { 
    5673                log.debug("Starting batch"); 
     
    6683                rcpt.setDelivered(Rcpt.STATUS_ERROR_NOT_FATAL); 
    6784                log.debug("temporary delivery error for "+rcpt.getEmailAddress().toString()); 
     85            } catch (RightException e) { 
     86                log.debug("Fatal delivery error for rcpt (right error)"+rcpt.getEmailAddress().toString()); 
     87                rcpt.setDelivered(Rcpt.STATUS_ERROR_FATAL); 
    6888            } 
    6989                } 
     
    83103        } 
    84104         
    85         private void deliver (Email in, Rcpt rcpt) throws TemporaryDeliveryException,FatalDeliveryException { 
    86                 // Make sure dirs exists 
     105        private void deliver (Email in, Rcpt rcpt) throws TemporaryDeliveryException,FatalDeliveryException, RightException { 
     106                String user = rcpt.getEmailAddress().getUser().toLowerCase(); // This assumes that a rcpt rewriter plugin exists for handling aliases, and rewrites to system uids. 
     107                 
     108                //      Make sure dirs exists 
    87109                String mpath = basePath+"/"+rcpt.getEmailAddress().getUser()+"/"+postPath+"/"; 
    88110                File fl = new File (mpath); 
    89                 fl.mkdirs(); 
     111                // if no exists mkdirs + rchown 
     112                if (!fl.exists()) { 
     113                        fl.mkdirs(); 
     114                        if (tryChown) 
     115                                chown.recursiveChown(fl.toString(),user); 
     116                } 
    90117                File tmp = new File (mpath+"/tmp/"); 
    91                 if (!tmp.isDirectory()) 
     118                if (!tmp.exists()) { 
    92119                        tmp.mkdirs(); 
     120                        if (tryChown) 
     121                                chown.recursiveChown(tmp.toString(),user); 
     122                } 
    93123                File cur = new File (mpath+"/cur/"); 
    94                 if (!cur.isDirectory()) 
     124                if (!cur.exists()) { 
    95125                        cur.mkdirs(); 
     126                        if (tryChown) 
     127                                chown.recursiveChown(cur.toString(),user); 
     128                } 
    96129                File newF = new File(mpath+"/new/"); 
    97                 if (!newF.isDirectory()) 
     130                if (!newF.exists()) { 
    98131                        newF.mkdirs(); 
     132                        if (tryChown) 
     133                                chown.chown(newF.toString(),user); 
     134                } 
    99135                 
    100136                // Write to tmp directory 
     
    105141                                raf = new RandomAccessFile (target,"rw"); 
    106142                                raf.seek(0); 
    107                             DataStreamParser dsp = new DataStreamParser(512, 512); 
    108                 dsp.appendString("From " + in.getFrom().toString() + " " + DateUtil.currentMailboxDate()); 
    109                 raf.write(ByteArrayTool.replaceBytes(dsp.getData(), ByteArrayTool.CRLF, ByteArrayTool.LF)); 
    110                                 // If on Unix. On windows ? 
    111                                 raf.write(ByteArrayTool.replaceBytes(in.getDataAsByte(),ByteArrayTool.CRLF,ByteArrayTool.LF)); 
     143                            //DataStreamParser dsp = new DataStreamParser(512, 512); 
     144                //dsp.appendString("From " + in.getFrom().toString() + " " + DateUtil.currentMailboxDate()); 
     145                //raf.write(ByteArrayTool.replaceBytes(dsp.getData(), ByteArrayTool.CRLF, ByteArrayTool.LF)); 
     146                            if (crlf) { 
     147                                raf.write(ByteArrayTool.replaceBytes(in.getDataAsByte(),ByteArrayTool.LF,ByteArrayTool.CRLF)); 
     148                                byte[] lf = new byte[2]; 
     149                                lf[0] = 13; 
     150                                lf[1] = 10; 
     151                                raf.write(lf); 
     152                            } 
     153                            else { 
     154                                raf.write(ByteArrayTool.replaceBytes(in.getDataAsByte(),ByteArrayTool.CRLF,ByteArrayTool.LF)); 
     155                                byte[] lf = new byte[1]; 
     156                                lf[0] = 10; 
     157                                raf.write(lf); 
     158                            } 
     159                                 
    112160                                raf.close(); 
    113161                        } catch (FileNotFoundException e) { 
     
    117165                                log.error("Io error ",e); 
    118166                                throw new TemporaryDeliveryException (e); 
    119                         } catch (InvalidStreamParserInitialisation e) { 
    120                         } 
     167                        }  
     168 
     169                if (tryChown) 
     170                        chown.chown(target.toString(),user); 
    121171                 
    122                 //TODO: Fix permissions ? 
    123                          
    124172                // Commit = mv 
    125173                File commit = new File (cur.getAbsolutePath()+"/"+fileName); 
     
    150198                this.postPath = postPath; 
    151199        } 
     200 
     201        public void setTryChown(boolean tryChown) { 
     202                this.tryChown = tryChown; 
     203        } 
     204         
    152205} 
  • trunk/jsmtpd/src/org/jsmtpd/plugins/deliveryServices/UnixMailboxWriter.java

    r136 r140  
    2121package org.jsmtpd.plugins.deliveryServices; 
    2222 
     23import java.io.File; 
    2324import java.io.FileNotFoundException; 
    2425import java.io.IOException; 
     
    4445import org.jsmtpd.tools.ByteArrayTool; 
    4546import org.jsmtpd.tools.DateUtil; 
     47import org.jsmtpd.tools.rights.IChown; 
     48import org.jsmtpd.tools.rights.RightException; 
     49import org.jsmtpd.tools.rights.UnixChown; 
    4650 
    4751/** 
     
    5559    private String mailboxDir = null; 
    5660    private Map<String,FileLock> locks = Collections.synchronizedMap(new HashMap<String,FileLock>()); 
     61    private boolean tryChown = false; 
     62    private IChown chown = new UnixChown(); 
    5763     
    58     public void doDelivery(Email in, List<Rcpt> rcpts) { 
     64    public void setTryChown(boolean tryChown) { 
     65                this.tryChown = tryChown; 
     66        } 
     67 
     68        public void doDelivery(Email in, List<Rcpt> rcpts) { 
    5969        log.debug("Begin  "); 
    6070        for (Rcpt rcpt : rcpts) { 
     
    8191        RandomAccessFile fp = null; 
    8292        String mailbox = mailboxDir + "/" + rcpt.getUser().toLowerCase(); 
     93        boolean exist = new File (mailbox).exists(); 
    8394        try { 
    8495            fp = openMBox(mailbox); 
     
    105116            lf[0] = 10; 
    106117            fp.write(lf); 
    107  
     118            if ((!exist) && tryChown) 
     119                chown.chown(mailbox,rcpt.getUser().toLowerCase()); 
    108120            //File is unlocked in the finally 
    109121            log.debug("Mail "+in.getDiskName()+ " delivered to : " + rcpt.getUser()); 
     
    120132                    + ", mail to this rcpt is lost",e); 
    121133            throw new FatalDeliveryException(); 
    122         } finally { 
     134        } catch (RightException e) { 
     135                log.error("Things are written, but I could not perfom chown on file ...",e); 
     136                } finally { 
    123137                closeMBox(mailbox,fp); 
    124138        } 
  • trunk/jsmtpd/src/org/jsmtpd/plugins/filters/ClamAV/ClamAVFilter.java

    r130 r140  
    8888         * read the response 
    8989         */ 
    90  
     90        log.debug("Starting ClamAV Scan of "+input.getDiskName()); 
     91        long time = System.currentTimeMillis(); 
    9192        ClamAVChat chat = new ClamAVChat(clamdHost, clamdPort, input.getDataAsByte(), connectionTimeout); 
    92         if (chat.doScan() == true) { 
     93        boolean response =chat.doScan(); 
     94        log.debug("Scanned "+input.getDiskName()+ ", "+input.getSize()+" octs in "+(System.currentTimeMillis()-time)+" ms"); 
     95        if ( response == true) { 
    9396            return true; 
    9497        }