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

     1  // Copyright 2017 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  	"context"
     8  	"errors"
     9  
    10  	"github.com/keybase/cli"
    11  	"github.com/keybase/client/go/libcmdline"
    12  	"github.com/keybase/client/go/libkb"
    13  	"github.com/keybase/client/go/protocol/keybase1"
    14  )
    15  
    16  type CmdTeamGenerateSeitan struct {
    17  	libkb.Contextified
    18  	Team     string
    19  	Role     keybase1.TeamRole
    20  	FullName string
    21  	Number   string
    22  }
    23  
    24  func newCmdTeamGenerateSeitan(cl *libcmdline.CommandLine, g *libkb.GlobalContext) cli.Command {
    25  	return cli.Command{
    26  		Name:         "generate-invite-token",
    27  		ArgumentHelp: "<team name>",
    28  		Usage:        "Generate an invite token that you can send via iMessage, or similar.",
    29  		Action: func(c *cli.Context) {
    30  			cmd := NewCmdTeamGenerateSeitanRunner(g)
    31  			cl.ChooseCommand(cmd, "generate-invite-token", c)
    32  		},
    33  		Flags: []cli.Flag{
    34  			cli.StringFlag{
    35  				Name:  "r, role",
    36  				Usage: "team role (admin, writer, reader) [required]",
    37  			},
    38  			cli.StringFlag{
    39  				Name:  "fullname",
    40  				Usage: "invitee's name",
    41  			},
    42  			cli.StringFlag{
    43  				Name:  "number",
    44  				Usage: "invitee's phone number",
    45  			},
    46  		},
    47  		Description: teamGenerateSeitanDoc,
    48  	}
    49  }
    50  
    51  func NewCmdTeamGenerateSeitanRunner(g *libkb.GlobalContext) *CmdTeamGenerateSeitan {
    52  	return &CmdTeamGenerateSeitan{Contextified: libkb.NewContextified(g)}
    53  }
    54  
    55  func (c *CmdTeamGenerateSeitan) ParseArgv(ctx *cli.Context) error {
    56  	var err error
    57  	c.Team, err = ParseOneTeamName(ctx)
    58  	if err != nil {
    59  		return err
    60  	}
    61  
    62  	c.Role, err = ParseRole(ctx)
    63  	if err != nil {
    64  		return err
    65  	}
    66  	if c.Role == keybase1.TeamRole_OWNER {
    67  		return errors.New("invalid team role, please use admin, writer, or reader")
    68  	}
    69  
    70  	c.FullName = ctx.String("fullname")
    71  	c.Number = ctx.String("number")
    72  
    73  	return nil
    74  }
    75  
    76  func (c *CmdTeamGenerateSeitan) Run() error {
    77  	cli, err := GetTeamsClient(c.G())
    78  	if err != nil {
    79  		return err
    80  	}
    81  
    82  	var labelSms keybase1.SeitanKeyLabelSms
    83  	labelSms.F = c.FullName
    84  	labelSms.N = c.Number
    85  
    86  	arg := keybase1.TeamCreateSeitanTokenV2Arg{
    87  		Teamname: c.Team,
    88  		Role:     c.Role,
    89  		Label:    keybase1.NewSeitanKeyLabelWithSms(labelSms),
    90  	}
    91  
    92  	res, err := cli.TeamCreateSeitanTokenV2(context.Background(), arg)
    93  	if err != nil {
    94  		return err
    95  	}
    96  
    97  	dui := c.G().UI.GetDumbOutputUI()
    98  	dui.Printf("Generated token: %q.\nAnother Keybase user can join the team using the following command:\n\nkeybase team accept-invite --token %s\n", res, res)
    99  
   100  	return nil
   101  }
   102  
   103  func (c *CmdTeamGenerateSeitan) GetUsage() libkb.Usage {
   104  	return libkb.Usage{
   105  		Config:    true,
   106  		API:       true,
   107  		KbKeyring: true,
   108  	}
   109  }
   110  
   111  const teamGenerateSeitanDoc = `"keybase generate-invite-token" allows you to create a one-time use,
   112  cryptographically secure token that someone can use to join a team.
   113  
   114  Optionally, full name and phone number can be provided (using
   115  --fullname and --number flags) to label created token to make them
   116  easier to distinguish. Label data is encrypted and visible only to
   117  admins.
   118  `