private void InitializeOutputFile(TOptions analyzeOptions, TContext context, ISet <string> targets)
        {
            string            filePath          = analyzeOptions.OutputFilePath;
            AggregatingLogger aggregatingLogger = (AggregatingLogger)context.Logger;

            if (!string.IsNullOrEmpty(filePath))
            {
                InvokeCatchingRelevantIOExceptions
                (
                    () =>
                {
                    LogFilePersistenceOptions logFilePersistenceOptions = analyzeOptions.ConvertToLogFilePersistenceOptions();

                    OptionallyEmittedData dataToInsert = analyzeOptions.DataToInsert.ToFlags();
                    OptionallyEmittedData dataToRemove = analyzeOptions.DataToRemove.ToFlags();

                    SarifLogger sarifLogger;

                    if (analyzeOptions.SarifOutputVersion != SarifVersion.OneZeroZero)
                    {
                        sarifLogger = new SarifLogger(
                            analyzeOptions.OutputFilePath,
                            logFilePersistenceOptions,
                            dataToInsert,
                            dataToRemove,
                            tool: _tool,
                            run: null,
                            analysisTargets: targets,
                            invocationTokensToRedact: GenerateSensitiveTokensList(),
                            invocationPropertiesToLog: analyzeOptions.InvocationPropertiesToLog,
                            levels: analyzeOptions.Level,
                            kinds: analyzeOptions.Kind);
                    }
                    else
                    {
                        sarifLogger = new SarifOneZeroZeroLogger(
                            analyzeOptions.OutputFilePath,
                            logFilePersistenceOptions,
                            dataToInsert,
                            dataToRemove,
                            tool: _tool,
                            run: null,
                            analysisTargets: targets,
                            invocationTokensToRedact: GenerateSensitiveTokensList(),
                            invocationPropertiesToLog: analyzeOptions.InvocationPropertiesToLog,
                            levels: analyzeOptions.Level,
                            kinds: analyzeOptions.Kind);
                    }
                    _pathToHashDataMap = sarifLogger.AnalysisTargetToHashDataMap;
                    sarifLogger.AnalysisStarted();
                    aggregatingLogger.Loggers.Add(sarifLogger);
                },
                    (ex) =>
                {
                    Errors.LogExceptionCreatingLogFile(context, filePath, ex);
                    ThrowExitApplicationException(context, ExitReason.ExceptionCreatingLogFile, ex);
                }
                );
            }
        }
        /// <summary>Converts a tool log file into the SARIF format.</summary>
        /// <exception cref="ArgumentNullException">Thrown when one or more required arguments are null.</exception>
        /// <exception cref="ArgumentException">Thrown when one or more arguments have unsupported or
        /// illegal values.</exception>
        /// <exception cref="InvalidOperationException">Thrown when the requested operation is invalid.</exception>
        /// <param name="toolFormat">The tool format of the input file.</param>
        /// <param name="inputFileName">The input log file name.</param>
        /// <param name="outputFileName">The name of the file to which the resulting SARIF log shall be
        /// written. This cannot be a directory.</param>
        /// <param name="conversionOptions">Options for controlling the conversion.</param>
        /// <param name="pluginAssemblyPath">Path to plugin assembly containing converter types.</param>
        public void ConvertToStandardFormat(
            string toolFormat,
            string inputFileName,
            string outputFileName,
            LogFilePersistenceOptions logFilePersistenceOptions = LogFilePersistenceOptions.None,
            OptionallyEmittedData dataToInsert = OptionallyEmittedData.None,
            string pluginAssemblyPath          = null)
        {
            if (inputFileName == null)
            {
                throw new ArgumentNullException(nameof(inputFileName));
            }
            if (outputFileName == null)
            {
                throw new ArgumentNullException(nameof(outputFileName));
            }

            // FileMode settings here will results in an exception being raised if the input
            // file does not exist, and that an existing output file will be overwritten
            using (FileStream input = File.OpenRead(inputFileName))
                using (FileStream outputTextStream = File.Create(outputFileName))
                    using (var outputTextWriter = new StreamWriter(outputTextStream))
                        using (var outputJson = new JsonTextWriter(outputTextWriter))
                        {
                            if (logFilePersistenceOptions.HasFlag(LogFilePersistenceOptions.PrettyPrint))
                            {
                                outputJson.Formatting = Formatting.Indented;
                            }

                            using (var output = new ResultLogJsonWriter(outputJson))
                            {
                                ConvertToStandardFormat(toolFormat, input, output, dataToInsert, pluginAssemblyPath);
                            }
                        }
        }
 public SarifOneZeroZeroLogger(
     string outputFilePath,
     LogFilePersistenceOptions logFilePersistenceOptions = SarifLogger.DefaultLogFilePersistenceOptions,
     OptionallyEmittedData dataToInsert = OptionallyEmittedData.None,
     OptionallyEmittedData dataToRemove = OptionallyEmittedData.None,
     Tool tool = null,
     Run run   = null,
     IEnumerable <string> analysisTargets           = null,
     IEnumerable <string> invocationTokensToRedact  = null,
     IEnumerable <string> invocationPropertiesToLog = null,
     string defaultFileEncoding        = null,
     IEnumerable <FailureLevel> levels = null,
     IEnumerable <ResultKind> kinds    = null)
     : base(new StreamWriter(new FileStream(outputFilePath, FileMode.Create, FileAccess.Write, FileShare.None)),
            logFilePersistenceOptions: logFilePersistenceOptions,
            dataToInsert: dataToInsert,
            dataToRemove: dataToRemove,
            defaultFileEncoding: defaultFileEncoding,
            tool: tool,
            run: run,
            analysisTargets: analysisTargets,
            invocationTokensToRedact: invocationTokensToRedact,
            invocationPropertiesToLog: invocationPropertiesToLog,
            levels: levels,
            kinds: kinds)
 {
     _outputFilePath = outputFilePath;
 }
