github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+incompatible/command/v7/create_user_command.go (about)

     1  package v7
     2  
     3  import (
     4  	"strings"
     5  
     6  	"code.cloudfoundry.org/cli/actor/sharedaction"
     7  	"code.cloudfoundry.org/cli/actor/v7action"
     8  	"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant"
     9  	"code.cloudfoundry.org/cli/api/uaa"
    10  	"code.cloudfoundry.org/cli/command"
    11  	"code.cloudfoundry.org/cli/command/flag"
    12  	"code.cloudfoundry.org/cli/command/translatableerror"
    13  	"code.cloudfoundry.org/cli/command/v7/shared"
    14  	"code.cloudfoundry.org/clock"
    15  )
    16  
    17  //go:generate counterfeiter . CreateUserActor
    18  
    19  type CreateUserActor interface {
    20  	CreateUser(username string, password string, origin string) (v7action.User, v7action.Warnings, error)
    21  	GetUser(username, origin string) (v7action.User, error)
    22  }
    23  
    24  type CreateUserCommand struct {
    25  	Args            flag.CreateUser `positional-args:"yes"`
    26  	Origin          string          `long:"origin" description:"Origin for mapping a user account to a user in an external identity provider"`
    27  	PasswordPrompt  bool            `long:"password-prompt" description:"Prompt interactively for password"`
    28  	usage           interface{}     `usage:"CF_NAME create-user USERNAME PASSWORD\n   CF_NAME create-user USERNAME [--origin ORIGIN]\n   CF_NAME create-user USERNAME --password-prompt\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"`
    29  	relatedCommands interface{}     `related_commands:"passwd, set-org-role, set-space-role"`
    30  
    31  	UI          command.UI
    32  	Config      command.Config
    33  	SharedActor command.SharedActor
    34  	Actor       CreateUserActor
    35  }
    36  
    37  func (cmd *CreateUserCommand) Setup(config command.Config, ui command.UI) error {
    38  	cmd.UI = ui
    39  	cmd.Config = config
    40  	sharedActor := sharedaction.NewActor(config)
    41  	cmd.SharedActor = sharedActor
    42  
    43  	ccClient, uaaClient, err := shared.GetNewClientsAndConnectToCF(config, ui, "")
    44  	if err != nil {
    45  		return err
    46  	}
    47  	cmd.Actor = v7action.NewActor(ccClient, config, sharedActor, uaaClient, clock.NewClock())
    48  	return nil
    49  }
    50  
    51  func (cmd *CreateUserCommand) Execute(args []string) error {
    52  	var password string
    53  	var err error
    54  
    55  	if cmd.passwordRequired() {
    56  		return translatableerror.RequiredArgumentError{
    57  			ArgumentName: "PASSWORD",
    58  		}
    59  	}
    60  
    61  	//	Is the admin logged in?
    62  	err = cmd.SharedActor.CheckTarget(false, false)
    63  	if err != nil {
    64  		return err
    65  	}
    66  
    67  	origin := cmd.Origin
    68  	if cmd.Origin == "" {
    69  		origin = constant.DefaultOriginUaa
    70  	}
    71  
    72  	//	Does the new user already exist?
    73  	_, err = cmd.Actor.GetUser(cmd.Args.Username, origin)
    74  	if err == nil {
    75  		// User already exists
    76  		cmd.UI.DisplayTextWithFlavor("Creating user {{.TargetUser}}...", map[string]interface{}{
    77  			"TargetUser": cmd.Args.Username,
    78  		})
    79  
    80  		cmd.UI.DisplayWarning("User '{{.User}}' already exists.", map[string]interface{}{
    81  			"User": cmd.Args.Username,
    82  		})
    83  
    84  		cmd.UI.DisplayOK()
    85  		return nil
    86  	}
    87  
    88  	//	Get the password
    89  	if cmd.Args.Password != nil {
    90  		password = *cmd.Args.Password
    91  	}
    92  
    93  	if cmd.PasswordPrompt {
    94  		password, err = cmd.UI.DisplayPasswordPrompt("Password")
    95  		if err != nil {
    96  			return err
    97  		}
    98  	}
    99  
   100  	//	Create the user!
   101  	cmd.UI.DisplayTextWithFlavor("Creating user {{.TargetUser}}...", map[string]interface{}{
   102  		"TargetUser": cmd.Args.Username,
   103  	})
   104  
   105  	_, warnings, err := cmd.Actor.CreateUser(cmd.Args.Username, password, cmd.Origin)
   106  	cmd.UI.DisplayWarnings(warnings)
   107  
   108  	if err != nil {
   109  		if _, ok := err.(uaa.ConflictError); ok {
   110  			cmd.UI.DisplayWarning("User '{{.User}}' already exists.", map[string]interface{}{
   111  				"User": cmd.Args.Username,
   112  			})
   113  			cmd.UI.DisplayOK()
   114  			return nil
   115  		} else {
   116  			return err
   117  		}
   118  	}
   119  
   120  	cmd.UI.DisplayOK()
   121  	cmd.UI.DisplayText("TIP: Assign roles with '{{.BinaryName}} set-org-role' and '{{.BinaryName}} set-space-role'.", map[string]interface{}{
   122  		"BinaryName": cmd.Config.BinaryName(),
   123  	})
   124  
   125  	return nil
   126  }
   127  
   128  func (cmd *CreateUserCommand) passwordRequired() bool {
   129  	if (cmd.Origin == "" || strings.ToLower(cmd.Origin) == constant.DefaultOriginUaa) && !cmd.PasswordPrompt {
   130  		if cmd.Args.Password == nil {
   131  			return true
   132  		}
   133  	}
   134  	return false
   135  }