2023-01-31 10:07:10 -08:00
// Copyright (c) HashiCorp, Inc.
2020-08-10 17:15:02 -04:00
// SPDX-License-Identifier: BUSL-1.1
2023-02-02 17:15:17 -08:00
2020-07-14 14:32:47 -07:00
package authenticate
import (
2023-01-31 10:07:10 -08:00
"errors"
"fmt"
"strings"
"github.com/hashicorp/boundary/api/authmethods"
2023-03-10 15:06:39 -05:00
"github.com/hashicorp/boundary/globals"
2020-08-10 17:15:02 -04:00
"github.com/hashicorp/boundary/internal/cmd/base"
2023-01-31 10:07:10 -08:00
"github.com/hashicorp/boundary/internal/types/scope"
2020-07-14 14:32:47 -07:00
"github.com/mitchellh/cli"
"github.com/mitchellh/go-wordwrap"
)
var _ cli . Command = ( * Command )( nil )
type Command struct {
* base . Command
}
func ( c * Command ) Synopsis () string {
2023-11-15 19:55:46 -05:00
return wordwrap . WrapString ( "Authenticate the local client" , base . TermWidth )
2020-07-14 14:32:47 -07:00
}
func ( c * Command ) Help () string {
return base . WrapForHelpText ([] string {
2020-08-10 17:15:02 -04:00
"Usage: boundary authenticate [sub command] [options] [args]" ,
2020-07-14 14:32:47 -07:00
"" ,
2020-08-10 17:15:02 -04:00
" This command authenticates the Boundary commandline client using a specified auth method. Examples:" ,
2020-07-14 14:32:47 -07:00
"" ,
2023-01-31 10:07:10 -08:00
" Authenticate with the primary auth method in the global scope:" ,
"" ,
" $ boundary authenticate" ,
"" ,
" Authenticate using the primary auth method in a specific scope" ,
"" ,
" $ boundary authenticate password -scope-id o_1234567890" ,
"" ,
" Authenticate with a password auth method using a specific auth method ID:" ,
2020-07-14 14:32:47 -07:00
"" ,
2023-01-31 10:07:10 -08:00
" $ boundary authenticate password -auth-method-id ampw_1234567890" ,
2022-01-31 11:50:45 -05:00
"" ,
2023-01-31 10:07:10 -08:00
" Authenticate with an OIDC auth method using a specific auth method ID:" ,
2022-01-31 11:50:45 -05:00
"" ,
" $ boundary authenticate oidc -auth-method-id amoidc_1234567890" ,
2020-07-14 14:32:47 -07:00
"" ,
2023-03-15 11:40:40 -04:00
" Authenticate with an LDAP auth method:" ,
"" ,
" $ boundary authenticate ldap -auth-method-id amldap_1234567890" ,
"" ,
2020-07-14 14:32:47 -07:00
" Please see the auth method subcommand help for detailed usage information." ,
2023-01-31 10:07:10 -08:00
}) + c . Flags (). Help ()
}
func ( c * Command ) Flags () * base . FlagSets {
set := c . FlagSet ( base . FlagSetHTTP | base . FlagSetClient | base . FlagSetOutputFormat )
f := set . NewFlagSet ( "Command Options" )
f . StringVar ( & base . StringVar {
Name : "scope-id" ,
EnvVar : "BOUNDARY_SCOPE_ID" ,
Target : & c . FlagScopeId ,
Usage : "The scope to use for the operation" ,
2020-07-14 14:32:47 -07:00
})
2023-01-31 10:07:10 -08:00
return set
2020-07-14 14:32:47 -07:00
}
func ( c * Command ) Run ( args [] string ) int {
2023-01-31 10:07:10 -08:00
client , err := c . Client ( base . WithNoTokenScope (), base . WithNoTokenValue ())
if c . WrapperCleanupFunc != nil {
defer func () {
if err := c . WrapperCleanupFunc (); err != nil {
c . PrintCliError ( fmt . Errorf ( "Error cleaning kms wrapper: %w" , err ))
}
}()
}
if err != nil {
c . PrintCliError ( fmt . Errorf ( "Error creating API client: %w" , err ))
return base . CommandCliError
}
f := c . Flags ()
if err := f . Parse ( args ); err != nil {
c . PrintCliError ( err )
return base . CommandUserError
}
// Lookup the primary auth method ID in the global scope
aClient := authmethods . NewClient ( client )
pri , err := getPrimaryAuthMethodId ( c . Context , aClient , scope . Global . String (), "" )
if err != nil {
c . PrintCliError ( errors . New ( "Error looking up primary auth method ID for the global scope. Try setting a primary auth method for the global scope, or use an auth method subcommand (see 'boundary authenticate -h' for available sub command usage)." ))
return base . CommandUserError
}
c . FlagAuthMethodId = pri
switch {
2023-03-10 15:06:39 -05:00
case strings . HasPrefix ( c . FlagAuthMethodId , globals . PasswordAuthMethodPrefix ):
2023-11-01 12:45:35 -07:00
cmd := PasswordCommand { Command : c . Command }
cmd . Opts = append ( c . Opts , base . WithSkipScopeIdFlag ( true ))
2023-01-31 10:07:10 -08:00
cmd . Run ([] string {})
2023-03-10 15:06:39 -05:00
case strings . HasPrefix ( c . FlagAuthMethodId , globals . OidcAuthMethodPrefix ):
2023-11-01 12:45:35 -07:00
cmd := OidcCommand { Command : c . Command }
cmd . Opts = append ( c . Opts , base . WithSkipScopeIdFlag ( true ))
2023-01-31 10:07:10 -08:00
cmd . Run ([] string {})
2023-03-15 11:40:40 -04:00
case strings . HasPrefix ( c . FlagAuthMethodId , globals . LdapAuthMethodPrefix ):
2023-11-01 12:45:35 -07:00
cmd := LdapCommand { Command : c . Command }
cmd . Opts = append ( c . Opts , base . WithSkipScopeIdFlag ( true ))
2023-03-15 11:40:40 -04:00
cmd . Run ([] string {})
2023-01-31 10:07:10 -08:00
default :
2023-03-15 11:40:40 -04:00
c . PrintCliError ( fmt . Errorf ( "The primary auth method was of an unsupported type. The given ID was %s; only 'ampw' (password), 'amoidc' (OIDC) and 'amldap' (LDAP) auth method prefixes are supported." , c . FlagAuthMethodId ))
2023-01-31 10:07:10 -08:00
return cli . RunResultHelp
}
return 0
2020-07-14 14:32:47 -07:00
}