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>