github.com/vmware/govmomi@v0.51.0/cli/sso/idp/ldap_update.go (about)

     1  // © Broadcom. All Rights Reserved.
     2  // The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
     3  // SPDX-License-Identifier: Apache-2.0
     4  
     5  package idp
     6  
     7  import (
     8  	"context"
     9  	"flag"
    10  	"reflect"
    11  
    12  	"github.com/vmware/govmomi/cli"
    13  	"github.com/vmware/govmomi/cli/flags"
    14  	"github.com/vmware/govmomi/cli/sso"
    15  	"github.com/vmware/govmomi/ssoadmin"
    16  	"github.com/vmware/govmomi/ssoadmin/types"
    17  )
    18  
    19  type ldapUpdate struct {
    20  	*flags.ClientFlag
    21  	serverType string
    22  	alias      string
    23  	idpDetails types.LdapIdentitySourceDetails
    24  	auth       types.SsoAdminIdentitySourceManagementServiceAuthenticationCredentails
    25  }
    26  
    27  func (cmd *ldapUpdate) Usage() string {
    28  	return "NAME"
    29  }
    30  
    31  func (cmd *ldapUpdate) Register(ctx context.Context, f *flag.FlagSet) {
    32  	cmd.ClientFlag, ctx = flags.NewClientFlag(ctx)
    33  	cmd.ClientFlag.Register(ctx, f)
    34  
    35  	f.StringVar(&cmd.serverType, "ServerType", "ActiveDirectory", "ServerType")
    36  	f.StringVar(&cmd.alias, "DomainAlias", "", "DomainAlias")
    37  	f.StringVar(&cmd.idpDetails.FriendlyName, "FriendlyName", "", "FriendlyName")
    38  	f.StringVar(&cmd.idpDetails.UserBaseDn, "UserBaseDn", "", "UserBaseDn")
    39  	f.StringVar(&cmd.idpDetails.GroupBaseDn, "GroupBaseDn", "", "GroupBaseDn")
    40  	f.StringVar(&cmd.idpDetails.PrimaryURL, "PrimaryUrl", "", "PrimaryUrl")
    41  	f.StringVar(&cmd.idpDetails.FailoverURL, "FailoverUrl", "", "FailoverUrl")
    42  	f.StringVar(&cmd.auth.Username, "AuthUsername", "", "Username")
    43  	f.StringVar(&cmd.auth.Password, "AuthPassword", "", "Password")
    44  }
    45  
    46  type lidpupd struct {
    47  	ldapUpdate
    48  }
    49  
    50  func init() {
    51  	cli.Register("sso.idp.ldap.update", &lidpupd{})
    52  }
    53  
    54  func (cmd *lidpupd) Description() string {
    55  	return `Update SSO ldap identity provider source.
    56  
    57  Examples:
    58    govc sso.idp.ldap.update  -FriendlyName CORPLOCAL corp.local`
    59  }
    60  
    61  func smerge(src *string, current string) {
    62  	if *src == "" {
    63  		*src = current
    64  	}
    65  }
    66  
    67  func (cmd *lidpupd) Run(ctx context.Context, f *flag.FlagSet) error {
    68  	if f.NArg() != 1 {
    69  		return flag.ErrHelp
    70  	}
    71  	idpname := f.Arg(0)
    72  	return sso.WithClient(ctx, cmd.ClientFlag, func(c *ssoadmin.Client) error {
    73  		sources, err := c.IdentitySources(ctx)
    74  		if err != nil {
    75  			return err
    76  		}
    77  
    78  		GetLdapIdentitySourceByName := func(i []types.LdapIdentitySource, name string) *types.LdapIdentitySource {
    79  			var n []types.LdapIdentitySource
    80  			for _, e := range i {
    81  				if e.Name == name {
    82  					n = append(n, e)
    83  				}
    84  			}
    85  			if len(n) != 1 {
    86  				return nil
    87  			}
    88  			return &n[0]
    89  		}
    90  
    91  		currentidp := GetLdapIdentitySourceByName(sources.LDAPS, idpname)
    92  		if currentidp == nil {
    93  			return c.RegisterLdap(ctx, cmd.serverType, idpname, cmd.alias, cmd.idpDetails, cmd.auth)
    94  		}
    95  
    96  		if cmd.auth.Username != "" && cmd.auth.Password != "" {
    97  			updateLdapAuthnErr := c.UpdateLdapAuthnType(ctx, idpname, cmd.auth)
    98  			if updateLdapAuthnErr != nil {
    99  				return updateLdapAuthnErr
   100  			}
   101  		}
   102  
   103  		IsAnyIdpDetails := func(d types.LdapIdentitySourceDetails) bool {
   104  			values := reflect.ValueOf(cmd.idpDetails)
   105  			for i := 0; i < values.NumField(); i++ {
   106  				if values.Field(i).Interface() != "" {
   107  					return true
   108  				}
   109  			}
   110  			return false
   111  		}
   112  		if IsAnyIdpDetails(cmd.idpDetails) {
   113  			smerge(&cmd.idpDetails.FriendlyName, currentidp.Details.FriendlyName)
   114  			smerge(&cmd.idpDetails.UserBaseDn, currentidp.Details.UserBaseDn)
   115  			smerge(&cmd.idpDetails.GroupBaseDn, currentidp.Details.GroupBaseDn)
   116  			smerge(&cmd.idpDetails.PrimaryURL, currentidp.Details.PrimaryURL)
   117  			smerge(&cmd.idpDetails.FailoverURL, currentidp.Details.FailoverURL)
   118  			updateLdapErr := c.UpdateLdap(ctx, idpname, cmd.idpDetails)
   119  			if updateLdapErr != nil {
   120  				return updateLdapErr
   121  			}
   122  		}
   123  		return nil
   124  	})
   125  }