]> git.r.bdr.sh - rbdr/mobius/commitdiff
Clean up various linter warnings
authorJeff Halter <redacted>
Tue, 18 Jun 2024 02:51:37 +0000 (19:51 -0700)
committerJeff Halter <redacted>
Tue, 18 Jun 2024 02:51:37 +0000 (19:51 -0700)
.github/workflows/golangci-lint.yml [new file with mode: 0644]
cmd/mobius-hotline-server/main.go
go.mod
hotline/file_transfer.go
hotline/files.go
hotline/flattened_file_object.go
hotline/server.go
hotline/server_blackbox_test.go
hotline/transaction_handlers.go
hotline/transaction_handlers_test.go

diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml
new file mode 100644 (file)
index 0000000..6f2d802
--- /dev/null
@@ -0,0 +1,25 @@
+name: golangci-lint
+on:
+  pull_request:
+    types: [opened, reopened]
+
+permissions:
+  contents: read
+  # Optional: allow read access to pull request. Use with `only-new-issues` option.
+  pull-requests: read
+  # Optional: allow write access to checks to allow the action to annotate code in the PR.
+  checks: write
+
+jobs:
+  golangci:
+    name: lint
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+      - uses: actions/setup-go@v5
+        with:
+          go-version: stable
+      - name: golangci-lint
+        uses: golangci/golangci-lint-action@v6
+        with:
+          version: v1.58
\ No newline at end of file
index 66566cdabe1de9f0f72a4dbe85f948e300988b3d..c34dc71f4bfa61af5a624b3ebc9cabbfdf7efacd 100644 (file)
@@ -99,7 +99,7 @@ func main() {
        }
 
        if _, err := os.Stat(*configDir); os.IsNotExist(err) {
-               slogger.Error(fmt.Sprintf("Configuration directory not found.  Correct the path or re-run with -init to generate initial config."))
+               slogger.Error("Configuration directory not found.  Correct the path or re-run with -init to generate initial config.")
                os.Exit(1)
        }
 
@@ -145,7 +145,9 @@ func (sh *statHandler) RenderStats(w http.ResponseWriter, _ *http.Request) {
        _, _ = io.WriteString(w, string(u))
 }
 
