use of com.zimbra.common.mime.Rfc822ValidationInputStream in project zm-mailbox by Zimbra.
the class Mailbox method addMessage.
public Message addMessage(OperationContext octxt, InputStream in, long sizeHint, Long receivedDate, DeliveryOptions dopt, DeliveryContext dctxt, ItemData id) throws IOException, ServiceException {
int bufLen = Provisioning.getInstance().getLocalServer().getMailDiskStreamingThreshold();
CopyInputStream cs = new CopyInputStream(in, sizeHint, bufLen, bufLen);
in = cs;
Blob blob = null;
try {
BufferStream bs = cs.getBufferStream();
ParsedMessage pm = null;
Rfc822ValidationInputStream validator = null;
if (LC.zimbra_lmtp_validate_messages.booleanValue()) {
validator = new Rfc822ValidationInputStream(cs, LC.zimbra_lmtp_max_line_length.longValue());
in = validator;
}
blob = StoreManager.getInstance().storeIncoming(in);
if (id != null && id.ud != null && id.ud.getBlobDigest() != null && !id.ud.getBlobDigest().isEmpty()) {
blob.setDigest(id.ud.getBlobDigest());
}
if (validator != null && !validator.isValid()) {
StoreManager.getInstance().delete(blob);
throw ServiceException.INVALID_REQUEST("Message content is invalid.", null);
}
pm = new ParsedMessage(new ParsedMessageOptions(blob, bs.isPartial() ? null : bs.getBuffer(), receivedDate, attachmentsIndexingEnabled()));
cs.release();
if (dctxt == null) {
dctxt = new DeliveryContext();
}
dctxt.setIncomingBlob(blob);
return addMessage(octxt, pm, dopt, dctxt);
} finally {
cs.release();
StoreManager.getInstance().quietDelete(blob);
}
}
use of com.zimbra.common.mime.Rfc822ValidationInputStream in project zm-mailbox by Zimbra.
the class TestUtilCode method validateRfc822.
private void validateRfc822(String before, int numNullBytes, String after, boolean isValid) throws IOException {
byte[] content = getBytes(before, numNullBytes, after);
// Test reading into a buffer.
byte[] buf = new byte[100];
Rfc822ValidationInputStream in = new Rfc822ValidationInputStream(new ByteArrayInputStream(content), 10240);
while ((in.read(buf)) >= 0) {
}
in.close();
assertEquals(isValid, in.isValid());
// Test reading on character at a time.
in = new Rfc822ValidationInputStream(new ByteArrayInputStream(content), 10240);
while ((in.read()) >= 0) {
}
in.close();
assertEquals(isValid, in.isValid());
// Compare content.
byte[] copy = ByteUtil.getContent(new Rfc822ValidationInputStream(new ByteArrayInputStream(content), 10240), content.length);
for (int i = 0; i < content.length; i++) {
assertEquals("Mismatch at byte " + i, content[i], copy[i]);
}
}
use of com.zimbra.common.mime.Rfc822ValidationInputStream in project zm-mailbox by Zimbra.
the class ZimbraLmtpBackend method deliver.
@Override
public void deliver(LmtpEnvelope env, InputStream in, int sizeHint) throws UnrecoverableLmtpException {
CopyInputStream cis = null;
Blob blob = null;
try {
int bufLen = Provisioning.getInstance().getLocalServer().getMailDiskStreamingThreshold();
cis = new CopyInputStream(in, sizeHint, bufLen, bufLen);
in = cis;
// MimeParserInputStream mpis = null;
// if (ZMimeMessage.usingZimbraParser()) {
// mpis = new MimeParserInputStream(in);
// in = mpis;
// }
Rfc822ValidationInputStream validator = null;
if (LC.zimbra_lmtp_validate_messages.booleanValue()) {
validator = new Rfc822ValidationInputStream(in, LC.zimbra_lmtp_max_line_length.longValue());
in = validator;
}
try {
blob = StoreManager.getInstance().storeIncoming(in);
} catch (IOException ioe) {
throw new UnrecoverableLmtpException("Error in storing incoming message", ioe);
}
if (validator != null && !validator.isValid()) {
try {
StoreManager.getInstance().delete(blob);
} catch (IOException e) {
ZimbraLog.lmtp.warn("Error in deleting blob %s", blob, e);
}
setDeliveryStatuses(env.getRecipients(), LmtpReply.INVALID_BODY_PARAMETER);
return;
}
BufferStream bs = cis.getBufferStream();
byte[] data = bs.isPartial() ? null : bs.getBuffer();
BlobInputStream bis = null;
MimeMessage mm = null;
try {
deliverMessageToLocalMailboxes(blob, bis, data, mm, env);
} catch (Exception e) {
ZimbraLog.lmtp.warn("Exception delivering mail (temporary failure)", e);
setDeliveryStatuses(env.getLocalRecipients(), LmtpReply.TEMPORARY_FAILURE);
}
try {
deliverMessageToRemoteMailboxes(blob, data, env);
} catch (Exception e) {
ZimbraLog.lmtp.warn("Exception delivering remote mail", e);
setDeliveryStatuses(env.getRemoteRecipients(), LmtpReply.TEMPORARY_FAILURE);
}
} catch (ServiceException e) {
ZimbraLog.lmtp.warn("Exception delivering mail (temporary failure)", e);
setDeliveryStatuses(env.getRecipients(), LmtpReply.TEMPORARY_FAILURE);
} finally {
if (cis != null) {
cis.release();
}
if (blob != null) {
try {
// clean up the incoming blob
StoreManager.getInstance().delete(blob);
} catch (IOException e) {
ZimbraLog.lmtp.warn("Error in deleting blob %s", blob, e);
}
}
}
}
Aggregations