You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ro...@apache.org on 2019/03/22 16:18:47 UTC

[james-project] 03/04: JAMES-2671 Calculate the length of encrypted content

This is an automated email from the ASF dual-hosted git repository.

rouazana pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 775d84f98520903673f164f8d24c45a447f5ee70
Author: Antoine Duprat <ad...@linagora.com>
AuthorDate: Mon Mar 4 14:31:48 2019 +0100

    JAMES-2671 Calculate the length of encrypted content
---
 .../james/blob/objectstorage/AESPayloadCodec.java  | 10 +++---
 .../blob/objectstorage/DefaultPayloadCodec.java    |  6 ++--
 .../blob/objectstorage/ObjectStorageBlobsDAO.java  |  1 -
 .../apache/james/blob/objectstorage/Payload.java   | 41 ++++++++++++++++++++++
 .../james/blob/objectstorage/PayloadCodec.java     |  2 --
 .../blob/objectstorage/AESPayloadCodecTest.java    | 11 +++---
 .../objectstorage/DefaultPayloadCodecTest.java     |  6 ++--
 7 files changed, 59 insertions(+), 18 deletions(-)

diff --git a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/AESPayloadCodec.java b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/AESPayloadCodec.java
index ee60dd4..b92f73a 100644
--- a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/AESPayloadCodec.java
+++ b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/AESPayloadCodec.java
@@ -25,11 +25,12 @@ import java.io.OutputStream;
 import java.io.PipedInputStream;
 import java.io.PipedOutputStream;
 import java.security.GeneralSecurityException;
+import java.util.Optional;
+import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.blob.objectstorage.crypto.CryptoConfig;
 import org.apache.james.blob.objectstorage.crypto.PBKDF2StreamingAeadFactory;