Пример #4
0
        private SarifLogger(
            TextWriter textWriter,
            LogFilePersistenceOptions logFilePersistenceOptions,
            bool closeWriterOnDipose,
            IEnumerable <FailureLevel> levels,
            IEnumerable <ResultKind> kinds) : base(failureLevels: levels, resultKinds: kinds)
        {
            _textWriter           = textWriter;
            _closeWriterOnDispose = closeWriterOnDipose;
            _jsonTextWriter       = new JsonTextWriter(_textWriter);

            _logFilePersistenceOptions = logFilePersistenceOptions;

            if (PrettyPrint)
            {
                // Indented output is preferable for debugging
                _jsonTextWriter.Formatting = Newtonsoft.Json.Formatting.Indented;
            }

            _jsonTextWriter.DateFormatString = DateTimeConverter.DateTimeFormat;
            _jsonTextWriter.CloseOutput      = _closeWriterOnDispose;

            _issueLogJsonWriter = new ResultLogJsonWriter(_jsonTextWriter);
            RuleToIndexMap      = new Dictionary <ReportingDescriptor, int>(ReportingDescriptor.ValueComparer);
        }
Пример #5
0
        public SarifLogger(
            TextWriter textWriter,
            LogFilePersistenceOptions logFilePersistenceOptions = DefaultLogFilePersistenceOptions,
            OptionallyEmittedData dataToInsert = OptionallyEmittedData.None,
            OptionallyEmittedData dataToRemove = OptionallyEmittedData.None,
            Tool tool = null,
            Run run   = null,
            IEnumerable <string> analysisTargets           = null,
            IEnumerable <string> invocationTokensToRedact  = null,
            IEnumerable <string> invocationPropertiesToLog = null,
            string defaultFileEncoding        = null,
            bool closeWriterOnDispose         = true,
            IEnumerable <FailureLevel> levels = null,
            IEnumerable <ResultKind> kinds    = null) : this(textWriter, logFilePersistenceOptions, closeWriterOnDispose, levels, kinds)
        {
            if (dataToInsert.HasFlag(OptionallyEmittedData.Hashes))
            {
                AnalysisTargetToHashDataMap = HashUtilities.MultithreadedComputeTargetFileHashes(analysisTargets);
            }

            _run = run ?? new Run();

            if (dataToInsert.HasFlag(OptionallyEmittedData.RegionSnippets) || dataToInsert.HasFlag(OptionallyEmittedData.ContextRegionSnippets))
            {
                _insertOptionalDataVisitor = new InsertOptionalDataVisitor(dataToInsert, _run);
            }

            EnhanceRun(
                analysisTargets,
                dataToInsert,
                dataToRemove,
                invocationTokensToRedact,
                invocationPropertiesToLog,
                defaultFileEncoding,
                AnalysisTargetToHashDataMap);

            tool = tool ?? Tool.CreateFromAssemblyData();

            _run.Tool     = tool;
            _dataToInsert = dataToInsert;
            _dataToRemove = dataToRemove;
            _issueLogJsonWriter.Initialize(_run);

            // Map existing Rules to ensure duplicates aren't created
            if (_run.Tool.Driver?.Rules != null)
            {
                for (int i = 0; i < _run.Tool.Driver.Rules.Count; ++i)
                {
                    RuleToIndexMap[_run.Tool.Driver.Rules[i]] = i;
                }
            }

            _persistArtifacts =
                (_dataToInsert & OptionallyEmittedData.Hashes) != 0 ||
                (_dataToInsert & OptionallyEmittedData.TextFiles) != 0 ||
                (_dataToInsert & OptionallyEmittedData.BinaryFiles) != 0;
        }
        public static LogFilePersistenceOptions ConvertToLogFilePersistenceOptions(this AnalyzeOptionsBase analyzeOptions)
        {
            LogFilePersistenceOptions logFilePersistenceOptions = LogFilePersistenceOptions.PrettyPrint;

            if (analyzeOptions.Force)
            {
                logFilePersistenceOptions |= LogFilePersistenceOptions.OverwriteExistingOutputFile;
            }
            if (analyzeOptions.Minify)
            {
                logFilePersistenceOptions ^= LogFilePersistenceOptions.PrettyPrint;
            }
            if (analyzeOptions.Optimize)
            {
                logFilePersistenceOptions |= LogFilePersistenceOptions.Optimize;
            }
            if (analyzeOptions.PrettyPrint)
            {
                logFilePersistenceOptions |= LogFilePersistenceOptions.PrettyPrint;
            }

            return(logFilePersistenceOptions);
        }
