001 package org.cumulus4j.store.crypto;
002
003 import javax.jdo.PersistenceManager;
004
005 import org.cumulus4j.store.EncryptionCoordinateSetManager;
006 import org.cumulus4j.store.KeyStoreRefManager;
007 import org.cumulus4j.store.PersistenceManagerConnection;
008 import org.cumulus4j.store.model.KeyStoreRef;
009 import org.datanucleus.store.ExecutionContext;
010
011 /**
012 * Context for encryption and decryption.
013 * @author Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de
014 */
015 public class CryptoContext
016 {
017 /**
018 * Create a new context.
019 * @param encryptionCoordinateSetManager the <code>EncryptionCoordinateSetManager</code> to be used in this context; must not be <code>null</code>.
020 * @param keyStoreRefManager the <code>KeyStoreRefManager</code> to be used in this context; must not be <code>null</code>.
021 * @param executionContext the <code>ExecutionContext</code> to be used in this context; must not be <code>null</code>.
022 * @param persistenceManagerConnection the <code>PersistenceManagerConnection</code> to be used in this context; must not be <code>null</code>.
023 */
024 public CryptoContext(EncryptionCoordinateSetManager encryptionCoordinateSetManager, KeyStoreRefManager keyStoreRefManager, ExecutionContext executionContext, PersistenceManagerConnection persistenceManagerConnection)
025 {
026 if (encryptionCoordinateSetManager == null)
027 throw new IllegalArgumentException("encryptionCoordinateSetManager == null");
028
029 if (keyStoreRefManager == null)
030 throw new IllegalArgumentException("keyStoreRefManager == null");
031
032 if (executionContext == null)
033 throw new IllegalArgumentException("executionContext == null");
034
035 if (persistenceManagerConnection == null)
036 throw new IllegalArgumentException("persistenceManagerConnection == null");
037
038 this.encryptionCoordinateSetManager = encryptionCoordinateSetManager;
039 this.keyStoreRefManager = keyStoreRefManager;
040 this.executionContext = executionContext;
041 this.persistenceManagerConnection = persistenceManagerConnection;
042 this.persistenceManagerForData = persistenceManagerConnection.getDataPM();
043 this.persistenceManagerForIndex = persistenceManagerConnection.getIndexPM();
044 }
045
046 private EncryptionCoordinateSetManager encryptionCoordinateSetManager;
047
048 public KeyStoreRefManager getKeyStoreRefManager() {
049 return keyStoreRefManager;
050 }
051
052 private KeyStoreRefManager keyStoreRefManager;
053
054 /**
055 * Get the <code>EncryptionCoordinateSetManager</code> to be used in this context; never <code>null</code>.
056 * @return the <code>EncryptionCoordinateSetManager</code> to be used in this context; never <code>null</code>.
057 */
058 public EncryptionCoordinateSetManager getEncryptionCoordinateSetManager() {
059 return encryptionCoordinateSetManager;
060 }
061
062 private ExecutionContext executionContext;
063
064 /**
065 * Get the <code>ExecutionContext</code> to be used in this context; never <code>null</code>.
066 * @return the <code>ExecutionContext</code> to be used in this context; never <code>null</code>.
067 */
068 public ExecutionContext getExecutionContext() {
069 return executionContext;
070 }
071
072 private PersistenceManagerConnection persistenceManagerConnection;
073
074 /**
075 * Get the <code>PersistenceManagerConnection</code> to be used in this context; never <code>null</code>.
076 * @return the <code>PersistenceManagerConnection</code> to be used in this context; never <code>null</code>.
077 */
078 public PersistenceManagerConnection getPersistenceManagerConnection() {
079 return persistenceManagerConnection;
080 }
081
082 private PersistenceManager persistenceManagerForData;
083
084 /**
085 * Convenience method synonymous to {@link PersistenceManagerConnection#getDataPM()}.
086 * @return the PM used for the actual data.
087 */
088 public PersistenceManager getPersistenceManagerForData() {
089 return persistenceManagerForData;
090 }
091
092 private PersistenceManager persistenceManagerForIndex;
093
094 /**
095 * Convenience method synonymous to {@link PersistenceManagerConnection#getIndexPM()}.
096 * @return the PM used for index data. If there is no separate index-datastore, this
097 * is the same as {@link #getPersistenceManagerForData()}.
098 */
099 public PersistenceManager getPersistenceManagerForIndex() {
100 return persistenceManagerForIndex;
101 }
102
103 public CryptoSession getCryptoSession()
104 {
105 ExecutionContext ec = executionContext;
106 Object cryptoManagerID = ec.getProperty(CryptoManager.PROPERTY_CRYPTO_MANAGER_ID);
107 if (cryptoManagerID == null)
108 throw new IllegalStateException("Property \"" + CryptoManager.PROPERTY_CRYPTO_MANAGER_ID + "\" is not set!");
109
110 if (!(cryptoManagerID instanceof String))
111 throw new IllegalStateException("Property \"" + CryptoManager.PROPERTY_CRYPTO_MANAGER_ID + "\" is set, but it is an instance of " + cryptoManagerID.getClass().getName() + " instead of java.lang.String!");
112
113 CryptoManager cryptoManager = CryptoManagerRegistry.sharedInstance(ec.getNucleusContext()).getCryptoManager((String) cryptoManagerID);
114
115 Object cryptoSessionID = ec.getProperty(CryptoSession.PROPERTY_CRYPTO_SESSION_ID);
116 if (cryptoSessionID == null)
117 throw new IllegalStateException("Property \"" + CryptoSession.PROPERTY_CRYPTO_SESSION_ID + "\" is not set!");
118
119 if (!(cryptoSessionID instanceof String))
120 throw new IllegalStateException("Property \"" + CryptoSession.PROPERTY_CRYPTO_SESSION_ID + "\" is set, but it is an instance of " + cryptoSessionID.getClass().getName() + " instead of java.lang.String!");
121
122 CryptoSession cryptoSession = cryptoManager.getCryptoSession((String) cryptoSessionID);
123 return cryptoSession;
124 }
125
126 private Integer keyStoreRefID;
127
128 public int getKeyStoreRefID() {
129 Integer keyStoreRefID = this.keyStoreRefID;
130 if (keyStoreRefID == null) {
131 String keyStoreID = getCryptoSession().getKeyStoreID();
132 KeyStoreRef keyStoreRef = getKeyStoreRefManager().createKeyStoreRef(getPersistenceManagerConnection(), keyStoreID);
133 keyStoreRefID = keyStoreRef.getKeyStoreRefID();
134 this.keyStoreRefID = keyStoreRefID;
135 }
136 return keyStoreRefID;
137 }
138 }