cubefs
138 строк · 2.7 Кб
1package sarama
2
3// Resource holds information about acl resource type
4type Resource struct {
5ResourceType AclResourceType
6ResourceName string
7ResourcePatternType AclResourcePatternType
8}
9
10func (r *Resource) encode(pe packetEncoder, version int16) error {
11pe.putInt8(int8(r.ResourceType))
12
13if err := pe.putString(r.ResourceName); err != nil {
14return err
15}
16
17if version == 1 {
18if r.ResourcePatternType == AclPatternUnknown {
19Logger.Print("Cannot encode an unknown resource pattern type, using Literal instead")
20r.ResourcePatternType = AclPatternLiteral
21}
22pe.putInt8(int8(r.ResourcePatternType))
23}
24
25return nil
26}
27
28func (r *Resource) decode(pd packetDecoder, version int16) (err error) {
29resourceType, err := pd.getInt8()
30if err != nil {
31return err
32}
33r.ResourceType = AclResourceType(resourceType)
34
35if r.ResourceName, err = pd.getString(); err != nil {
36return err
37}
38if version == 1 {
39pattern, err := pd.getInt8()
40if err != nil {
41return err
42}
43r.ResourcePatternType = AclResourcePatternType(pattern)
44}
45
46return nil
47}
48
49// Acl holds information about acl type
50type Acl struct {
51Principal string
52Host string
53Operation AclOperation
54PermissionType AclPermissionType
55}
56
57func (a *Acl) encode(pe packetEncoder) error {
58if err := pe.putString(a.Principal); err != nil {
59return err
60}
61
62if err := pe.putString(a.Host); err != nil {
63return err
64}
65
66pe.putInt8(int8(a.Operation))
67pe.putInt8(int8(a.PermissionType))
68
69return nil
70}
71
72func (a *Acl) decode(pd packetDecoder, version int16) (err error) {
73if a.Principal, err = pd.getString(); err != nil {
74return err
75}
76
77if a.Host, err = pd.getString(); err != nil {
78return err
79}
80
81operation, err := pd.getInt8()
82if err != nil {
83return err
84}
85a.Operation = AclOperation(operation)
86
87permissionType, err := pd.getInt8()
88if err != nil {
89return err
90}
91a.PermissionType = AclPermissionType(permissionType)
92
93return nil
94}
95
96// ResourceAcls is an acl resource type
97type ResourceAcls struct {
98Resource
99Acls []*Acl
100}
101
102func (r *ResourceAcls) encode(pe packetEncoder, version int16) error {
103if err := r.Resource.encode(pe, version); err != nil {
104return err
105}
106
107if err := pe.putArrayLength(len(r.Acls)); err != nil {
108return err
109}
110for _, acl := range r.Acls {
111if err := acl.encode(pe); err != nil {
112return err
113}
114}
115
116return nil
117}
118
119func (r *ResourceAcls) decode(pd packetDecoder, version int16) error {
120if err := r.Resource.decode(pd, version); err != nil {
121return err
122}
123
124n, err := pd.getArrayLength()
125if err != nil {
126return err
127}
128
129r.Acls = make([]*Acl, n)
130for i := 0; i < n; i++ {
131r.Acls[i] = new(Acl)
132if err := r.Acls[i].decode(pd, version); err != nil {
133return err
134}
135}
136
137return nil
138}
139