Author: amitj
Date: Tue Oct 10 09:32:00 2017
New Revision: 1811653
URL: http://svn.apache.org/viewvc?rev=1811653&view=rev
Log:
OAK-6802: Manage 'secret' property internally in S3/AzureDataStore
Azure implementation to manage the secret property internally and remove the
need to be configured
Modified:
jackrabbit/oak/trunk/oak-blob-cloud-azure/src/main/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureBlobStoreBackend.java
jackrabbit/oak/trunk/oak-blob-cloud-azure/src/test/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureDataStoreTest.java
Modified:
jackrabbit/oak/trunk/oak-blob-cloud-azure/src/main/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureBlobStoreBackend.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob-cloud-azure/src/main/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureBlobStoreBackend.java?rev=1811653&r1=1811652&r2=1811653&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-blob-cloud-azure/src/main/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureBlobStoreBackend.java
(original)
+++
jackrabbit/oak/trunk/oak-blob-cloud-azure/src/main/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureBlobStoreBackend.java
Tue Oct 10 09:32:00 2017
@@ -36,6 +36,7 @@ import com.microsoft.azure.storage.blob.
import com.microsoft.azure.storage.blob.CloudBlockBlob;
import com.microsoft.azure.storage.blob.CopyStatus;
import com.microsoft.azure.storage.blob.ListBlobItem;
+import org.apache.commons.io.IOUtils;
import org.apache.jackrabbit.core.data.DataIdentifier;
import org.apache.jackrabbit.core.data.DataRecord;
import org.apache.jackrabbit.core.data.DataStoreException;
@@ -46,12 +47,12 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
import java.net.URISyntaxException;
import java.util.EnumSet;
import java.util.Iterator;
@@ -68,6 +69,8 @@ public class AzureBlobStoreBackend exten
private static final String META_DIR_NAME = "META";
private static final String META_KEY_PREFIX = META_DIR_NAME + "/";
+ private static final String REF_KEY = "reference.key";
+
private static final long BUFFERED_STREAM_THRESHHOLD = 1024 * 1024;
private Properties properties;
@@ -77,7 +80,7 @@ public class AzureBlobStoreBackend exten
private RetryPolicy retryPolicy;
private Integer requestTimeout;
- private String secret;
+ private byte[] secret;
public void setProperties(final Properties properties) {
this.properties = properties;
@@ -111,7 +114,6 @@ public class AzureBlobStoreBackend exten
throw new DataStoreException("Unable to initialize Azure
Data Store from " + Utils.DEFAULT_CONFIG_FILE, e);
}
}
- secret = properties.getProperty("secret");
try {
Utils.setProxyIfNeeded(properties);
@@ -260,13 +262,23 @@ public class AzureBlobStoreBackend exten
@Override
public byte[] getOrCreateReferenceKey() throws DataStoreException {
try {
- if (!Strings.isNullOrEmpty(secret)) {
- return secret.getBytes("UTF-8");
+ if (secret != null && secret.length != 0) {
+ return secret;
+ } else {
+ byte[] key;
+ // Try reading from the metadata folder if it exists
+ DataRecord rec = getMetadataRecord(REF_KEY);
+ if (rec != null) {
+ key = IOUtils.toByteArray(rec.getStream());
+ } else {
+ key = super.getOrCreateReferenceKey();
+ addMetadataRecord(new ByteArrayInputStream(key), REF_KEY);
+ }
+ secret = key;
+ return secret;
}
- LOG.warn("secret not defined");
- return super.getOrCreateReferenceKey();
- } catch (UnsupportedEncodingException e) {
- throw new DataStoreException(e);
+ } catch (IOException e) {
+ throw new DataStoreException("Unable to get or create key " + e);
}
}
Modified:
jackrabbit/oak/trunk/oak-blob-cloud-azure/src/test/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureDataStoreTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-blob-cloud-azure/src/test/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureDataStoreTest.java?rev=1811653&r1=1811652&r2=1811653&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-blob-cloud-azure/src/test/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureDataStoreTest.java
(original)
+++
jackrabbit/oak/trunk/oak-blob-cloud-azure/src/test/java/org/apache/jackrabbit/oak/blob/cloud/azure/blobstorage/AzureDataStoreTest.java
Tue Oct 10 09:32:00 2017
@@ -20,6 +20,7 @@ import static org.apache.commons.codec.b
import static org.apache.commons.io.FileUtils.copyInputStreamToFile;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -31,7 +32,6 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.microsoft.azure.storage.StorageException;
-import com.microsoft.azure.storage.blob.CloudBlobContainer;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.output.NullOutputStream;
@@ -61,6 +61,7 @@ import java.security.DigestOutputStream;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -68,6 +69,8 @@ import java.util.Properties;
import java.util.Random;
import java.util.Set;
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
import javax.jcr.RepositoryException;
/**
@@ -78,6 +81,8 @@ import javax.jcr.RepositoryException;
* src/test/resources/azure.properties
*/
public class AzureDataStoreTest {
+ protected static final Logger LOG =
LoggerFactory.getLogger(AzureDataStoreTest.class);
+
@Rule
public TemporaryFolder folder = new TemporaryFolder(new File("target"));
@@ -688,4 +693,33 @@ public class AzureDataStoreTest {
assertTrue("prefix".equals(e.getMessage()));
}
}
+
+ @Test
+ public void testSecret() throws Exception {
+ byte[] data = new byte[4096];
+ randomGen.nextBytes(data);
+ DataRecord rec = ds.addRecord(new ByteArrayInputStream(data));
+ assertEquals(data.length, rec.getLength());
+ String ref = rec.getReference();
+
+ String id = rec.getIdentifier().toString();
+ assertNotNull(ref);
+
+ byte[] refKey = backend.getOrCreateReferenceKey();
+
+ Mac mac = Mac.getInstance("HmacSHA1");
+ mac.init(new SecretKeySpec(refKey, "HmacSHA1"));
+ byte[] hash = mac.doFinal(id.getBytes("UTF-8"));
+ String calcRef = id + ':' + encodeHexString(hash);
+
+ assertEquals("getReference() not equal", calcRef, ref);
+
+ DataRecord refRec = ds.getMetadataRecord("reference.key");
+ assertNotNull("Reference data record null", refRec);
+
+ byte[] refDirectFromBackend = IOUtils.toByteArray(refRec.getStream());
+ LOG.warn("Ref direct from backend {}", refDirectFromBackend);
+ assertTrue("refKey in memory not equal to the metadata record",
+ Arrays.equals(refKey, refDirectFromBackend));
+ }
}