Ejemplo n.º 1
0
        private int Startup(IEnumerable<string> args)
        {
            _signingCertPath = QuickSettings.EncryptedStringSetting["SigningCertPath"];

            ReadPassword();

            var options = args.Switches();
            var parameters = args.Parameters();

            foreach (var arg in options.Keys) {
                var argumentParameters = options[arg];

                switch (arg) {
                        /* global switches */
                    case "load-config":
                        // all ready done, but don't get too picky.
                        break;

                    case "nologo":
                        this.Assembly().SetLogo(string.Empty);
                        break;

                    case "help":
                        return Help();

                    case "rescan-tools":
                        ProgramFinder.IgnoreCache = true;
                        break;

                    case "certificate-path":
                        _signingCertPath = Path.GetFullPath(argumentParameters.Last());
                        ReadPassword();
                        break;

                    case "password":
                        _signingCertPassword = argumentParameters.Last();
                        break;

                    case "remember":
                        _remember = true;
                        break;

                    case "show-tools":
                        _showTools = true;
                        break;

                    case "sign-only":
                        _strongname = false;
                        break;

                    case "name-only":
                        _sign = false;
                        break;

                    case "verbose":
                        _verbose = true;
                        break;

                    default:
                        return Fail("Unknown parameter [--{0}]", arg);
                }
            }

            Logo();

            if (parameters.Count() < 1) {
                return Fail("Missing files to sign/name. \r\n\r\n    Use --help for command line help.");
            }

            if (_remember) {
                QuickSettings.EncryptedStringSetting["SigningCertPath"] = _signingCertPath;
                QuickSettings.EncryptedStringSetting["SigningCertPassword:"******"[Looking up tool locations...]");

            _signTool = new ProcessUtility(ProgramFinder.ProgramFilesAndDotNet.ScanForFile("signTool.exe"));
            _strongNameTool = new ProcessUtility(ProgramFinder.ProgramFilesAndDotNet.ScanForFile("sn.exe"));

            if (_showTools) {
                Console.WriteLine(_signTool.Executable);
                Console.WriteLine(_strongNameTool.Executable);
            }

            if (string.IsNullOrEmpty(_signingCertPath) || !File.Exists(_signingCertPath)) {
                Fail("Certificate Path Not Found [{0}] ", _signingCertPath);
            }

            try {
                foreach (var filename in parameters.FindFilesSmarter()) {
                    var result = "";
                    if( CoApp.Toolkit.Crypto.Verifier.HasValidSignature(filename)) {
                        using (new ConsoleColors(ConsoleColor.Yellow, ConsoleColor.Black)) {
                            Console.WriteLine("[{0}] already has a valid signature; skipping.", filename);
                        }
                        continue;
                    }

                    if (_strongname) {
                        _strongNameTool.ExecAsyncNoStdInRedirect(NamingCommand, filename, _signingCertPath);
                        _strongNameTool.AttachToConsoleForProcess();
                        result = _strongNameTool.StandardOut + _strongNameTool.StandardError;
                        _strongNameTool.WaitForExit(200);

                        if (!_strongNameTool.IsRunning) {
                            if (result.Contains("Failed to")) {
                                using (new ConsoleColors(ConsoleColor.Red, ConsoleColor.Black)) {
                                    Console.WriteLine("[{0}] failed strong naming; skipping.", filename);
                                }
                            }
                            // finished without waiting for a password. We're skipping this.
                            continue;
                        }

                        // send the password!
                        ConsoleApi.SendStringToStdIn(_signingCertPassword + "\r");
                        _strongNameTool.WaitForExit();

                        result += _strongNameTool.StandardOut + _strongNameTool.StandardError;
                        if (result.Contains("Failed to")) {
                            using (new ConsoleColors(ConsoleColor.Red, ConsoleColor.Black)) {
                                Console.WriteLine("[{0}] failed strong naming; skipping.", filename);
                            }
                            continue;
                        }

                        if (result.Contains("successfully re-signed")) {
                            using (new ConsoleColors(ConsoleColor.Green, ConsoleColor.Black)) {
                                Console.WriteLine("[{0}] Strong Named Successfully.", filename);
                            }
                        }

                        Verbose(Filter(result));
                    }

                    if (_sign) {
                        _signTool.Exec(SigningCommand, _signingCertPath, _signingCertPassword, filename);
                        result = _signTool.StandardOut + _signTool.StandardError;
                        if (result.Contains("Successfully signed and timestamped")) {
                            using (new ConsoleColors(ConsoleColor.Green, ConsoleColor.Black)) {
                                Console.WriteLine("[{0}] Digitally Signed and Timestamped Successfully.", filename);
                            }
                        }
                        else {
                            using (new ConsoleColors(ConsoleColor.Red, ConsoleColor.Black)) {
                                Console.WriteLine("[{0}] failed digital signing.", filename);
                            }
                        }
                        Verbose(Filter(result));
                    }
                }
            }
            catch (Exception e) {
                return Fail(e.Message);
            }

            return 0;
        }