func (e *UntrackEngine) Run(ctx *Context) (err error) { e.arg.Me, err = e.loadMe() if err != nil { return } them, remoteLink, localLink, err := e.loadThem() if err != nil { return } e.signingKeyPub, err = e.arg.Me.SigningKeyPub() if err != nil { return } untrackStatement, err := e.arg.Me.UntrackingProofFor(e.signingKeyPub, them) if err != nil { return } e.untrackStatementBytes, err = untrackStatement.Marshal() if err != nil { return } e.G().Log.Debug("| Untracking statement: %s", string(e.untrackStatementBytes)) didUntrack := false if localLink != nil { err = e.storeLocalUntrack(them) if err != nil { return } didUntrack = true } if remoteLink != nil && !remoteLink.IsRevoked() { err = e.storeRemoteUntrack(them, ctx) if err != nil { return } didUntrack = true } if !didUntrack { err = libkb.NewUntrackError("User %s is already untracked", e.arg.Username) return } e.G().NotifyRouter.HandleTrackingChanged(e.arg.Me.GetUID(), e.arg.Me.GetName()) return }
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 }