-
Notifications
You must be signed in to change notification settings - Fork 82
/
actions.go
97 lines (83 loc) · 2.58 KB
/
actions.go
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
// Copyright 2018 Shift Devices AG
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package relay
import (
"encoding/base64"
"encoding/json"
"github.com/digitalbitbox/bitbox-wallet-app/util/crypto"
"github.com/digitalbitbox/bitbox-wallet-app/util/errp"
)
// PushMessage pushes the encryption of the given data as JSON to the given server.
func PushMessage(server Server, channel *Channel, data interface{}) error {
if channel == nil {
panic("The channel may not be nil.")
}
bytes, err := json.Marshal(data)
if err != nil {
return err
}
encrypted, err := crypto.EncryptThenMAC(bytes, channel.EncryptionKey, channel.AuthenticationKey)
if err != nil {
return err
}
content := base64.StdEncoding.EncodeToString(encrypted)
request := &request{
server: server,
command: PushMessageCommand,
sender: Desktop,
channel: channel,
content: &content,
}
response, err := request.send()
if err != nil {
return err
}
return response.getErrorIfNok()
}
// PullOldestMessage pulls the oldest message on the given channel from the given server.
// If no message is available for ten seconds, then this function returns nil.
func PullOldestMessage(server Server, channel *Channel) ([]byte, error) {
if channel == nil {
panic("The channel may not be nil.")
}
request := &request{
server: server,
command: PullOldestMessageCommand,
sender: Desktop,
channel: channel,
}
response, err := request.send()
if err != nil {
return nil, err
}
if response.Status == "ok" && response.Data != nil && len(response.Data) > 0 {
decodedPayload, err := base64.StdEncoding.DecodeString(response.Data[0].Payload)
if err != nil {
return nil, errp.WithStack(err)
}
return crypto.MACThenDecrypt(decodedPayload, channel.EncryptionKey,
channel.AuthenticationKey)
}
return nil, response.getErrorIfNok()
}
// DeleteAllMessages deletes all messages in all channels which expired on the given server.
func DeleteAllMessages(server Server) error {
request := &request{
server: server,
command: DeleteAllMessagesCommand,
sender: Desktop,
}
_, err := request.send()
return err
}