/// <summary> /// Re-link proxy bindings to the given object /// </summary> /// <typeparam name="T">Type of object being linked</typeparam> /// <param name="inputObject">Object to link proxies into</param> /// <param name="keyring">Local keyring to use in resulting linked object</param> /// <param name="configuration">Local configuration to use in resulting linked object</param> public static void Relink <T>(this T inputObject, Keyring keyring = null, EncryptionProxyConfiguration configuration = null) where T : class { if (EncryptedType.PendingGenerations.Contains(typeof(T))) { // Ignore any recursive generation from constructors return; } if (keyring == null) { keyring = new Keyring(); } AttemptRelink(inputObject, keyring, configuration); }
/// <summary> /// Return a copy of the given object with proxy bindings (this could either be a relink or a creation operation) /// </summary> /// <typeparam name="T">Type of object being linked</typeparam> /// <param name="inputObject">Object being linked or wrapped in an encryption proxy</param> /// <param name="keyring">Local keyring to use in resulting linked object</param> /// <param name="configuration">Local configuration to use in resulting linked object</param> /// <returns>Object of same type as input, with proxy bindings</returns> public static T AsEncrypted <T>(this T inputObject, Keyring keyring = null, EncryptionProxyConfiguration configuration = null) where T : class { if (keyring == null) { keyring = new Keyring(); } if (!AttemptRelink(inputObject, keyring, configuration)) { var trackedInstance = EncryptedInstanceFactory.GenerateTrackedInstance(inputObject.GetType(), configuration); trackedInstance.GetLocalKeyring().Import(keyring); CopyObjectProperties(inputObject, trackedInstance); return((T)trackedInstance); } else { return(inputObject); } }
private static bool AttemptRelink(object inputObject, Keyring keyring, EncryptionProxyConfiguration configuration) { // Is the object already linked? if (HasValidEncryptionExtensions(inputObject)) { EncryptedInstanceFactory.AttachInterceptor(inputObject, configuration); inputObject.GetLocalKeyring().Import(keyring); return(true); } // Does this object already have the bits we can attach to? if (HasUnlinkedEncryptionExtensions(inputObject)) { EncryptedInstanceFactory.AttachToExistingObject(inputObject, configuration); inputObject.GetLocalKeyring().Import(keyring); return(true); } return(false); }