github.com/crowdsecurity/crowdsec@v1.6.1/cmd/crowdsec/lapiclient.go (about)

     1  package main
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"net/url"
     7  	"time"
     8  
     9  	"github.com/go-openapi/strfmt"
    10  
    11  	"github.com/crowdsecurity/go-cs-lib/version"
    12  
    13  	"github.com/crowdsecurity/crowdsec/pkg/apiclient"
    14  	"github.com/crowdsecurity/crowdsec/pkg/csconfig"
    15  	"github.com/crowdsecurity/crowdsec/pkg/cwhub"
    16  	"github.com/crowdsecurity/crowdsec/pkg/models"
    17  )
    18  
    19  func AuthenticatedLAPIClient(credentials csconfig.ApiCredentialsCfg, hub *cwhub.Hub) (*apiclient.ApiClient, error) {
    20  	scenarios, err := hub.GetInstalledItemNames(cwhub.SCENARIOS)
    21  	if err != nil {
    22  		return nil, fmt.Errorf("loading list of installed hub scenarios: %w", err)
    23  	}
    24  
    25  	appsecRules, err := hub.GetInstalledItemNames(cwhub.APPSEC_RULES)
    26  	if err != nil {
    27  		return nil, fmt.Errorf("loading list of installed hub appsec rules: %w", err)
    28  	}
    29  
    30  	installedScenariosAndAppsecRules := make([]string, 0, len(scenarios)+len(appsecRules))
    31  	installedScenariosAndAppsecRules = append(installedScenariosAndAppsecRules, scenarios...)
    32  	installedScenariosAndAppsecRules = append(installedScenariosAndAppsecRules, appsecRules...)
    33  
    34  	apiURL, err := url.Parse(credentials.URL)
    35  	if err != nil {
    36  		return nil, fmt.Errorf("parsing api url ('%s'): %w", credentials.URL, err)
    37  	}
    38  
    39  	papiURL, err := url.Parse(credentials.PapiURL)
    40  	if err != nil {
    41  		return nil, fmt.Errorf("parsing polling api url ('%s'): %w", credentials.PapiURL, err)
    42  	}
    43  
    44  	password := strfmt.Password(credentials.Password)
    45  
    46  	client, err := apiclient.NewClient(&apiclient.Config{
    47  		MachineID:     credentials.Login,
    48  		Password:      password,
    49  		Scenarios:     installedScenariosAndAppsecRules,
    50  		UserAgent:     fmt.Sprintf("crowdsec/%s", version.String()),
    51  		URL:           apiURL,
    52  		PapiURL:       papiURL,
    53  		VersionPrefix: "v1",
    54  		UpdateScenario: func() ([]string, error) {
    55  			scenarios, err := hub.GetInstalledItemNames(cwhub.SCENARIOS)
    56  			if err != nil {
    57  				return nil, err
    58  			}
    59  			appsecRules, err := hub.GetInstalledItemNames(cwhub.APPSEC_RULES)
    60  			if err != nil {
    61  				return nil, err
    62  			}
    63  			ret := make([]string, 0, len(scenarios)+len(appsecRules))
    64  			ret = append(ret, scenarios...)
    65  			ret = append(ret, appsecRules...)
    66  
    67  			return ret, nil
    68  		},
    69  	})
    70  	if err != nil {
    71  		return nil, fmt.Errorf("new client api: %w", err)
    72  	}
    73  
    74  	authResp, _, err := client.Auth.AuthenticateWatcher(context.Background(), models.WatcherAuthRequest{
    75  		MachineID: &credentials.Login,
    76  		Password:  &password,
    77  		Scenarios: installedScenariosAndAppsecRules,
    78  	})
    79  	if err != nil {
    80  		return nil, fmt.Errorf("authenticate watcher (%s): %w", credentials.Login, err)
    81  	}
    82  
    83  	var expiration time.Time
    84  	if err := expiration.UnmarshalText([]byte(authResp.Expire)); err != nil {
    85  		return nil, fmt.Errorf("unable to parse jwt expiration: %w", err)
    86  	}
    87  
    88  	client.GetClient().Transport.(*apiclient.JWTTransport).Token = authResp.Token
    89  	client.GetClient().Transport.(*apiclient.JWTTransport).Expiration = expiration
    90  
    91  	return client, nil
    92  }