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
|
package hotline
import (
"encoding/binary"
"github.com/jhalter/mobius/concat"
)
const GuestAccount = "guest" // default account used when no login is provided for a connection
type Account struct {
Login string `yaml:"Login"`
Name string `yaml:"Name"`
Password string `yaml:"Password"`
Access *[]byte `yaml:"Access"` // 8 byte bitmap
}
// Payload marshals an account to byte slice
// Example:
// 00 04 // fieldCount?
// 00 66 // 102 - fieldUserName
// 00 0d // 13
// 61 64 6d 69 6e 69 73 74 72 61 74 6f 72 // administrator
// 00 69 // 105 fieldUserLogin (encoded)
// 00 05 // len
// 9e 9b 92 96 91 // encoded login name
// 00 6a // 106 fieldUserPassword
// 00 01 // len
// 78
// 00 6e // fieldUserAccess
// 00 08
// ff d3 cf ef ff 80 00 00
func (a *Account) Payload() (out []byte) {
nameLen := make([]byte, 2)
binary.BigEndian.PutUint16(nameLen, uint16(len(a.Name)))
loginLen := make([]byte, 2)
binary.BigEndian.PutUint16(loginLen, uint16(len(a.Login)))
return concat.Slices(
[]byte{0x00, 0x3}, // param count -- always 3
[]byte{0x00, 0x66}, // fieldUserName
nameLen,
[]byte(a.Name),
[]byte{0x00, 0x69}, // fieldUserLogin
loginLen,
[]byte(NegatedUserString([]byte(a.Login))),
[]byte{0x00, 0x6e}, // fieldUserAccess
[]byte{0x00, 0x08},
*a.Access,
)
}
|