func assertUntracked(tc libkb.TestContext, username string) { me, err := libkb.LoadMe(libkb.NewLoadUserArg(tc.G)) if err != nil { tc.T.Fatal(err) } them, err := libkb.LoadUser(libkb.NewLoadUserByNameArg(tc.G, username)) if err != nil { tc.T.Fatal(err) } s, err := me.TrackChainLinkFor(them.GetName(), them.GetUID()) if err != nil { tc.T.Fatal(err) } if s != nil { tc.T.Fatal("expected not to get a tracking statement; but got one") } s, err = libkb.LocalTrackChainLinkFor(me.GetUID(), them.GetUID(), tc.G) if err != nil { tc.T.Fatal(err) } if s != nil { tc.T.Fatal("expected not to get a local tracking statement; but got one") } }
func (e *UntrackEngine) loadThem() (them *libkb.User, remoteLink, localLink *libkb.TrackChainLink, err error) { var rLink *libkb.TrackChainLink trackMap := e.arg.Me.IDTable().GetTrackMap() if links, ok := trackMap[e.arg.Username]; ok && (len(links) > 0) { rLink = links[len(links)-1] } var uid keybase1.UID uidTrusted := false if rLink != nil { if uid, err = rLink.GetTrackedUID(); err != nil { return } uidTrusted = true } if uid.IsNil() { res := libkb.ResolveUID(e.arg.Username) if err = res.GetError(); err != nil { return } // This is an untrusted uid. uid = res.GetUID() if uid.IsNil() { err = libkb.NewUntrackError("Could not resolve uid for @%s", e.arg.Username) return } } lLink, err := libkb.LocalTrackChainLinkFor(e.arg.Me.GetUID(), uid, e.G()) if err != nil { return } if rLink == nil && lLink == nil { err = libkb.NewUntrackError("You are not tracking %s", e.arg.Username) return } if !uidTrusted { if lLink == nil { err = libkb.NewUntrackError("Could not verify resolved uid for @%s", e.arg.Username) return } var trackedUsername string trackedUsername, err = lLink.GetTrackedUsername() if err != nil { return } if e.arg.Username != trackedUsername { err = libkb.NewUntrackError("Username mismatch: expected @%s, got @%s", e.arg.Username, trackedUsername) return } uidTrusted = true } them = libkb.NewUserThin(e.arg.Username, uid) remoteLink = rLink localLink = lLink return }