summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Trevisan (Treviño) <[email protected]>2023-11-07 11:51:27 +0200
committerMarco Trevisan (Treviño) <[email protected]>2023-11-30 01:16:38 +0100
commit44c364e364c1eb5ccdfad3b11f574787152adbd2 (patch)
tree9ac079f8af745a9ace3724c36d90d0027c4fa042
parenta85a609bbe4f52a2f19a24bcfbfcdb3c23decd45 (diff)
ci: Use golang-ci linter
-rw-r--r--.github/workflows/lint.yaml22
-rw-r--r--.golangci.yaml61
-rw-r--r--transaction.go14
3 files changed, 93 insertions, 4 deletions
diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml
new file mode 100644
index 0000000..771e735
--- /dev/null
+++ b/.github/workflows/lint.yaml
@@ -0,0 +1,22 @@
+on: [push, pull_request]
+name: Lint
+
+permissions:
+ contents: read
+
+jobs:
+ golangci:
+ name: lint
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-go@v4
+ with:
+ go-version: '1.21'
+ cache: false
+ - name: Install PAM
+ run: sudo apt install -y libpam-dev
+ - name: golangci-lint
+ uses: golangci/golangci-lint-action@v3
+ with:
+ version: v1.54
diff --git a/.golangci.yaml b/.golangci.yaml
new file mode 100644
index 0000000..bbfa6b4
--- /dev/null
+++ b/.golangci.yaml
@@ -0,0 +1,61 @@
+# This is for linting. To run it, please use:
+# golangci-lint run ${MODULE}/... [--fix]
+
+linters:
+ # linters to run in addition to default ones
+ enable:
+ - dupl
+ - durationcheck
+ - errname
+ - errorlint
+ - exportloopref
+ - forbidigo
+ - forcetypeassert
+ - gci
+ - godot
+ - gofmt
+ - gosec
+ - misspell
+ - nakedret
+ - nolintlint
+ - revive
+ - thelper
+ - tparallel
+ - unconvert
+ - unparam
+ - whitespace
+
+run:
+ timeout: 5m
+
+# Get all linter issues, even if duplicated
+issues:
+ exclude-use-default: false
+ max-issues-per-linter: 0
+ max-same-issues: 0
+ fix: false # we don’t want this in CI
+ exclude:
+ # EXC0001 errcheck: most errors are in defer calls, which are safe to ignore and idiomatic Go (would be good to only ignore defer ones though)
+ - 'Error return value of .((os\.)?std(out|err)\..*|.*Close|.*Flush|os\.Remove(All)?|.*print(f|ln)?|os\.(Un)?Setenv|w\.Stop). is not checked'
+ # EXC0008 gosec: duplicated of errcheck
+ - (G104|G307)
+ # EXC0010 gosec: False positive is triggered by 'src, err := ioutil.ReadFile(filename)'
+ - Potential file inclusion via variable
+ # We want named parameters even if unused, as they help better document the function
+ - unused-parameter
+ # Sometimes it is more readable it do a `if err:=a(); err != nil` tha simpy `return a()`
+ - if-return
+
+nolintlint:
+ require-explanation: true
+ require-specific: true
+
+linters-settings:
+ # Forbid the usage of deprecated ioutil and debug prints
+ forbidigo:
+ forbid:
+ - ioutil\.
+ - ^print.*$
+ # Never have naked return ever
+ nakedret:
+ max-func-lines: 1
diff --git a/transaction.go b/transaction.go
index 96bff63..fcba3d5 100644
--- a/transaction.go
+++ b/transaction.go
@@ -94,6 +94,7 @@ func cbPAMConv(s C.int, msg *C.char, c C.uintptr_t) (*C.char, C.int) {
var err error
v := cgo.Handle(c).Value()
style := Style(s)
+ var handler ConversationHandler
switch cb := v.(type) {
case BinaryConversationHandler:
if style == BinaryPrompt {
@@ -102,15 +103,18 @@ func cbPAMConv(s C.int, msg *C.char, c C.uintptr_t) (*C.char, C.int) {
return nil, C.PAM_CONV_ERR
}
return (*C.char)(C.CBytes(bytes)), C.PAM_SUCCESS
- } else {
- r, err = cb.RespondPAM(style, C.GoString(msg))
}
+ handler = cb
case ConversationHandler:
if style == BinaryPrompt {
return nil, C.PAM_AUTHINFO_UNAVAIL
}
- r, err = cb.RespondPAM(style, C.GoString(msg))
+ handler = cb
}
+ if handler == nil {
+ return nil, C.PAM_CONV_ERR
+ }
+ r, err = handler.RespondPAM(style, C.GoString(msg))
if err != nil {
return nil, C.PAM_CONV_ERR
}
@@ -118,6 +122,8 @@ func cbPAMConv(s C.int, msg *C.char, c C.uintptr_t) (*C.char, C.int) {
}
// Transaction is the application's handle for a PAM transaction.
+//
+//nolint:errname
type Transaction struct {
handle *C.pam_handle_t
conv *C.struct_pam_conv
@@ -195,7 +201,7 @@ func start(service, user string, handler ConversationHandler, confDir string) (*
}
func (t *Transaction) Error() string {
- return C.GoString(C.pam_strerror(t.handle, C.int(t.status)))
+ return C.GoString(C.pam_strerror(t.handle, t.status))
}
// Item is a an PAM information type.