github.com/keybase/client/go@v0.0.0-20240520164431-4f512a4c85a3/client/cmd_follow.go (about)

     1  // Copyright 2015 Keybase, Inc. All rights reserved. Use of
     2  // this source code is governed by the included BSD license.
     3  
     4  package client
     5  
     6  import (
     7  	"fmt"
     8  
     9  	"golang.org/x/net/context"
    10  
    11  	"github.com/keybase/cli"
    12  	"github.com/keybase/client/go/libcmdline"
    13  	"github.com/keybase/client/go/libkb"
    14  	keybase1 "github.com/keybase/client/go/protocol/keybase1"
    15  	"github.com/keybase/go-framed-msgpack-rpc/rpc"
    16  )
    17  
    18  type CmdTrack struct {
    19  	user           string
    20  	skipProofCache bool
    21  	options        keybase1.TrackOptions
    22  	libkb.Contextified
    23  }
    24  
    25  func NewCmdTrack(cl *libcmdline.CommandLine, g *libkb.GlobalContext) cli.Command {
    26  	return cli.Command{
    27  		Name:         "follow",
    28  		ArgumentHelp: "<username>",
    29  		Usage:        "Verify a user's authenticity and optionally follow them",
    30  		Flags: []cli.Flag{
    31  			cli.BoolFlag{
    32  				Name:  "local, l",
    33  				Usage: "Only follow locally, don't send a public statement to the server.",
    34  			},
    35  			cli.BoolFlag{
    36  				Name:  "y",
    37  				Usage: "Approve remote following without prompting.",
    38  			},
    39  			cli.BoolFlag{
    40  				Name:  "s, skip-proof-cache",
    41  				Usage: "Skip cached proofs, force re-check",
    42  			},
    43  		},
    44  		Aliases: []string{"track"},
    45  		Action: func(c *cli.Context) {
    46  			cl.ChooseCommand(NewCmdTrackRunner(g), "follow", c)
    47  		},
    48  	}
    49  }
    50  
    51  func NewCmdTrackRunner(g *libkb.GlobalContext) *CmdTrack {
    52  	return &CmdTrack{Contextified: libkb.NewContextified(g)}
    53  }
    54  
    55  func (v *CmdTrack) SetUser(user string) {
    56  	v.user = user
    57  }
    58  
    59  func (v *CmdTrack) SetOptions(options keybase1.TrackOptions) {
    60  	v.options = options
    61  }
    62  
    63  func (v *CmdTrack) ParseArgv(ctx *cli.Context) error {
    64  	if len(ctx.Args()) != 1 {
    65  		return fmt.Errorf("Follow only takes one argument, the user to follow.")
    66  	}
    67  	v.user = ctx.Args()[0]
    68  	v.options = keybase1.TrackOptions{LocalOnly: ctx.Bool("local"), BypassConfirm: ctx.Bool("y")}
    69  	v.skipProofCache = ctx.Bool("skip-proof-cache")
    70  	return nil
    71  }
    72  
    73  func (v *CmdTrack) Run() error {
    74  	cli, err := GetTrackClient(v.G())
    75  	if err != nil {
    76  		return err
    77  	}
    78  
    79  	protocols := []rpc.Protocol{
    80  		NewIdentifyTrackUIProtocol(v.G()),
    81  		NewSecretUIProtocol(v.G()),
    82  	}
    83  	if err = RegisterProtocolsWithContext(protocols, v.G()); err != nil {
    84  		return err
    85  	}
    86  
    87  	_, err = cli.Track(context.TODO(), keybase1.TrackArg{
    88  		UserAssertion:    v.user,
    89  		Options:          v.options,
    90  		ForceRemoteCheck: v.skipProofCache,
    91  	})
    92  	return err
    93  }
    94  
    95  func (v *CmdTrack) GetUsage() libkb.Usage {
    96  	return libkb.Usage{
    97  		Config:    true,
    98  		API:       true,
    99  		KbKeyring: true,
   100  	}
   101  }