public static MacSignature? GetMacSignature()

in Lib/Collectors/FileSystemUtils.cs [211:281]


        public static MacSignature? GetMacSignature(string? Path)
        {
            try
            {
                if (ExternalCommandRunner.RunExternalCommand("codesign", $"-dv --verbose=4 \"{Path}\"", out string stdOut, out string stdErr) == 0)
                {
                    // The output from codesign goes to stdErr
                    var splits = stdErr.Split('\n');

                    if (splits[0].EndsWith("code object is not signed at all"))
                    {
                        return null;
                    }

                    var signature = new MacSignature();

                    foreach (var split in splits)
                    {
                        var innerSplit = split.Split('=');

                        switch (innerSplit[0])
                        {
                            case "Hash Type":
                                signature.HashType = innerSplit[1].Split(' ')[0];
                                break;

                            case "Hash Choices":
                                signature.HashChoices = innerSplit[1];
                                break;

                            case "CMSDigest":
                                signature.CMSDigest = innerSplit[1];
                                break;

                            case "Authority":
                                if (signature.Authorities is null)
                                {
                                    signature.Authorities = new List<string>();
                                }
                                signature.Authorities.Add(innerSplit[1]);
                                break;

                            case "Timestamp":
                                if (DateTime.TryParse(innerSplit[1], out DateTime result))
                                {
                                    signature.Timestamp = result;
                                }
                                break;

                            case "TeamIdentifier":
                                signature.TeamIdentifier = innerSplit[1];
                                break;

                            default:
                                if (innerSplit[0].StartsWith("CandidateCDHashFull"))
                                {
                                    signature.CandidateCDHashFull = innerSplit[1];
                                }
                                break;
                        }
                    }

                    return signature;
                }
            }
            catch (Exception e)
            {
                Log.Verbose("Failed to get Mac CodeSign information for {0} ({1}:{2})", Path, e.GetType(), e.Message);
            }
            return null;
        }