Cleaning up the codebase.

This commit is contained in:
Kyle Isom 2023-05-04 23:21:07 -07:00
parent 8b2d10209e
commit 74ce7bc58a
16 changed files with 170 additions and 127 deletions

View File

@ -45,13 +45,6 @@ func sha512Slicer(bs []byte) []byte {
return sum[:] return sum[:]
} }
var sliceFunctions = map[string]func([]byte) []byte{
"sha224": sha224Slicer,
"sha256": sha256Slicer,
"sha384": sha384Slicer,
"sha512": sha512Slicer,
}
// Hash represents a generic hash function that may or may not be secure. It // Hash represents a generic hash function that may or may not be secure. It
// satisfies the hash.Hash interface. // satisfies the hash.Hash interface.
type Hash struct { type Hash struct {

View File

@ -94,7 +94,7 @@ func NoError(err error, s ...string) {
} }
if nil != err { if nil != err {
die(err.Error()) die(err.Error(), s...)
} }
} }
@ -170,5 +170,5 @@ func ErrorEqT(t *testing.T, expected, actual error) {
should = fmt.Sprintf("have '%s'", actual) should = fmt.Sprintf("have '%s'", actual)
} }
die(fmt.Sprintf("assert.Error2: expected '%s', but %s", expected, should)) t.Fatalf("assert.Error2: expected '%s', but %s", expected, should)
} }

View File

@ -10,9 +10,9 @@ import (
"strings" "strings"
"time" "time"
"github.com/cloudflare/cfssl/helpers"
"git.wntrmute.dev/kyle/goutils/die" "git.wntrmute.dev/kyle/goutils/die"
"git.wntrmute.dev/kyle/goutils/lib" "git.wntrmute.dev/kyle/goutils/lib"
"github.com/cloudflare/cfssl/helpers"
) )
var warnOnly bool var warnOnly bool

View File

