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 }