Skip to content

Commit 063af5c

Browse files
authored
AES support & fixed linter issues (#192)
1 parent 8d9024a commit 063af5c

File tree

16 files changed

+178
-36
lines changed

16 files changed

+178
-36
lines changed

Makefile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ test-network:
99
lint: go-lint-install go-lint
1010

1111
go-lint-install:
12-
ifeq (,$(wildcard test -f bin/golangci-lint))
12+
ifeq (,$(shell which golangci-lint))
1313
@echo " > Installing golint"
14-
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/v1.45.2/install.sh | sh -s
14+
go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.48.0
1515
endif
1616

1717
go-lint:
1818
@echo " > Running golint"
19-
bin/golangci-lint run --timeout=2m
19+
golangci-lint run ./...

blockchain/binance/api/client.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package api
22

33
import (
4+
"context"
5+
"net/http"
46
"net/url"
57
"strconv"
68
"time"
@@ -33,6 +35,11 @@ func (c *Client) GetTransactionsByAddress(address string, limit int) ([]Tx, erro
3335

3436
var result TransactionsResponse
3537

36-
err := c.req.Get(&result, "bc/api/v1/txs", params)
38+
_, err := c.req.Execute(context.TODO(), client.NewReqBuilder().
39+
Method(http.MethodGet).
40+
PathStatic("bc/api/v1/txs").
41+
Query(params).
42+
WriteTo(&result).
43+
Build())
3744
return result.Tx, err
3845
}

blockchain/binance/client.go

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package binance
22

33
import (
4-
"fmt"
4+
"context"
5+
"net/http"
56
"net/url"
67
"strconv"
78
"time"
@@ -15,20 +16,27 @@ type Client struct {
1516
}
1617

1718
func InitClient(url, apiKey string, errorHandler client.HttpErrorHandler) Client {
18-
request := client.InitJSONClient(url, errorHandler)
19-
request.AddHeader("apikey", apiKey)
19+
request := client.InitJSONClient(url, errorHandler, client.WithExtraHeader("apikey", apiKey))
2020
return Client{
2121
req: request,
2222
}
2323
}
2424

2525
func (c Client) FetchNodeInfo() (result NodeInfoResponse, err error) {
26-
err = c.req.Get(&result, "/api/v1/node-info", nil)
26+
_, err = c.req.Execute(context.TODO(), client.NewReqBuilder().
27+
Method(http.MethodGet).
28+
PathStatic("/api/v1/node-info").
29+
WriteTo(&result).
30+
Build())
2731
return result, err
2832
}
2933

3034
func (c Client) FetchTransactionsInBlock(blockNumber int64) (result TransactionsInBlockResponse, err error) {
31-
err = c.req.Get(&result, fmt.Sprintf("api/v2/transactions-in-block/%d", blockNumber), nil)
35+
_, err = c.req.Execute(context.TODO(), client.NewReqBuilder().
36+
Method(http.MethodGet).
37+
Pathf("api/v2/transactions-in-block/%d", blockNumber).
38+
WriteTo(&result).
39+
Build())
3240
return result, err
3341
}
3442

@@ -41,23 +49,42 @@ func (c Client) FetchTransactionsByAddressAndTokenID(address, tokenID string, li
4149
"limit": {strconv.Itoa(limit)},
4250
}
4351
var result TransactionsInBlockResponse
44-
err := c.req.Get(&result, "/api/v1/transactions", params)
52+
_, err := c.req.Execute(context.TODO(), client.NewReqBuilder().
53+
Method(http.MethodGet).
54+
PathStatic("/api/v1/transactions").
55+
Query(params).
56+
WriteTo(&result).
57+
Build())
4558
return result.Tx, err
4659
}
4760

4861
func (c Client) FetchAccountMeta(address string) (result AccountMeta, err error) {
49-
err = c.req.Get(&result, fmt.Sprintf("/api/v1/account/%s", address), nil)
62+
_, err = c.req.Execute(context.TODO(), client.NewReqBuilder().
63+
Method(http.MethodGet).
64+
Pathf("/api/v1/account/%s", address).
65+
WriteTo(&result).
66+
Build())
5067
return result, err
5168
}
5269

5370
func (c Client) FetchTokens(limit int) (result Tokens, err error) {
5471
params := url.Values{"limit": {strconv.Itoa(limit)}}
55-
err = c.req.Get(&result, "/api/v1/tokens", params)
72+
_, err = c.req.Execute(context.TODO(), client.NewReqBuilder().
73+
Method(http.MethodGet).
74+
PathStatic("/api/v1/tokens").
75+
Query(params).
76+
WriteTo(&result).
77+
Build())
5678
return result, err
5779
}
5880

5981
func (c Client) FetchMarketPairs(limit int) (pairs []MarketPair, err error) {
6082
params := url.Values{"limit": {strconv.Itoa(limit)}}
61-
err = c.req.Get(&pairs, "/api/v1/markets", params)
83+
_, err = c.req.Execute(context.TODO(), client.NewReqBuilder().
84+
Method(http.MethodGet).
85+
PathStatic("/api/v1/markets").
86+
Query(params).
87+
WriteTo(&pairs).
88+
Build())
6289
return pairs, err
6390
}

blockchain/binance/explorer/client.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package explorer
22

33
import (
4+
"context"
5+
"net/http"
46
"net/url"
57
"strconv"
68

@@ -25,7 +27,12 @@ func (c Client) FetchBep2Assets(page, rows int) (assets Bep2Assets, err error) {
2527
"page": {strconv.Itoa(page)},
2628
"rows": {strconv.Itoa(rows)},
2729
}
28-
err = c.req.Get(&assets, "/api/v1/assets", params)
30+
_, err = c.req.Execute(context.TODO(), client.NewReqBuilder().
31+
Method(http.MethodGet).
32+
PathStatic("/api/v1/assets").
33+
Query(params).
34+
WriteTo(&assets).
35+
Build())
2936

3037
return assets, err
3138
}

client/api/backend/client.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package backend
22

33
import (
4-
"fmt"
4+
"context"
5+
"net/http"
56

67
"github.com/trustwallet/go-libs/client"
78
)
@@ -17,6 +18,10 @@ func InitClient(url string, errorHandler client.HttpErrorHandler) Client {
1718
}
1819

1920
func (c *Client) GetAssetInfo(assetID string) (result AssetInfoResp, err error) {
20-
err = c.req.Get(&result, fmt.Sprintf("/v1/assets/%s", assetID), nil)
21+
_, err = c.req.Execute(context.TODO(), client.NewReqBuilder().
22+
Method(http.MethodGet).
23+
Pathf("/v1/assets/%s", assetID).
24+
WriteTo(&result).
25+
Build())
2126
return result, err
2227
}

crypto/aes.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package crypto
2+
3+
import (
4+
"crypto/aes"
5+
"crypto/cipher"
6+
"crypto/rand"
7+
"encoding/base64"
8+
"io"
9+
)
10+
11+
func AESEncrypt(key []byte, message string) (string, error) {
12+
c, err := aes.NewCipher(key)
13+
if err != nil {
14+
return "", err
15+
}
16+
17+
gcm, err := cipher.NewGCM(c)
18+
if err != nil {
19+
return "", err
20+
}
21+
22+
nonce := make([]byte, gcm.NonceSize())
23+
if _, err = io.ReadFull(rand.Reader, nonce); err != nil {
24+
return "", err
25+
}
26+
27+
plaintext := []byte(message)
28+
ciphertext := gcm.Seal(nonce, nonce, plaintext, nil)
29+
return base64.StdEncoding.EncodeToString(ciphertext), nil
30+
}
31+
32+
func AESDecrypt(key []byte, secure string) (string, error) {
33+
ciphertext, err := base64.StdEncoding.DecodeString(secure)
34+
if err != nil {
35+
return "", err
36+
}
37+
38+
c, err := aes.NewCipher(key)
39+
if err != nil {
40+
return "", err
41+
}
42+
gcm, err := cipher.NewGCM(c)
43+
if err != nil {
44+
return "", err
45+
}
46+
47+
nonceSize := gcm.NonceSize()
48+
if len(ciphertext) < nonceSize {
49+
return "", err
50+
}
51+
52+
nonce, ciphertext := ciphertext[:nonceSize], ciphertext[nonceSize:]
53+
plaintext, err := gcm.Open(nil, nonce, ciphertext, nil)
54+
if err != nil {
55+
return "", err
56+
}
57+
return string(plaintext), err
58+
}

crypto/aes_test.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package crypto
2+
3+
import (
4+
"github.com/stretchr/testify/assert"
5+
"testing"
6+
)
7+
8+
func TestAES(t *testing.T) {
9+
secret, message := []byte("RfUjXnZr4u7x!A%D*G-KaPdSgVkYp3s5"), "a plain text"
10+
11+
_, err := AESEncrypt([]byte("not_a_valid_length"), message)
12+
assert.Error(t, err)
13+
14+
encryptedMessage, err := AESEncrypt(secret, message)
15+
assert.NoError(t, err)
16+
assert.NotEmpty(t, encryptedMessage)
17+
assert.NotEqual(t, encryptedMessage, message)
18+
19+
decryptedMessage, err := AESDecrypt(secret, encryptedMessage)
20+
assert.NoError(t, err)
21+
assert.Equal(t, decryptedMessage, message)
22+
23+
failedMessage, err := AESDecrypt([]byte("this_is_an_invalid_secret_key___"), decryptedMessage)
24+
assert.Error(t, err)
25+
assert.Empty(t, failedMessage)
26+
}

crypto/sign_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func testCompareKeys(t *testing.T, exp string, act *rsa.PrivateKey) {
2929
var buf bytes.Buffer
3030
assert.NoError(t, pem.Encode(&buf, &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(act)}))
3131

32-
assert.Equal(t, exp, string(buf.Bytes()))
32+
assert.Equal(t, exp, buf.String())
3333
}
3434

3535
func TestGetRSAPrivateKey(t *testing.T) {

eventer/client.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package eventer
22

33
import (
4+
"context"
5+
"net/http"
6+
47
"github.com/trustwallet/go-libs/client"
58
"github.com/trustwallet/go-libs/middleware"
69
)
@@ -28,6 +31,11 @@ func Init(url string, limit int) {
2831
}
2932

3033
func (c Client) SendBatch(events []Event) (status Status, err error) {
31-
err = senderClient.Post(&status, "", events)
34+
_, err = senderClient.Execute(context.TODO(), client.NewReqBuilder().
35+
Method(http.MethodPost).
36+
PathStatic("").
37+
Body(events).
38+
WriteTo(&status).
39+
Build())
3240
return
3341
}

gin/hmac_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ func TestHmacVerifier(t *testing.T) {
9393
return "whatever", nil
9494
})
9595

96-
rawURL := fmt.Sprintf("http://does.not.matter")
96+
rawURL := "http://does.not.matter"
9797
w := httptest.NewRecorder()
9898
h(createTestContext(t, w, rawURL, map[string]string{}))
9999
assert.Equal(t, http.StatusBadRequest, w.Code)
@@ -106,7 +106,7 @@ func TestHmacVerifier(t *testing.T) {
106106
return "", errors.New("plaintext cannot be extracted")
107107
})
108108

