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 | 		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 := sess.Where("key_id=?", ekey.PrimaryKey.KeyIdString()). | 		has, err := sess.Where("key_id=?", ekey.PrimaryKey.KeyIdString()). | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue