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));
+    }
 }


Reply via email to