Backport #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> Co-authored-by: 6543 <6543@obermui.de>
This commit is contained in:
		
							parent
							
								
									f5845e6497
								
							
						
					
					
						commit
						51f4f8c393
					
				
					 1 changed files with 40 additions and 0 deletions
				
			
		|  | @ -99,6 +99,46 @@ func AddGPGKey(ownerID int64, content, token, signature string) ([]*GPGKey, erro | |||
| 		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 { | ||||
| 		// Key ID cannot be duplicated.
 | ||||
| 		has, err := sess.Where("key_id=?", ekey.PrimaryKey.KeyIdString()). | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue