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