...
1 package pgproto3
2
3 import (
4 "bytes"
5 "encoding/binary"
6 "encoding/json"
7 "errors"
8
9 "github.com/jackc/pgx/v5/internal/pgio"
10 )
11
12
13 type AuthenticationSASL struct {
14 AuthMechanisms []string
15 }
16
17
18 func (*AuthenticationSASL) Backend() {}
19
20
21 func (*AuthenticationSASL) AuthenticationResponse() {}
22
23
24
25 func (dst *AuthenticationSASL) Decode(src []byte) error {
26 if len(src) < 4 {
27 return errors.New("authentication message too short")
28 }
29
30 authType := binary.BigEndian.Uint32(src)
31
32 if authType != AuthTypeSASL {
33 return errors.New("bad auth type")
34 }
35
36 authMechanisms := src[4:]
37 for len(authMechanisms) > 1 {
38 idx := bytes.IndexByte(authMechanisms, 0)
39 if idx == -1 {
40 return &invalidMessageFormatErr{messageType: "AuthenticationSASL", details: "unterminated string"}
41 }
42 dst.AuthMechanisms = append(dst.AuthMechanisms, string(authMechanisms[:idx]))
43 authMechanisms = authMechanisms[idx+1:]
44 }
45
46 return nil
47 }
48
49
50 func (src *AuthenticationSASL) Encode(dst []byte) ([]byte, error) {
51 dst, sp := beginMessage(dst, 'R')
52 dst = pgio.AppendUint32(dst, AuthTypeSASL)
53
54 for _, s := range src.AuthMechanisms {
55 dst = append(dst, []byte(s)...)
56 dst = append(dst, 0)
57 }
58 dst = append(dst, 0)
59
60 return finishMessage(dst, sp)
61 }
62
63
64 func (src AuthenticationSASL) MarshalJSON() ([]byte, error) {
65 return json.Marshal(struct {
66 Type string
67 AuthMechanisms []string
68 }{
69 Type: "AuthenticationSASL",
70 AuthMechanisms: src.AuthMechanisms,
71 })
72 }
73
View as plain text