Skip to content

Commit 6b98c3f

Browse files
committed
signalmeow/web: use context logger, make SendHTTPRequest use context
Signed-off-by: Sumner Evans <[email protected]>
1 parent b90b12f commit 6b98c3f

File tree

13 files changed

+58
-62
lines changed

13 files changed

+58
-62
lines changed

commands.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ func fnSetDeviceName(ce *WrappedCommandEvent) {
177177
}
178178

179179
name := strings.Join(ce.Args, " ")
180-
err := ce.User.Client.UpdateDeviceName(name)
180+
err := ce.User.Client.UpdateDeviceName(ce.Ctx, name)
181181
if err != nil {
182182
ce.Reply("Error setting device name: %v", err)
183183
return

pkg/signalmeow/attachments.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ func (cli *Client) UploadAttachment(ctx context.Context, body []byte) (*signalpb
139139
attributesPath := "/v3/attachments/form/upload"
140140
username, password := cli.Store.BasicAuthCreds()
141141
opts := &web.HTTPReqOpt{Username: &username, Password: &password}
142-
resp, err := web.SendHTTPRequest(http.MethodGet, attributesPath, opts)
142+
resp, err := web.SendHTTPRequest(ctx, http.MethodGet, attributesPath, opts)
143143
if err != nil {
144144
log.Err(err).Msg("Error sending request fetching upload attributes")
145145
return nil, err
@@ -152,7 +152,7 @@ func (cli *Client) UploadAttachment(ctx context.Context, body []byte) (*signalpb
152152
}
153153

154154
// Allocate attachment on CDN
155-
resp, err = web.SendHTTPRequest(http.MethodPost, "", &web.HTTPReqOpt{
155+
resp, err = web.SendHTTPRequest(ctx, http.MethodPost, "", &web.HTTPReqOpt{
156156
OverrideURL: uploadAttributes.SignedUploadLocation,
157157
ContentType: web.ContentTypeOctetStream,
158158
Headers: uploadAttributes.Headers,
@@ -169,7 +169,7 @@ func (cli *Client) UploadAttachment(ctx context.Context, body []byte) (*signalpb
169169
}
170170

171171
// Upload attachment to CDN
172-
resp, err = web.SendHTTPRequest(http.MethodPut, "", &web.HTTPReqOpt{
172+
resp, err = web.SendHTTPRequest(ctx, http.MethodPut, "", &web.HTTPReqOpt{
173173
OverrideURL: resp.Header.Get("Location"),
174174
Body: encryptedWithMAC,
175175
ContentType: web.ContentTypeOctetStream,

pkg/signalmeow/devicename.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package signalmeow
1818

1919
import (
20+
"context"
2021
"crypto/aes"
2122
"crypto/cipher"
2223
"crypto/hmac"
@@ -43,27 +44,27 @@ func aes256CTR(key, iv, dst, source []byte) {
4344
cipher.NewCTR(block, iv).XORKeyStream(dst, source)
4445
}
4546

46-
func (cli *Client) UpdateDeviceName(name string) error {
47+
func (cli *Client) UpdateDeviceName(ctx context.Context, name string) error {
4748
encryptedName, err := EncryptDeviceName(name, cli.Store.ACIIdentityKeyPair.GetPublicKey())
4849
if err != nil {
4950
return fmt.Errorf("failed to encrypt device name: %w", err)
5051
}
51-
err = cli.updateDeviceName(encryptedName)
52+
err = cli.updateDeviceName(ctx, encryptedName)
5253
if err != nil {
5354
return fmt.Errorf("failed to update device name: %w", err)
5455
}
5556
return nil
5657
}
5758

58-
func (cli *Client) updateDeviceName(encryptedName []byte) error {
59+
func (cli *Client) updateDeviceName(ctx context.Context, encryptedName []byte) error {
5960
reqData, err := json.Marshal(map[string]any{
6061
"deviceName": encryptedName,
6162
})
6263
if err != nil {
6364
return fmt.Errorf("failed to marshal device name update request: %w", err)
6465
}
6566
username, password := cli.Store.BasicAuthCreds()
66-
resp, err := web.SendHTTPRequest(http.MethodPut, "/v1/accounts/name", &web.HTTPReqOpt{
67+
resp, err := web.SendHTTPRequest(ctx, http.MethodPut, "/v1/accounts/name", &web.HTTPReqOpt{
6768
Body: reqData,
6869
Username: &username,
6970
Password: &password,

pkg/signalmeow/groups.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ func (cli *Client) fetchGroupByID(ctx context.Context, gid types.GroupIdentifier
379379
ContentType: web.ContentTypeProtobuf,
380380
Host: web.StorageHostname,
381381
}
382-
response, err := web.SendHTTPRequest(http.MethodGet, "/v1/groups", opts)
382+
response, err := web.SendHTTPRequest(ctx, http.MethodGet, "/v1/groups", opts)
383383
if err != nil {
384384
zlog.Err(err).Msg("RetrieveGroupById SendHTTPRequest error")
385385
return nil, err
@@ -425,7 +425,7 @@ func (cli *Client) DownloadGroupAvatar(ctx context.Context, group *Group) ([]byt
425425
Username: &username,
426426
Password: &password,
427427
}
428-
resp, err := web.SendHTTPRequest(http.MethodGet, group.AvatarPath, opts)
428+
resp, err := web.SendHTTPRequest(ctx, http.MethodGet, group.AvatarPath, opts)
429429
if err != nil {
430430
return nil, fmt.Errorf("failed to send request: %w", err)
431431
}

pkg/signalmeow/keys.go

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ func (cli *Client) GenerateAndRegisterPreKeys(ctx context.Context, uuidKind type
8686
preKeyUsername = cli.Store.ACI.String()
8787
}
8888
preKeyUsername = fmt.Sprintf("%s.%d", preKeyUsername, cli.Store.DeviceID)
89-
err = RegisterPreKeys(&generatedPreKeys, uuidKind, preKeyUsername, cli.Store.Password)
89+
err = RegisterPreKeys(ctx, &generatedPreKeys, uuidKind, preKeyUsername, cli.Store.Password)
9090
if err != nil {
9191
zlog.Err(err).Msg("RegisterPreKeys error")
9292
return err
@@ -228,7 +228,8 @@ func KyberPreKeyToJSON(kyberPreKey *libsignalgo.KyberPreKeyRecord) map[string]in
228228
return kyberPreKeyJson
229229
}
230230

231-
func RegisterPreKeys(generatedPreKeys *GeneratedPreKeys, uuidKind types.UUIDKind, username string, password string) error {
231+
func RegisterPreKeys(ctx context.Context, generatedPreKeys *GeneratedPreKeys, uuidKind types.UUIDKind, username string, password string) error {
232+
log := zerolog.Ctx(ctx).With().Str("action", "register prekeys").Logger()
232233
// Convert generated prekeys to JSON
233234
preKeysJson := []map[string]interface{}{}
234235
kyberPreKeysJson := []map[string]interface{}{}
@@ -252,22 +253,20 @@ func RegisterPreKeys(generatedPreKeys *GeneratedPreKeys, uuidKind types.UUIDKind
252253
keysPath := "/v2/keys?identity=" + string(uuidKind)
253254
jsonBytes, err := json.Marshal(register_json)
254255
if err != nil {
255-
zlog.Err(err).Msg("Error marshalling register JSON")
256+
log.Err(err).Msg("Error marshalling register JSON")
256257
return err
257258
}
258259
opts := &web.HTTPReqOpt{Body: jsonBytes, Username: &username, Password: &password}
259-
resp, err := web.SendHTTPRequest(http.MethodPut, keysPath, opts)
260+
resp, err := web.SendHTTPRequest(ctx, http.MethodPut, keysPath, opts)
260261
if err != nil {
261-
zlog.Err(err).Msg("Error sending request")
262+
log.Err(err).Msg("Error sending request")
262263
return err
263264
}
265+
defer resp.Body.Close()
264266
// status code not 2xx
265267
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
266-
err := fmt.Errorf("Error registering prekeys: %v", resp.Status)
267-
zlog.Err(err).Msg("Error registering prekeys")
268-
return err
268+
return fmt.Errorf("error registering prekeys: %v", resp.Status)
269269
}
270-
defer resp.Body.Close()
271270
return err
272271
}
273272

@@ -306,7 +305,7 @@ func (cli *Client) FetchAndProcessPreKey(ctx context.Context, theirUUID uuid.UUI
306305
}
307306
path := "/v2/keys/" + theirUUID.String() + deviceIDPath + "?pq=true"
308307
username, password := cli.Store.BasicAuthCreds()
309-
resp, err := web.SendHTTPRequest(http.MethodGet, path, &web.HTTPReqOpt{Username: &username, Password: &password})
308+
resp, err := web.SendHTTPRequest(ctx, http.MethodGet, path, &web.HTTPReqOpt{Username: &username, Password: &password})
310309
if err != nil {
311310
zlog.Err(err).Msg("Error sending request")
312311
return err

pkg/signalmeow/misc.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222
"github.com/rs/zerolog"
2323

2424
"go.mau.fi/mautrix-signal/pkg/libsignalgo"
25-
"go.mau.fi/mautrix-signal/pkg/signalmeow/web"
2625
)
2726

2827
// Deprecated: global loggers are bad
@@ -31,7 +30,6 @@ var zlog zerolog.Logger = zerolog.New(zerolog.ConsoleWriter{}).With().Timestamp(
3130
func SetLogger(l zerolog.Logger) {
3231
zlog = l
3332
setupFFILogging()
34-
web.SetLogger(l.With().Str("component", "signalmeow/web").Logger())
3533
}
3634

3735
type FFILogger struct{}

pkg/signalmeow/profile.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ func (cli *Client) fetchProfileByID(ctx context.Context, signalID uuid.UUID) (*P
220220
}
221221
zlog.Trace().Msg("Got profile response")
222222
if *resp.Status < 200 || *resp.Status >= 300 {
223-
err := errors.New(fmt.Sprintf("%v (unsuccessful status code)", *resp.Status))
223+
err := fmt.Errorf("%v (unsuccessful status code)", *resp.Status)
224224
zlog.Err(err).Msg("profile response error")
225225
return nil, err
226226
}
@@ -237,7 +237,7 @@ func (cli *Client) fetchProfileByID(ctx context.Context, signalID uuid.UUID) (*P
237237
zlog.Err(err).Msg("error decrypting profile name")
238238
}
239239
// TODO store first and last name separately instead of removing the separator
240-
profile.Name = strings.Replace(profile.Name, "\x00", " ", -1)
240+
profile.Name = strings.ReplaceAll(profile.Name, "\x00", " ")
241241
}
242242
if len(profileResponse.About) > 0 {
243243
profile.About, err = decryptString(profileKey, profileResponse.About)
@@ -257,14 +257,14 @@ func (cli *Client) fetchProfileByID(ctx context.Context, signalID uuid.UUID) (*P
257257
return &profile, nil
258258
}
259259

260-
func (cli *Client) DownloadUserAvatar(avatarPath string, profileKey *libsignalgo.ProfileKey) ([]byte, error) {
260+
func (cli *Client) DownloadUserAvatar(ctx context.Context, avatarPath string, profileKey *libsignalgo.ProfileKey) ([]byte, error) {
261261
username, password := cli.Store.BasicAuthCreds()
262262
opts := &web.HTTPReqOpt{
263263
Host: web.CDN1Hostname,
264264
Username: &username,
265265
Password: &password,
266266
}
267-
resp, err := web.SendHTTPRequest(http.MethodGet, avatarPath, opts)
267+
resp, err := web.SendHTTPRequest(ctx, http.MethodGet, avatarPath, opts)
268268
if err != nil {
269269
return nil, fmt.Errorf("failed to send request: %w", err)
270270
}

pkg/signalmeow/provisioning.go

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"time"
3030

3131
"github.com/google/uuid"
32+
"github.com/rs/zerolog"
3233
"google.golang.org/protobuf/proto"
3334
"nhooyr.io/websocket"
3435

@@ -249,14 +250,15 @@ func PerformProvisioning(incomingCtx context.Context, deviceStore store.DeviceSt
249250

250251
// Returns the provisioningUrl and an error
251252
func startProvisioning(ctx context.Context, ws *websocket.Conn, provisioningCipher *ProvisioningCipher) (string, error) {
253+
log := zerolog.Ctx(ctx).With().Str("action", "start provisioning").Logger()
252254
pubKey := provisioningCipher.GetPublicKey()
253255

254256
provisioningUrl := ""
255257

256258
msg := &signalpb.WebSocketMessage{}
257259
err := wspb.Read(ctx, ws, msg)
258260
if err != nil {
259-
zlog.Err(err).Msg("error reading websocket message")
261+
log.Err(err).Msg("error reading websocket message")
260262
return "", err
261263
}
262264

@@ -280,22 +282,23 @@ func startProvisioning(ctx context.Context, ws *websocket.Conn, provisioningCiph
280282
provisioningUrl = "sgnl://linkdevice?uuid=" + uuid + "&pub_key=" + pubKey
281283

282284
// Create and send response
283-
response := web.CreateWSResponse(*msg.Request.Id, 200)
285+
response := web.CreateWSResponse(ctx, *msg.Request.Id, 200)
284286
err = wspb.Write(ctx, ws, response)
285287
if err != nil {
286-
zlog.Err(err).Msg("error writing websocket message")
288+
log.Err(err).Msg("error writing websocket message")
287289
return "", err
288290
}
289291
}
290292
return provisioningUrl, nil
291293
}
292294

293295
func continueProvisioning(ctx context.Context, ws *websocket.Conn, provisioningCipher *ProvisioningCipher) (*signalpb.ProvisionMessage, error) {
296+
log := zerolog.Ctx(ctx).With().Str("action", "continue provisioning").Logger()
294297
envelope := &signalpb.ProvisionEnvelope{}
295298
msg := &signalpb.WebSocketMessage{}
296299
err := wspb.Read(ctx, ws, msg)
297300
if err != nil {
298-
zlog.Err(err).Msg("error reading websocket message")
301+
log.Err(err).Msg("error reading websocket message")
299302
return nil, err
300303
}
301304

@@ -309,15 +312,15 @@ func continueProvisioning(ctx context.Context, ws *websocket.Conn, provisioningC
309312
return nil, err
310313
}
311314

312-
response := web.CreateWSResponse(*msg.Request.Id, 200)
315+
response := web.CreateWSResponse(ctx, *msg.Request.Id, 200)
313316
err = wspb.Write(ctx, ws, response)
314317
if err != nil {
315-
zlog.Err(err).Msg("error writing websocket message")
318+
log.Err(err).Msg("error writing websocket message")
316319
return nil, err
317320
}
318321
} else {
319322
err = fmt.Errorf("invalid provisioning message, type: %v, verb: %v, path: %v", *msg.Type, *msg.Request.Verb, *msg.Request.Path)
320-
zlog.Err(err).Msg("problem reading websocket message")
323+
log.Err(err).Msg("problem reading websocket message")
321324
return nil, err
322325
}
323326
provisioningMessage, err := provisioningCipher.Decrypt(envelope)

pkg/signalmeow/sending.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func (cli *Client) senderCertificate(ctx context.Context) (*libsignalgo.SenderCe
6060

6161
username, password := cli.Store.BasicAuthCreds()
6262
opts := &web.HTTPReqOpt{Username: &username, Password: &password}
63-
resp, err := web.SendHTTPRequest(http.MethodGet, "/v1/certificate/delivery", opts)
63+
resp, err := web.SendHTTPRequest(ctx, http.MethodGet, "/v1/certificate/delivery", opts)
6464
if err != nil {
6565
return nil, err
6666
}
@@ -121,7 +121,7 @@ func addPadding(version uint32, contents []byte) ([]byte, error) {
121121

122122
err := padBlock(&buffer, messageLength)
123123
if err != nil {
124-
return nil, errors.New(fmt.Sprintf("Invalid message padding: %v", err))
124+
return nil, fmt.Errorf("Invalid message padding: %w", err)
125125
}
126126
return buffer, nil
127127
}

pkg/signalmeow/web/signalwebsocket.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -219,14 +219,14 @@ func (s *SignalWebsocket) connectLoop(
219219
// Unexpected status code
220220
s.statusChannel <- SignalWebsocketConnectionStatus{
221221
Event: SignalWebsocketConnectionEventError,
222-
Err: fmt.Errorf("Bad status opening websocket: %v", resp.Status),
222+
Err: fmt.Errorf("bad status opening websocket: %v", resp.Status),
223223
}
224224
return // NOT RETRYING, KILLING THE CONNECTION LOOP
225225
} else {
226226
// Something is very wrong
227227
s.statusChannel <- SignalWebsocketConnectionStatus{
228228
Event: SignalWebsocketConnectionEventError,
229-
Err: fmt.Errorf("Unexpected error opening websocket: %v", resp.Status),
229+
Err: fmt.Errorf("unexpected error opening websocket: %v", resp.Status),
230230
}
231231
}
232232
// Retry the connection
@@ -385,10 +385,10 @@ func readLoop(
385385
return fmt.Errorf("error reading message: %w", err)
386386
}
387387
if msg.Type == nil {
388-
return errors.New("Received message with no type")
388+
return errors.New("received message with no type")
389389
} else if *msg.Type == signalpb.WebSocketMessage_REQUEST {
390390
if msg.Request == nil {
391-
return errors.New("Received request message with no request")
391+
return errors.New("received request message with no request")
392392
}
393393
log.Debug().
394394
Uint64("request_id", *msg.Request.Id).
@@ -421,9 +421,9 @@ func readLoop(
421421
Msg("Deleted response channel for ID")
422422
close(responseChannel)
423423
} else if *msg.Type == signalpb.WebSocketMessage_UNKNOWN {
424-
return fmt.Errorf("Received message with unknown type: %v", *msg.Type)
424+
return fmt.Errorf("received message with unknown type: %v", *msg.Type)
425425
} else {
426-
return fmt.Errorf("Received message with actually unknown type: %v", *msg.Type)
426+
return fmt.Errorf("received message with actually unknown type: %v", *msg.Type)
427427
}
428428
}
429429
}
@@ -498,7 +498,7 @@ func writeLoop(
498498
return fmt.Errorf("error writing request message: %w", err)
499499
}
500500
} else if request.RequestMessage != nil && request.ResponseMessage != nil {
501-
message := CreateWSResponse(*request.RequestMessage.Id, request.ResponseMessage.Status)
501+
message := CreateWSResponse(ctx, *request.RequestMessage.Id, request.ResponseMessage.Status)
502502
log.Debug().
503503
Uint64("request_id", *request.RequestMessage.Id).
504504
Int("response_status", request.ResponseMessage.Status).
@@ -508,7 +508,7 @@ func writeLoop(
508508
return fmt.Errorf("error writing response message: %w", err)
509509
}
510510
} else {
511-
return fmt.Errorf("Invalid request: %+v", request)
511+
return fmt.Errorf("invalid request: %+v", request)
512512
}
513513
}
514514
}
@@ -576,10 +576,10 @@ func OpenWebsocket(ctx context.Context, path string) (*websocket.Conn, *http.Res
576576
return ws, resp, err
577577
}
578578

579-
func CreateWSResponse(id uint64, status int) *signalpb.WebSocketMessage {
579+
func CreateWSResponse(ctx context.Context, id uint64, status int) *signalpb.WebSocketMessage {
580580
if status != 200 && status != 400 {
581581
// TODO support more responses to Signal? Are there more?
582-
zlog.Fatal().Int("status", status).Msg("Error creating response. Non 200/400 not supported yet.")
582+
zerolog.Ctx(ctx).Fatal().Int("status", status).Msg("Error creating response. Non 200/400 not supported yet.")
583583
return nil
584584
}
585585
msg_type := signalpb.WebSocketMessage_RESPONSE

0 commit comments

Comments
 (0)