Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 0931D200B7B for ; Thu, 25 Aug 2016 11:49:59 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 07CF3160A93; Thu, 25 Aug 2016 09:49:59 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 057FD160ABD for ; Thu, 25 Aug 2016 11:49:57 +0200 (CEST) Received: (qmail 47338 invoked by uid 500); 25 Aug 2016 09:49:57 -0000 Mailing-List: contact commits-help@cayenne.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cayenne.apache.org Delivered-To: mailing list commits@cayenne.apache.org Received: (qmail 47292 invoked by uid 99); 25 Aug 2016 09:49:57 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 25 Aug 2016 09:49:57 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 0F796E0C09; Thu, 25 Aug 2016 09:49:57 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: aadamchik@apache.org To: commits@cayenne.apache.org Date: Thu, 25 Aug 2016 09:49:58 -0000 Message-Id: <3665f51c711a4026bd58dc77e2e661e7@git.apache.org> In-Reply-To: <6676ba8c4a354adda3f10a1a3074c540@git.apache.org> References: <6676ba8c4a354adda3f10a1a3074c540@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [3/4] cayenne git commit: CAY-2107 cayenne-crypto: Lazy initialization of crypto subsystem archived-at: Thu, 25 Aug 2016 09:49:59 -0000 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 Authored: Thu Aug 25 12:45:36 2016 +0300 Committer: Andrus Adamchik 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 PLAIN_INT = new Property("plainInt"); + public static final Property PLAIN_STRING = new Property("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 @@ + + + + + @@ -33,4 +38,8 @@ + + + +