func (e *UntrackEngine) storeRemoteUntrack(them *libkb.User, ctx *Context) (err error) { e.G().Log.Debug("+ StoreRemoteUntrack") defer e.G().Log.Debug("- StoreRemoteUntrack -> %s", libkb.ErrToOk(err)) arg := libkb.SecretKeyArg{ Me: e.arg.Me, KeyType: libkb.DeviceSigningKeyType, } var signingKeyPriv libkb.GenericKey if signingKeyPriv, err = e.G().Keyrings.GetSecretKeyWithPrompt(ctx.LoginContext, arg, ctx.SecretUI, "untracking signature"); err != nil { return } var sig string var sigid keybase1.SigID if sig, sigid, err = signingKeyPriv.SignToString(e.untrackStatementBytes); err != nil { return } _, err = e.G().API.Post(libkb.APIArg{ Endpoint: "follow", NeedSession: true, Args: libkb.HTTPArgs{ "sig_id_base": libkb.S{Val: sigid.ToString(false)}, "sig_id_short": libkb.S{Val: sigid.ToShortID()}, "sig": libkb.S{Val: sig}, "uid": libkb.UIDArg(them.GetUID()), "type": libkb.S{Val: "untrack"}, "signing_kid": e.signingKeyPub.GetKID(), }, }) return }
func checkTrackCommon(tc libkb.TestContext, blocks []sb, outcome *keybase1.IdentifyOutcome, them *libkb.User, ui *FakeIdentifyUI) error { me, err := libkb.LoadMe(libkb.NewLoadUserArg(tc.G)) if err != nil { return err } if them == nil { tc.T.Fatal("checkTrackCommon called with nil 'them' user") } s, err := me.TrackChainLinkFor(them.GetName(), them.GetUID()) if err != nil { return err } if s == nil { tc.T.Fatal("me.TrackChainLinkFor(...) returned nil, nil") } tc.T.Logf("payload json:\n%s", s.GetPayloadJSON().MarshalPretty()) sbs := s.ToServiceBlocks() if len(sbs) != len(blocks) { return fmt.Errorf("num service blocks: %d, expected %d", len(sbs), len(blocks)) } sort.Sort(byID(sbs)) for i, sb := range sbs { tsb := blocks[i] if sb.IsSocial() != tsb.social { return fmt.Errorf("(sb %d): social: %v, expected %v", i, sb.IsSocial(), tsb.social) } if sb.ToIDString() != tsb.id { return fmt.Errorf("(sb %d): id: %s, expected %s", i, sb.ToIDString(), tsb.id) } if sb.GetProofState() != tsb.proofState { return fmt.Errorf("(sb %d): proof state: %d, expected %d", i, sb.GetProofState(), tsb.proofState) } } if ui.Outcome.TrackStatus != outcome.TrackStatus { return fmt.Errorf("track status: %d, expected %d", ui.Outcome.TrackStatus, outcome.TrackStatus) } if ui.Outcome.NumTrackFailures != outcome.NumTrackFailures { return fmt.Errorf("num track failures: %d, expected %d", ui.Outcome.NumTrackFailures, outcome.NumTrackFailures) } if ui.Outcome.NumTrackChanges != outcome.NumTrackChanges { return fmt.Errorf("num track changes: %d, expected %d", ui.Outcome.NumTrackChanges, outcome.NumTrackChanges) } if ui.Outcome.NumProofFailures != outcome.NumProofFailures { return fmt.Errorf("num proof failures: %d, expected %d", ui.Outcome.NumProofFailures, outcome.NumProofFailures) } if ui.Outcome.NumProofSuccesses != outcome.NumProofSuccesses { return fmt.Errorf("num proof successes: %d, expected %d", ui.Outcome.NumProofSuccesses, outcome.NumProofSuccesses) } if ui.Outcome.NumRevoked != outcome.NumRevoked { return fmt.Errorf("num revoked: %d, expected %d", ui.Outcome.NumRevoked, outcome.NumRevoked) } return nil }
func (e *UntrackEngine) storeLocalUntrack(them *libkb.User) error { return libkb.RemoveLocalTrack(e.arg.Me.GetUID(), them.GetUID(), e.G()) }
func (e *UntrackEngine) storeLocalUntrack(them *libkb.User) error { // Also do a removal in case of expiring local tracks return libkb.RemoveLocalTracks(e.arg.Me.GetUID(), them.GetUID(), e.G()) }