package inventory import ( "testing" "golang.org/x/crypto/bcrypt" ) // The bus's users as records — against a real store, because what is being checked is that the // column exists, the upsert behaves, and a plaintext is returned exactly once. func aBusUser(module string) BusUser { return BusUser{Username: "one." + module, Kind: BusModule, Node: "one", Module: module} } // The plaintext comes back once and the store keeps only a hash that verifies against it. **A // credential recoverable from the mesh's store is one whose blast radius is the store's**, so what // is asserted is that the password is not in there. // Minting again replaces what was there rather than failing or adding a second row: that is a // rotation, and the old credential stops working at the next composition. // Forgetting a node takes every credential that belonged to it — its host's and every module // assigned to it. What a forgotten node leaves behind otherwise is a working set of credentials for // a machine the mesh no longer knows. // Forgetting the users of no node would forget every user that has none — the controller and every // person — so it is refused rather than run. // The controller's own user is created by the installer, so the mesh has to be able to record a // credential it did not mint — or the first composition leaves the writer out of the file it writes. // Outside a test a bus password is hashed at bcrypt's default cost: only ForTest lowers it (novox/hq issue 591). func TestABusPasswordIsHashedAtTheDefaultCostOutsideATest(t *testing.T) { was := busPasswordCostForTest.Load() t.Cleanup(func() { busPasswordCostForTest.Store(was) }) busPasswordCostForTest.Store(0) hash, err := hashBusPassword("a password") if err != nil { t.Fatal(err) } if got, err := bcrypt.Cost(hash); err != nil || got != bcrypt.DefaultCost { t.Fatalf("a bus password is hashed at cost %d (%v), not bcrypt's default %d", got, err, bcrypt.DefaultCost) } }