blob: 0530d8946a8fa2eea3f897a45afa596bc4f10545 [file] [log] [blame]
David K. Bainbridgebd6b2882021-08-26 13:31:02 +00001package sarama
2
3type AlterUserScramCredentialsRequest struct {
4 Version int16
5
6 // Deletions represent list of SCRAM credentials to remove
7 Deletions []AlterUserScramCredentialsDelete
8
9 // Upsertions represent list of SCRAM credentials to update/insert
10 Upsertions []AlterUserScramCredentialsUpsert
11}
12
13type AlterUserScramCredentialsDelete struct {
14 Name string
15 Mechanism ScramMechanismType
16}
17
18type AlterUserScramCredentialsUpsert struct {
19 Name string
20 Mechanism ScramMechanismType
21 Iterations int32
22 Salt []byte
23 saltedPassword []byte
24
25 // This field is never transmitted over the wire
26 // @see: https://tools.ietf.org/html/rfc5802
27 Password []byte
28}
29
30func (r *AlterUserScramCredentialsRequest) encode(pe packetEncoder) error {
31 pe.putCompactArrayLength(len(r.Deletions))
32 for _, d := range r.Deletions {
33 if err := pe.putCompactString(d.Name); err != nil {
34 return err
35 }
36 pe.putInt8(int8(d.Mechanism))
37 pe.putEmptyTaggedFieldArray()
38 }
39
40 pe.putCompactArrayLength(len(r.Upsertions))
41 for _, u := range r.Upsertions {
42 if err := pe.putCompactString(u.Name); err != nil {
43 return err
44 }
45 pe.putInt8(int8(u.Mechanism))
46 pe.putInt32(u.Iterations)
47
48 if err := pe.putCompactBytes(u.Salt); err != nil {
49 return err
50 }
51
52 // do not transmit the password over the wire
53 formatter := scramFormatter{mechanism: u.Mechanism}
54 salted, err := formatter.saltedPassword(u.Password, u.Salt, int(u.Iterations))
55 if err != nil {
56 return err
57 }
58
59 if err := pe.putCompactBytes(salted); err != nil {
60 return err
61 }
62 pe.putEmptyTaggedFieldArray()
63 }
64
65 pe.putEmptyTaggedFieldArray()
66 return nil
67}
68
69func (r *AlterUserScramCredentialsRequest) decode(pd packetDecoder, version int16) error {
70 numDeletions, err := pd.getCompactArrayLength()
71 if err != nil {
72 return err
73 }
74
75 r.Deletions = make([]AlterUserScramCredentialsDelete, numDeletions)
76 for i := 0; i < numDeletions; i++ {
77 r.Deletions[i] = AlterUserScramCredentialsDelete{}
78 if r.Deletions[i].Name, err = pd.getCompactString(); err != nil {
79 return err
80 }
81 mechanism, err := pd.getInt8()
82 if err != nil {
83 return err
84 }
85 r.Deletions[i].Mechanism = ScramMechanismType(mechanism)
86 if _, err = pd.getEmptyTaggedFieldArray(); err != nil {
87 return err
88 }
89 }
90
91 numUpsertions, err := pd.getCompactArrayLength()
92 if err != nil {
93 return err
94 }
95
96 r.Upsertions = make([]AlterUserScramCredentialsUpsert, numUpsertions)
97 for i := 0; i < numUpsertions; i++ {
98 r.Upsertions[i] = AlterUserScramCredentialsUpsert{}
99 if r.Upsertions[i].Name, err = pd.getCompactString(); err != nil {
100 return err
101 }
102 mechanism, err := pd.getInt8()
103 if err != nil {
104 return err
105 }
106
107 r.Upsertions[i].Mechanism = ScramMechanismType(mechanism)
108 if r.Upsertions[i].Iterations, err = pd.getInt32(); err != nil {
109 return err
110 }
111 if r.Upsertions[i].Salt, err = pd.getCompactBytes(); err != nil {
112 return err
113 }
114 if r.Upsertions[i].saltedPassword, err = pd.getCompactBytes(); err != nil {
115 return err
116 }
117 if _, err = pd.getEmptyTaggedFieldArray(); err != nil {
118 return err
119 }
120 }
121
122 if _, err = pd.getEmptyTaggedFieldArray(); err != nil {
123 return err
124 }
125 return nil
126}
127
128func (r *AlterUserScramCredentialsRequest) key() int16 {
129 return 51
130}
131
132func (r *AlterUserScramCredentialsRequest) version() int16 {
133 return r.Version
134}
135
136func (r *AlterUserScramCredentialsRequest) headerVersion() int16 {
137 return 2
138}
139
140func (r *AlterUserScramCredentialsRequest) requiredVersion() KafkaVersion {
141 return V2_7_0_0
142}