-func defaultConfigPath() (cfgPath string) {
+func defaultConfigPath() string {
+       var cfgPath string
+
        switch runtime.GOOS {
        case "windows":
                cfgPath = "config/"
diff --git a/go.mod b/go.mod
index 5fe9eaf103fa565c1448af86714521411b906371..24c803e3adc2b69313c4c29b4664b9e5f2928763 100644 (file)
--- a/go.mod
+++ b/go.mod
@@ -3,7 +3,6 @@ module github.com/jhalter/mobius
 go 1.22
 
 require (
-       github.com/davecgh/go-spew v1.1.1
        github.com/go-playground/validator/v10 v10.19.0
        github.com/stretchr/testify v1.9.0
        golang.org/x/crypto v0.22.0
@@ -13,6 +12,7 @@ require (
 )
 
 require (
+       github.com/davecgh/go-spew v1.1.1 // indirect
        github.com/gabriel-vasile/mimetype v1.4.3 // indirect
        github.com/go-playground/locales v0.14.1 // indirect
        github.com/go-playground/universal-translator v0.18.1 // indirect
index 7c24109e1dfb9e1f70f0938764d2614464ffb634..194e8b9890e862ac0401e1e758ba3f37b3fc595b 100644 (file)
@@ -1,10 +1,10 @@
 package hotline
 
 import (
+       "crypto/rand"
        "encoding/binary"
        "fmt"
        "math"
-       "math/rand"
        "path/filepath"
        "sync"
 )
@@ -51,7 +51,7 @@ func (wc *WriteCounter) Write(p []byte) (int, error) {
 
 func (cc *ClientConn) newFileTransfer(transferType int, fileName, filePath, size []byte) *FileTransfer {
        var transactionRef [4]byte
-       rand.Read(transactionRef[:])
+       _, _ = rand.Read(transactionRef[:])
 
        ft := &FileTransfer{
                FileName:         fileName,
index 901b98cbb01f981b0e1768ce9829f6dd884dca5e..6753cceb7ec5995d7f65ed75e67658c06b598f0c 100644 (file)
@@ -40,8 +40,7 @@ func getFileNameList(path string, ignoreList []string) (fields []Field, err erro
                return fields, fmt.Errorf("error reading path: %s: %w", path, err)
        }
 
-       for i, _ := range files {
-               file := files[i]
+       for _, file := range files {
                var fnwi FileNameWithInfo
 
                if ignoreFile(file.Name(), ignoreList) {
index 6419a1f7e82f874eb68bfa18222fb3ea7b35ae72..b178c6c1a739cd80eafa706bdea76d629498ec18 100644 (file)
@@ -189,7 +189,7 @@ func (ffif *FlatFileInformationFork) Write(p []byte) (int, error) {
 
                ffif.Comment = p[commentStartPos:commentEndPos]
 
-               total = uint16(commentEndPos)
+               //total = uint16(commentEndPos)
        }
 
        return len(p), nil
index 448aab126791a5e2530c547f6154f5329fd4c02f..5245c7bdda3a2c368bad00d9da7ecbbddcb120b8 100644 (file)
@@ -4,6 +4,7 @@ import (
        "bufio"
        "bytes"
        "context"
+       "crypto/rand"
        "encoding/binary"
        "errors"
        "fmt"
@@ -15,7 +16,6 @@ import (
        "log"
        "log/slog"
        "math/big"
-       "math/rand"
        "net"
        "os"
        "path"
@@ -760,7 +760,8 @@ func (s *Server) NewPrivateChat(cc *ClientConn) []byte {
        defer s.PrivateChatsMu.Unlock()
 
        randID := make([]byte, 4)
-       rand.Read(randID)
+       _, _ = rand.Read(randID)
+
        data := binary.BigEndian.Uint32(randID)
 
        s.PrivateChats[data] = &PrivateChat{
index 059fe5a49ba267306010fc257c3a831932d0134b..b45e279c8a7a6644090196da01d1e74990a7b65f 100644 (file)
@@ -30,7 +30,7 @@ func assertTransferBytesEqual(t *testing.T, wantHexDump string, got []byte) bool
        return assert.Equal(t, wantHexDump, hex.Dump(clean))
 }
 
-// tranAssertEqual compares equality of transactions slices after stripping out the random ID
+// tranAssertEqual compares equality of transactions slices after stripping out the random transaction ID
 func tranAssertEqual(t *testing.T, tran1, tran2 []Transaction) bool {
        var newT1 []Transaction
        var newT2 []Transaction
@@ -39,7 +39,10 @@ func tranAssertEqual(t *testing.T, tran1, tran2 []Transaction) bool {
                trans.ID = []byte{0, 0, 0, 0}
                var fs []Field
                for _, field := range trans.Fields {
-                       if field.ID == [2]byte{0x00, 0x6b} {
+                       if field.ID == [2]byte{0x00, 0x6b} { // FieldRefNum
+                               continue
+                       }
+                       if field.ID == [2]byte{0x00, 0x72} { // FieldChatID
                                continue
                        }
                        fs = append(fs, field)
@@ -52,7 +55,10 @@ func tranAssertEqual(t *testing.T, tran1, tran2 []Transaction) bool {
                trans.ID = []byte{0, 0, 0, 0}
                var fs []Field
                for _, field := range trans.Fields {
-                       if field.ID == [2]byte{0x00, 0x6b} {
+                       if field.ID == [2]byte{0x00, 0x6b} { // FieldRefNum
+                               continue
+                       }
+                       if field.ID == [2]byte{0x00, 0x72} { // FieldChatID
                                continue
                        }
                        fs = append(fs, field)
index 20b87e2118105e0cdbd977f5a0dc19eba9db6c12..0fb250f2cd60e761e62516dab9b93eabdffcafd0 100644 (file)
@@ -1256,8 +1256,9 @@ func HandleNewNewsFldr(cc *ClientConn, t *Transaction) (res []Transaction, err e
 func HandleGetNewsArtNameList(cc *ClientConn, t *Transaction) (res []Transaction, err error) {
        if !cc.Authorize(accessNewsReadArt) {
                res = append(res, cc.NewErrReply(t, "You are not allowed to read news."))
-               return res, err
+               return res, nil
        }
+
        pathStrs := ReadNewsPath(t.GetField(FieldNewsPath).Data)
 
        var cat NewsCategoryListData15
@@ -1272,11 +1273,11 @@ func HandleGetNewsArtNameList(cc *ClientConn, t *Transaction) (res []Transaction
 
        b, err := io.ReadAll(&nald)
        if err != nil {
-
+               return res, fmt.Errorf("error loading news articles: %w", err)
        }
 
        res = append(res, cc.NewReply(t, NewField(FieldNewsArtListData, b)))
-       return res, err
+       return res, nil
 }
 
 // HandleGetNewsArtData requests information about the specific news article.
index 9c0359f14cc1af2d520dddc04df11b6fb6ad536a..09cb1cbdac2132406ec8d5c474be579178bc6875 100644 (file)
@@ -7,7 +7,6 @@ import (
        "github.com/stretchr/testify/mock"
        "io"
        "io/fs"
-       "math/rand"
        "os"
        "path/filepath"
        "strings"
@@ -109,15 +108,13 @@ func TestHandleSetChatSubject(t *testing.T) {
                },
        }
        for _, tt := range tests {
-               rand.Seed(1) // reset seed between tests to make transaction IDs predictable
-
                t.Run(tt.name, func(t *testing.T) {
                        got, err := HandleSetChatSubject(tt.args.cc, tt.args.t)
                        if (err != nil) != tt.wantErr {
                                t.Errorf("HandleSetChatSubject() error = %v, wantErr %v", err, tt.wantErr)
                                return
                        }
-                       if !assert.Equal(t, tt.want, got) {
+                       if !tranAssertEqual(t, tt.want, got) {
                                t.Errorf("HandleSetChatSubject() got = %v, want %v", got, tt.want)
                        }
                })
@@ -195,14 +192,13 @@ func TestHandleLeaveChat(t *testing.T) {
                },
        }
        for _, tt := range tests {
-               rand.Seed(1)
                t.Run(tt.name, func(t *testing.T) {
                        got, err := HandleLeaveChat(tt.args.cc, tt.args.t)
                        if (err != nil) != tt.wantErr {
                                t.Errorf("HandleLeaveChat() error = %v, wantErr %v", err, tt.wantErr)
                                return
                        }
-                       if !assert.Equal(t, tt.want, got) {
+                       if !tranAssertEqual(t, tt.want, got) {
                                t.Errorf("HandleLeaveChat() got = %v, want %v", got, tt.want)
                        }
                })
@@ -724,8 +720,6 @@ func TestHandleChatSend(t *testing.T) {
 }
 
 func TestHandleGetFileInfo(t *testing.T) {
-       rand.Seed(1) // reset seed between tests to make transaction IDs predictable
-
        type args struct {
                cc *ClientConn
                t  *Transaction
@@ -781,8 +775,6 @@ func TestHandleGetFileInfo(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-                       rand.Seed(1) // reset seed between tests to make transaction IDs predictable
-
                        gotRes, err := HandleGetFileInfo(tt.args.cc, tt.args.t)
                        if (err != nil) != tt.wantErr {
                                t.Errorf("HandleGetFileInfo() error = %v, wantErr %v", err, tt.wantErr)
@@ -793,7 +785,8 @@ func TestHandleGetFileInfo(t *testing.T) {
                        // TODO: revisit how to test this by mocking the stat calls
                        gotRes[0].Fields[4].Data = make([]byte, 8)
                        gotRes[0].Fields[5].Data = make([]byte, 8)
-                       if !assert.Equal(t, tt.wantRes, gotRes) {
+
+                       if !tranAssertEqual(t, tt.wantRes, gotRes) {
                                t.Errorf("HandleGetFileInfo() gotRes = %v, want %v", gotRes, tt.wantRes)
                        }
                })
@@ -1166,7 +1159,6 @@ func TestHandleUploadFile(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-                       rand.Seed(1)
                        gotRes, err := HandleUploadFile(tt.args.cc, tt.args.t)
                        if (err != nil) != tt.wantErr {
                                t.Errorf("HandleUploadFile() error = %v, wantErr %v", err, tt.wantErr)
@@ -3592,7 +3584,6 @@ func TestHandleInviteNewChat(t *testing.T) {
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {
-                       rand.Seed(1)
                        gotRes, err := HandleInviteNewChat(tt.args.cc, tt.args.t)
                        if !tt.wantErr(t, err, fmt.Sprintf("HandleInviteNewChat(%v, %v)", tt.args.cc, tt.args.t)) {
                                return
@@ -3699,6 +3690,78 @@ func TestHandleGetNewsArtNameList(t *testing.T) {
                        },
                        wantErr: assert.NoError,
                },
+               {
+                       name: "when user has required access",
+                       args: args{
+                               cc: &ClientConn{
+                                       Account: &Account{
+                                               Access: func() accessBitmap {
+                                                       var bits accessBitmap
+                                                       bits.Set(accessNewsReadArt)
+                                                       return bits
+                                               }(),
+                                       },
+                                       Server: &Server{
+                                               ThreadedNews: &ThreadedNews{
+                                                       Categories: map[string]NewsCategoryListData15{
+                                                               "Example Category": {
+                                                                       Type: [2]byte{0, 2},
+                                                                       Name: "",
+                                                                       Articles: map[uint32]*NewsArtData{
+                                                                               uint32(1): {
+                                                                                       Title:  "testTitle",
+                                                                                       Poster: "testPoster",
+                                                                                       Data:   "testBody",
+                                                                               },
+                                                                       },
+                                                                       SubCats:  nil,
+                                                                       GUID:     [16]byte{},
+                                                                       AddSN:    [4]byte{},
+                                                                       DeleteSN: [4]byte{},
+                                                               },
+                                                       },
+                                               },
+
+                                               //Accounts: map[string]*Account{
+                                               //      "guest": {
+                                               //              Name:     "guest",
+                                               //              Login:    "guest",
+                                               //              Password: "zz",
+                                               //              Access:   accessBitmap{255, 255, 255, 255, 255, 255, 255, 255},
+                                               //      },
+                                               //},
+                                       },
+                               },
+                               t: NewTransaction(
+                                       TranGetNewsArtNameList,
+                                       &[]byte{0, 1},
+                                       //  00000000  00 01 00 00 10 45 78 61  6d 70 6c 65 20 43 61 74  |.....Example Cat|
+                                       //  00000010  65 67 6f 72 79                                    |egory|
+                                       NewField(FieldNewsPath, []byte{
+                                               0x00, 0x01, 0x00, 0x00, 0x10, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79,
+                                       }),
+                               ),
+                       },
+                       wantRes: []Transaction{
+                               {
+                                       Flags:     0x00,
+                                       IsReply:   0x01,
+                                       Type:      []byte{0, 0},
+                                       ErrorCode: []byte{0, 0, 0, 0},
+                                       Fields: []Field{
+                                               NewField(FieldNewsArtListData, []byte{
+                                                       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+                                                       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+                                                       0x09, 0x74, 0x65, 0x73, 0x74, 0x54, 0x69, 0x74, 0x6c, 0x65, 0x0a, 0x74, 0x65, 0x73, 0x74, 0x50,
+                                                       0x6f, 0x73, 0x74, 0x65, 0x72, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e,
+                                                       0x00, 0x08,
+                                               },
+                                               ),
+                                       },
+                               },
+                       },
+                       wantErr: assert.NoError,
+               },
        }
        for _, tt := range tests {
                t.Run(tt.name, func(t *testing.T) {