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