/// <summary> /// Saves the public key-ring bundle. /// </summary> /// <remarks> /// <para>Atomically saves the public key-ring bundle to the path specified by <see cref="PublicKeyRingPath"/>.</para> /// <para>Called by <see cref="Import(Stream)"/> if any public keys were successfully imported.</para> /// </remarks> /// <exception cref="System.IO.IOException"> /// An error occured while saving the public key-ring bundle. /// </exception> protected void SavePublicKeyRingBundle() { var filename = Path.GetFileName(PublicKeyRingPath) + "~"; var dirname = Path.GetDirectoryName(PublicKeyRingPath); var tmp = Path.Combine(dirname, "." + filename); var bak = Path.Combine(dirname, filename); Directory.CreateDirectory(dirname); using (var file = File.Open(tmp, FileMode.Create, FileAccess.Write)) { PublicKeyRingBundle.Encode(file); file.Flush(); } if (File.Exists(PublicKeyRingPath)) { #if !NETSTANDARD1_3 && !NETSTANDARD1_6 File.Replace(tmp, PublicKeyRingPath, bak); #else if (File.Exists(bak)) { File.Delete(bak); } File.Move(PublicKeyRingPath, bak); File.Move(tmp, PublicKeyRingPath); #endif } else { File.Move(tmp, PublicKeyRingPath); } }
/// <summary> /// Enumerate all public keyrings. /// </summary> /// <remarks> /// Enumerates all public keyrings. /// </remarks> /// <returns>The list of available public keyrings.</returns> public virtual IEnumerable <PgpPublicKeyRing> EnumeratePublicKeyRings() { foreach (PgpPublicKeyRing keyring in PublicKeyRingBundle.GetKeyRings()) { yield return(keyring); } yield break; }
bool TryGetPublicKeyRing(long keyId, out PgpPublicKeyRing keyring) { foreach (PgpPublicKeyRing ring in PublicKeyRingBundle.GetKeyRings()) { foreach (PgpPublicKey key in ring.GetPublicKeys()) { if (key.KeyId == keyId) { keyring = ring; return(true); } } } keyring = null; return(false); }
/// <summary> /// Helper method to retrieve a public key, and its keyring, given a key's ID /// </summary> /// <param name="keyId"></param> /// <param name="doAsync"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public override async Task <KeyRetrievalResults> GetPublicKeyRingAsync(long keyId, bool doAsync, CancellationToken cancellationToken) { foreach (PgpPublicKeyRing ring in PublicKeyRingBundle.GetKeyRings()) { foreach (PgpPublicKey key in ring.GetPublicKeys()) { if (key.KeyId == keyId) { return(new KeyRetrievalResults(ring, key)); } } } if (AutoKeyRetrieve && IsValidKeyServer) { var keyring = await RetrievePublicKeyRingAsync(keyId, doAsync, cancellationToken).ConfigureAwait(false); return(new KeyRetrievalResults(keyring, keyring.GetPublicKey(keyId))); } return(new KeyRetrievalResults(null, null)); }