Example #1
0
        /// <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);
            }
        }
Example #2
0
        /// <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;
        }
Example #3
0
        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);
        }
Example #4
0
        /// <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));
        }