@@ -11,8 +11,6 @@ import (
11
11
"strings"
12
12
"time"
13
13
14
- "code.gitea.io/gitea/modules/log"
15
-
16
14
"github.com/go-xorm/xorm"
17
15
"golang.org/x/crypto/openpgp"
18
16
"golang.org/x/crypto/openpgp/packet"
@@ -46,20 +44,6 @@ func (key *GPGKey) BeforeInsert() {
46
44
key .CreatedUnix = key .Created .Unix ()
47
45
}
48
46
49
- // AfterInsert will be invoked by XORM after inserting a record
50
- func (key * GPGKey ) AfterInsert () {
51
- log .Debug ("AfterInsert Subkeys: %v" , key .SubsKey )
52
- sess := x .NewSession ()
53
- defer sessionRelease (sess )
54
- sess .Begin ()
55
- for _ , subkey := range key .SubsKey {
56
- if err := addGPGKey (sess , subkey ); err != nil {
57
- log .Warn ("Failed to add subKey: [err:%v, subkey:%v]" , err , subkey )
58
- }
59
- }
60
- sess .Commit ()
61
- }
62
-
63
47
// AfterSet is invoked from XORM after setting the value of a field of this object.
64
48
func (key * GPGKey ) AfterSet (colName string , _ xorm.Cell ) {
65
49
switch colName {
@@ -102,11 +86,18 @@ func checkArmoredGPGKeyString(content string) (*openpgp.Entity, error) {
102
86
return list [0 ], nil
103
87
}
104
88
89
+ //addGPGKey add key and subkeys to database
105
90
func addGPGKey (e Engine , key * GPGKey ) (err error ) {
106
- // Save GPG key.
91
+ // Save GPG primary key.
107
92
if _ , err = e .Insert (key ); err != nil {
108
93
return err
109
94
}
95
+ // Save GPG subs key.
96
+ for _ , subkey := range key .SubsKey {
97
+ if err := addGPGKey (e , subkey ); err != nil {
98
+ return err
99
+ }
100
+ }
110
101
return nil
111
102
}
112
103
@@ -139,11 +130,13 @@ func AddGPGKey(ownerID int64, content string) (*GPGKey, error) {
139
130
}
140
131
141
132
if err = addGPGKey (sess , key ); err != nil {
142
- return nil , fmt . Errorf ( "addKey: %v" , err )
133
+ return nil , err
143
134
}
144
135
145
136
return key , sess .Commit ()
146
137
}
138
+
139
+ //base64EncPubKey encode public kay content to base 64
147
140
func base64EncPubKey (pubkey * packet.PublicKey ) (string , error ) {
148
141
var w bytes.Buffer
149
142
err := pubkey .Serialize (& w )
@@ -152,6 +145,8 @@ func base64EncPubKey(pubkey *packet.PublicKey) (string, error) {
152
145
}
153
146
return base64 .StdEncoding .EncodeToString (w .Bytes ()), nil
154
147
}
148
+
149
+ //parseSubGPGKey parse a sub Key
155
150
func parseSubGPGKey (ownerID int64 , primaryID string , pubkey * packet.PublicKey , expiry time.Time ) (* GPGKey , error ) {
156
151
content , err := base64EncPubKey (pubkey )
157
152
if err != nil {
@@ -170,6 +165,8 @@ func parseSubGPGKey(ownerID int64, primaryID string, pubkey *packet.PublicKey, e
170
165
CanCertify : pubkey .PubKeyAlgo .CanSign (),
171
166
}, nil
172
167
}
168
+
169
+ //parseGPGKey parse a PrimaryKey entity (primary key + subs keys + self-signature)
173
170
func parseGPGKey (ownerID int64 , e * openpgp.Entity ) (* GPGKey , error ) {
174
171
pubkey := e .PrimaryKey
175
172
@@ -239,13 +236,11 @@ func parseGPGKey(ownerID int64, e *openpgp.Entity) (*GPGKey, error) {
239
236
}
240
237
241
238
// deleteGPGKey does the actual key deletion
242
- func deleteGPGKey (e * xorm.Session , keyIDs ... int64 ) error {
243
- if len ( keyIDs ) == 0 {
244
- return nil
239
+ func deleteGPGKey (e * xorm.Session , keyID string ) ( int64 , error ) {
240
+ if keyID == "" {
241
+ return 0 , fmt . Errorf ( "empty KeyId forbidden" ) //Should never happen but just to be sure
245
242
}
246
-
247
- _ , err := e .In ("id" , keyIDs ).Delete (new (GPGKey ))
248
- return err
243
+ return e .Where ("key_id=?" , keyID ).Or ("primary_key_id=?" , keyID ).Delete (new (GPGKey ))
249
244
}
250
245
251
246
// DeleteGPGKey deletes GPG key information in database.
@@ -269,18 +264,7 @@ func DeleteGPGKey(doer *User, id int64) (err error) {
269
264
return err
270
265
}
271
266
272
- //Add subkeys to remove
273
- subkeys := make ([]* GPGKey , 0 , 5 )
274
- x .Where ("primary_key_id=?" , key .KeyID ).Find (& subkeys )
275
- ids := make ([]int64 , len (subkeys )+ 1 )
276
- for i , sk := range subkeys {
277
- ids [i ] = sk .ID
278
- }
279
-
280
- //Add primary key to remove at last
281
- ids [len (subkeys )] = id
282
-
283
- if err = deleteGPGKey (sess , ids ... ); err != nil {
267
+ if _ , err = deleteGPGKey (sess , key .KeyID ); err != nil {
284
268
return err
285
269
}
286
270
0 commit comments