Changeset 140
- Timestamp:
- 04/08/06 00:03:14 (3 years ago)
- Files:
-
- trunk/jsmtpd/etc/jsmtpd-plugin-config.xml (modified) (2 diffs)
- trunk/jsmtpd/src/org/jsmtpd/plugins/deliveryServices/MaildirWriter.java (modified) (6 diffs)
- trunk/jsmtpd/src/org/jsmtpd/plugins/deliveryServices/UnixMailboxWriter.java (modified) (6 diffs)
- trunk/jsmtpd/src/org/jsmtpd/plugins/filters/ClamAV/ClamAVFilter.java (modified) (1 diff)
- trunk/jsmtpd/src/org/jsmtpd/tools/rights/IChown.java (added)
- trunk/jsmtpd/src/org/jsmtpd/tools/rights/RightException.java (added)
- trunk/jsmtpd/src/org/jsmtpd/tools/rights/UnixChown.java (added)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/jsmtpd/etc/jsmtpd-plugin-config.xml
r29 r140 13 13 14 14 <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"/> 17 17 </ACLSetup> 18 18 19 19 <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"/> 21 21 </DNSSetup> 22 22 … … 24 24 25 25 <LocalDeliveryService name="umw" class="org.jsmtpd.plugins.deliveryServices.UnixMailboxWriter"> 26 <propertyset name=" MailDir" value="mailboxes/"/>26 <propertyset name="mailDir" value="mailboxes/"/> 27 27 </LocalDeliveryService> 28 28 trunk/jsmtpd/src/org/jsmtpd/plugins/deliveryServices/MaildirWriter.java
r123 r140 35 35 import org.jsmtpd.core.common.delivery.IDeliveryService; 36 36 import org.jsmtpd.core.common.delivery.TemporaryDeliveryException; 37 import org.jsmtpd.core.common.io.InvalidStreamParserInitialisation;38 import org.jsmtpd.core.common.io.dataStream.DataStreamParser;39 37 import org.jsmtpd.core.mail.Email; 40 38 import org.jsmtpd.core.mail.Rcpt; 41 39 import org.jsmtpd.tools.ByteArrayTool; 42 import org.jsmtpd.tools.DateUtil; 40 import org.jsmtpd.tools.rights.IChown; 41 import org.jsmtpd.tools.rights.RightException; 42 import org.jsmtpd.tools.rights.UnixChown; 43 43 /** 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 * 46 52 * @author Jean-Francois POUX 47 53 * 48 54 */ 49 55 public 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=""; 52 58 private String host = ReadConfig.getInstance().getLocalDomain(); 53 59 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 55 72 public void doDelivery(Email in, List<Rcpt> rcpts) { 56 73 log.debug("Starting batch"); … … 66 83 rcpt.setDelivered(Rcpt.STATUS_ERROR_NOT_FATAL); 67 84 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); 68 88 } 69 89 } … … 83 103 } 84 104 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 87 109 String mpath = basePath+"/"+rcpt.getEmailAddress().getUser()+"/"+postPath+"/"; 88 110 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 } 90 117 File tmp = new File (mpath+"/tmp/"); 91 if (!tmp. isDirectory())118 if (!tmp.exists()) { 92 119 tmp.mkdirs(); 120 if (tryChown) 121 chown.recursiveChown(tmp.toString(),user); 122 } 93 123 File cur = new File (mpath+"/cur/"); 94 if (!cur. isDirectory())124 if (!cur.exists()) { 95 125 cur.mkdirs(); 126 if (tryChown) 127 chown.recursiveChown(cur.toString(),user); 128 } 96 129 File newF = new File(mpath+"/new/"); 97 if (!newF. isDirectory())130 if (!newF.exists()) { 98 131 newF.mkdirs(); 132 if (tryChown) 133 chown.chown(newF.toString(),user); 134 } 99 135 100 136 // Write to tmp directory … … 105 141 raf = new RandomAccessFile (target,"rw"); 106 142 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 112 160 raf.close(); 113 161 } catch (FileNotFoundException e) { … … 117 165 log.error("Io error ",e); 118 166 throw new TemporaryDeliveryException (e); 119 } catch (InvalidStreamParserInitialisation e) { 120 } 167 } 168 169 if (tryChown) 170 chown.chown(target.toString(),user); 121 171 122 //TODO: Fix permissions ?123 124 172 // Commit = mv 125 173 File commit = new File (cur.getAbsolutePath()+"/"+fileName); … … 150 198 this.postPath = postPath; 151 199 } 200 201 public void setTryChown(boolean tryChown) { 202 this.tryChown = tryChown; 203 } 204 152 205 } trunk/jsmtpd/src/org/jsmtpd/plugins/deliveryServices/UnixMailboxWriter.java
r136 r140 21 21 package org.jsmtpd.plugins.deliveryServices; 22 22 23 import java.io.File; 23 24 import java.io.FileNotFoundException; 24 25 import java.io.IOException; … … 44 45 import org.jsmtpd.tools.ByteArrayTool; 45 46 import org.jsmtpd.tools.DateUtil; 47 import org.jsmtpd.tools.rights.IChown; 48 import org.jsmtpd.tools.rights.RightException; 49 import org.jsmtpd.tools.rights.UnixChown; 46 50 47 51 /** … … 55 59 private String mailboxDir = null; 56 60 private Map<String,FileLock> locks = Collections.synchronizedMap(new HashMap<String,FileLock>()); 61 private boolean tryChown = false; 62 private IChown chown = new UnixChown(); 57 63 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) { 59 69 log.debug("Begin "); 60 70 for (Rcpt rcpt : rcpts) { … … 81 91 RandomAccessFile fp = null; 82 92 String mailbox = mailboxDir + "/" + rcpt.getUser().toLowerCase(); 93 boolean exist = new File (mailbox).exists(); 83 94 try { 84 95 fp = openMBox(mailbox); … … 105 116 lf[0] = 10; 106 117 fp.write(lf); 107 118 if ((!exist) && tryChown) 119 chown.chown(mailbox,rcpt.getUser().toLowerCase()); 108 120 //File is unlocked in the finally 109 121 log.debug("Mail "+in.getDiskName()+ " delivered to : " + rcpt.getUser()); … … 120 132 + ", mail to this rcpt is lost",e); 121 133 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 { 123 137 closeMBox(mailbox,fp); 124 138 } trunk/jsmtpd/src/org/jsmtpd/plugins/filters/ClamAV/ClamAVFilter.java
r130 r140 88 88 * read the response 89 89 */ 90 90 log.debug("Starting ClamAV Scan of "+input.getDiskName()); 91 long time = System.currentTimeMillis(); 91 92 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) { 93 96 return true; 94 97 }
