github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/tools/users/users.go (about)

     1  // Copyright 2019 Keybase, Inc. All rights reserved. Use of
     2  // this source code is governed by the included BSD license.
     3  
     4  // users signs up a bunch of users in a development environment
     5  
     6  package main
     7  
     8  import (
     9  	"crypto/rand"
    10  	"flag"
    11  	"fmt"
    12  	"os"
    13  	"os/exec"
    14  )
    15  
    16  var usersCount int
    17  var walletsCount int
    18  var bin string
    19  var home string
    20  
    21  func main() {
    22  	parseFlags()
    23  	su := createStandardUsers()
    24  	wu := createWalletUsers()
    25  	fmt.Printf("created %d standard users\n", len(su))
    26  	fmt.Printf("created %d wallet users\n", len(wu))
    27  
    28  	f, err := os.Create("out.json")
    29  	if err != nil {
    30  		fmt.Printf("error opening out.json: %s\n", err)
    31  		return
    32  	}
    33  	defer f.Close()
    34  	fmt.Fprintf(f, "[\n")
    35  	for i, u := range su {
    36  		if i != 0 {
    37  			fmt.Fprintf(f, ",\n")
    38  		}
    39  		fmt.Fprintf(f, "\t{\"username\": %q}", u)
    40  	}
    41  	for i, u := range wu {
    42  		if i != 0 || len(su) > 0 {
    43  			fmt.Fprintf(f, ",\n")
    44  		}
    45  		fmt.Fprintf(f, "\t{\"username\": %q}", u)
    46  	}
    47  	fmt.Fprintf(f, "\n]\n")
    48  }
    49  
    50  func parseFlags() {
    51  	flag.IntVar(&usersCount, "users", 0, "number of standard users to create")
    52  	flag.IntVar(&walletsCount, "wallets", 0, "number of users with wallets to create")
    53  	flag.StringVar(&bin, "bin", "/usr/local/bin/keybase", "keybase binary path")
    54  	flag.StringVar(&home, "home", "/tmp", "home directory")
    55  	flag.Parse()
    56  
    57  	if usersCount == 0 && walletsCount == 0 {
    58  		fmt.Fprintf(os.Stderr, "must specify at least one type of user to create\n\n")
    59  		fmt.Fprintf(os.Stderr, "Usage:\n\n")
    60  		fmt.Fprintf(os.Stderr, "  users [options]\n\n")
    61  		flag.PrintDefaults()
    62  		os.Exit(1)
    63  	}
    64  }
    65  
    66  func createStandardUsers() []string {
    67  	if usersCount == 0 {
    68  		return nil
    69  	}
    70  	fmt.Printf("Creating %d standard users:\n", usersCount)
    71  	var users []string
    72  	for i := 0; i < usersCount; i++ {
    73  		username, err := createStandardUser()
    74  		if err != nil {
    75  			fmt.Printf("%d: error %s\n", i+1, err)
    76  			continue
    77  		}
    78  		fmt.Printf("%d: created %s\n", i+1, username)
    79  		users = append(users, username)
    80  	}
    81  
    82  	return users
    83  }
    84  
    85  func createWalletUsers() []string {
    86  	if walletsCount == 0 {
    87  		return nil
    88  	}
    89  	fmt.Printf("Creating %d users with wallets:\n", walletsCount)
    90  	var users []string
    91  	for i := 0; i < walletsCount; i++ {
    92  		username, err := createWalletUser()
    93  		if err != nil {
    94  			fmt.Printf("%d: error %s\n", i+1, err)
    95  			continue
    96  		}
    97  		fmt.Printf("%d: created %s (with wallet)\n", i+1, username)
    98  		users = append(users, username)
    99  	}
   100  
   101  	return users
   102  }
   103  
   104  func createStandardUser() (string, error) {
   105  	logout()
   106  	buf := make([]byte, 6)
   107  	if _, err := rand.Read(buf); err != nil {
   108  		return "", err
   109  	}
   110  	username := fmt.Sprintf("ad_%x", buf)
   111  	cmd := exec.Command(bin, "-home", home, "signup", "-batch", "-username", username, "-passphrase", "00000000", "-no-email", "-invite-code", "202020202020202020202020")
   112  	if out, err := cmd.CombinedOutput(); err != nil {
   113  		fmt.Printf("signup error: %s\n", err)
   114  		fmt.Printf("output: %s\n", string(out))
   115  		return "", err
   116  	}
   117  	return username, nil
   118  }
   119  
   120  func createWalletUser() (string, error) {
   121  	username, err := createStandardUser()
   122  	if err != nil {
   123  		return "", err
   124  	}
   125  
   126  	// accept the disclaimer
   127  	cmd := exec.Command(bin, "-home", home, "wallet", "api", "-m", `{"method": "setup-wallet"}`)
   128  	if out, err := cmd.CombinedOutput(); err != nil {
   129  		fmt.Printf("setup-wallet error: %s\n", err)
   130  		fmt.Printf("output: %s\n", string(out))
   131  		return "", err
   132  	}
   133  
   134  	return username, nil
   135  }
   136  
   137  func logout() {
   138  	cmd := exec.Command(bin, "-home", home, "logout")
   139  	if out, err := cmd.CombinedOutput(); err != nil {
   140  		fmt.Printf("logout error: %s\n", err)
   141  		fmt.Printf("output: %s\n", string(out))
   142  	}
   143  }