golang.org/x/tools/gopls@v0.15.3/internal/vulncheck/govulncheck/govulncheck.go (about)

     1  // Copyright 2023 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // Code generated by copying from golang.org/x/vuln@v1.0.1 (go run copier.go); DO NOT EDIT.
     6  
     7  // Package govulncheck contains the JSON output structs for govulncheck.
     8  package govulncheck
     9  
    10  import (
    11  	"time"
    12  
    13  	"golang.org/x/tools/gopls/internal/vulncheck/osv"
    14  )
    15  
    16  const (
    17  	// ProtocolVersion is the current protocol version this file implements
    18  	ProtocolVersion = "v1.0.0"
    19  )
    20  
    21  // Message is an entry in the output stream. It will always have exactly one
    22  // field filled in.
    23  type Message struct {
    24  	Config   *Config    `json:"config,omitempty"`
    25  	Progress *Progress  `json:"progress,omitempty"`
    26  	OSV      *osv.Entry `json:"osv,omitempty"`
    27  	Finding  *Finding   `json:"finding,omitempty"`
    28  }
    29  
    30  // Config must occur as the first message of a stream and informs the client
    31  // about the information used to generate the findings.
    32  // The only required field is the protocol version.
    33  type Config struct {
    34  	// ProtocolVersion specifies the version of the JSON protocol.
    35  	ProtocolVersion string `json:"protocol_version"`
    36  
    37  	// ScannerName is the name of the tool, for example, govulncheck.
    38  	//
    39  	// We expect this JSON format to be used by other tools that wrap
    40  	// govulncheck, which will have a different name.
    41  	ScannerName string `json:"scanner_name,omitempty"`
    42  
    43  	// ScannerVersion is the version of the tool.
    44  	ScannerVersion string `json:"scanner_version,omitempty"`
    45  
    46  	// DB is the database used by the tool, for example,
    47  	// vuln.go.dev.
    48  	DB string `json:"db,omitempty"`
    49  
    50  	// LastModified is the last modified time of the data source.
    51  	DBLastModified *time.Time `json:"db_last_modified,omitempty"`
    52  
    53  	// GoVersion is the version of Go used for analyzing standard library
    54  	// vulnerabilities.
    55  	GoVersion string `json:"go_version,omitempty"`
    56  
    57  	// ScanLevel instructs govulncheck to analyze at a specific level of detail.
    58  	// Valid values include module, package and symbol.
    59  	ScanLevel ScanLevel `json:"scan_level,omitempty"`
    60  }
    61  
    62  // Progress messages are informational only, intended to allow users to monitor
    63  // the progress of a long running scan.
    64  // A stream must remain fully valid and able to be interpreted with all progress
    65  // messages removed.
    66  type Progress struct {
    67  	// A time stamp for the message.
    68  	Timestamp *time.Time `json:"time,omitempty"`
    69  
    70  	// Message is the progress message.
    71  	Message string `json:"message,omitempty"`
    72  }
    73  
    74  // Vuln represents a single OSV entry.
    75  type Finding struct {
    76  	// OSV is the id of the detected vulnerability.
    77  	OSV string `json:"osv,omitempty"`
    78  
    79  	// FixedVersion is the module version where the vulnerability was
    80  	// fixed. This is empty if a fix is not available.
    81  	//
    82  	// If there are multiple fixed versions in the OSV report, this will
    83  	// be the fixed version in the latest range event for the OSV report.
    84  	//
    85  	// For example, if the range events are
    86  	// {introduced: 0, fixed: 1.0.0} and {introduced: 1.1.0}, the fixed version
    87  	// will be empty.
    88  	//
    89  	// For the stdlib, we will show the fixed version closest to the
    90  	// Go version that is used. For example, if a fix is available in 1.17.5 and
    91  	// 1.18.5, and the GOVERSION is 1.17.3, 1.17.5 will be returned as the
    92  	// fixed version.
    93  	FixedVersion string `json:"fixed_version,omitempty"`
    94  
    95  	// Trace contains an entry for each frame in the trace.
    96  	//
    97  	// Frames are sorted starting from the imported vulnerable symbol
    98  	// until the entry point. The first frame in Frames should match
    99  	// Symbol.
   100  	//
   101  	// In binary mode, trace will contain a single-frame with no position
   102  	// information.
   103  	//
   104  	// When a package is imported but no vulnerable symbol is called, the trace
   105  	// will contain a single-frame with no symbol or position information.
   106  	Trace []*Frame `json:"trace,omitempty"`
   107  }
   108  
   109  // Frame represents an entry in a finding trace.
   110  type Frame struct {
   111  	// Module is the module path of the module containing this symbol.
   112  	//
   113  	// Importable packages in the standard library will have the path "stdlib".
   114  	Module string `json:"module"`
   115  
   116  	// Version is the module version from the build graph.
   117  	Version string `json:"version,omitempty"`
   118  
   119  	// Package is the import path.
   120  	Package string `json:"package,omitempty"`
   121  
   122  	// Function is the function name.
   123  	Function string `json:"function,omitempty"`
   124  
   125  	// Receiver is the receiver type if the called symbol is a method.
   126  	//
   127  	// The client can create the final symbol name by
   128  	// prepending Receiver to FuncName.
   129  	Receiver string `json:"receiver,omitempty"`
   130  
   131  	// Position describes an arbitrary source position
   132  	// including the file, line, and column location.
   133  	// A Position is valid if the line number is > 0.
   134  	Position *Position `json:"position,omitempty"`
   135  }
   136  
   137  // Position represents arbitrary source position.
   138  type Position struct {
   139  	Filename string `json:"filename,omitempty"` // filename, if any
   140  	Offset   int    `json:"offset"`             // byte offset, starting at 0
   141  	Line     int    `json:"line"`               // line number, starting at 1
   142  	Column   int    `json:"column"`             // column number, starting at 1 (byte count)
   143  }
   144  
   145  // ScanLevel represents the detail level at which a scan occurred.
   146  // This can be necessary to correctly interpret the findings, for instance if
   147  // a scan is at symbol level and a finding does not have a symbol it means the
   148  // vulnerability was imported but not called. If the scan however was at
   149  // "package" level, that determination cannot be made.
   150  type ScanLevel string
   151  
   152  const (
   153  	scanLevelModule  = "module"
   154  	scanLevelPackage = "package"
   155  	scanLevelSymbol  = "symbol"
   156  )
   157  
   158  // WantSymbols can be used to check whether the scan level is one that is able
   159  // to generate symbols called findings.
   160  func (l ScanLevel) WantSymbols() bool { return l == scanLevelSymbol }