1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
diff --git a/src/client/client.go b/src/client/client.go
index 5dc5985..493ec10 100644
--- a/src/client/client.go
+++ b/src/client/client.go
@@ -441,7 +441,14 @@ func (s *SignalClient) Init(maxRetries int) error {
tcpPortsNumberMapping := s.jsonRpc2ClientConfig.GetTcpPortsForNumbers()
for number, tcpPort := range tcpPortsNumberMapping {
s.jsonRpc2Clients[number] = NewJsonRpc2Client(s.signalCliApiConfig, number)
- err := s.jsonRpc2Clients[number].Dial("127.0.0.1:"+strconv.FormatInt(tcpPort, 10), maxRetries)
+ var dialAddr string
+ socketPath, err := s.jsonRpc2ClientConfig.GetSocketPathForNumber(number)
+ if err == nil && socketPath != "" {
+ dialAddr = socketPath
+ } else {
+ dialAddr = "127.0.0.1:" + strconv.FormatInt(tcpPort, 10)
+ }
+ err = s.jsonRpc2Clients[number].Dial(dialAddr, maxRetries)
if err != nil {
return err
}
diff --git a/src/client/jsonrpc2.go b/src/client/jsonrpc2.go
index ef00633..b2cbb69 100644
--- a/src/client/jsonrpc2.go
+++ b/src/client/jsonrpc2.go
@@ -7,7 +7,9 @@ import (
"errors"
"net"
"net/http"
+ "os"
"strconv"
+ "strings"
"sync"
"time"
@@ -78,12 +80,23 @@ func NewJsonRpc2Client(signalCliApiConfig *utils.SignalCliApiConfig, number stri
func (r *JsonRpc2Client) Dial(address string, maxRetries int) error {
var err error
+ if len(address) >= 2 && address[:2] == "%h" {
+ address = os.Getenv("HOME") + address[2:]
+ } else if len(address) >= 5 && address[:5] == "$HOME" {
+ address = os.Getenv("HOME") + address[5:]
+ }
+
r.address = address
connected := false
+ network := "tcp"
+ if strings.Contains(address, "/") || strings.HasSuffix(address, ".sock") {
+ network = "unix"
+ }
+
for i := 0; i < maxRetries; i++ {
- r.conn, err = net.Dial("tcp", address)
+ r.conn, err = net.Dial(network, address)
if err != nil {
- log.Info("Waiting for signal-cli to start up in daemon mode...")
+ log.Infof("Waiting for signal-cli to start up in daemon mode (address: %s, error: %s)...", address, err.Error())
time.Sleep(2 * time.Second)
continue
}
diff --git a/src/main.go b/src/main.go
index 2450496..40918f5 100644
--- a/src/main.go
+++ b/src/main.go
@@ -93,6 +93,29 @@ func main() {
router.Use(gin.Recovery())
+ authToken := os.Getenv("AUTH_TOKEN")
+ if authToken != "" {
+ router.Use(func(c *gin.Context) {
+ path := c.Request.URL.Path
+ if path == "/v1/health" || (len(path) >= 8 && path[:8] == "/swagger") {
+ c.Next()
+ return
+ }
+ authHeader := c.GetHeader("Authorization")
+ var token string
+ if len(authHeader) > 7 && authHeader[:7] == "Bearer " {
+ token = authHeader[7:]
+ } else {
+ token = c.Query("token")
+ }
+ if token != authToken {
+ c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"})
+ return
+ }
+ c.Next()
+ })
+ }
+
port := utils.GetEnv("PORT", "8080")
if _, err := strconv.Atoi(port); err != nil {
log.Fatal("Invalid PORT ", port, " set. PORT needs to be a number")
diff --git a/src/utils/config.go b/src/utils/config.go
index 9163b2c..cc66cc8 100644
--- a/src/utils/config.go
+++ b/src/utils/config.go
@@ -10,7 +10,8 @@ import (
const MULTI_ACCOUNT_NUMBER string = "<multi-account>"
type JsonRpc2ClientConfigEntry struct {
- TcpPort int64 `yaml:"tcp_port"`
+ TcpPort int64 `yaml:"tcp_port"`
+ SocketPath string `yaml:"socket_path"`
}
type JsonRpc2ClientConfigEntries struct {
@@ -39,6 +40,14 @@ func (c *JsonRpc2ClientConfig) Load(path string) error {
return nil
}
+func (c *JsonRpc2ClientConfig) GetSocketPathForNumber(number string) (string, error) {
+ if val, ok := c.config.Entries[number]; ok {
+ return val.SocketPath, nil
+ }
+
+ return "", errors.New("Number " + number + " not found in local map")
+}
+
func (c *JsonRpc2ClientConfig) GetTcpPortForNumber(number string) (int64, error) {
if val, ok := c.config.Entries[number]; ok {
return val.TcpPort, nil
|