Handle duplicate keys on GPG key ring (#17242)
It is possible that a keyring can contain duplicate keys on a keyring due to jpegs or other layers. This currently leads to a confusing error for the user - where we report a duplicate key insertion. This PR simply coalesces keys into one key if there are duplicates. Signed-off-by: Andrew Thornton <art27@cantab.net> Co-authored-by: 6543 <6543@obermui.de>
This commit is contained in:
parent
29acb3213b
commit
46cac263ca
1 changed files with 40 additions and 0 deletions
|
@ -101,6 +101,46 @@ func AddGPGKey(ownerID int64, content, token, signature string) ([]*GPGKey, erro
|
||||||
verified = true
|
verified = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(ekeys) > 1 {
|
||||||
|
id2key := map[string]*openpgp.Entity{}
|
||||||
|
newEKeys := make([]*openpgp.Entity, 0, len(ekeys))
|
||||||
|
for _, ekey := range ekeys {
|
||||||
|
id := ekey.PrimaryKey.KeyIdString()
|
||||||
|
if original, has := id2key[id]; has {
|
||||||
|
// Coalesce this with the other one
|
||||||
|
for _, subkey := range ekey.Subkeys {
|
||||||
|
if subkey.PublicKey == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
found := false
|
||||||
|
|
||||||
|
for _, originalSubkey := range original.Subkeys {
|
||||||
|
if originalSubkey.PublicKey == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if originalSubkey.PublicKey.KeyId == subkey.PublicKey.KeyId {
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !found {
|
||||||
|
original.Subkeys = append(original.Subkeys, subkey)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for name, identity := range ekey.Identities {
|
||||||
|
if _, has := original.Identities[name]; has {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
original.Identities[name] = identity
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
id2key[id] = ekey
|
||||||
|
newEKeys = append(newEKeys, ekey)
|
||||||
|
}
|
||||||
|
ekeys = newEKeys
|
||||||
|
}
|
||||||
|
|
||||||
for _, ekey := range ekeys {
|
for _, ekey := range ekeys {
|
||||||
// Key ID cannot be duplicated.
|
// Key ID cannot be duplicated.
|
||||||
has, err := db.GetEngine(ctx).Where("key_id=?", ekey.PrimaryKey.KeyIdString()).
|
has, err := db.GetEngine(ctx).Where("key_id=?", ekey.PrimaryKey.KeyIdString()).
|
||||||
|
|
Reference in a new issue