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 2016/08/25 09:49:58 UTC
[3/4] cayenne git commit: CAY-2107 cayenne-crypto: Lazy
initialization of crypto subsystem
CAY-2107 cayenne-crypto: Lazy initialization of crypto subsystem
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/37c7e0fb
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/37c7e0fb
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/37c7e0fb
Branch: refs/heads/master
Commit: 37c7e0fbd382456acb361c1f49fe7fbc3ee3323d
Parents: 023d5f1
Author: Andrus Adamchik <an...@objectstyle.com>
Authored: Thu Aug 25 12:45:36 2016 +0300
Committer: Andrus Adamchik <an...@objectstyle.com>
Committed: Thu Aug 25 12:45:36 2016 +0300
----------------------------------------------------------------------
.../cayenne/crypto/Runtime_AES128_Base.java | 39 ++++--
.../cayenne/crypto/Runtime_LazyInit_IT.java | 139 +++++++++++++++++++
.../org/apache/cayenne/crypto/db/Table4.java | 9 ++
.../apache/cayenne/crypto/db/auto/_Table4.java | 36 +++++
.../src/test/resources/datamap.map.xml | 9 ++
5 files changed, 220 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/37c7e0fb/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_AES128_Base.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_AES128_Base.java b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_AES128_Base.java
index 8703c4a..4b5774c 100644
--- a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_AES128_Base.java
+++ b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_AES128_Base.java
@@ -25,29 +25,24 @@ import org.apache.cayenne.test.jdbc.DBHelper;
import org.apache.cayenne.test.jdbc.TableHelper;
import java.net.URL;
+import java.sql.SQLException;
public class Runtime_AES128_Base {
protected ServerRuntime runtime;
protected TableHelper table1;
protected TableHelper table2;
+ protected TableHelper table4;
protected void setUp(boolean compress) throws Exception {
- URL keyStoreUrl = JceksKeySourceTest.class.getResource(JceksKeySourceTest.KS1_JCEKS);
-
- CryptoModuleBuilder builder = new CryptoModuleBuilder().keyStore(keyStoreUrl, JceksKeySourceTest.TEST_KEY_PASS,
- "k3");
-
- if (compress) {
- builder.compress();
- }
-
- Module crypto = builder.build();
+ Module crypto = createCryptoModule(compress);
+ this.runtime = createRuntime(crypto);
- this.runtime = new ServerRuntime("cayenne-crypto.xml", crypto);
+ setupTestTables(new DBHelper(runtime.getDataSource(null)));
+ }
- DBHelper dbHelper = new DBHelper(runtime.getDataSource(null));
+ protected void setupTestTables(DBHelper dbHelper) throws SQLException {
this.table2 = new TableHelper(dbHelper, "TABLE2").setColumns("ID", "PLAIN_BYTES", "CRYPTO_BYTES");
table2.deleteAll();
@@ -55,6 +50,26 @@ public class Runtime_AES128_Base {
this.table1 = new TableHelper(dbHelper, "TABLE1").setColumns("ID", "PLAIN_STRING", "CRYPTO_STRING",
"PLAIN_INT", "CRYPTO_INT");
table1.deleteAll();
+
+ this.table4 = new TableHelper(dbHelper, "TABLE4").setColumns("ID", "PLAIN_STRING", "PLAIN_INT");
+ table4.deleteAll();
+ }
+
+ protected ServerRuntime createRuntime(Module crypto) {
+ return new ServerRuntime("cayenne-crypto.xml", crypto);
+ }
+
+ protected Module createCryptoModule(boolean compress) {
+ URL keyStoreUrl = JceksKeySourceTest.class.getResource(JceksKeySourceTest.KS1_JCEKS);
+
+ CryptoModuleBuilder builder = new CryptoModuleBuilder().keyStore(keyStoreUrl, JceksKeySourceTest.TEST_KEY_PASS,
+ "k3");
+
+ if (compress) {
+ builder.compress();
+ }
+
+ return builder.build();
}
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/37c7e0fb/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_LazyInit_IT.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_LazyInit_IT.java b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_LazyInit_IT.java
new file mode 100644
index 0000000..bf79489
--- /dev/null
+++ b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/Runtime_LazyInit_IT.java
@@ -0,0 +1,139 @@
+/*****************************************************************
+ * 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;
+
+import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.configuration.server.ServerRuntime;
+import org.apache.cayenne.crypto.db.Table1;
+import org.apache.cayenne.crypto.db.Table4;
+import org.apache.cayenne.crypto.key.KeySource;
+import org.apache.cayenne.di.Binder;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.di.Module;
+import org.apache.cayenne.query.ObjectSelect;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.security.Key;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.fail;
+
+public class Runtime_LazyInit_IT extends Runtime_AES128_Base {
+
+
+ protected static boolean UNLOCKED;
+
+ @Before
+ public void before() throws Exception {
+ setUp(false);
+ UNLOCKED = false;
+ }
+
+ @Override
+ protected ServerRuntime createRuntime(final Module crypto) {
+ Module cryptoWrapper = new Module() {
+ @Override
+ public void configure(Binder binder) {
+
+ crypto.configure(binder);
+
+ binder.decorate(KeySource.class).after(LockingKeySourceDecorator.class);
+ }
+ };
+
+ return super.createRuntime(cryptoWrapper);
+ }
+
+ @Test
+ public void testCryptoLocked() {
+
+ assertFalse(UNLOCKED);
+
+ Table4 t4 = runtime.newContext().newObject(Table4.class);
+ t4.setPlainInt(56);
+ t4.setPlainString("XX");
+ t4.getObjectContext().commitChanges();
+
+ assertEquals(t4.getObjectId(), ObjectSelect.query(Table4.class).selectOne(runtime.newContext()).getObjectId());
+ }
+
+ @Test
+ public void testCryptoLocked_Unlocked() {
+
+
+ assertFalse(UNLOCKED);
+
+ try {
+ Table1 t1 = runtime.newContext().newObject(Table1.class);
+ t1.setPlainInt(56);
+ t1.setCryptoInt(77);
+ t1.setPlainString("XX");
+ t1.setCryptoString("YY");
+ t1.getObjectContext().commitChanges();
+
+ fail("Must have thrown on crypto access");
+ } catch (CayenneRuntimeException e) {
+ // expected
+ }
+
+ UNLOCKED = true;
+
+ Table1 t1 = runtime.newContext().newObject(Table1.class);
+ t1.setPlainInt(56);
+ t1.setCryptoInt(77);
+ t1.setPlainString("XX");
+ t1.setCryptoString("YY");
+ t1.getObjectContext().commitChanges();
+
+ assertEquals(t1.getObjectId(), ObjectSelect.query(Table1.class).selectOne(runtime.newContext()).getObjectId());
+
+ }
+
+
+ public static class LockingKeySourceDecorator implements KeySource {
+
+ private KeySource keySource;
+
+ public LockingKeySourceDecorator(@Inject KeySource keySource) {
+ this.keySource = keySource;
+ }
+
+ @Override
+ public Key getKey(String alias) {
+ return ensureKeySource().getKey(alias);
+ }
+
+ @Override
+ public String getDefaultKeyAlias() {
+ return ensureKeySource().getDefaultKeyAlias();
+ }
+
+ private KeySource ensureKeySource() {
+
+ if (!UNLOCKED) {
+ throw new IllegalStateException("Crypto is locked");
+ }
+
+ return keySource;
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/37c7e0fb/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/Table4.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/Table4.java b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/Table4.java
new file mode 100644
index 0000000..89ffe67
--- /dev/null
+++ b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/Table4.java
@@ -0,0 +1,9 @@
+package org.apache.cayenne.crypto.db;
+
+import org.apache.cayenne.crypto.db.auto._Table4;
+
+public class Table4 extends _Table4 {
+
+ private static final long serialVersionUID = 1L;
+
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/37c7e0fb/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table4.java
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table4.java b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table4.java
new file mode 100644
index 0000000..3f825bc
--- /dev/null
+++ b/cayenne-crypto/src/test/java/org/apache/cayenne/crypto/db/auto/_Table4.java
@@ -0,0 +1,36 @@
+package org.apache.cayenne.crypto.db.auto;
+
+import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.exp.Property;
+
+/**
+ * Class _Table4 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 _Table4 extends CayenneDataObject {
+
+ private static final long serialVersionUID = 1L;
+
+ public static final String ID_PK_COLUMN = "ID";
+
+ public static final Property<Integer> PLAIN_INT = new Property<Integer>("plainInt");
+ public static final Property<String> PLAIN_STRING = new Property<String>("plainString");
+
+ public void setPlainInt(int plainInt) {
+ writeProperty("plainInt", plainInt);
+ }
+ public int getPlainInt() {
+ Object value = readProperty("plainInt");
+ return (value != null) ? (Integer) value : 0;
+ }
+
+ public void setPlainString(String plainString) {
+ writeProperty("plainString", plainString);
+ }
+ public String getPlainString() {
+ return (String)readProperty("plainString");
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/37c7e0fb/cayenne-crypto/src/test/resources/datamap.map.xml
----------------------------------------------------------------------
diff --git a/cayenne-crypto/src/test/resources/datamap.map.xml b/cayenne-crypto/src/test/resources/datamap.map.xml
index 2ea6a80..b71de41 100644
--- a/cayenne-crypto/src/test/resources/datamap.map.xml
+++ b/cayenne-crypto/src/test/resources/datamap.map.xml
@@ -20,6 +20,11 @@
<db-attribute name="CRYPTO_BYTES" type="VARBINARY"/>
<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
</db-entity>
+ <db-entity name="TABLE4">
+ <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
+ <db-attribute name="PLAIN_INT" type="INTEGER"/>
+ <db-attribute name="PLAIN_STRING" type="VARCHAR" length="200"/>
+ </db-entity>
<obj-entity name="Table1" className="org.apache.cayenne.crypto.db.Table1" dbEntityName="TABLE1">
<obj-attribute name="cryptoInt" type="int" db-attribute-path="CRYPTO_INT"/>
<obj-attribute name="cryptoString" type="java.lang.String" db-attribute-path="CRYPTO_STRING"/>
@@ -33,4 +38,8 @@
<obj-entity name="Table3" className="org.apache.cayenne.crypto.db.Table3" dbEntityName="TABLE3">
<obj-attribute name="cryptoString" type="java.lang.String" db-attribute-path="CRYPTO_BYTES"/>
</obj-entity>
+ <obj-entity name="Table4" className="org.apache.cayenne.crypto.db.Table4" dbEntityName="TABLE4">
+ <obj-attribute name="plainInt" type="int" db-attribute-path="PLAIN_INT"/>
+ <obj-attribute name="plainString" type="java.lang.String" db-attribute-path="PLAIN_STRING"/>
+ </obj-entity>
</data-map>