aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/breml/bidichk
diff options
context:
space:
mode:
authorTaras Madan <tarasmadan@google.com>2022-09-05 14:27:54 +0200
committerGitHub <noreply@github.com>2022-09-05 12:27:54 +0000
commitb2f2446b46bf02821d90ebedadae2bf7ae0e880e (patch)
tree923cf42842918d6bebca1d6bbdc08abed54d274d /vendor/github.com/breml/bidichk
parente6654faff4bcca4be92e9a8596fd4b77f747c39e (diff)
go.mod, vendor: update (#3358)
* go.mod, vendor: remove unnecessary dependencies Commands: 1. go mod tidy 2. go mod vendor * go.mod, vendor: update cloud.google.com/go Commands: 1. go get -u cloud.google.com/go 2. go mod tidy 3. go mod vendor * go.mod, vendor: update cloud.google.com/* Commands: 1. go get -u cloud.google.com/storage cloud.google.com/logging 2. go mod tidy 3. go mod vendor * go.mod, .golangci.yml, vendor: update *lint* Commands: 1. go get -u golang.org/x/tools github.com/golangci/golangci-lint@v1.47.0 2. go mod tidy 3. go mod vendor 4. edit .golangci.yml to suppress new errors (resolved in the same PR later) * all: fix lint errors hash.go: copy() recommended by gosimple parse.go: ent is never nil verifier.go: signal.Notify() with unbuffered channel is bad. Have no idea why. * .golangci.yml: adjust godot rules check-all is deprecated, but still work if you're hesitating too - I'll remove this commit
Diffstat (limited to 'vendor/github.com/breml/bidichk')
-rw-r--r--vendor/github.com/breml/bidichk/LICENSE21
-rw-r--r--vendor/github.com/breml/bidichk/pkg/bidichk/bidichk.go180
-rw-r--r--vendor/github.com/breml/bidichk/pkg/bidichk/version.go19
3 files changed, 220 insertions, 0 deletions
diff --git a/vendor/github.com/breml/bidichk/LICENSE b/vendor/github.com/breml/bidichk/LICENSE
new file mode 100644
index 000000000..47a8419ce
--- /dev/null
+++ b/vendor/github.com/breml/bidichk/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 Lucas Bremgartner
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/github.com/breml/bidichk/pkg/bidichk/bidichk.go b/vendor/github.com/breml/bidichk/pkg/bidichk/bidichk.go
new file mode 100644
index 000000000..2e1e89934
--- /dev/null
+++ b/vendor/github.com/breml/bidichk/pkg/bidichk/bidichk.go
@@ -0,0 +1,180 @@
+package bidichk
+
+import (
+ "bytes"
+ "flag"
+ "fmt"
+ "go/token"
+ "os"
+ "sort"
+ "strings"
+ "unicode/utf8"
+
+ "golang.org/x/tools/go/analysis"
+)
+
+const (
+ doc = "bidichk detects dangerous unicode character sequences"
+ disallowedDoc = `coma separated list of disallowed runes (full name or short name)
+
+Supported runes
+
+LEFT-TO-RIGHT-EMBEDDING, LRE (u+202A)
+RIGHT-TO-LEFT-EMBEDDING, RLE (u+202B)
+POP-DIRECTIONAL-FORMATTING, PDF (u+202C)
+LEFT-TO-RIGHT-OVERRIDE, LRO (u+202D)
+RIGHT-TO-LEFT-OVERRIDE, RLO (u+202E)
+LEFT-TO-RIGHT-ISOLATE, LRI (u+2066)
+RIGHT-TO-LEFT-ISOLATE, RLI (u+2067)
+FIRST-STRONG-ISOLATE, FSI (u+2068)
+POP-DIRECTIONAL-ISOLATE, PDI (u+2069)
+`
+)
+
+type disallowedRunes map[string]rune
+
+func (m disallowedRunes) String() string {
+ ss := make([]string, 0, len(m))
+ for s := range m {
+ ss = append(ss, s)
+ }
+ sort.Strings(ss)
+ return strings.Join(ss, ",")
+}
+
+func (m disallowedRunes) Set(s string) error {
+ ss := strings.FieldsFunc(s, func(c rune) bool { return c == ',' })
+ if len(ss) == 0 {
+ return nil
+ }
+
+ for k := range m {
+ delete(m, k)
+ }
+
+ for _, v := range ss {
+ switch v {
+ case runeShortNameLRE, runeShortNameRLE, runeShortNamePDF,
+ runeShortNameLRO, runeShortNameRLO, runeShortNameLRI,
+ runeShortNameRLI, runeShortNameFSI, runeShortNamePDI:
+ v = shortNameLookup[v]
+ fallthrough
+ case runeNameLRE, runeNameRLE, runeNamePDF,
+ runeNameLRO, runeNameRLO, runeNameLRI,
+ runeNameRLI, runeNameFSI, runeNamePDI:
+ m[v] = runeLookup[v]
+ default:
+ return fmt.Errorf("unknown check name %q (see help for full list)", v)
+ }
+ }
+ return nil
+}
+
+const (
+ runeNameLRE = "LEFT-TO-RIGHT-EMBEDDING"
+ runeNameRLE = "RIGHT-TO-LEFT-EMBEDDING"
+ runeNamePDF = "POP-DIRECTIONAL-FORMATTING"
+ runeNameLRO = "LEFT-TO-RIGHT-OVERRIDE"
+ runeNameRLO = "RIGHT-TO-LEFT-OVERRIDE"
+ runeNameLRI = "LEFT-TO-RIGHT-ISOLATE"
+ runeNameRLI = "RIGHT-TO-LEFT-ISOLATE"
+ runeNameFSI = "FIRST-STRONG-ISOLATE"
+ runeNamePDI = "POP-DIRECTIONAL-ISOLATE"
+
+ runeShortNameLRE = "LRE" // LEFT-TO-RIGHT-EMBEDDING
+ runeShortNameRLE = "RLE" // RIGHT-TO-LEFT-EMBEDDING
+ runeShortNamePDF = "PDF" // POP-DIRECTIONAL-FORMATTING
+ runeShortNameLRO = "LRO" // LEFT-TO-RIGHT-OVERRIDE
+ runeShortNameRLO = "RLO" // RIGHT-TO-LEFT-OVERRIDE
+ runeShortNameLRI = "LRI" // LEFT-TO-RIGHT-ISOLATE
+ runeShortNameRLI = "RLI" // RIGHT-TO-LEFT-ISOLATE
+ runeShortNameFSI = "FSI" // FIRST-STRONG-ISOLATE
+ runeShortNamePDI = "PDI" // POP-DIRECTIONAL-ISOLATE
+)
+
+var runeLookup = map[string]rune{
+ runeNameLRE: '\u202A', // LEFT-TO-RIGHT-EMBEDDING
+ runeNameRLE: '\u202B', // RIGHT-TO-LEFT-EMBEDDING
+ runeNamePDF: '\u202C', // POP-DIRECTIONAL-FORMATTING
+ runeNameLRO: '\u202D', // LEFT-TO-RIGHT-OVERRIDE
+ runeNameRLO: '\u202E', // RIGHT-TO-LEFT-OVERRIDE
+ runeNameLRI: '\u2066', // LEFT-TO-RIGHT-ISOLATE
+ runeNameRLI: '\u2067', // RIGHT-TO-LEFT-ISOLATE
+ runeNameFSI: '\u2068', // FIRST-STRONG-ISOLATE
+ runeNamePDI: '\u2069', // POP-DIRECTIONAL-ISOLATE
+}
+
+var shortNameLookup = map[string]string{
+ runeShortNameLRE: runeNameLRE,
+ runeShortNameRLE: runeNameRLE,
+ runeShortNamePDF: runeNamePDF,
+ runeShortNameLRO: runeNameLRO,
+ runeShortNameRLO: runeNameRLO,
+ runeShortNameLRI: runeNameLRI,
+ runeShortNameRLI: runeNameRLI,
+ runeShortNameFSI: runeNameFSI,
+ runeShortNamePDI: runeNamePDI,
+}
+
+type bidichk struct {
+ disallowedRunes disallowedRunes
+}
+
+// NewAnalyzer return a new bidichk analyzer.
+func NewAnalyzer() *analysis.Analyzer {
+ bidichk := bidichk{}
+ bidichk.disallowedRunes = make(map[string]rune, len(runeLookup))
+ for k, v := range runeLookup {
+ bidichk.disallowedRunes[k] = v
+ }
+
+ a := &analysis.Analyzer{
+ Name: "bidichk",
+ Doc: doc,
+ Run: bidichk.run,
+ }
+
+ a.Flags.Init("bidichk", flag.ExitOnError)
+ a.Flags.Var(&bidichk.disallowedRunes, "disallowed-runes", disallowedDoc)
+ a.Flags.Var(versionFlag{}, "V", "print version and exit")
+
+ return a
+}
+
+func (b bidichk) run(pass *analysis.Pass) (interface{}, error) {
+ var err error
+
+ pass.Fset.Iterate(func(f *token.File) bool {
+ if strings.HasPrefix(f.Name(), "$GOROOT") {
+ return true
+ }
+
+ return b.check(f.Name(), f.Pos(0), pass) == nil
+ })
+
+ return nil, err
+}
+
+func (b bidichk) check(filename string, pos token.Pos, pass *analysis.Pass) error {
+ body, err := os.ReadFile(filename)
+ if err != nil {
+ return err
+ }
+
+ for name, r := range b.disallowedRunes {
+ start := 0
+ for {
+ idx := bytes.IndexRune(body[start:], r)
+ if idx == -1 {
+ break
+ }
+ start += idx
+
+ pass.Reportf(pos+token.Pos(start), "found dangerous unicode character sequence %s", name)
+
+ start += utf8.RuneLen(r)
+ }
+ }
+
+ return nil
+}
diff --git a/vendor/github.com/breml/bidichk/pkg/bidichk/version.go b/vendor/github.com/breml/bidichk/pkg/bidichk/version.go
new file mode 100644
index 000000000..4cfc57dd1
--- /dev/null
+++ b/vendor/github.com/breml/bidichk/pkg/bidichk/version.go
@@ -0,0 +1,19 @@
+package bidichk
+
+import (
+ "fmt"
+ "os"
+)
+
+var Version = "bidichk version dev"
+
+type versionFlag struct{}
+
+func (versionFlag) IsBoolFlag() bool { return true }
+func (versionFlag) Get() interface{} { return nil }
+func (versionFlag) String() string { return "" }
+func (versionFlag) Set(s string) error {
+ fmt.Println(Version)
+ os.Exit(0)
+ return nil
+}