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