Пример #7
0
        public int Run(ConvertOptions convertOptions, IFileSystem fileSystem = null)
        {
            fileSystem ??= Sarif.FileSystem.Instance;

            try
            {
                if (string.IsNullOrEmpty(convertOptions.OutputFilePath))
                {
                    convertOptions.OutputFilePath = convertOptions.InputFilePath + SarifConstants.SarifFileExtension;
                }

                if (fileSystem.DirectoryExists(convertOptions.OutputFilePath))
                {
                    Console.Error.WriteLine(
                        string.Format(
                            CultureInfo.CurrentCulture,
                            "The output path '{0}' is a directory.",
                            convertOptions.OutputFilePath));
                    return(FAILURE);
                }

                if (!ValidateOptions(convertOptions, fileSystem))
                {
                    return(FAILURE);
                }

                LogFilePersistenceOptions logFilePersistenceOptions = LogFilePersistenceOptions.None;

                OptionallyEmittedData dataToInsert = convertOptions.DataToInsert.ToFlags();

                if (convertOptions.PrettyPrint)
                {
                    logFilePersistenceOptions |= LogFilePersistenceOptions.PrettyPrint;
                }

                if (convertOptions.Force)
                {
                    logFilePersistenceOptions |= LogFilePersistenceOptions.OverwriteExistingOutputFile;
                }

                new ToolFormatConverter().ConvertToStandardFormat(
                    convertOptions.ToolFormat,
                    convertOptions.InputFilePath,
                    convertOptions.OutputFilePath,
                    logFilePersistenceOptions,
                    dataToInsert,
                    convertOptions.PluginAssemblyPath);

                if (convertOptions.NormalizeForGitHub)
                {
                    SarifLog sarifLog;

                    JsonSerializer serializer = new JsonSerializer()
                    {
                        Formatting = convertOptions.PrettyPrint ? Formatting.Indented : 0,
                    };

                    using (JsonTextReader reader = new JsonTextReader(new StreamReader(convertOptions.OutputFilePath)))
                    {
                        sarifLog = serializer.Deserialize <SarifLog>(reader);
                    }

                    var visitor = new GitHubIngestionVisitor();
                    visitor.VisitSarifLog(sarifLog);

                    using (FileStream stream = File.Create(convertOptions.OutputFilePath))
                        using (StreamWriter streamWriter = new StreamWriter(stream))
                            using (JsonTextWriter writer = new JsonTextWriter(streamWriter))
                            {
                                serializer.Serialize(writer, sarifLog);
                            }
                }
            }
            catch (Exception ex) when(!Debugger.IsAttached)
            {
                Console.WriteLine(ex);
                return(FAILURE);
            }

            return(SUCCESS);
        }