github.com/ablease/cli@v6.37.1-0.20180613014814-3adbb7d7fb19+incompatible/command/v2/create_user_command.go (about)

     1  package v2
     2  
     3  import (
     4  	"strings"
     5  
     6  	"code.cloudfoundry.org/cli/actor/sharedaction"
     7  	"code.cloudfoundry.org/cli/actor/v2action"
     8  	"code.cloudfoundry.org/cli/api/uaa"
     9  	"code.cloudfoundry.org/cli/command"
    10  	"code.cloudfoundry.org/cli/command/flag"
    11  	"code.cloudfoundry.org/cli/command/translatableerror"
    12  	"code.cloudfoundry.org/cli/command/v2/shared"
    13  )
    14  
    15  //go:generate counterfeiter . CreateUserActor
    16  
    17  type CreateUserActor interface {
    18  	CreateUser(username string, password string, origin string) (v2action.User, v2action.Warnings, error)
    19  }
    20  
    21  type CreateUserCommand struct {
    22  	Args            flag.CreateUser `positional-args:"yes"`
    23  	Origin          string          `long:"origin" description:"Origin for mapping a user account to a user in an external identity provider"`
    24  	usage           interface{}     `usage:"CF_NAME create-user USERNAME PASSWORD\n   CF_NAME create-user USERNAME --origin ORIGIN\n\nEXAMPLES:\n   cf create-user j.smith@example.com S3cr3t                  # internal user\n   cf create-user j.smith@example.com --origin ldap           # LDAP user\n   cf create-user j.smith@example.com --origin provider-alias # SAML or OpenID Connect federated user"`
    25  	relatedCommands interface{}     `related_commands:"passwd, set-org-role, set-space-role"`
    26  
    27  	UI          command.UI
    28  	Config      command.Config
    29  	SharedActor command.SharedActor
    30  	Actor       CreateUserActor
    31  }
    32  
    33  func (cmd *CreateUserCommand) Setup(config command.Config, ui command.UI) error {
    34  	cmd.UI = ui
    35  	cmd.Config = config
    36  	cmd.SharedActor = sharedaction.NewActor(config)
    37  
    38  	ccClient, uaaClient, err := shared.NewClients(config, ui, true)
    39  	if err != nil {
    40  		return err
    41  	}
    42  	cmd.Actor = v2action.NewActor(ccClient, uaaClient, config)
    43  
    44  	return nil
    45  }
    46  
    47  func (cmd *CreateUserCommand) Execute(args []string) error {
    48  	// cmd.Args.Password is intentionally set to a pointer such that we can check
    49  	// if it is passed (otherwise we can't differentiate between the default
    50  	// empty string and a passed in empty string.
    51  	var password string
    52  
    53  	if (cmd.Origin == "" || strings.ToLower(cmd.Origin) == "uaa") && cmd.Args.Password == nil {
    54  		return translatableerror.RequiredArgumentError{
    55  			ArgumentName: "PASSWORD",
    56  		}
    57  	}
    58  
    59  	if cmd.Args.Password != nil {
    60  		password = *cmd.Args.Password
    61  	} else {
    62  		password = ""
    63  	}
    64  
    65  	err := cmd.SharedActor.CheckTarget(false, false)
    66  	if err != nil {
    67  		return err
    68  	}
    69  
    70  	cmd.UI.DisplayTextWithFlavor("Creating user {{.TargetUser}}...", map[string]interface{}{
    71  		"TargetUser": cmd.Args.Username,
    72  	})
    73  
    74  	_, warnings, err := cmd.Actor.CreateUser(cmd.Args.Username, password, cmd.Origin)
    75  	cmd.UI.DisplayWarnings(warnings)
    76  
    77  	if err != nil {
    78  		if _, ok := err.(uaa.ConflictError); ok {
    79  			cmd.UI.DisplayWarning("user {{.User}} already exists", map[string]interface{}{
    80  				"User": cmd.Args.Username,
    81  			})
    82  		} else {
    83  			cmd.UI.DisplayTextWithFlavor("Error creating user {{.User}}.", map[string]interface{}{
    84  				"User": cmd.Args.Username,
    85  			})
    86  			return err
    87  		}
    88  	}
    89  
    90  	cmd.UI.DisplayOK()
    91  	cmd.UI.DisplayNewline()
    92  	cmd.UI.DisplayText("TIP: Assign roles with '{{.BinaryName}} set-org-role' and '{{.BinaryName}} set-space-role'.", map[string]interface{}{
    93  		"BinaryName": cmd.Config.BinaryName(),
    94  	})
    95  
    96  	return nil
    97  }