@ -8,10 +8,10 @@ import (
"os" "os"
"time" "time"
"github.com/cloudflare/cfssl/helpers"
"github.com/cloudflare/cfssl/revoke"
"git.wntrmute.dev/kyle/goutils/die" "git.wntrmute.dev/kyle/goutils/die"
"git.wntrmute.dev/kyle/goutils/lib" "git.wntrmute.dev/kyle/goutils/lib"
"github.com/cloudflare/cfssl/helpers"
"github.com/cloudflare/cfssl/revoke"
) )
func printRevocation(cert *x509.Certificate) { func printRevocation(cert *x509.Certificate) {

View File

@ -12,6 +12,7 @@ import (
"path/filepath" "path/filepath"
"git.wntrmute.dev/kyle/goutils/die" "git.wntrmute.dev/kyle/goutils/die"
"git.wntrmute.dev/kyle/goutils/fileutil"
) )
var ( var (
@ -56,7 +57,7 @@ func processFile(tfr *tar.Reader, hdr *tar.Header, top string) error {
} }
filePath := filepath.Clean(filepath.Join(top, hdr.Name)) filePath := filepath.Clean(filepath.Join(top, hdr.Name))
switch hdr.Typeflag { switch hdr.Typeflag {
case tar.TypeReg, tar.TypeRegA: case tar.TypeReg:
file, err := os.Create(filePath) file, err := os.Create(filePath)
if err != nil { if err != nil {
return err return err
@ -92,6 +93,10 @@ func processFile(tfr *tar.Reader, hdr *tar.Header, top string) error {
return err return err
} }
case tar.TypeSymlink: case tar.TypeSymlink:
if !fileutil.ValidateSymlink(hdr.Linkname, top) {
return fmt.Errorf("symlink %s is outside the top-level %s",
hdr.Linkname, top)
}
path := linkTarget(hdr.Linkname, top) path := linkTarget(hdr.Linkname, top)
if ok, err := filepath.Match(top+"/*", filepath.Clean(path)); !ok { if ok, err := filepath.Match(top+"/*", filepath.Clean(path)); !ok {
return fmt.Errorf("symlink %s isn't in %s", hdr.Linkname, top) return fmt.Errorf("symlink %s isn't in %s", hdr.Linkname, top)

View File

@ -12,36 +12,23 @@ import (
"sort" "sort"
"strings" "strings"
"git.wntrmute.dev/kyle/goutils/dbg"
"git.wntrmute.dev/kyle/goutils/die" "git.wntrmute.dev/kyle/goutils/die"
"git.wntrmute.dev/kyle/goutils/logging"
) )
var ( var (
gopath string gopath string
project string project string
debug bool
) )
var ( var (
stdLibRegexp = regexp.MustCompile(`^\w+(/\w+)*$`) debug = dbg.New()
sourceRegexp = regexp.MustCompile(`^[^.].*\.go$`)
log = logging.NewConsole()
imports = map[string]bool{}
fset = &token.FileSet{} fset = &token.FileSet{}
imports = map[string]bool{}
sourceRegexp = regexp.MustCompile(`^[^.].*\.go$`)
stdLibRegexp = regexp.MustCompile(`^\w+(/\w+)*$`)
) )
func debugf(format string, args ...interface{}) {
if debug {
fmt.Printf(format, args...)
}
}
func debugln(args ...interface{}) {
if debug {
fmt.Println(args...)
}
}
func init() { func init() {
gopath = os.Getenv("GOPATH") gopath = os.Getenv("GOPATH")
if gopath == "" { if gopath == "" {
@ -75,7 +62,7 @@ func walkFile(path string, info os.FileInfo, err error) error {
return nil return nil
} }
debugln(path) debug.Println(path)
f, err := parser.ParseFile(fset, path, nil, parser.ImportsOnly) f, err := parser.ParseFile(fset, path, nil, parser.ImportsOnly)
if err != nil { if err != nil {
@ -85,16 +72,16 @@ func walkFile(path string, info os.FileInfo, err error) error {
for _, importSpec := range f.Imports { for _, importSpec := range f.Imports {
importPath := strings.Trim(importSpec.Path.Value, `"`) importPath := strings.Trim(importSpec.Path.Value, `"`)
if stdLibRegexp.MatchString(importPath) { if stdLibRegexp.MatchString(importPath) {
debugln("standard lib:", importPath) debug.Println("standard lib:", importPath)
continue continue
} else if strings.HasPrefix(importPath, project) { } else if strings.HasPrefix(importPath, project) {
debugln("internal import:", importPath) debug.Println("internal import:", importPath)
continue continue
} else if strings.HasPrefix(importPath, "golang.org/") { } else if strings.HasPrefix(importPath, "golang.org/") {
debugln("extended lib:", importPath) debug.Println("extended lib:", importPath)
continue continue
} }
debugln("import:", importPath) debug.Println("import:", importPath)
imports[importPath] = true imports[importPath] = true
} }
@ -108,7 +95,7 @@ func main() {
var noVendor bool var noVendor bool
flag.StringVar(&ignoreLine, "i", "", "comma-separated list of directories to ignore") flag.StringVar(&ignoreLine, "i", "", "comma-separated list of directories to ignore")
flag.BoolVar(&noVendor, "nv", false, "ignore the vendor directory") flag.BoolVar(&noVendor, "nv", false, "ignore the vendor directory")
flag.BoolVar(&debug, "v", false, "log debugging information") flag.BoolVar(&debug.Enabled, "v", false, "log debugging information")
flag.Parse() flag.Parse()
if noVendor { if noVendor {

View File

@ -55,21 +55,21 @@ func To(w io.WriteCloser) *DebugPrinter {
} }
// Print calls fmt.Print if Enabled is true. // Print calls fmt.Print if Enabled is true.
func (dbg DebugPrinter) Print(v ...interface{}) { func (dbg *DebugPrinter) Print(v ...interface{}) {
if dbg.Enabled { if dbg.Enabled {
fmt.Fprint(dbg.out, v...) fmt.Fprint(dbg.out, v...)
} }
} }
// Println calls fmt.Println if Enabled is true. // Println calls fmt.Println if Enabled is true.
func (dbg DebugPrinter) Println(v ...interface{}) { func (dbg *DebugPrinter) Println(v ...interface{}) {
if dbg.Enabled { if dbg.Enabled {
fmt.Fprintln(dbg.out, v...) fmt.Fprintln(dbg.out, v...)
} }
} }
// Printf calls fmt.Printf if Enabled is true. // Printf calls fmt.Printf if Enabled is true.
func (dbg DebugPrinter) Printf(format string, v ...interface{}) { func (dbg *DebugPrinter) Printf(format string, v ...interface{}) {
if dbg.Enabled { if dbg.Enabled {
fmt.Fprintf(dbg.out, format, v...) fmt.Fprintf(dbg.out, format, v...)
} }

View File

@ -1,10 +1,11 @@
//go:build !windows
// +build !windows
// Package fileutil contains common file functions. // Package fileutil contains common file functions.
package fileutil package fileutil
import ( import (
"os" "os"
"path/filepath"
"strings"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
) )
@ -47,10 +48,3 @@ const (
func Access(path string, mode int) error { func Access(path string, mode int) error {
return unix.Access(path, uint32(mode)) return unix.Access(path, uint32(mode))
} }
// ValidateSymlink checks to make sure a symlink exists in some top-level
// directory.
func ValidateSymlink(symlink, topLevel string) bool {
target, err := filepath.EvalSymlinks(symlink)
return strings.HasPrefix(target, topLevel)
}

View File

@ -0,0 +1,49 @@
//go:build windows
// +build windows
// Package fileutil contains common file functions.
package fileutil
import (
"errors"
"os"
)
// FileDoesExist returns true if the file exists.
func FileDoesExist(path string) bool {
_, err := os.Stat(path)
return !os.IsNotExist(err)
}
// DirectoryDoesExist returns true if the file exists.
func DirectoryDoesExist(path string) bool {
fi, err := os.Stat(path)
if err != nil {
return false
}
return fi.Mode().IsDir()
}
const (
// AccessExists checks whether the file exists. This is invalid outside of
// Unix systems.
AccessExists = 0
// AccessRead checks whether the user has read permissions on
// the file. This is invalid outside of Unix systems.
AccessRead = 0
// AccessWrite checks whether the user has write permissions
// on the file. This is invalid outside of Unix systems.
AccessWrite = 0
// AccessExec checks whether the user has executable
// permissions on the file. This is invalid outside of Unix systems.
AccessExec = 0
)
// Access is a Unix-only call, and has no meaning on Windows.
func Access(path string, mode int) error {
return errors.New("fileutil: Access is meaningless on Windows")
}

16
fileutil/symlinks.go Normal file
View File

@ -0,0 +1,16 @@
package fileutil
import (
"path/filepath"
"strings"
)
// ValidateSymlink checks to make sure a symlink exists in some top-level
// directory.
func ValidateSymlink(symlink, topLevel string) bool {
target, err := filepath.EvalSymlinks(symlink)
if err != nil {
return false
}
return strings.HasPrefix(target, topLevel)
}

8
go.mod
View File

@ -13,11 +13,3 @@ require (
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad golang.org/x/sys v0.0.0-20220412211240-33da011f77ad
gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v2 v2.4.0
) )
require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/google/certificate-transparency-go v1.0.21 // indirect
github.com/kr/fs v0.1.0 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect
)

6
go.sum
View File

@ -81,16 +81,22 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0=
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=

View File

@ -89,7 +89,7 @@ func Duration(d time.Duration) string {
if d >= yearDuration { if d >= yearDuration {
years := d / yearDuration years := d / yearDuration
s += fmt.Sprintf("%dy", years) s += fmt.Sprintf("%dy", years)
d -= (years * yearDuration) d -= years * yearDuration
} }
if d >= dayDuration { if d >= dayDuration {
@ -103,7 +103,7 @@ func Duration(d time.Duration) string {
d %= 1 * time.Second d %= 1 * time.Second
hours := d / time.Hour hours := d / time.Hour
d -= (hours * time.Hour) d -= hours * time.Hour
s += fmt.Sprintf("%dh%s", hours, d) s += fmt.Sprintf("%dh%s", hours, d)
return s return s
} }

View File

@ -8,21 +8,7 @@ import (
) )
// Logger provides a standardised logging interface. // Logger provides a standardised logging interface.
type Logger interface { //
// SetLevel sets the minimum log level.
SetLevel(Level)
// Good returns true if the Logger is healthy.
Good() bool
// Status returns an error corresponding to the logger's state;
// if it's healthy (e.g. Good() returns true), Error will
// return nil.
Status() error
// Close gives the Logger the opportunity to perform any cleanup.
Close() error
// Log messages consist of four components: // Log messages consist of four components:
// //
// 1. The **level** attaches a notion of priority to the log message. // 1. The **level** attaches a notion of priority to the log message.
@ -83,6 +69,21 @@ type Logger interface {
// + ``$2`` contains the level // + ``$2`` contains the level
// + ``$3`` contains the actor // + ``$3`` contains the actor
// + ``$4`` contains the event // + ``$4`` contains the event
type Logger interface {
// SetLevel sets the minimum log level.
SetLevel(Level)
// Good returns true if the Logger is healthy.
Good() bool
// Status returns an error corresponding to the logger's state;
// if it's healthy (e.g. Good() returns true), Error will
// return nil.
Status() error
// Close gives the Logger the opportunity to perform any cleanup.
Close() error
Debug(actor, event string, attrs map[string]string) Debug(actor, event string, attrs map[string]string)
Info(actor, event string, attrs map[string]string) Info(actor, event string, attrs map[string]string)
Warn(actor, event string, attrs map[string]string) Warn(actor, event string, attrs map[string]string)

View File

@ -1,4 +1,4 @@
// seekbuf implements a read-seekable buffer. // Package seekbuf implements a read-seekable buffer.
package seekbuf package seekbuf
import "io" import "io"

View File

@ -1,4 +1,4 @@
// syslog is a syslog-type facility for logging. // Package syslog is a syslog-type facility for logging.
package syslog package syslog
import ( import (
@ -100,12 +100,12 @@ type Options struct {
// DefaultOptions returns a sane set of defaults for syslog, using the program // DefaultOptions returns a sane set of defaults for syslog, using the program
// name as the tag name. withSyslog controls whether logs should be sent to // name as the tag name. withSyslog controls whether logs should be sent to
// syslog, too. // syslog, too.
func DefaultOptions(tag string, withSyslog bool) { func DefaultOptions(tag string, withSyslog bool) *Options {
if tag == "" { if tag == "" {
tag = os.Args[0] tag = os.Args[0]
} }
return &DefaultOptions{ return &Options{
Level: "WARNING", Level: "WARNING",
Tag: tag, Tag: tag,
Facility: "daemon", Facility: "daemon",
@ -113,15 +113,15 @@ func DefaultOptions(tag string, withSyslog bool) {
} }
} }
// DefaultDefaultOptions returns a sane set of debug defaults for syslog, // DefaultDebugOptions returns a sane set of debug defaults for syslog,
// using the program name as the tag name. withSyslog controls whether logs // using the program name as the tag name. withSyslog controls whether logs
// should be sent to syslog, too. // should be sent to syslog, too.
func DefaultDebugOptions(tag string, withSyslog bool) { func DefaultDebugOptions(tag string, withSyslog bool) *Options {
if tag == "" { if tag == "" {
tag = os.Args[0] tag = os.Args[0]
} }
return &DefaultOptions{ return &Options{
Level: "DEBUG", Level: "DEBUG",
Facility: "daemon", Facility: "daemon",
WriteSyslog: withSyslog, WriteSyslog: withSyslog,
@ -131,7 +131,7 @@ func DefaultDebugOptions(tag string, withSyslog bool) {
func Setup(opts *Options) error { func Setup(opts *Options) error {
priority, ok := priorities[opts.Level] priority, ok := priorities[opts.Level]
if !ok { if !ok {
return fmt.Errorf("log: unknown priority %s", level) return fmt.Errorf("log: unknown priority %s", opts.Level)
} }
log.p = priority log.p = priority