コード例 #1
0
ファイル: GnuPGTool.cs プロジェクト: soukoku/PgpSharp
        /// <summary>
        /// Lists the known keys.
        /// </summary>
        /// <param name="target">The target.</param>
        /// <returns></returns>
        public IEnumerable <KeyId> ListKeys(KeyTarget target)
        {
            var args    = "--fixed-list-mode --with-colons --with-fingerprint --list-public-keys";
            var keyHead = "pub";

            if (target == KeyTarget.Secret)
            {
                args    = "--fixed-list-mode --with-colons --with-fingerprint --list-secret-keys";
                keyHead = "sec";
            }
            if (!string.IsNullOrWhiteSpace(KeyringFolder))
            {
                args += string.Format(" --homedir \"{0}\" ", KeyringFolder);
            }

            using (var proc = new RedirectedProcess(GnuPGConfig.GnuPGExePath, args))
            {
                if (proc.Start())
                {
                    proc.WaitForExit();

                    string[] lines = proc.Output.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
                    for (int i = 0; i < lines.Length; i++)
                    {
                        var fields = lines[i].Split(':');
                        if (fields[0] == keyHead)
                        {
                            var id       = fields[4];
                            var allowCap = KeyCapabilities.None;
                            var useCap   = KeyCapabilities.None;
                            ParseKeyCapField(fields[11], ref allowCap, ref useCap);
                            i++;

                            // read more lines as part of this key
                            string        finger = null;
                            List <string> users  = new List <string>();
                            for (; i < lines.Length; i++)
                            {
                                fields = lines[i].Split(':');
                                if (fields[0] == keyHead)
                                {
                                    // another key, exit loop
                                    i--;
                                    break;
                                }
                                switch (fields[0])
                                {
                                case "uid":
                                    users.Add(IOUtility.DecodeAsciiEscapes(fields[9]));
                                    break;

                                case "fpr":
                                    finger = fields[9];
                                    break;
                                }
                            }

                            yield return(new KeyId(id, finger, allowCap, useCap, users));
                        }
                    }
                }
            }
        }