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]

Reply via email to