Skip to content

Commit

Permalink
Fix multiple recoveries
Browse files Browse the repository at this point in the history
The evolve-instruction was badly calculated, and thus only one recovery was
possible.

Unfortunately all accounts with a recovery cannot be recovered :(
  • Loading branch information
ineiti committed Dec 10, 2021
1 parent c238ba1 commit ac9c4ee
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 3 deletions.
12 changes: 12 additions & 0 deletions personhood/service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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: "[email protected]",
})
require.Error(t, err)
require.Equal(t, EREUnknown, reply.Status)

// Test correct email
ts.dummyEmail.Reset()
reply, err = ts.s.EmailRecover(&EmailRecover{
Email: "[email protected]",
})
// 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: "[email protected]",
Expand Down
20 changes: 17 additions & 3 deletions personhood/user/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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)
}
Expand Down
10 changes: 10 additions & 0 deletions personhood/user/user_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

0 comments on commit ac9c4ee

Please sign in to comment.