-import org.jclouds.io.Payload;
 import org.jclouds.io.Payloads;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -48,11 +49,12 @@ public class AESPayloadCodec implements PayloadCodec {
     public Payload write(InputStream is) {
         PipedInputStream snk = new PipedInputStream();
         try {
+            AtomicLong length = new AtomicLong();
             PipedOutputStream src = new PipedOutputStream(snk);
             OutputStream outputStream = streamingAead.newEncryptingStream(src, PBKDF2StreamingAeadFactory.EMPTY_ASSOCIATED_DATA);
             Thread copyThread = new Thread(() -> {
                 try (OutputStream stream = outputStream) {
-                    IOUtils.copy(is, stream);
+                    length.addAndGet(IOUtils.copy(is, stream));
                 } catch (IOException e) {
                     throw new RuntimeException("Stream copy failure ", e);
                 }
@@ -61,7 +63,7 @@ public class AESPayloadCodec implements PayloadCodec {
                 LOGGER.error("Unable to encrypt payload's input stream",e)
             );
             copyThread.start();
-            return Payloads.newInputStreamPayload(snk);
+            return new Payload(Payloads.newInputStreamPayload(snk), Optional.of(length.get()));
         } catch (IOException | GeneralSecurityException e) {
             throw new RuntimeException("Unable to build payload for object storage, failed to " +
                 "encrypt", e);
@@ -71,7 +73,7 @@ public class AESPayloadCodec implements PayloadCodec {
     @Override
     public InputStream read(Payload payload) throws IOException {
         try {
-            return streamingAead.newDecryptingStream(payload.openStream(), PBKDF2StreamingAeadFactory.EMPTY_ASSOCIATED_DATA);
+            return streamingAead.newDecryptingStream(payload.getPayload().openStream(), PBKDF2StreamingAeadFactory.EMPTY_ASSOCIATED_DATA);
         } catch (GeneralSecurityException e) {
             throw new IOException("Incorrect crypto setup", e);
         }
diff --git a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/DefaultPayloadCodec.java b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/DefaultPayloadCodec.java
index bd56c49..6f56b26 100644
--- a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/DefaultPayloadCodec.java
+++ b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/DefaultPayloadCodec.java
@@ -21,18 +21,18 @@ package org.apache.james.blob.objectstorage;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Optional;
 
-import org.jclouds.io.Payload;
 import org.jclouds.io.Payloads;
 
 public class DefaultPayloadCodec implements PayloadCodec {
     @Override
     public Payload write(InputStream is) {
-        return Payloads.newInputStreamPayload(is);
+        return new Payload(Payloads.newInputStreamPayload(is), Optional.empty());
     }
 
     @Override
     public InputStream read(Payload payload) throws IOException {
-        return payload.openStream();
+        return payload.getPayload().openStream();
     }
 }
diff --git a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAO.java b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAO.java
index d441e68..d870912 100644
--- a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAO.java
+++ b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAO.java
@@ -34,7 +34,6 @@ import org.apache.james.blob.objectstorage.swift.SwiftTempAuthObjectStorage;
 import org.jclouds.blobstore.domain.Blob;
 import org.jclouds.blobstore.options.CopyOptions;
 import org.jclouds.domain.Location;
-import org.jclouds.io.Payload;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/Payload.java b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/Payload.java
new file mode 100644
index 0000000..3813072
--- /dev/null
+++ b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/Payload.java
@@ -0,0 +1,41 @@
+/*
+ * 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.blob.objectstorage;
+
+import java.util.Optional;
+
+public class Payload {
+
+    private final org.jclouds.io.Payload payload;
+    private final Optional<Long> length;
+
+    public Payload(org.jclouds.io.Payload payload, Optional<Long> length) {
+        this.payload = payload;
+        this.length = length;
+    }
+
+    public org.jclouds.io.Payload getPayload() {
+        return payload;
+    }
+
+    public Optional<Long> getLength() {
+        return length;
+    }
+}
diff --git a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/PayloadCodec.java b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/PayloadCodec.java
index 5e1cfc5..debb9fb 100644
--- a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/PayloadCodec.java
+++ b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/PayloadCodec.java
@@ -22,8 +22,6 @@ package org.apache.james.blob.objectstorage;
 import java.io.IOException;
 import java.io.InputStream;
 
-import org.jclouds.io.Payload;
-
 public interface PayloadCodec {
     Payload write(InputStream is);
 
diff --git a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/AESPayloadCodecTest.java b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/AESPayloadCodecTest.java
index 62b7507..3127916 100644
--- a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/AESPayloadCodecTest.java
+++ b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/AESPayloadCodecTest.java
@@ -26,10 +26,10 @@ import java.io.ByteArrayInputStream;
 import java.io.FilterInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Optional;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.james.blob.objectstorage.crypto.CryptoConfig;
-import org.jclouds.io.Payload;
 import org.jclouds.io.Payloads;
 import org.jetbrains.annotations.NotNull;
 import org.junit.jupiter.api.Test;
@@ -50,7 +50,7 @@ class AESPayloadCodecTest implements PayloadCodecContract {
     @Test
     void aesCodecShouldEncryptPayloadContentWhenWriting() throws Exception {
         Payload payload = codec().write(expected());
-        byte[] bytes = IOUtils.toByteArray(payload.openStream());
+        byte[] bytes = IOUtils.toByteArray(payload.getPayload().openStream());
         // authenticated encryption uses a random salt for the authentication
         // header all we can say for sure is that the output is not the same as
         // the input.
@@ -59,7 +59,7 @@ class AESPayloadCodecTest implements PayloadCodecContract {
 
     @Test
     void aesCodecShouldDecryptPayloadContentWhenReading() throws Exception {
-        Payload payload = Payloads.newInputStreamPayload(new ByteArrayInputStream(ENCRYPTED_BYTES));
+        Payload payload = new Payload(Payloads.newInputStreamPayload(new ByteArrayInputStream(ENCRYPTED_BYTES)), Optional.empty());
 
         InputStream actual = codec().read(payload);
 
@@ -69,7 +69,7 @@ class AESPayloadCodecTest implements PayloadCodecContract {
     @Test
     void aesCodecShouldRaiseExceptionWhenUnderliyingInputStreamFails() throws Exception {
         Payload payload =
-            Payloads.newInputStreamPayload(new FilterInputStream(new ByteArrayInputStream(ENCRYPTED_BYTES)) {
+            new Payload(Payloads.newInputStreamPayload(new FilterInputStream(new ByteArrayInputStream(ENCRYPTED_BYTES)) {
                 private int readCount = 0;
 
                 @Override
@@ -81,7 +81,8 @@ class AESPayloadCodecTest implements PayloadCodecContract {
                         return super.read(b, off, len);
                     }
                 }
-            });
+            }),
+            Optional.empty());
         int i = ENCRYPTED_BYTES.length / 2;
         byte[] bytes = new byte[i];
         InputStream is = codec().read(payload);
diff --git a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/DefaultPayloadCodecTest.java b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/DefaultPayloadCodecTest.java
index eed9869..9f43983 100644
--- a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/DefaultPayloadCodecTest.java
+++ b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/DefaultPayloadCodecTest.java
@@ -22,8 +22,8 @@ package org.apache.james.blob.objectstorage;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.io.InputStream;
+import java.util.Optional;
 
-import org.jclouds.io.Payload;
 import org.jclouds.io.Payloads;
 import org.junit.jupiter.api.Test;
 
@@ -37,12 +37,12 @@ class DefaultPayloadCodecTest implements PayloadCodecContract {
     void defaultCodecShouldNotChangePayloadContentWhenWriting() throws Exception {
         Payload payload = codec().write(expected());
 
-        assertThat(payload.openStream()).hasSameContentAs(expected());
+        assertThat(payload.getPayload().openStream()).hasSameContentAs(expected());
     }
 
     @Test
     void defaultCodecShouldNotChangePayloadContentWhenReading() throws Exception {
-        Payload payload = Payloads.newInputStreamPayload(expected());
+        Payload payload = new Payload(Payloads.newInputStreamPayload(expected()), Optional.empty());
 
         InputStream actual = codec().read(payload);
 


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


Re: [james-project] 03/04: JAMES-2671 Calculate the length of encrypted content

Posted by wei jiang <bu...@hotmail.com>.
I meant fuck this email group!

Get Outlook for Android<https://aka.ms/ghei36>

________________________________
From: wei jiang <bu...@hotmail.com>
Sent: Friday, March 22, 2019 10:47:14 PM
To: James Developers List
Subject: Re: [james-project] 03/04: JAMES-2671 Calculate the length of encrypted content

duck this email group! stop sending emails to me!

Get Outlook for Android<https://aka.ms/ghei36>

________________________________
From: rouazana@apache.org <ro...@apache.org>
Sent: Friday, March 22, 2019 10:18:47 AM
To: server-dev@james.apache.org
Subject: [james-project] 03/04: JAMES-2671 Calculate the length of encrypted content

This is an automated email from the ASF dual-hosted git repository.

rouazana pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 775d84f98520903673f164f8d24c45a447f5ee70
Author: Antoine Duprat <ad...@linagora.com>
AuthorDate: Mon Mar 4 14:31:48 2019 +0100

    JAMES-2671 Calculate the length of encrypted content
---
 .../james/blob/objectstorage/AESPayloadCodec.java  | 10 +++---
 .../blob/objectstorage/DefaultPayloadCodec.java    |  6 ++--
 .../blob/objectstorage/ObjectStorageBlobsDAO.java  |  1 -
 .../apache/james/blob/objectstorage/Payload.java   | 41 ++++++++++++++++++++++
 .../james/blob/objectstorage/PayloadCodec.java     |  2 --
 .../blob/objectstorage/AESPayloadCodecTest.java    | 11 +++---
 .../objectstorage/DefaultPayloadCodecTest.java     |  6 ++--
 7 files changed, 59 insertions(+), 18 deletions(-)

diff --git a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/AESPayloadCodec.java b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/AESPayloadCodec.java
index ee60dd4..b92f73a 100644
--- a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/AESPayloadCodec.java
+++ b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/AESPayloadCodec.java
@@ -25,11 +25,12 @@ import java.io.OutputStream;
 import java.io.PipedInputStream;
 import java.io.PipedOutputStream;
 import java.security.GeneralSecurityException;
+import java.util.Optional;
+import java.util.concurrent.atomic.AtomicLong;

 import org.apache.commons.io.IOUtils;
 import org.apache.james.blob.objectstorage.crypto.CryptoConfig;
 import org.apache.james.blob.objectstorage.crypto.PBKDF2StreamingAeadFactory;
-import org.jclouds.io.Payload;
 import org.jclouds.io.Payloads;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -48,11 +49,12 @@ public class AESPayloadCodec implements PayloadCodec {
     public Payload write(InputStream is) {
         PipedInputStream snk = new PipedInputStream();
         try {
+            AtomicLong length = new AtomicLong();
             PipedOutputStream src = new PipedOutputStream(snk);
             OutputStream outputStream = streamingAead.newEncryptingStream(src, PBKDF2StreamingAeadFactory.EMPTY_ASSOCIATED_DATA);
             Thread copyThread = new Thread(() -> {
                 try (OutputStream stream = outputStream) {
-                    IOUtils.copy(is, stream);
+                    length.addAndGet(IOUtils.copy(is, stream));
                 } catch (IOException e) {
                     throw new RuntimeException("Stream copy failure ", e);
                 }
@@ -61,7 +63,7 @@ public class AESPayloadCodec implements PayloadCodec {
                 LOGGER.error("Unable to encrypt payload's input stream",e)
             );
             copyThread.start();
-            return Payloads.newInputStreamPayload(snk);
+            return new Payload(Payloads.newInputStreamPayload(snk), Optional.of(length.get()));
         } catch (IOException | GeneralSecurityException e) {
             throw new RuntimeException("Unable to build payload for object storage, failed to " +
                 "encrypt", e);
@@ -71,7 +73,7 @@ public class AESPayloadCodec implements PayloadCodec {
     @Override
     public InputStream read(Payload payload) throws IOException {
         try {
-            return streamingAead.newDecryptingStream(payload.openStream(), PBKDF2StreamingAeadFactory.EMPTY_ASSOCIATED_DATA);
+            return streamingAead.newDecryptingStream(payload.getPayload().openStream(), PBKDF2StreamingAeadFactory.EMPTY_ASSOCIATED_DATA);
         } catch (GeneralSecurityException e) {
             throw new IOException("Incorrect crypto setup", e);
         }
diff --git a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/DefaultPayloadCodec.java b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/DefaultPayloadCodec.java
index bd56c49..6f56b26 100644
--- a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/DefaultPayloadCodec.java
+++ b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/DefaultPayloadCodec.java
@@ -21,18 +21,18 @@ package org.apache.james.blob.objectstorage;

 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Optional;

-import org.jclouds.io.Payload;
 import org.jclouds.io.Payloads;

 public class DefaultPayloadCodec implements PayloadCodec {
     @Override
     public Payload write(InputStream is) {
-        return Payloads.newInputStreamPayload(is);
+        return new Payload(Payloads.newInputStreamPayload(is), Optional.empty());
     }

     @Override
     public InputStream read(Payload payload) throws IOException {
-        return payload.openStream();
+        return payload.getPayload().openStream();
     }
 }
diff --git a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAO.java b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAO.java
index d441e68..d870912 100644
--- a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAO.java
+++ b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAO.java
@@ -34,7 +34,6 @@ import org.apache.james.blob.objectstorage.swift.SwiftTempAuthObjectStorage;
 import org.jclouds.blobstore.domain.Blob;
 import org.jclouds.blobstore.options.CopyOptions;
 import org.jclouds.domain.Location;
-import org.jclouds.io.Payload;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

diff --git a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/Payload.java b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/Payload.java
new file mode 100644
index 0000000..3813072
--- /dev/null
+++ b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/Payload.java
@@ -0,0 +1,41 @@
+/*
+ * 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.blob.objectstorage;
+
+import java.util.Optional;
+
+public class Payload {
+
+    private final org.jclouds.io.Payload payload;
+    private final Optional<Long> length;
+
+    public Payload(org.jclouds.io.Payload payload, Optional<Long> length) {
+        this.payload = payload;
+        this.length = length;
+    }
+
+    public org.jclouds.io.Payload getPayload() {
+        return payload;
+    }
+
+    public Optional<Long> getLength() {
+        return length;
+    }
+}
diff --git a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/PayloadCodec.java b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/PayloadCodec.java
index 5e1cfc5..debb9fb 100644
--- a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/PayloadCodec.java
+++ b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/PayloadCodec.java
@@ -22,8 +22,6 @@ package org.apache.james.blob.objectstorage;
 import java.io.IOException;
 import java.io.InputStream;

-import org.jclouds.io.Payload;
-
 public interface PayloadCodec {
     Payload write(InputStream is);

diff --git a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/AESPayloadCodecTest.java b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/AESPayloadCodecTest.java
index 62b7507..3127916 100644
--- a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/AESPayloadCodecTest.java
+++ b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/AESPayloadCodecTest.java
@@ -26,10 +26,10 @@ import java.io.ByteArrayInputStream;
 import java.io.FilterInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Optional;

 import org.apache.commons.io.IOUtils;
 import org.apache.james.blob.objectstorage.crypto.CryptoConfig;
-import org.jclouds.io.Payload;
 import org.jclouds.io.Payloads;
 import org.jetbrains.annotations.NotNull;
 import org.junit.jupiter.api.Test;
@@ -50,7 +50,7 @@ class AESPayloadCodecTest implements PayloadCodecContract {
     @Test
     void aesCodecShouldEncryptPayloadContentWhenWriting() throws Exception {
         Payload payload = codec().write(expected());
-        byte[] bytes = IOUtils.toByteArray(payload.openStream());
+        byte[] bytes = IOUtils.toByteArray(payload.getPayload().openStream());
         // authenticated encryption uses a random salt for the authentication
         // header all we can say for sure is that the output is not the same as
         // the input.
@@ -59,7 +59,7 @@ class AESPayloadCodecTest implements PayloadCodecContract {

     @Test
     void aesCodecShouldDecryptPayloadContentWhenReading() throws Exception {
-        Payload payload = Payloads.newInputStreamPayload(new ByteArrayInputStream(ENCRYPTED_BYTES));
+        Payload payload = new Payload(Payloads.newInputStreamPayload(new ByteArrayInputStream(ENCRYPTED_BYTES)), Optional.empty());

         InputStream actual = codec().read(payload);

@@ -69,7 +69,7 @@ class AESPayloadCodecTest implements PayloadCodecContract {
     @Test
     void aesCodecShouldRaiseExceptionWhenUnderliyingInputStreamFails() throws Exception {
         Payload payload =
-            Payloads.newInputStreamPayload(new FilterInputStream(new ByteArrayInputStream(ENCRYPTED_BYTES)) {
+            new Payload(Payloads.newInputStreamPayload(new FilterInputStream(new ByteArrayInputStream(ENCRYPTED_BYTES)) {
                 private int readCount = 0;

                 @Override
@@ -81,7 +81,8 @@ class AESPayloadCodecTest implements PayloadCodecContract {
                         return super.read(b, off, len);
                     }
                 }
-            });
+            }),
+            Optional.empty());
         int i = ENCRYPTED_BYTES.length / 2;
         byte[] bytes = new byte[i];
         InputStream is = codec().read(payload);
diff --git a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/DefaultPayloadCodecTest.java b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/DefaultPayloadCodecTest.java
index eed9869..9f43983 100644
--- a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/DefaultPayloadCodecTest.java
+++ b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/DefaultPayloadCodecTest.java
@@ -22,8 +22,8 @@ package org.apache.james.blob.objectstorage;
 import static org.assertj.core.api.Assertions.assertThat;

 import java.io.InputStream;
+import java.util.Optional;

-import org.jclouds.io.Payload;
 import org.jclouds.io.Payloads;
 import org.junit.jupiter.api.Test;

@@ -37,12 +37,12 @@ class DefaultPayloadCodecTest implements PayloadCodecContract {
     void defaultCodecShouldNotChangePayloadContentWhenWriting() throws Exception {
         Payload payload = codec().write(expected());

-        assertThat(payload.openStream()).hasSameContentAs(expected());
+        assertThat(payload.getPayload().openStream()).hasSameContentAs(expected());
     }

     @Test
     void defaultCodecShouldNotChangePayloadContentWhenReading() throws Exception {
-        Payload payload = Payloads.newInputStreamPayload(expected());
+        Payload payload = new Payload(Payloads.newInputStreamPayload(expected()), Optional.empty());

         InputStream actual = codec().read(payload);



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org


Re: [james-project] 03/04: JAMES-2671 Calculate the length of encrypted content

Posted by wei jiang <bu...@hotmail.com>.
duck this email group! stop sending emails to me!

Get Outlook for Android<https://aka.ms/ghei36>

________________________________
From: rouazana@apache.org <ro...@apache.org>
Sent: Friday, March 22, 2019 10:18:47 AM
To: server-dev@james.apache.org
Subject: [james-project] 03/04: JAMES-2671 Calculate the length of encrypted content

This is an automated email from the ASF dual-hosted git repository.

rouazana pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 775d84f98520903673f164f8d24c45a447f5ee70
Author: Antoine Duprat <ad...@linagora.com>
AuthorDate: Mon Mar 4 14:31:48 2019 +0100

    JAMES-2671 Calculate the length of encrypted content
---
 .../james/blob/objectstorage/AESPayloadCodec.java  | 10 +++---
 .../blob/objectstorage/DefaultPayloadCodec.java    |  6 ++--
 .../blob/objectstorage/ObjectStorageBlobsDAO.java  |  1 -
 .../apache/james/blob/objectstorage/Payload.java   | 41 ++++++++++++++++++++++
 .../james/blob/objectstorage/PayloadCodec.java     |  2 --
 .../blob/objectstorage/AESPayloadCodecTest.java    | 11 +++---
 .../objectstorage/DefaultPayloadCodecTest.java     |  6 ++--
 7 files changed, 59 insertions(+), 18 deletions(-)

diff --git a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/AESPayloadCodec.java b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/AESPayloadCodec.java
index ee60dd4..b92f73a 100644
--- a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/AESPayloadCodec.java
+++ b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/AESPayloadCodec.java
@@ -25,11 +25,12 @@ import java.io.OutputStream;
 import java.io.PipedInputStream;
 import java.io.PipedOutputStream;
 import java.security.GeneralSecurityException;
+import java.util.Optional;
+import java.util.concurrent.atomic.AtomicLong;

 import org.apache.commons.io.IOUtils;
 import org.apache.james.blob.objectstorage.crypto.CryptoConfig;
 import org.apache.james.blob.objectstorage.crypto.PBKDF2StreamingAeadFactory;
-import org.jclouds.io.Payload;
 import org.jclouds.io.Payloads;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -48,11 +49,12 @@ public class AESPayloadCodec implements PayloadCodec {
     public Payload write(InputStream is) {
         PipedInputStream snk = new PipedInputStream();
         try {
+            AtomicLong length = new AtomicLong();
             PipedOutputStream src = new PipedOutputStream(snk);
             OutputStream outputStream = streamingAead.newEncryptingStream(src, PBKDF2StreamingAeadFactory.EMPTY_ASSOCIATED_DATA);
             Thread copyThread = new Thread(() -> {
                 try (OutputStream stream = outputStream) {
-                    IOUtils.copy(is, stream);
+                    length.addAndGet(IOUtils.copy(is, stream));
                 } catch (IOException e) {
                     throw new RuntimeException("Stream copy failure ", e);
                 }
@@ -61,7 +63,7 @@ public class AESPayloadCodec implements PayloadCodec {
                 LOGGER.error("Unable to encrypt payload's input stream",e)
             );
             copyThread.start();
-            return Payloads.newInputStreamPayload(snk);
+            return new Payload(Payloads.newInputStreamPayload(snk), Optional.of(length.get()));
         } catch (IOException | GeneralSecurityException e) {
             throw new RuntimeException("Unable to build payload for object storage, failed to " +
                 "encrypt", e);
@@ -71,7 +73,7 @@ public class AESPayloadCodec implements PayloadCodec {
     @Override
     public InputStream read(Payload payload) throws IOException {
         try {
-            return streamingAead.newDecryptingStream(payload.openStream(), PBKDF2StreamingAeadFactory.EMPTY_ASSOCIATED_DATA);
+            return streamingAead.newDecryptingStream(payload.getPayload().openStream(), PBKDF2StreamingAeadFactory.EMPTY_ASSOCIATED_DATA);
         } catch (GeneralSecurityException e) {
             throw new IOException("Incorrect crypto setup", e);
         }
diff --git a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/DefaultPayloadCodec.java b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/DefaultPayloadCodec.java
index bd56c49..6f56b26 100644
--- a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/DefaultPayloadCodec.java
+++ b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/DefaultPayloadCodec.java
@@ -21,18 +21,18 @@ package org.apache.james.blob.objectstorage;

 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Optional;

-import org.jclouds.io.Payload;
 import org.jclouds.io.Payloads;

 public class DefaultPayloadCodec implements PayloadCodec {
     @Override
     public Payload write(InputStream is) {
-        return Payloads.newInputStreamPayload(is);
+        return new Payload(Payloads.newInputStreamPayload(is), Optional.empty());
     }

     @Override
     public InputStream read(Payload payload) throws IOException {
-        return payload.openStream();
+        return payload.getPayload().openStream();
     }
 }
diff --git a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAO.java b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAO.java
index d441e68..d870912 100644
--- a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAO.java
+++ b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/ObjectStorageBlobsDAO.java
@@ -34,7 +34,6 @@ import org.apache.james.blob.objectstorage.swift.SwiftTempAuthObjectStorage;
 import org.jclouds.blobstore.domain.Blob;
 import org.jclouds.blobstore.options.CopyOptions;
 import org.jclouds.domain.Location;
-import org.jclouds.io.Payload;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

diff --git a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/Payload.java b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/Payload.java
new file mode 100644
index 0000000..3813072
--- /dev/null
+++ b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/Payload.java
@@ -0,0 +1,41 @@
+/*
+ * 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.blob.objectstorage;
+
+import java.util.Optional;
+
+public class Payload {
+
+    private final org.jclouds.io.Payload payload;
+    private final Optional<Long> length;
+
+    public Payload(org.jclouds.io.Payload payload, Optional<Long> length) {
+        this.payload = payload;
+        this.length = length;
+    }
+
+    public org.jclouds.io.Payload getPayload() {
+        return payload;
+    }
+
+    public Optional<Long> getLength() {
+        return length;
+    }
+}
diff --git a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/PayloadCodec.java b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/PayloadCodec.java
index 5e1cfc5..debb9fb 100644
--- a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/PayloadCodec.java
+++ b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/PayloadCodec.java
@@ -22,8 +22,6 @@ package org.apache.james.blob.objectstorage;
 import java.io.IOException;
 import java.io.InputStream;

-import org.jclouds.io.Payload;
-
 public interface PayloadCodec {
     Payload write(InputStream is);

diff --git a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/AESPayloadCodecTest.java b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/AESPayloadCodecTest.java
index 62b7507..3127916 100644
--- a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/AESPayloadCodecTest.java
+++ b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/AESPayloadCodecTest.java
@@ -26,10 +26,10 @@ import java.io.ByteArrayInputStream;
 import java.io.FilterInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Optional;

 import org.apache.commons.io.IOUtils;
 import org.apache.james.blob.objectstorage.crypto.CryptoConfig;
-import org.jclouds.io.Payload;
 import org.jclouds.io.Payloads;
 import org.jetbrains.annotations.NotNull;
 import org.junit.jupiter.api.Test;
@@ -50,7 +50,7 @@ class AESPayloadCodecTest implements PayloadCodecContract {
     @Test
     void aesCodecShouldEncryptPayloadContentWhenWriting() throws Exception {
         Payload payload = codec().write(expected());
-        byte[] bytes = IOUtils.toByteArray(payload.openStream());
+        byte[] bytes = IOUtils.toByteArray(payload.getPayload().openStream());
         // authenticated encryption uses a random salt for the authentication
         // header all we can say for sure is that the output is not the same as
         // the input.
@@ -59,7 +59,7 @@ class AESPayloadCodecTest implements PayloadCodecContract {

     @Test
     void aesCodecShouldDecryptPayloadContentWhenReading() throws Exception {
-        Payload payload = Payloads.newInputStreamPayload(new ByteArrayInputStream(ENCRYPTED_BYTES));
+        Payload payload = new Payload(Payloads.newInputStreamPayload(new ByteArrayInputStream(ENCRYPTED_BYTES)), Optional.empty());

         InputStream actual = codec().read(payload);

@@ -69,7 +69,7 @@ class AESPayloadCodecTest implements PayloadCodecContract {
     @Test
     void aesCodecShouldRaiseExceptionWhenUnderliyingInputStreamFails() throws Exception {
         Payload payload =
-            Payloads.newInputStreamPayload(new FilterInputStream(new ByteArrayInputStream(ENCRYPTED_BYTES)) {
+            new Payload(Payloads.newInputStreamPayload(new FilterInputStream(new ByteArrayInputStream(ENCRYPTED_BYTES)) {
                 private int readCount = 0;

                 @Override
@@ -81,7 +81,8 @@ class AESPayloadCodecTest implements PayloadCodecContract {
                         return super.read(b, off, len);
                     }
                 }
-            });
+            }),
+            Optional.empty());
         int i = ENCRYPTED_BYTES.length / 2;
         byte[] bytes = new byte[i];
         InputStream is = codec().read(payload);
diff --git a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/DefaultPayloadCodecTest.java b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/DefaultPayloadCodecTest.java
index eed9869..9f43983 100644
--- a/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/DefaultPayloadCodecTest.java
+++ b/server/blob/blob-objectstorage/src/test/java/org/apache/james/blob/objectstorage/DefaultPayloadCodecTest.java
@@ -22,8 +22,8 @@ package org.apache.james.blob.objectstorage;
 import static org.assertj.core.api.Assertions.assertThat;

 import java.io.InputStream;
+import java.util.Optional;

-import org.jclouds.io.Payload;
 import org.jclouds.io.Payloads;
 import org.junit.jupiter.api.Test;

@@ -37,12 +37,12 @@ class DefaultPayloadCodecTest implements PayloadCodecContract {
     void defaultCodecShouldNotChangePayloadContentWhenWriting() throws Exception {
         Payload payload = codec().write(expected());

-        assertThat(payload.openStream()).hasSameContentAs(expected());
+        assertThat(payload.getPayload().openStream()).hasSameContentAs(expected());
     }

     @Test
     void defaultCodecShouldNotChangePayloadContentWhenReading() throws Exception {
-        Payload payload = Payloads.newInputStreamPayload(expected());
+        Payload payload = new Payload(Payloads.newInputStreamPayload(expected()), Optional.empty());

         InputStream actual = codec().read(payload);



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org