You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2014/03/29 11:29:23 UTC

svn commit: r1582976 - in /cayenne/main/trunk/cayenne-crypto/src: main/java/org/apache/cayenne/crypto/transformer/value/ test/java/org/apache/cayenne/crypto/db/ test/java/org/apache/cayenne/crypto/db/auto/ test/java/org/apache/cayenne/crypto/transforme...

Author: aadamchik
Date: Sat Mar 29 10:29:23 2014
New Revision: 1582976

URL: http://svn.apache.org/r1582976
Log:
CAY-1916 cayenne-crypto module that enables data encryption for certain model attributes

* JceTransformerFactory - in progress + tests

Added:
    cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/BytesToBytesConverter.java
      - copied, changed from r1582975, cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptor.java
    cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/StringToBytesConverter.java
      - copied, changed from r1582975, cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptor.java
    cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/Table2.java
    cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table2.java
    cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/
    cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/
    cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/JceTransformerFactoryTest.java
Modified:
    cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceTransformerFactory.java
    cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptor.java
    cayenne/main/trunk/cayenne-crypto/src/test/resources/datamap.map.xml

Copied: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/BytesToBytesConverter.java (from r1582975, cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptor.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/BytesToBytesConverter.java?p2=cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/BytesToBytesConverter.java&p1=cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptor.java&r1=1582975&r2=1582976&rev=1582976&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptor.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/BytesToBytesConverter.java Sat Mar 29 10:29:23 2014
@@ -18,21 +18,16 @@
  ****************************************************************/
 package org.apache.cayenne.crypto.transformer.value;
 
-import javax.crypto.Cipher;
-
 /**
  * @since 3.2
  */
-public class JceValueEncryptor implements ValueTransformer {
-    
-    public JceValueEncryptor(ToBytesConverter toBytes) {
-        
-    }
+final class BytesToBytesConverter implements ToBytesConverter {
+
+    static final ToBytesConverter INSTANCE = new BytesToBytesConverter();
 
     @Override
-    public Object transform(Cipher cipher, Object value) {
-        // TODO Auto-generated method stub
-        return null;
+    public byte[] toBytes(Object value) {
+        return (byte[]) value;
     }
 
 }

Modified: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceTransformerFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceTransformerFactory.java?rev=1582976&r1=1582975&r2=1582976&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceTransformerFactory.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceTransformerFactory.java Sat Mar 29 10:29:23 2014
@@ -19,6 +19,7 @@
 package org.apache.cayenne.crypto.transformer.value;
 
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -68,7 +69,12 @@ public class JceTransformerFactory imple
     }
 
     protected Map<String, ToBytesConverter> createToBytesConverters() {
+        Map<String, ToBytesConverter> map = new HashMap<String, ToBytesConverter>();
 
+        map.put("byte[]", BytesToBytesConverter.INSTANCE);
+        map.put(String.class.getName(), StringToBytesConverter.INSTANCE);
+
+        return map;
     }
 
     protected ValueTransformer createEncryptor(DbAttribute a) {

Modified: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptor.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptor.java?rev=1582976&r1=1582975&r2=1582976&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptor.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptor.java Sat Mar 29 10:29:23 2014
@@ -24,15 +24,16 @@ import javax.crypto.Cipher;
  * @since 3.2
  */
 public class JceValueEncryptor implements ValueTransformer {
-    
+
+    final ToBytesConverter toBytes;
+
     public JceValueEncryptor(ToBytesConverter toBytes) {
-        
+        this.toBytes = toBytes;
     }
 
     @Override
     public Object transform(Cipher cipher, Object value) {
-        // TODO Auto-generated method stub
-        return null;
+        throw new UnsupportedOperationException("TODO");
     }
 
 }

Copied: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/StringToBytesConverter.java (from r1582975, cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptor.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/StringToBytesConverter.java?p2=cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/StringToBytesConverter.java&p1=cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptor.java&r1=1582975&r2=1582976&rev=1582976&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptor.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/StringToBytesConverter.java Sat Mar 29 10:29:23 2014
@@ -18,21 +18,24 @@
  ****************************************************************/
 package org.apache.cayenne.crypto.transformer.value;
 
-import javax.crypto.Cipher;
+import java.nio.charset.Charset;
 
 /**
  * @since 3.2
  */
-public class JceValueEncryptor implements ValueTransformer {
-    
-    public JceValueEncryptor(ToBytesConverter toBytes) {
-        
+final class StringToBytesConverter implements ToBytesConverter {
+
+    static final ToBytesConverter INSTANCE = new StringToBytesConverter();
+
+    private Charset utf8;
+
+    StringToBytesConverter() {
+        this.utf8 = Charset.forName("UTF-8");
     }
 
     @Override
-    public Object transform(Cipher cipher, Object value) {
-        // TODO Auto-generated method stub
-        return null;
+    public byte[] toBytes(Object value) {
+        return ((String) value).getBytes(utf8);
     }
 
 }

Added: cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/Table2.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/Table2.java?rev=1582976&view=auto
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/Table2.java (added)
+++ cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/Table2.java Sat Mar 29 10:29:23 2014
@@ -0,0 +1,9 @@
+package org.apache.cayenne.crypto.db;
+
+import org.apache.cayenne.crypto.db.auto._Table2;
+
+public class Table2 extends _Table2 {
+
+    private static final long serialVersionUID = 1L; 
+
+}

Added: cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table2.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table2.java?rev=1582976&view=auto
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table2.java (added)
+++ cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table2.java Sat Mar 29 10:29:23 2014
@@ -0,0 +1,40 @@
+package org.apache.cayenne.crypto.db.auto;
+
+import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.exp.Property;
+
+/**
+ * Class _Table2 was generated by Cayenne.
+ * It is probably a good idea to avoid changing this class manually,
+ * since it may be overwritten next time code is regenerated.
+ * If you need to make any customizations, please use subclass.
+ */
+public abstract class _Table2 extends CayenneDataObject {
+
+    private static final long serialVersionUID = 1L; 
+
+    @Deprecated
+    public static final String CRYPTO_BYTES_PROPERTY = "cryptoBytes";
+    @Deprecated
+    public static final String PLAIN_BYTES_PROPERTY = "plainBytes";
+
+    public static final String ID_PK_COLUMN = "ID";
+
+    public static final Property<byte[]> CRYPTO_BYTES = new Property<byte[]>("cryptoBytes");
+    public static final Property<byte[]> PLAIN_BYTES = new Property<byte[]>("plainBytes");
+
+    public void setCryptoBytes(byte[] cryptoBytes) {
+        writeProperty("cryptoBytes", cryptoBytes);
+    }
+    public byte[] getCryptoBytes() {
+        return (byte[])readProperty("cryptoBytes");
+    }
+
+    public void setPlainBytes(byte[] plainBytes) {
+        writeProperty("plainBytes", plainBytes);
+    }
+    public byte[] getPlainBytes() {
+        return (byte[])readProperty("plainBytes");
+    }
+
+}

Added: cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/JceTransformerFactoryTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/JceTransformerFactoryTest.java?rev=1582976&view=auto
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/JceTransformerFactoryTest.java (added)
+++ cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/transformer/value/JceTransformerFactoryTest.java Sat Mar 29 10:29:23 2014
@@ -0,0 +1,90 @@
+/*****************************************************************
+ *   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.cayenne.crypto.transformer.value;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.sql.Types;
+
+import junit.framework.TestCase;
+
+import org.apache.cayenne.configuration.server.ServerRuntime;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+
+public class JceTransformerFactoryTest extends TestCase {
+
+    private DbEntity t1;
+    private DbEntity t2;
+
+    @Override
+    protected void setUp() throws Exception {
+        ServerRuntime runtime = new ServerRuntime("cayenne-crypto.xml");
+        this.t1 = runtime.getChannel().getEntityResolver().getDbEntity("TABLE1");
+        this.t2 = runtime.getChannel().getEntityResolver().getDbEntity("TABLE2");
+    }
+
+    public void testGetJavaType() {
+
+        JceTransformerFactory f = new JceTransformerFactory();
+
+        DbAttribute t1_ct = t1.getAttribute("CRYPTO_STRING");
+        assertEquals("java.lang.String", f.getJavaType(t1_ct));
+
+        DbAttribute t2_cb = t2.getAttribute("CRYPTO_BYTES");
+        assertEquals("byte[]", f.getJavaType(t2_cb));
+
+        DbEntity fakeEntity = mock(DbEntity.class);
+        when(fakeEntity.getDataMap()).thenReturn(t1.getDataMap());
+
+        DbAttribute fakeA1 = mock(DbAttribute.class);
+        when(fakeA1.getName()).thenReturn("fake1");
+        when(fakeA1.getEntity()).thenReturn(fakeEntity);
+        when(fakeA1.getType()).thenReturn(Types.VARBINARY);
+
+        assertEquals("byte[]", f.getJavaType(fakeA1));
+
+        DbAttribute fakeA2 = mock(DbAttribute.class);
+        when(fakeA2.getName()).thenReturn("fake2");
+        when(fakeA2.getEntity()).thenReturn(fakeEntity);
+        when(fakeA2.getType()).thenReturn(Types.VARCHAR);
+
+        assertEquals("java.lang.String", f.getJavaType(fakeA2));
+    }
+
+    public void testCreateEncryptor() {
+        JceTransformerFactory f = new JceTransformerFactory();
+
+        DbAttribute t1_ct = t1.getAttribute("CRYPTO_STRING");
+
+        ValueTransformer t1 = f.createEncryptor(t1_ct);
+        assertNotNull(t1);
+        assertTrue(t1 instanceof JceValueEncryptor);
+        assertNotSame(BytesToBytesConverter.INSTANCE, ((JceValueEncryptor) t1).toBytes);
+
+        DbAttribute t2_cb = t2.getAttribute("CRYPTO_BYTES");
+
+        ValueTransformer t2 = f.createEncryptor(t2_cb);
+        assertNotNull(t2);
+        assertTrue(t2 instanceof JceValueEncryptor);
+        assertSame(BytesToBytesConverter.INSTANCE, ((JceValueEncryptor) t2).toBytes);
+    }
+
+}

Modified: cayenne/main/trunk/cayenne-crypto/src/test/resources/datamap.map.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/test/resources/datamap.map.xml?rev=1582976&r1=1582975&r2=1582976&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/test/resources/datamap.map.xml (original)
+++ cayenne/main/trunk/cayenne-crypto/src/test/resources/datamap.map.xml Sat Mar 29 10:29:23 2014
@@ -9,8 +9,17 @@
 		<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
 		<db-attribute name="PLAIN_STRING" type="VARCHAR" length="200"/>
 	</db-entity>
+	<db-entity name="TABLE2">
+		<db-attribute name="CRYPTO_BYTES" type="BLOB"/>
+		<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
+		<db-attribute name="PLAIN_BYTES" type="VARBINARY"/>
+	</db-entity>
 	<obj-entity name="Table1" className="org.apache.cayenne.crypto.db.Table1" dbEntityName="TABLE1">
 		<obj-attribute name="cryptoString" type="java.lang.String" db-attribute-path="CRYPTO_STRING"/>
 		<obj-attribute name="plainString" type="java.lang.String" db-attribute-path="PLAIN_STRING"/>
 	</obj-entity>
+	<obj-entity name="Table2" className="org.apache.cayenne.crypto.db.Table2" dbEntityName="TABLE2">
+		<obj-attribute name="cryptoBytes" type="byte[]" db-attribute-path="CRYPTO_BYTES"/>
+		<obj-attribute name="plainBytes" type="byte[]" db-attribute-path="PLAIN_BYTES"/>
+	</obj-entity>
 </data-map>