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:05 UTC

svn commit: r1582975 - in /cayenne/main/trunk/cayenne-crypto/src: main/java/org/apache/cayenne/crypto/batch/ main/java/org/apache/cayenne/crypto/cipher/ main/java/org/apache/cayenne/crypto/transformer/ main/java/org/apache/cayenne/crypto/transformer/va...

Author: aadamchik
Date: Sat Mar 29 10:29:04 2014
New Revision: 1582975

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

* valueTranformerFactory to use DbAttribute (instead of int type) to compile transformers
* JceTransformerFactory - in progress

Added:
    cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptor.java
      - copied, changed from r1582974, cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ValueTransformer.java
    cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ToBytesConverter.java
      - copied, changed from r1582974, cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ValueTransformer.java
Modified:
    cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/batch/CryptoBatchTranslatorFactoryDecorator.java
    cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/DefaultCipherFactory.java
    cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultTransformerFactory.java
    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/ValueTransformer.java
    cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ValueTransformerFactory.java
    cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13TransformerFactory.java
    cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13TransformerFactoryTest.java

Modified: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/batch/CryptoBatchTranslatorFactoryDecorator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/batch/CryptoBatchTranslatorFactoryDecorator.java?rev=1582975&r1=1582974&r2=1582975&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/batch/CryptoBatchTranslatorFactoryDecorator.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/batch/CryptoBatchTranslatorFactoryDecorator.java Sat Mar 29 10:29:04 2014
@@ -57,7 +57,6 @@ public class CryptoBatchTranslatorFactor
                     encryptor = cryptoFactory.encryptor(getBindings());
                     encryptorCompiled = true;
                 }
-
             }
 
             @Override

Modified: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/DefaultCipherFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/DefaultCipherFactory.java?rev=1582975&r1=1582974&r2=1582975&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/DefaultCipherFactory.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/cipher/DefaultCipherFactory.java Sat Mar 29 10:29:04 2014
@@ -29,6 +29,9 @@ import org.apache.cayenne.crypto.CryptoC
 import org.apache.cayenne.di.Inject;
 
 /**
+ * Creates and returns a new {@link Cipher} configured using properties from
+ * {@link CryptoConstants#PROPERTIES_MAP}.
+ * 
  * @since 3.2
  */
 public class DefaultCipherFactory implements CipherFactory {

Modified: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultTransformerFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultTransformerFactory.java?rev=1582975&r1=1582974&r2=1582975&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultTransformerFactory.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/DefaultTransformerFactory.java Sat Mar 29 10:29:04 2014
@@ -79,7 +79,7 @@ public class DefaultTransformerFactory i
 
                 ColumnDescriptor cd = columns[cryptoColumns.get(i)];
                 keys[i] = cd.getDataRowKey();
-                transformers[i] = transformerFactory.decryptor(cd.getAttribute().getType());
+                transformers[i] = transformerFactory.decryptor(cd.getAttribute());
             }
 
             return new DefaultMapTransformer(keys, transformers, cipherFactory.cipher());
@@ -116,7 +116,7 @@ public class DefaultTransformerFactory i
                 int pos = cryptoColumns.get(i);
                 BatchParameterBinding b = bindings[pos];
                 positions[i] = pos;
