2010-05-19 14:17:06 -04:00
|
|
|
package com.fsck.k9.mail.filter;
|
2010-02-04 21:32:32 -05:00
|
|
|
|
|
|
|
import java.io.FilterOutputStream;
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.io.OutputStream;
|
|
|
|
|
2011-02-06 17:09:48 -05:00
|
|
|
public class SmtpDataStuffing extends FilterOutputStream {
|
2010-02-04 21:32:32 -05:00
|
|
|
private static final int STATE_NORMAL = 0;
|
|
|
|
private static final int STATE_CR = 1;
|
|
|
|
private static final int STATE_CRLF = 2;
|
2010-04-29 00:59:14 -04:00
|
|
|
|
2010-02-04 21:32:32 -05:00
|
|
|
private int state = STATE_NORMAL;
|
|
|
|
|
2011-02-06 17:09:48 -05:00
|
|
|
public SmtpDataStuffing(OutputStream out) {
|
2010-02-04 21:32:32 -05:00
|
|
|
super(out);
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2011-02-06 17:09:48 -05:00
|
|
|
public void write(int oneByte) throws IOException {
|
|
|
|
if (oneByte == '\r') {
|
2010-02-04 21:32:32 -05:00
|
|
|
state = STATE_CR;
|
2011-02-06 17:09:48 -05:00
|
|
|
} else if ((state == STATE_CR) && (oneByte == '\n')) {
|
2010-02-04 21:32:32 -05:00
|
|
|
state = STATE_CRLF;
|
2011-02-06 17:09:48 -05:00
|
|
|
} else if ((state == STATE_CRLF) && (oneByte == '.')) {
|
2010-02-04 21:32:32 -05:00
|
|
|
// Read <CR><LF><DOT> so this line needs an additional period.
|
|
|
|
super.write('.');
|
|
|
|
state = STATE_NORMAL;
|
2011-02-06 17:09:48 -05:00
|
|
|
} else {
|
2010-02-04 21:32:32 -05:00
|
|
|
state = STATE_NORMAL;
|
|
|
|
}
|
|
|
|
super.write(oneByte);
|
|
|
|
}
|
|
|
|
}
|