in lib/ec2macosinit/usermanagement.go [103:159]
func (c *UserManagementModule) randomizePassword() (message string, err error) {
// This detection of the user probably needs to move into the Do() function when there is more to do, but since this
// is the first place the c.User is used, its handled here
// If user is undefined, default to ec2-user
if c.User == "" {
c.User = "ec2-user"
}
// Verify that user exists
exists, err := userExists(c.User)
if err != nil {
return "", fmt.Errorf("ec2macosinit: error while checking if user %s exists: %s\n", c.User, err)
}
if !exists { // if the user doesn't exist, error out
return "", fmt.Errorf("ec2macosinit: user %s does not exist\n", c.User)
}
// Check for Secure Token, if its already set then attempting to change the password will fail
secureTokenSet, err := c.isSecureTokenSet()
if err != nil {
return "", fmt.Errorf("ec2macosinit: unable to confirm Secure Token is DISABLED: %s", err)
}
// Only proceed if user doesn't have Secure Token enabled
if secureTokenSet {
return "", fmt.Errorf("ec2macosinit: unable to change password, Secure Token Set for %s", c.User)
}
// Change Secure Token behavior if needed
err = c.disableSecureTokenCreation()
if err != nil {
return "", fmt.Errorf("ec2macosinit: unable to disable Secure Token generation: %s", err)
}
defer func() {
// Set Secure Token behavior back if needed
deferErr := c.enableSecureTokenCreation()
if deferErr != nil {
// Catch a failure and change status returns to represent an error condition
message = "" // Overwrite new message to indicate error
err = fmt.Errorf("ec2macosinit: unable to enable Secure Token generation: %s %s", deferErr, err)
}
}()
// Generate random password
password, err := generateSecurePassword(PasswordLength)
if err != nil {
return "", fmt.Errorf("ec2macosinit: unable to generate secure password: %s", err)
}
// Change the password
err = c.changePassword(password)
if err != nil {
return "", fmt.Errorf("ec2macosinit: unable to set secure password: %s", err)
}
return fmt.Sprintf("successfully set secure password for %s", c.User), nil
}