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 `