7
7
package auth
8
8
9
9
import (
10
+ "os"
10
11
"strconv"
11
12
"strings"
12
13
"sync"
28
29
type KeyRing struct {
29
30
sessKeyID int
30
31
keyLock sync.RWMutex
31
- avaliable bool
32
+ available bool
32
33
}
33
34
34
35
func GetSessionID () (int , error ) {
@@ -51,33 +52,75 @@ func GetSessionID() (int, error) {
51
52
log .L .Infof ("added search permission for session keyring %s" , defaultSessionName )
52
53
53
54
globalKeyRing .sessKeyID = sessKeyID
54
- globalKeyRing .avaliable = true
55
+ globalKeyRing .available = true
55
56
},
56
57
)
57
- if joinSessionErr != nil {
58
- return 0 , errors .Wrapf (joinSessionErr , "join session keyring %s." , defaultSessionName )
59
- }
60
- if ! globalKeyRing .avaliable {
58
+ if ! globalKeyRing .available || joinSessionErr != nil {
61
59
return 0 , unix .EINVAL
62
60
}
63
61
64
62
return globalKeyRing .sessKeyID , nil
65
63
}
66
64
65
+ func ClearKeyring () error {
66
+ sessKeyID , err := GetSessionID ()
67
+ if err != nil {
68
+ return err
69
+ }
70
+ log .L .Infof ("[abin] clear keyring session ID: %d" , sessKeyID )
71
+
72
+ _ , err = unix .KeyctlInt (unix .KEYCTL_CLEAR , sessKeyID , 0 , 0 , 0 )
73
+
74
+ return err
75
+ }
76
+
67
77
func AddKeyring (id , value string ) (int , error ) {
68
78
sessKeyID , err := GetSessionID ()
69
79
if err != nil {
70
80
return 0 , err
71
81
}
82
+ log .L .Infof ("[abin]session ID: %d" , sessKeyID )
72
83
73
84
globalKeyRing .keyLock .Lock ()
74
85
defer globalKeyRing .keyLock .Unlock ()
75
86
87
+ permFull , _ , err := checkPermission (sessKeyID , 0 )
88
+ if err != nil {
89
+ return 0 , errors .Wrap (err , "check permission before adding key" )
90
+ }
91
+ log .L .Infof ("[abin] keyring permission: %b, uid: %d, gid: %d" , permFull , os .Getuid (), os .Getgid ())
92
+
76
93
keyID , err := unix .AddKey ("user" , id , []byte (value ), sessKeyID )
94
+ if err != nil {
95
+ if errors .Is (err , unix .EACCES ) {
96
+ log .L .Infof ("[abin] error unix.EACCES: %d" , err )
97
+ return 0 , unix .EINVAL
98
+ }
99
+ return 0 , errors .Wrapf (err , "add key %s" , id )
100
+ }
101
+
102
+ _ , err = unix .KeyctlInt (unix .KEYCTL_LINK , keyID , sessKeyID , 0 , 0 )
77
103
if err != nil {
78
104
return 0 , err
79
105
}
80
106
107
+ permFull , _ , err = checkPermission (keyID , 0 )
108
+ if err != nil {
109
+ return 0 , errors .Wrap (err , "check permission before adding key" )
110
+ }
111
+ log .L .Infof ("[abin] key %d permission: %b" , keyID , permFull )
112
+
113
+ if err := addSearchPermission (keyID ); err != nil {
114
+ log .L .Infof ("[abin] add permission to key: %d, err: %v" , keyID , err )
115
+ return keyID , unix .EINVAL
116
+ }
117
+
118
+ permFull , _ , err = checkPermission (keyID , 0 )
119
+ if err != nil {
120
+ return 0 , errors .Wrap (err , "check permission before adding key" )
121
+ }
122
+ log .L .Infof ("[abin] key %d after add permission: %b" , keyID , permFull )
123
+
81
124
return keyID , nil
82
125
}
83
126
@@ -105,7 +148,7 @@ func checkPermission(ringID int, targetMask uint32) (uint32, bool, error) {
105
148
106
149
permFull := uint32 (perm64 ) & mask
107
150
108
- return permFull , (permFull & targetMask ) ! = 0 , nil
151
+ return permFull , (permFull & targetMask )^ targetMask = = 0 , nil
109
152
}
110
153
111
154
func addSearchPermission (ringID int ) error {
@@ -130,10 +173,10 @@ func addSearchPermission(ringID int) error {
130
173
*
131
174
* Refer to https://man7.org/linux/man-pages/man7/keyrings.7.html
132
175
*/
133
- var searchPermissionBits uint32 = 0x80000
176
+ var allUserPermissionBits uint32 = 0x3f0000
134
177
135
178
// Check if the search right for user already exists.
136
- permFull , hasPermission , err := checkPermission (ringID , searchPermissionBits )
179
+ permFull , hasPermission , err := checkPermission (ringID , allUserPermissionBits )
137
180
if err != nil {
138
181
return errors .Wrap (err , "check permission" )
139
182
}
@@ -142,17 +185,21 @@ func addSearchPermission(ringID int) error {
142
185
}
143
186
144
187
// Add search right for user.
145
- if err := unix .KeyctlSetperm (ringID , permFull | searchPermissionBits ); err != nil {
188
+ if err := unix .KeyctlSetperm (ringID , permFull | allUserPermissionBits ); err != nil {
189
+ log .L .Infof ("[abin] set perm error: %v, ringID: %d, bits: %b" , err , ringID , permFull | allUserPermissionBits )
146
190
return errors .Wrap (err , "set permission" )
147
191
}
148
192
149
- permFull , hasPermission , err = checkPermission (ringID , searchPermissionBits )
193
+ permFull , hasPermission , err = checkPermission (ringID , allUserPermissionBits )
150
194
if err != nil {
151
195
return errors .Wrap (err , "check permission after add search permission" )
152
196
}
153
197
if ! hasPermission {
154
- return errors . Errorf ( "add search permission failed, current permission: %b" , permFull )
198
+ return unix . EINVAL
155
199
}
200
+
201
+ log .L .Infof ("[abin] keyring permission: %b" , permFull )
202
+
156
203
return nil
157
204
}
158
205
@@ -177,6 +224,10 @@ func getData(key int) (string, error) {
177
224
for {
178
225
sizeRead , err := unix .KeyctlBuffer (unix .KEYCTL_READ , key , buffer , size )
179
226
if err != nil {
227
+ log .L .Infof ("[abin] KEYCTL_READ error:%v : %d" , err , err )
228
+ if errors .Is (err , unix .EACCES ) {
229
+ return "" , unix .EINVAL
230
+ }
180
231
return "" , err
181
232
}
182
233
0 commit comments