|  | 
| 7 | 7 | 	"errors" | 
| 8 | 8 | 	"fmt" | 
| 9 | 9 | 	"reflect" | 
|  | 10 | +	"sort" | 
| 10 | 11 | 	"time" | 
| 11 | 12 | 
 | 
| 12 | 13 | 	"github.com/davecgh/go-spew/spew" | 
| @@ -380,17 +381,45 @@ func overrideSessionTimeZone(session *Session) { | 
| 380 | 381 | // as nil in the bbolt store. Therefore, we also override the permissions | 
| 381 | 382 | // or caveats to nil for the migrated session in that scenario, so that the | 
| 382 | 383 | // deep equals check does not fail in this scenario either. | 
|  | 384 | +// | 
|  | 385 | +// Additionally, we sort the caveats of both the kv and sql sessions by | 
|  | 386 | +// their ID, so that they are always comparable in a deterministic way with deep | 
|  | 387 | +// equals. | 
| 383 | 388 | func overrideMacaroonRecipe(kvSession *Session, migratedSession *Session) { | 
| 384 | 389 | 	if kvSession.MacaroonRecipe != nil { | 
| 385 | 390 | 		kvPerms := kvSession.MacaroonRecipe.Permissions | 
| 386 | 391 | 		kvCaveats := kvSession.MacaroonRecipe.Caveats | 
| 387 | 392 | 
 | 
|  | 393 | +		// If the kvSession has a MacaroonRecipe with nil set for any | 
|  | 394 | +		// of the fields, we need to override the migratedSession | 
|  | 395 | +		// MacaroonRecipe to match that. | 
| 388 | 396 | 		if kvPerms == nil && kvCaveats == nil { | 
| 389 | 397 | 			migratedSession.MacaroonRecipe = &MacaroonRecipe{} | 
| 390 | 398 | 		} else if kvPerms == nil { | 
| 391 | 399 | 			migratedSession.MacaroonRecipe.Permissions = nil | 
| 392 | 400 | 		} else if kvCaveats == nil { | 
| 393 | 401 | 			migratedSession.MacaroonRecipe.Caveats = nil | 
| 394 | 402 | 		} | 
|  | 403 | + | 
|  | 404 | +		sqlCaveats := migratedSession.MacaroonRecipe.Caveats | 
|  | 405 | + | 
|  | 406 | +		// If there have been caveats set for the MacaroonRecipe, | 
|  | 407 | +		// the order of the postgres db caveats will in very rare cases | 
|  | 408 | +		// differ from the kv store caveats. Therefore, we sort | 
|  | 409 | +		// both the kv and sql caveats by their ID, so that we can | 
|  | 410 | +		// compare them in a deterministic way. | 
|  | 411 | +		if kvCaveats != nil { | 
|  | 412 | +			sort.Slice(kvCaveats, func(i, j int) bool { | 
|  | 413 | +				return bytes.Compare( | 
|  | 414 | +					kvCaveats[i].Id, kvCaveats[j].Id, | 
|  | 415 | +				) < 0 | 
|  | 416 | +			}) | 
|  | 417 | + | 
|  | 418 | +			sort.Slice(sqlCaveats, func(i, j int) bool { | 
|  | 419 | +				return bytes.Compare( | 
|  | 420 | +					sqlCaveats[i].Id, sqlCaveats[j].Id, | 
|  | 421 | +				) < 0 | 
|  | 422 | +			}) | 
|  | 423 | +		} | 
| 395 | 424 | 	} | 
| 396 | 425 | } | 
0 commit comments