109-
rawURL := fmt.Sprintf("http://does.not.matter")
109+
rawURL := "http://does.not.matter"
110110
w := httptest.NewRecorder()
111111
h(createTestContext(t, w, rawURL, map[string]string{}))
112112
assert.Equal(t, http.StatusBadRequest, w.Code)
@@ -122,7 +122,7 @@ func TestHmacVerifier(t *testing.T) {
122122
return "whatever", nil
123123
})
124124

125-
rawURL := fmt.Sprintf("http://does.not.matter")
125+
rawURL := "http://does.not.matter"
126126
w := httptest.NewRecorder()
127127
h(createTestContext(t, w, rawURL, map[string]string{
128128
HmacDefaultSignatureHeader: "some-static-sig",

httplib/downloader.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package httplib
33
import (
44
"fmt"
55
"io"
6-
"io/ioutil"
76
"net/http"
87

98
log "github.com/sirupsen/logrus"
@@ -37,7 +36,7 @@ func (d *downloader) Download(url string) ([]byte, error) {
3736
reader = &io.LimitedReader{R: resp.Body, N: d.bytesSizeLimit}
3837
}
3938

40-
b, err := ioutil.ReadAll(reader)
39+
b, err := io.ReadAll(reader)
4140
if err != nil {
4241
return nil, err
4342
}

metrics/pusher.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@ type MetricsPusherClient struct {
1515
}
1616

1717
func NewMetricsPusherClient(pushURL, key string, errorHandler client.HttpErrorHandler) *MetricsPusherClient {
18-
client := client.InitClient(pushURL, errorHandler)
19-
client.AddHeader("X-API-Key", key)
18+
client := client.InitClient(pushURL, errorHandler, client.WithExtraHeader("X-API-Key", key))
2019

2120
return &MetricsPusherClient{
2221
client: client,

middleware/cache.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77
"encoding/json"
88
"errors"
99
"fmt"
10-
"io/ioutil"
10+
"io"
1111
"net/http"
1212
"sync"
1313
"time"
@@ -140,9 +140,9 @@ func generateKey(c *gin.Context) string {
140140
url := c.Request.URL.String()
141141
var b []byte
142142
if c.Request.Body != nil {
143-
b, _ = ioutil.ReadAll(c.Request.Body)
143+
b, _ = io.ReadAll(c.Request.Body)
144144
// Restore the io.ReadCloser to its original state
145-
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(b))
145+
c.Request.Body = io.NopCloser(bytes.NewBuffer(b))
146146
}
147147
hash := sha1.Sum(append([]byte(url), b...))
148148
return base64.URLEncoding.EncodeToString(hash[:])

middleware/sentry.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package middleware
22

33
import (
44
"bytes"
5-
"io/ioutil"
5+
"io"
66
"net/http"
77
"strconv"
88

@@ -154,9 +154,9 @@ func GetSentryErrorHandler(conditions ...SentryCondition) func(res *http.Respons
154154
}
155155

156156
func getBody(res *http.Response) string {
157-
bodyBytes, _ := ioutil.ReadAll(res.Body)
157+
bodyBytes, _ := io.ReadAll(res.Body)
158158
_ = res.Body.Close() // must close
159-
res.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
159+
res.Body = io.NopCloser(bytes.NewBuffer(bodyBytes))
160160

161161
return string(bodyBytes)
162162
}

0 commit comments

Comments
 (0)