From 3535e4b00690f119eada474c669d8d83e57c0d1d Mon Sep 17 00:00:00 2001 From: Virgil Date: Sat, 4 Apr 2026 17:11:25 +0000 Subject: [PATCH] feat(pool): support descriptive password alias Co-Authored-By: Virgil --- config.go | 14 +++++++----- pool/client.go | 7 +++++- pool/client_test.go | 55 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 7 deletions(-) diff --git a/config.go b/config.go index f08f40d..877ba94 100644 --- a/config.go +++ b/config.go @@ -41,6 +41,7 @@ type PoolConfig struct { URL string `json:"url"` User string `json:"user"` Pass string `json:"pass"` + Password string `json:"password"` RigID string `json:"rig-id"` Algo string `json:"algo"` TLS bool `json:"tls"` @@ -83,10 +84,11 @@ type RateLimit struct { type WorkersMode string const ( - WorkersByRigID WorkersMode = "rig-id" // rigid field, fallback to user - WorkersByUser WorkersMode = "user" - WorkersByPass WorkersMode = "password" - WorkersByAgent WorkersMode = "agent" - WorkersByIP WorkersMode = "ip" - WorkersDisabled WorkersMode = "false" + WorkersByRigID WorkersMode = "rig-id" // rigid field, fallback to user + WorkersByUser WorkersMode = "user" + WorkersByPass WorkersMode = "password" + WorkersByPassword WorkersMode = "password" + WorkersByAgent WorkersMode = "agent" + WorkersByIP WorkersMode = "ip" + WorkersDisabled WorkersMode = "false" ) diff --git a/pool/client.go b/pool/client.go index f1c1166..eaf0f15 100644 --- a/pool/client.go +++ b/pool/client.go @@ -139,9 +139,14 @@ func (c *StratumClient) Connect() error { // // client.Login() func (c *StratumClient) Login() { + password := c.config.Password + if password == "" { + password = c.config.Pass + } + params := map[string]interface{}{ "login": c.config.User, - "pass": c.config.Pass, + "pass": password, "rigid": c.config.RigID, } if c.config.Algo != "" { diff --git a/pool/client_test.go b/pool/client_test.go index 540d846..db64219 100644 --- a/pool/client_test.go +++ b/pool/client_test.go @@ -1,6 +1,7 @@ package pool import ( + "encoding/json" "net" "sync" "testing" @@ -171,3 +172,57 @@ func TestStratumClient_HandleMessage_Ugly(t *testing.T) { t.Fatalf("expected login rejection to disconnect once, got %d", disconnects) } } + +func TestStratumClient_Login_Good(t *testing.T) { + serverConn, clientConn := net.Pipe() + defer clientConn.Close() + + client := &StratumClient{ + config: proxy.PoolConfig{ + User: "WALLET", + Pass: "legacy", + Password: "preferred", + RigID: "rig-alpha", + Algo: "cn/r", + }, + conn: serverConn, + } + + writeDone := make(chan struct{}) + go func() { + client.Login() + close(writeDone) + }() + + buffer := make([]byte, 2048) + n, err := clientConn.Read(buffer) + if err != nil { + t.Fatal(err) + } + + var request jsonRPCRequest + if err := json.Unmarshal(buffer[:n], &request); err != nil { + t.Fatal(err) + } + + params, ok := request.Params.(map[string]interface{}) + if !ok { + t.Fatalf("expected login params map, got %T", request.Params) + } + if got := params["pass"]; got != "preferred" { + t.Fatalf("expected preferred password, got %v", got) + } + if got := params["rigid"]; got != "rig-alpha" { + t.Fatalf("expected rigid field to be forwarded, got %v", got) + } + if got := params["algo"]; got == nil { + t.Fatal("expected algo extension to be forwarded") + } + + client.Disconnect() + select { + case <-writeDone: + case <-time.After(time.Second): + t.Fatal("expected login write to complete") + } +}