77package auth
88
99import (
10+ "os"
1011 "strconv"
1112 "strings"
1213 "sync"
2829type KeyRing struct {
2930 sessKeyID int
3031 keyLock sync.RWMutex
31- avaliable bool
32+ available bool
3233}
3334
3435func GetSessionID () (int , error ) {
@@ -51,33 +52,75 @@ func GetSessionID() (int, error) {
5152 log .L .Infof ("added search permission for session keyring %s" , defaultSessionName )
5253
5354 globalKeyRing .sessKeyID = sessKeyID
54- globalKeyRing .avaliable = true
55+ globalKeyRing .available = true
5556 },
5657 )
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 {
6159 return 0 , unix .EINVAL
6260 }
6361
6462 return globalKeyRing .sessKeyID , nil
6563}
6664
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+
6777func AddKeyring (id , value string ) (int , error ) {
6878 sessKeyID , err := GetSessionID ()
6979 if err != nil {
7080 return 0 , err
7181 }
82+ log .L .Infof ("[abin]session ID: %d" , sessKeyID )
7283
7384 globalKeyRing .keyLock .Lock ()
7485 defer globalKeyRing .keyLock .Unlock ()
7586
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+
7693 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 )
77103 if err != nil {
78104 return 0 , err
79105 }
80106
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+
81124 return keyID , nil
82125}
83126
@@ -105,7 +148,7 @@ func checkPermission(ringID int, targetMask uint32) (uint32, bool, error) {
105148
106149 permFull := uint32 (perm64 ) & mask
107150
108- return permFull , (permFull & targetMask ) ! = 0 , nil
151+ return permFull , (permFull & targetMask )^ targetMask = = 0 , nil
109152}
110153
111154func addSearchPermission (ringID int ) error {
@@ -130,10 +173,10 @@ func addSearchPermission(ringID int) error {
130173 *
131174 * Refer to https://man7.org/linux/man-pages/man7/keyrings.7.html
132175 */
133- var searchPermissionBits uint32 = 0x80000
176+ var allUserPermissionBits uint32 = 0x3f0000
134177
135178 // Check if the search right for user already exists.
136- permFull , hasPermission , err := checkPermission (ringID , searchPermissionBits )
179+ permFull , hasPermission , err := checkPermission (ringID , allUserPermissionBits )
137180 if err != nil {
138181 return errors .Wrap (err , "check permission" )
139182 }
@@ -142,17 +185,21 @@ func addSearchPermission(ringID int) error {
142185 }
143186
144187 // 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 )
146190 return errors .Wrap (err , "set permission" )
147191 }
148192
149- permFull , hasPermission , err = checkPermission (ringID , searchPermissionBits )
193+ permFull , hasPermission , err = checkPermission (ringID , allUserPermissionBits )
150194 if err != nil {
151195 return errors .Wrap (err , "check permission after add search permission" )
152196 }
153197 if ! hasPermission {
154- return errors . Errorf ( "add search permission failed, current permission: %b" , permFull )
198+ return unix . EINVAL
155199 }
200+
201+ log .L .Infof ("[abin] keyring permission: %b" , permFull )
202+
156203 return nil
157204}
158205
@@ -177,6 +224,10 @@ func getData(key int) (string, error) {
177224 for {
178225 sizeRead , err := unix .KeyctlBuffer (unix .KEYCTL_READ , key , buffer , size )
179226 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+ }
180231 return "" , err
181232 }
182233
0 commit comments