github.com/jfrog/jfrog-cli-core/v2@v2.51.0/general/invite/invite.go (about)

     1  package invite
     2  
     3  import (
     4  	"fmt"
     5  	"github.com/jfrog/jfrog-cli-core/v2/artifactory/utils"
     6  	"github.com/jfrog/jfrog-client-go/access"
     7  	accessservices "github.com/jfrog/jfrog-client-go/access/services"
     8  	"github.com/jfrog/jfrog-client-go/artifactory/services"
     9  	clientutils "github.com/jfrog/jfrog-client-go/utils"
    10  	"github.com/jfrog/jfrog-client-go/utils/log"
    11  	"strings"
    12  
    13  	"github.com/jfrog/jfrog-cli-core/v2/utils/config"
    14  )
    15  
    16  const InviteCliSourceName = "cli"
    17  
    18  type InviteCommand struct {
    19  	invitedEmail  string
    20  	serverDetails *config.ServerDetails
    21  }
    22  
    23  func (ic *InviteCommand) SetInvitedEmail(invitedEmail string) *InviteCommand {
    24  	ic.invitedEmail = invitedEmail
    25  	return ic
    26  }
    27  
    28  func (ic *InviteCommand) SetServerDetails(serverDetails *config.ServerDetails) *InviteCommand {
    29  	ic.serverDetails = serverDetails
    30  	return ic
    31  }
    32  
    33  func (ic *InviteCommand) ServerDetails() (*config.ServerDetails, error) {
    34  	return ic.serverDetails, nil
    35  }
    36  
    37  func (ic *InviteCommand) CommandName() string {
    38  	return "invite"
    39  }
    40  
    41  func NewInviteCommand() *InviteCommand {
    42  	return &InviteCommand{}
    43  }
    44  
    45  func (ic *InviteCommand) Run() (err error) {
    46  	servicesManager, err := utils.CreateServiceManager(ic.serverDetails, -1, 0, false)
    47  	if err != nil {
    48  		return err
    49  	}
    50  	userDetails := ic.createNewInvitedUser()
    51  
    52  	log.Info(fmt.Sprintf("Sending invitation email to: %s...", userDetails.Name))
    53  	params := new(services.UserParams)
    54  	params.UserDetails = *userDetails
    55  	params.ReplaceIfExists = false
    56  	// Inviting the new user - send a 'CreateUser' request to artifactory with the "shouldInvite=true" parameter.
    57  	err = servicesManager.CreateUser(*params)
    58  	if err != nil {
    59  		if strings.HasSuffix(err.Error(), "already exists") {
    60  			log.Debug(fmt.Sprintf("Re-sending invitation email to: %s...", userDetails.Name))
    61  			var accessManager *access.AccessServicesManager
    62  			accessManager, err = utils.CreateAccessServiceManager(ic.serverDetails, false)
    63  			if err != nil {
    64  				return
    65  			}
    66  			// Re-inviting user - send an "Invite" request to access.
    67  			err = accessManager.InviteUser(params.UserDetails.Email, InviteCliSourceName)
    68  			if err != nil {
    69  				return
    70  			}
    71  		}
    72  	}
    73  	return
    74  }
    75  
    76  func (ic *InviteCommand) createNewInvitedUser() *services.User {
    77  	userDetails := services.User{}
    78  	// Parameters "name" and "email" should both be with the email value for internal reasons in access.
    79  	userDetails.Email = ic.invitedEmail
    80  	userDetails.Name = ic.invitedEmail
    81  	// Random valid password - information won't be used in access.
    82  	userDetails.Password = "Password1!"
    83  	userDetails.Admin = clientutils.Pointer(true)
    84  	userDetails.ShouldInvite = clientutils.Pointer(true)
    85  	userDetails.Source = accessservices.InviteCliSourceName
    86  
    87  	userDetails.ProfileUpdatable = clientutils.Pointer(true)
    88  	userDetails.DisableUIAccess = clientutils.Pointer(false)
    89  	userDetails.InternalPasswordDisabled = clientutils.Pointer(false)
    90  	return &userDetails
    91  }