From ac9c4eee3b24a4df09067b36be5204f25da5b922 Mon Sep 17 00:00:00 2001 From: Linus Gasser Date: Thu, 9 Dec 2021 16:32:17 +0100 Subject: [PATCH] Fix multiple recoveries The evolve-instruction was badly calculated, and thus only one recovery was possible. Unfortunately all accounts with a recovery cannot be recovered :( --- personhood/service_test.go | 12 ++++++++++++ personhood/user/user.go | 20 +++++++++++++++++--- personhood/user/user_test.go | 10 ++++++++++ 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/personhood/service_test.go b/personhood/service_test.go index 9e591496b..d62caab79 100644 --- a/personhood/service_test.go +++ b/personhood/service_test.go @@ -180,12 +180,24 @@ func TestService_EmailRecover(t *testing.T) { require.Equal(t, uint64(2000), newUserCoin.Value) require.Equal(t, contracts.SpawnerCoin, newUserCoin.Name) + // Test wrong email reply, err := ts.s.EmailRecover(&EmailRecover{ Email: "linus.gasser2@epfl.ch", }) require.Error(t, err) require.Equal(t, EREUnknown, reply.Status) + // Test correct email + ts.dummyEmail.Reset() + reply, err = ts.s.EmailRecover(&EmailRecover{ + Email: "linus.gasser@epfl.ch", + }) + // Need to wait for the update to go through the network. + require.NoError(t, err) + require.Equal(t, ERERecovered, reply.Status) + time.Sleep(time.Second) + + // Test correct email a 2nd time ts.dummyEmail.Reset() reply, err = ts.s.EmailRecover(&EmailRecover{ Email: "linus.gasser@epfl.ch", diff --git a/personhood/user/user.go b/personhood/user/user.go index 1264136ef..bdfb80b11 100644 --- a/personhood/user/user.go +++ b/personhood/user/user.go @@ -288,13 +288,16 @@ func (u User) createRecovery(otherUser User, if err := newUserSigner.EvolveFrom(&otherUser.SignerDarc); err != nil { return xerrors.Errorf("couldn't evolve signer darc: %v", err) } - newExpr := newUserSigner.Rules.GetSignExpr().AddOrElement( + newSignExpr := newUserSigner.Rules.GetSignExpr().AddOrElement( recoveryDeviceIdentity.String()) - if err := newUserSigner.Rules.UpdateSign(newExpr); err != nil { + if err := newUserSigner.Rules.UpdateSign(newSignExpr); err != nil { return xerrors.Errorf("couldn't update signer darc: %v", err) } + + newEvolveExpr := newUserSigner.Rules.Get(byzcoin.ContractDarcInvokeEvolve). + AddOrElement(recoveryDeviceIdentity.String()) if err := newUserSigner.Rules.UpdateRule(byzcoin.ContractDarcInvokeEvolve, - newExpr); err != nil { + newEvolveExpr); err != nil { return xerrors.Errorf("couldn't update signer darc: %v", err) } newUserSignerBuf, err := newUserSigner.ToProto() @@ -394,6 +397,17 @@ func (u *User) UpdateCredential() error { return nil } +// UpdateSignerDarc fetches the latest version of the signer darc. +func (u *User) UpdateSignerDarc() error { + if _, err := u.cl.GetInstance( + byzcoin.NewInstanceID(u.SignerDarc.GetBaseID()), + byzcoin.ContractDarcID, + &u.SignerDarc); err != nil { + return xerrors.Errorf("couldn't get signer darc: %v", err) + } + return nil +} + func (u User) getActiveSpawner() ActiveSpawner { return u.Spawner.Start(u.CoinID, u.Signer) } diff --git a/personhood/user/user_test.go b/personhood/user/user_test.go index 32b396c6f..9bb8dd0da 100644 --- a/personhood/user/user_test.go +++ b/personhood/user/user_test.go @@ -146,8 +146,18 @@ func TestUser_Recover(t *testing.T) { recoverStr, err := user.Recover(user2.CredIID, "https://something.com") require.NoError(t, err) + require.NoError(t, user2.UpdateSignerDarc()) user2recover, err := NewFromURL(ut.Client, recoverStr) require.NoError(t, err) require.Equal(t, user2.CredIID, user2recover.CredIID) + require.NoError(t, user2.UpdateSignerDarc()) + + // Recover a second time + recoverStr, err = user.Recover(user2.CredIID, "https://something.com") + require.NoError(t, err) + + user2recover, err = NewFromURL(ut.Client, recoverStr) + require.NoError(t, err) + require.Equal(t, user2.CredIID, user2recover.CredIID) }