// Run starts the engine. func (e *TrackToken) Run(ctx *Context) (err error) { e.G().Trace("TrackToken", func() error { return err })() if len(e.arg.Token) == 0 { err = fmt.Errorf("missing TrackToken argument") return err } if err = e.loadMe(); err != nil { e.G().Log.Info("loadme err: %s", err) return err } var outcome *libkb.IdentifyOutcome outcome, err = e.G().TrackCache.Get(e.arg.Token) if err != nil { return err } if outcome.TrackStatus() == keybase1.TrackStatus_UPDATE_OK && !e.arg.Options.ForceRetrack { e.G().Log.Debug("tracking statement up-to-date.") return nil } if err = e.loadThem(outcome.Username); err != nil { return err } if e.arg.Me.Equal(e.them) { err = libkb.SelfTrackError{} return err } if err = e.isTrackTokenStale(outcome); err != nil { e.G().Log.Debug("Track statement is stale") return err } ska := libkb.SecretKeyArg{ Me: e.arg.Me, KeyType: libkb.DeviceSigningKeyType, } e.lockedKey, e.lockedWhich, err = e.G().Keyrings.GetSecretKeyLocked(ctx.LoginContext, ska) if err != nil { e.G().Log.Debug("secretkey err: %s", err) return err } e.lockedKey.SetUID(e.arg.Me.GetUID()) e.signingKeyPub, err = e.lockedKey.GetPubKey() if err != nil { e.G().Log.Debug("getpubkey err: %s", err) return err } if e.trackStatement, err = e.arg.Me.TrackingProofFor(e.signingKeyPub, e.them, outcome); err != nil { e.G().Log.Debug("tracking proof err: %s", err) return err } if e.trackStatementBytes, err = e.trackStatement.Marshal(); err != nil { return err } e.G().Log.Debug("| Tracking statement: %s", string(e.trackStatementBytes)) if e.arg.Options.LocalOnly { err = e.storeLocalTrack() } else { err = e.storeRemoteTrack(ctx) } if err == nil { e.G().NotifyRouter.HandleUserChanged(e.arg.Me.GetUID()) e.G().NotifyRouter.HandleUserChanged(e.them.GetUID()) } return err }
// Run starts the engine. func (e *TrackToken) Run(ctx *Context) (err error) { e.G().Trace("TrackToken", func() error { return err })() if len(e.arg.Token) == 0 { err = fmt.Errorf("missing TrackToken argument") return err } if err = e.loadMe(); err != nil { e.G().Log.Info("loadme err: %s", err) return err } var outcome *libkb.IdentifyOutcome outcome, err = e.G().TrackCache.Get(e.arg.Token) if err != nil { return err } if outcome.TrackStatus() == keybase1.TrackStatus_UPDATE_OK && !e.arg.Options.ForceRetrack { e.G().Log.Debug("tracking statement up-to-date.") return nil } if err = e.loadThem(outcome.Username); err != nil { return err } if e.arg.Me.Equal(e.them) { err = libkb.SelfTrackError{} return err } if err = e.isTrackTokenStale(outcome); err != nil { e.G().Log.Debug("Track statement is stale") return err } // need public signing key for track statement signingKeyPub, err := e.arg.Me.SigningKeyPub() if err != nil { return err } if e.trackStatement, err = e.arg.Me.TrackingProofFor(signingKeyPub, e.them, outcome); err != nil { e.G().Log.Debug("tracking proof err: %s", err) return err } if e.trackStatementBytes, err = e.trackStatement.Marshal(); err != nil { return err } e.G().Log.Debug("| Tracking statement: %s", string(e.trackStatementBytes)) if e.arg.Options.LocalOnly || e.arg.Options.ExpiringLocal { e.G().Log.Debug("| Local") err = e.storeLocalTrack() } else { err = e.storeRemoteTrack(ctx, signingKeyPub.GetKID()) if err == nil { // if the remote track succeeded, remove local tracks // (this also removes any snoozes) e.removeLocalTracks() } } if err == nil { // Remove these after desktop notification change complete: e.G().NotifyRouter.HandleUserChanged(e.arg.Me.GetUID()) e.G().NotifyRouter.HandleUserChanged(e.them.GetUID()) // Keep these: e.G().NotifyRouter.HandleTrackingChanged(e.arg.Me.GetUID(), e.arg.Me.GetName()) e.G().NotifyRouter.HandleTrackingChanged(e.them.GetUID(), e.them.GetName()) // Dismiss any associated gregor item. if outcome.ResponsibleGregorItem != nil { err = e.G().GregorDismisser.DismissItem(outcome.ResponsibleGregorItem.Metadata().MsgID()) } } return err }