Its in 0.4-SNAPSHOT version of mailbox which is atm compatible with 0.3 and should also stay so...
Bye, Norman 2011/7/12 Saibabu Vallurupalli <[email protected]>: > Hi Norman, > > Thank you for applying the patch. Since I am in process of upgrading our > Apache James thought of checking with you on next James release this fix is > going to be available? > > Please advise. > > Thank you, > Sai > > > On Tue, Jul 12, 2011 at 1:40 PM, <[email protected]> wrote: > >> Author: norman >> Date: Tue Jul 12 17:40:49 2011 >> New Revision: 1145691 >> >> URL: http://svn.apache.org/viewvc?rev=1145691&view=rev >> Log: >> Add support for encrypted Headers and Body of the message when using JPA. >> This work is a modified version of the classes attached to MAILBOX-102. >> Thanks again to Valluripalli, Sai for the code. We love contributions :) >> >> Added: >> >> james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/EncryptDecryptHelper.java >> >> james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAEncryptedMessage.java >> Modified: >> james/mailbox/trunk/jpa/pom.xml >> >> james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java >> >> james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java >> james/mailbox/trunk/pom.xml >> >> Modified: james/mailbox/trunk/jpa/pom.xml >> URL: >> http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/pom.xml?rev=1145691&r1=1145690&r2=1145691&view=diff >> >> ============================================================================== >> --- james/mailbox/trunk/jpa/pom.xml (original) >> +++ james/mailbox/trunk/jpa/pom.xml Tue Jul 12 17:40:49 2011 >> @@ -48,7 +48,10 @@ >> <groupId>${javax.mail.groupId}</groupId> >> <artifactId>${javax.mail.artifactId}</artifactId> >> </dependency> >> - >> + <dependency> >> + <groupId>org.jasypt</groupId> >> + <artifactId>jasypt</artifactId> >> + </dependency> >> <dependency> >> <groupId>junit</groupId> >> <artifactId>junit-dep</artifactId> >> @@ -100,7 +103,7 @@ >> </property> >> <property> >> <name>metaDataFactory</name> >> - >> <value>jpa(Types=org.apache.james.mailbox.jpa.mail.model.JPAUserFlag;org.apache.james.mailbox.jpa.mail.model.JPAHeader;org.apache.james.mailbox.jpa.mail.model.JPAMailbox;org.apache.james.mailbox.jpa.mail.model.openjpa.AbstractJPAMessage;org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMessage;org.apache.james.mailbox.jpa.mail.model.openjpa.JPAStreamingMessage;org.apache.james.mailbox.jpa.mail.model.JPAProperty;org.apache.james.mailbox.jpa.user.model.JPASubscription)</value> >> + >> <value>jpa(Types=org.apache.james.mailbox.jpa.mail.model.JPAUserFlag;org.apache.james.mailbox.jpa.mail.model.JPAMailbox;org.apache.james.mailbox.jpa.mail.model.openjpa.AbstractJPAMessage;org.apache.james.mailbox.jpa.mail.model.openjpa.JPAEncryptedMessage;org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMessage;org.apache.james.mailbox.jpa.mail.model.openjpa.JPAStreamingMessage;org.apache.james.mailbox.jpa.mail.model.JPAProperty;org.apache.james.mailbox.jpa.user.model.JPASubscription)</value> >> </property> >> </toolProperties> >> </configuration> >> >> Added: >> james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/EncryptDecryptHelper.java >> URL: >> http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/EncryptDecryptHelper.java?rev=1145691&view=auto >> >> ============================================================================== >> --- >> james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/EncryptDecryptHelper.java >> (added) >> +++ >> james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/EncryptDecryptHelper.java >> Tue Jul 12 17:40:49 2011 >> @@ -0,0 +1,66 @@ >> +/**************************************************************** >> + * Licensed to the Apache Software Foundation (ASF) under one * >> + * or more contributor license agreements. See the NOTICE file * >> + * distributed with this work for additional information * >> + * regarding copyright ownership. The ASF licenses this file * >> + * to you under the Apache License, Version 2.0 (the * >> + * "License"); you may not use this file except in compliance * >> + * with the License. You may obtain a copy of the License at * >> + * * >> + * http://www.apache.org/licenses/LICENSE-2.0 * >> + * * >> + * Unless required by applicable law or agreed to in writing, * >> + * software distributed under the License is distributed on an * >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * >> + * KIND, either express or implied. See the License for the * >> + * specific language governing permissions and limitations * >> + * under the License. * >> + ****************************************************************/ >> +package org.apache.james.mailbox.jpa.mail.model.openjpa; >> + >> +import org.jasypt.encryption.pbe.StandardPBEByteEncryptor; >> + >> +/** >> + * Helper class for encrypt and de-crypt data >> + * >> + * >> + */ >> +public class EncryptDecryptHelper { >> + >> + // Use one static instance as it is thread safe >> + private static StandardPBEByteEncryptor encryptor = new >> StandardPBEByteEncryptor(); >> + >> + >> + /** >> + * Set the password for encrypt / de-crypt. This MUST be done before >> + * the usage of {@link #getDecrypted(byte[])} and {@link >> #getEncrypted(byte[])}. >> + * >> + * So to be safe its the best to call this in a constructor >> + * >> + * @param pass >> + */ >> + public static void init(String pass) { >> + encryptor.setPassword(pass); >> + } >> + >> + /** >> + * Encrypt the given array and return the encrypted one >> + * >> + * @param array >> + * @return enc-array >> + */ >> + public static byte[] getEncrypted(byte[] array) { >> + return encryptor.encrypt(array); >> + } >> + >> + /** >> + * Decrypt the given array and return the de-crypted one >> + * >> + * @param array >> + * @return dec-array >> + */ >> + public static byte[] getDecrypted(byte[] array) { >> + return encryptor.decrypt(array); >> + } >> + >> +} >> >> Added: >> james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAEncryptedMessage.java >> URL: >> http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAEncryptedMessage.java?rev=1145691&view=auto >> >> ============================================================================== >> --- >> james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAEncryptedMessage.java >> (added) >> +++ >> james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/mail/model/openjpa/JPAEncryptedMessage.java >> Tue Jul 12 17:40:49 2011 >> @@ -0,0 +1,115 @@ >> +/**************************************************************** >> + * Licensed to the Apache Software Foundation (ASF) under one * >> + * or more contributor license agreements. See the NOTICE file * >> + * distributed with this work for additional information * >> + * regarding copyright ownership. The ASF licenses this file * >> + * to you under the Apache License, Version 2.0 (the * >> + * "License"); you may not use this file except in compliance * >> + * with the License. You may obtain a copy of the License at * >> + * * >> + * http://www.apache.org/licenses/LICENSE-2.0 * >> + * * >> + * Unless required by applicable law or agreed to in writing, * >> + * software distributed under the License is distributed on an * >> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * >> + * KIND, either express or implied. See the License for the * >> + * specific language governing permissions and limitations * >> + * under the License. * >> + ****************************************************************/ >> +package org.apache.james.mailbox.jpa.mail.model.openjpa; >> + >> +import java.io.ByteArrayInputStream; >> +import java.io.IOException; >> +import java.io.InputStream; >> +import java.util.Date; >> + >> +import javax.mail.Flags; >> +import javax.mail.internet.SharedInputStream; >> +import javax.persistence.Basic; >> +import javax.persistence.Column; >> +import javax.persistence.Entity; >> +import javax.persistence.FetchType; >> +import javax.persistence.Lob; >> +import javax.persistence.Table; >> + >> +import org.apache.commons.io.IOUtils; >> +import org.apache.james.mailbox.MailboxException; >> +import org.apache.james.mailbox.jpa.mail.model.JPAMailbox; >> +import org.apache.james.mailbox.store.mail.model.Message; >> +import org.apache.james.mailbox.store.mail.model.impl.PropertyBuilder; >> +import org.apache.openjpa.persistence.Externalizer; >> +import org.apache.openjpa.persistence.Factory; >> + >> +@Entity(name="Message") >> +@Table(name="JAMES_MAIL") >> +public class JPAEncryptedMessage extends AbstractJPAMessage { >> + >> + /** The value for the body field. Lazy loaded */ >> + /** We use a max length to represent 1gb data. Thats prolly >> overkill, but who knows */ >> + @Basic(optional = false, fetch = FetchType.LAZY) >> + @Column(name = "MAIL_BYTES", length = 1048576000, nullable = >> false) >> + @Externalizer("EncryptDecryptHelper.getEncrypted") >> + @Factory("EncryptDecryptHelper.getDecrypted") >> + @Lob private byte[] body; >> + >> + >> + /** The value for the header field. Lazy loaded */ >> + /** We use a max length to represent 1gb data. Thats prolly >> overkill, but who knows */ >> + @Basic(optional = false, fetch = FetchType.LAZY) >> + @Column(name = "HEADER_BYTES", length = 10485760, nullable = >> false) >> + @Externalizer("EncryptDecryptHelper.getEncrypted") >> + @Factory("EncryptDecryptHelper.getDecrypted") >> + @Lob private byte[] header; >> + >> + @Deprecated >> + public JPAEncryptedMessage() {} >> + >> + public JPAEncryptedMessage(JPAMailbox mailbox,Date internalDate, >> int size, Flags flags, SharedInputStream content, int bodyStartOctet, final >> PropertyBuilder propertyBuilder) throws MailboxException { >> + super(mailbox, internalDate, flags, size ,bodyStartOctet, >> propertyBuilder); >> + try { >> + int headerEnd = bodyStartOctet -2; >> + if (headerEnd < 0) { >> + headerEnd = 0; >> + } >> + this.header = IOUtils.toByteArray(content.newStream(0, >> headerEnd)); >> + this.body = >> IOUtils.toByteArray(content.newStream(getBodyStartOctet(), -1)); >> + >> + } catch (IOException e) { >> + throw new MailboxException("Unable to parse message",e); >> + } >> + } >> + >> + /** >> + * Create a copy of the given message >> + * >> + * @param message >> + * @throws MailboxException >> + */ >> + public JPAEncryptedMessage(JPAMailbox mailbox, long uid, long >> modSeq, Message<?> message) throws MailboxException{ >> + super(mailbox, uid, modSeq, message); >> + try { >> + this.body = IOUtils.toByteArray(message.getBodyContent()); >> + this.header = >> IOUtils.toByteArray(message.getHeaderContent()); >> + } catch (IOException e) { >> + throw new MailboxException("Unable to parse message",e); >> + } >> + } >> + >> + >> + /* >> + * (non-Javadoc) >> + * @see >> org.apache.james.mailbox.store.mail.model.Message#getBodyContent() >> + */ >> + public InputStream getBodyContent() throws IOException { >> + return new ByteArrayInputStream(body); >> + } >> + >> + /* >> + * (non-Javadoc) >> + * @see >> org.apache.james.mailbox.store.mail.model.Message#getHeaderContent() >> + */ >> + public InputStream getHeaderContent() throws IOException { >> + return new ByteArrayInputStream(header); >> + } >> + >> +} >> >> Modified: >> james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java >> URL: >> http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java?rev=1145691&r1=1145690&r2=1145691&view=diff >> >> ============================================================================== >> --- >> james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java >> (original) >> +++ >> james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java >> Tue Jul 12 17:40:49 2011 >> @@ -25,6 +25,8 @@ import org.apache.james.mailbox.MailboxP >> import org.apache.james.mailbox.MailboxSession; >> import org.apache.james.mailbox.jpa.JPAMailboxManager; >> import org.apache.james.mailbox.jpa.JPAMailboxSessionMapperFactory; >> +import >> org.apache.james.mailbox.jpa.mail.model.openjpa.EncryptDecryptHelper; >> +import >> org.apache.james.mailbox.jpa.openjpa.OpenJPAMessageManager.AdvancedFeature; >> import org.apache.james.mailbox.store.Authenticator; >> import org.apache.james.mailbox.store.JVMMailboxPathLocker; >> import org.apache.james.mailbox.store.StoreMessageManager; >> @@ -36,20 +38,34 @@ import org.apache.james.mailbox.store.ma >> */ >> public class OpenJPAMailboxManager extends JPAMailboxManager { >> >> - private boolean useStreaming; >> + private AdvancedFeature feature; >> >> public OpenJPAMailboxManager(JPAMailboxSessionMapperFactory >> mapperFactory, Authenticator authenticator, MailboxPathLocker locker, >> boolean useStreaming) { >> super(mapperFactory, authenticator, locker); >> - this.useStreaming = useStreaming; >> + if (useStreaming) { >> + feature = AdvancedFeature.Streaming; >> + } else { >> + feature = AdvancedFeature.None; >> + } >> } >> >> + public OpenJPAMailboxManager(JPAMailboxSessionMapperFactory >> mapperFactory, Authenticator authenticator, MailboxPathLocker locker, >> String encryptPass) { >> + super(mapperFactory, authenticator, locker); >> + if (encryptPass != null) { >> + EncryptDecryptHelper.init(encryptPass); >> + feature = AdvancedFeature.Encryption; >> + } else { >> + feature = AdvancedFeature.None; >> + } >> + } >> + >> public OpenJPAMailboxManager(JPAMailboxSessionMapperFactory >> mapperFactory, Authenticator authenticator) { >> this(mapperFactory, authenticator, new JVMMailboxPathLocker(), >> false); >> } >> >> @Override >> protected StoreMessageManager<Long> createMessageManager(Mailbox<Long> >> mailboxRow, MailboxSession session) throws MailboxException { >> - StoreMessageManager<Long> result = new >> OpenJPAMessageManager(getMapperFactory(), getMessageSearchIndex(), >> getEventDispatcher(), mailboxRow, useStreaming); >> + StoreMessageManager<Long> result = new >> OpenJPAMessageManager(getMapperFactory(), getMessageSearchIndex(), >> getEventDispatcher(), mailboxRow, feature); >> return result; >> } >> } >> >> Modified: >> james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java >> URL: >> http://svn.apache.org/viewvc/james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java?rev=1145691&r1=1145690&r2=1145691&view=diff >> >> ============================================================================== >> --- >> james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java >> (original) >> +++ >> james/mailbox/trunk/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMessageManager.java >> Tue Jul 12 17:40:49 2011 >> @@ -27,6 +27,7 @@ import javax.mail.internet.SharedInputSt >> import org.apache.james.mailbox.MailboxException; >> import org.apache.james.mailbox.jpa.JPAMessageManager; >> import org.apache.james.mailbox.jpa.mail.model.JPAMailbox; >> +import >> org.apache.james.mailbox.jpa.mail.model.openjpa.JPAEncryptedMessage; >> import >> org.apache.james.mailbox.jpa.mail.model.openjpa.JPAStreamingMessage; >> import org.apache.james.mailbox.store.MailboxEventDispatcher; >> import org.apache.james.mailbox.store.MailboxSessionMapperFactory; >> @@ -40,30 +41,40 @@ import org.apache.james.mailbox.store.se >> */ >> public class OpenJPAMessageManager extends JPAMessageManager { >> >> - private final boolean useStreaming; >> + private final AdvancedFeature feature; >> >> + public static enum AdvancedFeature { >> + None, >> + Streaming, >> + Encryption >> + } >> + >> public OpenJPAMessageManager(MailboxSessionMapperFactory<Long> >> mapperFactory, MessageSearchIndex<Long> index, >> MailboxEventDispatcher<Long> dispatcher, Mailbox<Long> mailbox) >> throws MailboxException { >> - this(mapperFactory, index, dispatcher, mailbox, false); >> + this(mapperFactory, index, dispatcher, mailbox, >> AdvancedFeature.None); >> } >> >> public OpenJPAMessageManager(MailboxSessionMapperFactory<Long> >> mapperFactory, MessageSearchIndex<Long> index, >> - MailboxEventDispatcher<Long> dispatcher, Mailbox<Long> >> mailbox, final boolean useStreaming) throws MailboxException { >> + MailboxEventDispatcher<Long> dispatcher, Mailbox<Long> >> mailbox, final AdvancedFeature f) throws MailboxException { >> super(mapperFactory, index, dispatcher, mailbox); >> - this.useStreaming = useStreaming; >> + this.feature = f; >> } >> >> @Override >> protected Message<Long> createMessage(Date internalDate, int size, int >> bodyStartOctet, SharedInputStream content, Flags flags, PropertyBuilder >> propertyBuilder) throws MailboxException { >> - if (useStreaming) { >> - int headerEnd = bodyStartOctet -2; >> - if (headerEnd < 0) { >> - headerEnd = 0; >> - } >> + int headerEnd = bodyStartOctet -2; >> + if (headerEnd < 0) { >> + headerEnd = 0; >> + } >> + switch (feature) { >> + case Streaming: >> return new JPAStreamingMessage((JPAMailbox) getMailboxEntity(), >> internalDate, size, flags, content, bodyStartOctet, propertyBuilder); >> - } else { >> + case Encryption: >> + return new JPAEncryptedMessage((JPAMailbox) >> getMailboxEntity(), internalDate, size, flags, content, bodyStartOctet, >> propertyBuilder); >> + default: >> return super.createMessage(internalDate, size, bodyStartOctet, >> content, flags, propertyBuilder); >> } >> + >> } >> >> >> >> Modified: james/mailbox/trunk/pom.xml >> URL: >> http://svn.apache.org/viewvc/james/mailbox/trunk/pom.xml?rev=1145691&r1=1145690&r2=1145691&view=diff >> >> ============================================================================== >> --- james/mailbox/trunk/pom.xml (original) >> +++ james/mailbox/trunk/pom.xml Tue Jul 12 17:40:49 2011 >> @@ -715,6 +715,11 @@ >> <artifactId>geronimo-jpa_2.0_spec</artifactId> >> <version>1.1</version> >> </dependency> >> + <dependency> >> + <groupId>org.jasypt</groupId> >> + <artifactId>jasypt</artifactId> >> + <version>1.7.1</version> >> + </dependency> >> >> <!-- >> END OpenJPA >> >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [email protected] >> For additional commands, e-mail: [email protected] >> >> > --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
