|
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