mirror of
				https://github.com/optim-enterprises-bv/vault.git
				synced 2025-10-29 09:42:25 +00:00 
			
		
		
		
	handle mount fields for non-entity clients; prevent null values (#28202)
This commit is contained in:
		| @@ -3067,6 +3067,13 @@ func (a *ActivityLog) writeExport(ctx context.Context, rw http.ResponseWriter, f | ||||
| 				NamespacePath: nsDisplayPath, | ||||
| 				Timestamp:     ts.UTC().Format(time.RFC3339), | ||||
| 				MountAccessor: e.MountAccessor, | ||||
|  | ||||
| 				// Default following to empty versus nil, will be overwritten if necessary | ||||
| 				Policies:                  []string{}, | ||||
| 				EntityMetadata:            map[string]string{}, | ||||
| 				EntityAliasMetadata:       map[string]string{}, | ||||
| 				EntityAliasCustomMetadata: map[string]string{}, | ||||
| 				EntityGroupIDs:            []string{}, | ||||
| 			} | ||||
|  | ||||
| 			if e.MountAccessor != "" { | ||||
| @@ -3106,24 +3113,34 @@ func (a *ActivityLog) writeExport(ctx context.Context, rw http.ResponseWriter, f | ||||
| 							return fmt.Errorf("failed to process entity name") | ||||
| 						} | ||||
|  | ||||
| 						record.Policies, ok = entityResp.Data["policies"].([]string) | ||||
| 						policies, ok := entityResp.Data["policies"].([]string) | ||||
| 						if !ok { | ||||
| 							return fmt.Errorf("failed to process policies") | ||||
| 						} | ||||
|  | ||||
| 						slices.Sort(record.Policies) | ||||
| 						if policies != nil { | ||||
| 							record.Policies = policies | ||||
| 							slices.Sort(record.Policies) | ||||
| 						} | ||||
|  | ||||
| 						record.EntityMetadata, ok = entityResp.Data["metadata"].(map[string]string) | ||||
| 						entityMetadata, ok := entityResp.Data["metadata"].(map[string]string) | ||||
| 						if !ok { | ||||
| 							return fmt.Errorf("failed to process entity metadata") | ||||
| 						} | ||||
|  | ||||
| 						record.EntityGroupIDs, ok = entityResp.Data["group_ids"].([]string) | ||||
| 						if entityMetadata != nil { | ||||
| 							record.EntityMetadata = entityMetadata | ||||
| 						} | ||||
|  | ||||
| 						entityGroupIDs, ok := entityResp.Data["group_ids"].([]string) | ||||
| 						if !ok { | ||||
| 							return fmt.Errorf("failed to process entity group IDs") | ||||
| 						} | ||||
|  | ||||
| 						slices.Sort(record.EntityGroupIDs) | ||||
| 						if entityGroupIDs != nil { | ||||
| 							record.EntityGroupIDs = entityGroupIDs | ||||
| 							slices.Sort(record.EntityGroupIDs) | ||||
| 						} | ||||
|  | ||||
| 						aliases, ok := entityResp.Data["aliases"].([]interface{}) | ||||
| 						if !ok { | ||||
| @@ -3165,15 +3182,31 @@ func (a *ActivityLog) writeExport(ctx context.Context, rw http.ResponseWriter, f | ||||
| 								return fmt.Errorf("failed to process mount path") | ||||
| 							} | ||||
|  | ||||
| 							record.EntityAliasMetadata, ok = alias["metadata"].(map[string]string) | ||||
| 							entityAliasMetadata, ok := alias["metadata"].(map[string]string) | ||||
| 							if !ok { | ||||
| 								return fmt.Errorf("failed to process entity alias metadata") | ||||
| 							} | ||||
|  | ||||
| 							record.EntityAliasCustomMetadata, ok = alias["custom_metadata"].(map[string]string) | ||||
| 							if entityAliasMetadata != nil { | ||||
| 								record.EntityAliasMetadata = entityAliasMetadata | ||||
| 							} | ||||
|  | ||||
| 							entityAliasCustomMetadata, ok := alias["custom_metadata"].(map[string]string) | ||||
| 							if !ok { | ||||
| 								return fmt.Errorf("failed to process entity alias custom metadata") | ||||
| 							} | ||||
|  | ||||
| 							if entityAliasCustomMetadata != nil { | ||||
| 								record.EntityAliasCustomMetadata = entityAliasCustomMetadata | ||||
| 							} | ||||
| 						} | ||||
| 					} else { | ||||
| 						// fetch mount directly to ensure mount type and path are populated | ||||
| 						// this will be necessary for non-entity client types (e.g. non-entity-token) | ||||
| 						validateResp := a.core.router.ValidateMountByAccessor(e.MountAccessor) | ||||
| 						if validateResp != nil { | ||||
| 							record.MountPath = validateResp.MountPath | ||||
| 							record.MountType = validateResp.MountType | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
|   | ||||
| @@ -585,8 +585,22 @@ func getCSVExport(t *testing.T, client *api.Client, monthsPreviousTo int, now ti | ||||
|  | ||||
| 	// skip initial row as it is header | ||||
| 	for rowIdx := 1; rowIdx < len(csvRecords); rowIdx++ { | ||||
| 		baseRecord := vault.ActivityLogExportRecord{ | ||||
| 			Policies:                  []string{}, | ||||
| 			EntityMetadata:            map[string]string{}, | ||||
| 			EntityAliasMetadata:       map[string]string{}, | ||||
| 			EntityAliasCustomMetadata: map[string]string{}, | ||||
| 			EntityGroupIDs:            []string{}, | ||||
| 		} | ||||
|  | ||||
| 		recordMap := make(map[string]interface{}) | ||||
|  | ||||
| 		// create base map | ||||
| 		err = mapstructure.Decode(baseRecord, &recordMap) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
|  | ||||
| 		for columnIdx, columnName := range csvHeader { | ||||
| 			val := csvRecords[rowIdx][columnIdx] | ||||
|  | ||||
| @@ -597,13 +611,7 @@ func getCSVExport(t *testing.T, client *api.Client, monthsPreviousTo int, now ti | ||||
| 				prefix := columnNameParts[0] | ||||
|  | ||||
| 				if _, ok := mapFields[prefix]; ok { | ||||
| 					m, mOK := recordMap[prefix] | ||||
|  | ||||
| 					// ensure output contains non-nil map | ||||
| 					if !mOK { | ||||
| 						m = make(map[string]string) | ||||
| 						recordMap[prefix] = m | ||||
| 					} | ||||
| 					m := recordMap[prefix] | ||||
|  | ||||
| 					// ignore empty CSV column value | ||||
| 					if val != "" { | ||||
| @@ -611,12 +619,7 @@ func getCSVExport(t *testing.T, client *api.Client, monthsPreviousTo int, now ti | ||||
| 						recordMap[prefix] = m | ||||
| 					} | ||||
| 				} else if _, ok := sliceFields[prefix]; ok { | ||||
| 					// ensure output contains non-nil slice | ||||
| 					s, sOK := recordMap[prefix] | ||||
| 					if !sOK { | ||||
| 						s = make([]string, 0) | ||||
| 						recordMap[prefix] = s | ||||
| 					} | ||||
| 					s := recordMap[prefix] | ||||
|  | ||||
| 					// ignore empty CSV column value | ||||
| 					if val != "" { | ||||
| @@ -624,7 +627,7 @@ func getCSVExport(t *testing.T, client *api.Client, monthsPreviousTo int, now ti | ||||
| 						recordMap[prefix] = s | ||||
| 					} | ||||
| 				} else { | ||||
| 					t.Fatalf("unexpected CSV field: %s", columnName) | ||||
| 					t.Fatalf("unexpected CSV field: %q", columnName) | ||||
| 				} | ||||
| 			} else if _, ok := boolFields[columnName]; ok { | ||||
| 				recordMap[columnName], err = strconv.ParseBool(val) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Chris Capurso
					Chris Capurso