-                transformers[i] = transformerFactory.encryptor(b.getAttribute().getType());
+                transformers[i] = transformerFactory.encryptor(b.getAttribute());
             }
 
             return new DefaultBindingsTransformer(positions, transformers, cipherFactory.cipher());

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=1582975&r1=1582974&r2=1582975&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:04 2014
@@ -18,6 +18,19 @@
  ****************************************************************/
 package org.apache.cayenne.crypto.transformer.value;
 
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.cayenne.dba.TypesMapping;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
+
 /**
  * A {@link ValueTransformerFactory} that creates encryptors/decryptors that are
  * taking advantage of the JCE (Java Cryptography Extension) ciphers.
@@ -26,19 +39,77 @@ package org.apache.cayenne.crypto.transf
  */
 public class JceTransformerFactory implements ValueTransformerFactory {
 
+    private Map<String, ToBytesConverter> toBytesConverters;
+    private ConcurrentMap<DbAttribute, ValueTransformer> encryptors;
+
     public JceTransformerFactory() {
-        // TODO Auto-generated constructor stub
+        this.toBytesConverters = createToBytesConverters();
+        this.encryptors = new ConcurrentHashMap<DbAttribute, ValueTransformer>();
     }
 
     @Override
-    public ValueTransformer decryptor(int jdbcType) {
-        // TODO Auto-generated method stub
-        return null;
+    public ValueTransformer decryptor(DbAttribute a) {
+        throw new UnsupportedOperationException("TODO");
     }
 
     @Override
-    public ValueTransformer encryptor(int jdbcType) {
-        throw new UnsupportedOperationException("TODO");
+    public ValueTransformer encryptor(DbAttribute a) {
+        ValueTransformer e = encryptors.get(a);
+
+        if (e == null) {
+
+            ValueTransformer newTransformer = createEncryptor(a);
+            ValueTransformer oldTransformer = encryptors.putIfAbsent(a, newTransformer);
+
+            e = oldTransformer != null ? oldTransformer : newTransformer;
+        }
+
+        return e;
+    }
+
+    protected Map<String, ToBytesConverter> createToBytesConverters() {
+
+    }
+
+    protected ValueTransformer createEncryptor(DbAttribute a) {
+
+        String type = getJavaType(a);
+        ToBytesConverter toBytes = toBytesConverters.get(type);
+        if (toBytes == null) {
+            throw new IllegalArgumentException("The type " + type + " for attribute " + a
+                    + " has no to-byte conversion");
+        }
+
+        return new JceValueEncryptor(toBytes);
+    }
+
+    // TODO: calculating Java type of ObjAttribute may become unneeded per
+    // CAY-1752, as DbAttribute will have it.
+    protected String getJavaType(DbAttribute a) {
+
+        DbEntity dbEntity = a.getEntity();
+        DataMap dataMap = dbEntity.getDataMap();
+        Collection<ObjEntity> objEntities = dataMap.getMappedEntities(dbEntity);
+
+        if (objEntities.size() != 1) {
+            return TypesMapping.getJavaBySqlType(a.getType());
+        }
+
+        Collection<String> javaTypes = new HashSet<String>();
+        ObjEntity objEntity = objEntities.iterator().next();
+        for (ObjAttribute oa : objEntity.getAttributes()) {
+
+            // TODO: this won't pick up flattened attributes
+            if (a.getName().equals(oa.getDbAttributePath())) {
+                javaTypes.add(oa.getType());
+            }
+        }
+
+        if (javaTypes.size() != 1) {
+            return TypesMapping.getJavaBySqlType(a.getType());
+        }
+
+        return javaTypes.iterator().next();
     }
 
 }

Copied: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptor.java (from r1582974, cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ValueTransformer.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptor.java?p2=cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptor.java&p1=cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ValueTransformer.java&r1=1582974&r2=1582975&rev=1582975&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ValueTransformer.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/JceValueEncryptor.java Sat Mar 29 10:29:04 2014
@@ -21,11 +21,18 @@ package org.apache.cayenne.crypto.transf
 import javax.crypto.Cipher;
 
 /**
- * An encryptor or decryptor of a single value.
- * 
  * @since 3.2
  */
-public interface ValueTransformer {
+public class JceValueEncryptor implements ValueTransformer {
+    
+    public JceValueEncryptor(ToBytesConverter toBytes) {
+        
+    }
+
+    @Override
+    public Object transform(Cipher cipher, Object value) {
+        // TODO Auto-generated method stub
+        return null;
+    }
 
-    Object transform(Cipher cipher, Object value);
 }

Copied: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ToBytesConverter.java (from r1582974, cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ValueTransformer.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ToBytesConverter.java?p2=cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ToBytesConverter.java&p1=cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ValueTransformer.java&r1=1582974&r2=1582975&rev=1582975&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ValueTransformer.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ToBytesConverter.java Sat Mar 29 10:29:04 2014
@@ -18,14 +18,10 @@
  ****************************************************************/
 package org.apache.cayenne.crypto.transformer.value;
 
-import javax.crypto.Cipher;
-
 /**
- * An encryptor or decryptor of a single value.
- * 
  * @since 3.2
  */
-public interface ValueTransformer {
+interface ToBytesConverter {
 
-    Object transform(Cipher cipher, Object value);
+    byte[] toBytes(Object value);
 }

Modified: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ValueTransformer.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ValueTransformer.java?rev=1582975&r1=1582974&r2=1582975&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ValueTransformer.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ValueTransformer.java Sat Mar 29 10:29:04 2014
@@ -27,5 +27,9 @@ import javax.crypto.Cipher;
  */
 public interface ValueTransformer {
 
+    /**
+     * Transforms a value using the provided Cipher. Cipher is assumed to be
+     * fully initialized and its state reset from any previous operations.
+     */
     Object transform(Cipher cipher, Object value);
 }

Modified: cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ValueTransformerFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ValueTransformerFactory.java?rev=1582975&r1=1582974&r2=1582975&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ValueTransformerFactory.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/value/ValueTransformerFactory.java Sat Mar 29 10:29:04 2014
@@ -18,6 +18,8 @@
  ****************************************************************/
 package org.apache.cayenne.crypto.transformer.value;
 
+import org.apache.cayenne.map.DbAttribute;
+
 /**
  * A factory that creates transformers for encryption/decryption of individual
  * values.
@@ -26,7 +28,7 @@ package org.apache.cayenne.crypto.transf
  */
 public interface ValueTransformerFactory {
 
-    ValueTransformer encryptor(int jdbcType);
+    ValueTransformer encryptor(DbAttribute a);
 
-    ValueTransformer decryptor(int jdbcType);
+    ValueTransformer decryptor(DbAttribute a);
 }

Modified: cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13TransformerFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13TransformerFactory.java?rev=1582975&r1=1582974&r2=1582975&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13TransformerFactory.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13TransformerFactory.java Sat Mar 29 10:29:04 2014
@@ -24,6 +24,7 @@ import javax.crypto.Cipher;
 
 import org.apache.cayenne.crypto.transformer.value.ValueTransformer;
 import org.apache.cayenne.crypto.transformer.value.ValueTransformerFactory;
+import org.apache.cayenne.map.DbAttribute;
 
 public class Rot13TransformerFactory implements ValueTransformerFactory {
 
@@ -75,12 +76,12 @@ public class Rot13TransformerFactory imp
     }
 
     @Override
-    public ValueTransformer decryptor(int jdbcType) {
+    public ValueTransformer decryptor(DbAttribute a) {
         return stringTransformer;
     }
 
     @Override
-    public ValueTransformer encryptor(int jdbcType) {
+    public ValueTransformer encryptor(DbAttribute a) {
         return stringTransformer;
     }
 }

Modified: cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13TransformerFactoryTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13TransformerFactoryTest.java?rev=1582975&r1=1582974&r2=1582975&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13TransformerFactoryTest.java (original)
+++ cayenne/main/trunk/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/unit/Rot13TransformerFactoryTest.java Sat Mar 29 10:29:04 2014
@@ -18,22 +18,22 @@
  ****************************************************************/
 package org.apache.cayenne.crypto.unit;
 
-import java.sql.Types;
-
 import junit.framework.TestCase;
 
+import org.apache.cayenne.map.DbAttribute;
+
 public class Rot13TransformerFactoryTest extends TestCase {
 
     public void testEncrypt() {
 
         Rot13TransformerFactory factory = new Rot13TransformerFactory();
-        assertEquals("nop", factory.encryptor(Types.BINARY).transform(null, "abc"));
+        assertEquals("nop", factory.encryptor(new DbAttribute()).transform(null, "abc"));
     }
 
     public void testDecrypt() {
 
         Rot13TransformerFactory factory = new Rot13TransformerFactory();
-        assertEquals("nop", factory.decryptor(Types.BINARY).transform(null, "abc"));
+        assertEquals("nop", factory.decryptor(new DbAttribute()).transform(null, "abc"));
     }
 
 }