Add AnalysisError type and wrap all analyzer error paths (#4779)

* Add AnalysisError type and AnalysisErrorInfo interface

Introduce a shared error type that provides structured metadata
(analyzer type, operation, service, resource) for analysis failures.
This allows the scanner to extract context from errors without
depending on concrete types.

* Wrap errors in simple API analyzers with AnalysisError

Batch A: Airbrake, Anthropic, Asana, DigitalOcean, DockerHub,
ElevenLabs, Fastly, Groq, HuggingFace, Mailchimp, Mailgun, Mux,
Netlify, Ngrok, Notion, OpenAI, Opsgenie, Posthog, Postman,
Sendgrid, Sourcegraph.

Wraps credential validation errors with operation
"validate_credentials" and AnalyzePermissions errors with
operation "analyze_permissions".

* Wrap errors in remaining analyzers with AnalysisError (Batches B-E)

Batch B (OAuth/multi-credential): airtableoauth, airtablepat, datadog,
dropbox, figma, launchdarkly, plaid
Batch C (Complex): bitbucket, databricks, github, gitlab, jira, monday,
planetscale, shopify, slack, square, stripe, twilio
Batch D (Database): mysql, postgres (service: Database)
Batch E (PrivateKey): privatekey (service: crypto)

* Use Type().String() and constants for NewAnalysisError calls

Address PR feedback: replace hardcoded analyzer type strings with
a.Type().String() and replace raw operation/service strings with
package-level constants (OperationValidateCredentials,
OperationAnalyzePermissions, ServiceAPI, ServiceConfig, etc.).

* Omit empty resource parenthetical from AnalysisError messages

Conditionally include "(resource: ...)" only when non-empty,
avoiding cluttered messages like "... (resource: ): ..." that
appear for the majority of analyzers that don't set a resource.

* Wrap no-data error path in GitHub analyzer with AnalysisError
This commit is contained in:
John Elliott
2026-04-14 17:18:48 -07:00
committed by GitHub
parent 3a11c8393e
commit 761be8877b
45 changed files with 300 additions and 105 deletions
+2 -1
View File
@@ -25,7 +25,8 @@ func (Analyzer) Type() analyzers.AnalyzerType { return analyzers.AnalyzerTypeAir
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
info, err := AnalyzePermissions(a.Cfg, credInfo["key"])
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err,
)
}
return secretInfoToAnalyzerResult(info), nil
}
@@ -22,12 +22,12 @@ func (Analyzer) Type() analyzers.AnalyzerType { return analyzers.AnalyzerTypeAir
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
token, ok := credInfo["token"]
if !ok {
return nil, errors.New("token not found in credInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("token not found in credInfo"))
}
userInfo, err := common.FetchAirtableUserInfo(token)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err)
}
var basesInfo *common.AirtableBases
@@ -36,12 +36,12 @@ func getScopeEndpoint(scope string) (common.Endpoint, bool) {
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
token, ok := credInfo["token"]
if !ok {
return nil, errors.New("token not found in credInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("token not found in credInfo"))
}
userInfo, err := common.FetchAirtableUserInfo(token)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err)
}
scopeStatusMap[common.PermissionStrings[common.UserEmailRead]] = userInfo.Email != nil
@@ -49,17 +49,17 @@ func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analy
var basesInfo *common.AirtableBases
granted, err := determineScope(token, common.SchemaBasesRead, nil)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err)
}
if granted {
basesInfo, err = common.FetchAirtableBases(token)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err)
}
// If bases are fetched, determine the token scopes
err := determineScopes(token, basesInfo)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err)
}
}
@@ -51,12 +51,14 @@ func (a Analyzer) Type() analyzers.AnalyzerType {
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, exist := credInfo["key"]
if !exist {
return nil, errors.New("key not found in credentials info")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("key not found in credentials info"),
)
}
secretInfo, err := AnalyzePermissions(a.Cfg, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err,
)
}
return secretInfoToAnalyzerResult(secretInfo), nil
+4 -2
View File
@@ -28,12 +28,14 @@ func (Analyzer) Type() analyzers.AnalyzerType { return analyzers.AnalyzerTypeAsa
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, ok := credInfo["key"]
if !ok {
return nil, errors.New("key not found in credInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("key not found in credInfo"),
)
}
info, err := AnalyzePermissions(a.Cfg, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err,
)
}
return secretInfoToAnalyzerResult(info), nil
@@ -63,11 +63,11 @@ func (Analyzer) Type() analyzers.AnalyzerType { return analyzers.AnalyzerTypeBit
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, ok := credInfo["key"]
if !ok {
return nil, errors.New("key not found in credentialInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("key not found in credentialInfo"))
}
info, err := AnalyzePermissions(a.Cfg, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err)
}
return secretInfoToAnalyzerResult(info), nil
}
@@ -26,17 +26,17 @@ func (a Analyzer) Type() analyzers.AnalyzerType {
func (a Analyzer) Analyze(ctx context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
token, exist := credInfo["token"]
if !exist {
return nil, fmt.Errorf("key not found in credential info")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", fmt.Errorf("key not found in credential info"))
}
domain, exist := credInfo["domain"]
if !exist {
return nil, fmt.Errorf("domain not found in credential info")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", fmt.Errorf("domain not found in credential info"))
}
info, err := AnalyzePermissions(ctx, a.Cfg, domain, token)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err)
}
return secretInfoToAnalyzerResult(info), nil
+1 -1
View File
@@ -33,7 +33,7 @@ func (a Analyzer) Analyze(ctx context.Context, credInfo map[string]string) (*ana
info, err := AnalyzePermissions(a.Cfg, apiKey, appKey, endpoint)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err)
}
return secretInfoToAnalyzerResult(info), nil
}
@@ -34,11 +34,13 @@ func (Analyzer) Type() analyzers.AnalyzerType { return analyzers.AnalyzerTypeDig
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, ok := credInfo["key"]
if !ok {
return nil, errors.New("missing key in credInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("missing key in credInfo"),
)
}
info, err := AnalyzePermissions(a.Cfg, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err,
)
}
return secretInfoToAnalyzerResult(info), nil
}
@@ -54,17 +54,20 @@ func (a Analyzer) Type() analyzers.AnalyzerType {
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
username, exist := credInfo["username"]
if !exist {
return nil, errors.New("username not found in the credentials info")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("username not found in the credentials info"),
)
}
pat, exist := credInfo["pat"]
if !exist {
return nil, errors.New("personal access token(PAT) not found in the credentials info")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("personal access token(PAT) not found in the credentials info"),
)
}
info, err := AnalyzePermissions(a.Cfg, username, pat)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err,
)
}
return secretInfoToAnalyzerResult(info), nil
+2 -2
View File
@@ -43,12 +43,12 @@ func (a Analyzer) Type() analyzers.AnalyzerType {
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
token, exist := credInfo["token"]
if !exist {
return nil, errors.New("token not found in credentials info")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("token not found in credentials info"))
}
info, err := AnalyzePermissions(a.Cfg, token)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err)
}
return secretInfoToAnalyzerResult(info), nil
@@ -86,12 +86,14 @@ func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analy
// check if the `key` exist in the credentials info
key, exist := credInfo["key"]
if !exist {
return nil, errors.New("key not found in credentials info")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("key not found in credentials info"),
)
}
info, err := AnalyzePermissions(a.Cfg, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err,
)
}
return secretInfoToAnalyzerResult(info), nil
+69
View File
@@ -0,0 +1,69 @@
package analyzers
import "fmt"
// Operation constants for AnalysisError.
const (
OperationValidateCredentials = "validate_credentials"
OperationAnalyzePermissions = "analyze_permissions"
)
// Service constants for AnalysisError.
const (
ServiceAPI = "API"
ServiceConfig = "config"
ServiceDatabase = "Database"
ServiceOAuth = "OAuth"
ServiceCrypto = "crypto"
)
// AnalysisErrorInfo is implemented by errors that provide structured context
// about analysis failures. This allows downstream consumers (e.g., the scanner)
// to extract metadata for structured error storage without depending on
// concrete error types.
type AnalysisErrorInfo interface {
error
AnalyzerType() string
Operation() string // "validate_credentials", "authenticate", "analyze_permissions", "connect", "ping"
Service() string // "config", "API", "OAuth", "Database"
Resource() string // account ID, endpoint URL, or other identifier
}
// AnalysisError represents a structured error from an analyzer.
type AnalysisError struct {
analyzerType string
operation string
service string
resource string
err error
}
// NewAnalysisError creates a new AnalysisError.
func NewAnalysisError(analyzerType, operation, service, resource string, err error) *AnalysisError {
return &AnalysisError{
analyzerType: analyzerType,
operation: operation,
service: service,
resource: resource,
err: err,
}
}
func (e *AnalysisError) Error() string {
var resource string
if e.resource != "" {
resource = fmt.Sprintf(" (resource: %s)", e.resource)
}
if e.err != nil {
return fmt.Sprintf("%s analysis failed: %s on %s%s: %v",
e.analyzerType, e.operation, e.service, resource, e.err)
}
return fmt.Sprintf("%s analysis failed: %s on %s%s",
e.analyzerType, e.operation, e.service, resource)
}
func (e *AnalysisError) Unwrap() error { return e.err }
func (e *AnalysisError) AnalyzerType() string { return e.analyzerType }
func (e *AnalysisError) Operation() string { return e.operation }
func (e *AnalysisError) Service() string { return e.service }
func (e *AnalysisError) Resource() string { return e.resource }
+86
View File
@@ -0,0 +1,86 @@
package analyzers
import (
"errors"
"fmt"
"testing"
)
func TestAnalysisErrorImplementsInterface(t *testing.T) {
var _ AnalysisErrorInfo = (*AnalysisError)(nil)
}
func TestAnalysisErrorFields(t *testing.T) {
orig := fmt.Errorf("connection refused")
e := NewAnalysisError("Postgres", "connect", "Database", "localhost:5432", orig)
if e.AnalyzerType() != "Postgres" {
t.Errorf("AnalyzerType() = %q, want %q", e.AnalyzerType(), "Postgres")
}
if e.Operation() != "connect" {
t.Errorf("Operation() = %q, want %q", e.Operation(), "connect")
}
if e.Service() != "Database" {
t.Errorf("Service() = %q, want %q", e.Service(), "Database")
}
if e.Resource() != "localhost:5432" {
t.Errorf("Resource() = %q, want %q", e.Resource(), "localhost:5432")
}
}
func TestAnalysisErrorUnwrap(t *testing.T) {
orig := fmt.Errorf("timeout")
e := NewAnalysisError("GitHub", "authenticate", "API", "", orig)
if !errors.Is(e, orig) {
t.Error("errors.Is should find the original error")
}
}
func TestAnalysisErrorAs(t *testing.T) {
orig := fmt.Errorf("bad key")
e := NewAnalysisError("Airbrake", "validate_credentials", "config", "", orig)
// Wrap it further
wrapped := fmt.Errorf("analyze failed: %w", e)
var ae AnalysisErrorInfo
if !errors.As(wrapped, &ae) {
t.Fatal("errors.As should find AnalysisErrorInfo in wrapped error")
}
if ae.AnalyzerType() != "Airbrake" {
t.Errorf("AnalyzerType() = %q, want %q", ae.AnalyzerType(), "Airbrake")
}
if ae.Operation() != "validate_credentials" {
t.Errorf("Operation() = %q, want %q", ae.Operation(), "validate_credentials")
}
}
func TestAnalysisErrorMessage(t *testing.T) {
orig := fmt.Errorf("401 unauthorized")
e := NewAnalysisError("Slack", "authenticate", "API", "workspace-123", orig)
expected := "Slack analysis failed: authenticate on API (resource: workspace-123): 401 unauthorized"
if e.Error() != expected {
t.Errorf("Error() = %q, want %q", e.Error(), expected)
}
}
func TestAnalysisErrorMessageNilError(t *testing.T) {
e := NewAnalysisError("MySQL", "connect", "Database", "db.example.com", nil)
expected := "MySQL analysis failed: connect on Database (resource: db.example.com)"
if e.Error() != expected {
t.Errorf("Error() = %q, want %q", e.Error(), expected)
}
}
func TestAnalysisErrorMessageEmptyResource(t *testing.T) {
orig := fmt.Errorf("invalid token")
e := NewAnalysisError("OpenAI", "analyze_permissions", "API", "", orig)
expected := "OpenAI analysis failed: analyze_permissions on API: invalid token"
if e.Error() != expected {
t.Errorf("Error() = %q, want %q", e.Error(), expected)
}
}
+4 -4
View File
@@ -25,16 +25,16 @@ func (a Analyzer) Type() analyzers.AnalyzerType {
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, exist := credInfo["key"]
if !exist {
return nil, fmt.Errorf("key not found in credential info")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", fmt.Errorf("key not found in credential info"),
)
}
// analyze permissions
info, err := AnalyzePermissions(a.Cfg, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err,
)
}
// secret info to analyzer
return secretInfoToAnalyzerResult(info), nil
}
+2 -2
View File
@@ -41,11 +41,11 @@ const (
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
token, ok := credInfo["token"]
if !ok {
return nil, errors.New("token not found in credInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("token not found in credInfo"))
}
info, err := AnalyzePermissions(a.Cfg, token)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err)
}
return MapToAnalyzerResult(info), nil
}
+2 -2
View File
@@ -35,10 +35,10 @@ func (Analyzer) Type() analyzers.AnalyzerType { return analyzers.AnalyzerTypeGit
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
info, err := AnalyzePermissions(a.Cfg, credInfo["key"])
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err)
}
if info == nil {
return nil, fmt.Errorf("GitHub analyzer returned no data for token")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", fmt.Errorf("GitHub analyzer returned no data for token"))
}
return secretInfoToAnalyzerResult(info), nil
}
+2 -2
View File
@@ -34,7 +34,7 @@ func (Analyzer) Type() analyzers.AnalyzerType { return analyzers.AnalyzerTypeGit
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, ok := credInfo["key"]
if !ok {
return nil, errors.New("key not found in credentialInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("key not found in credentialInfo"))
}
host, ok := credInfo["host"]
if !ok {
@@ -43,7 +43,7 @@ func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analy
info, err := AnalyzePermissions(a.Cfg, key, host)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err)
}
return secretInfoToAnalyzerResult(info), nil
}
+4 -2
View File
@@ -58,12 +58,14 @@ func (a Analyzer) Type() analyzers.AnalyzerType {
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, exist := credInfo["key"]
if !exist {
return nil, errors.New("key not found in credentials info")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("key not found in credentials info"),
)
}
secretInfo, err := AnalyzePermissions(a.Cfg, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err,
)
}
return secretInfoToAnalyzerResult(secretInfo), nil
@@ -33,12 +33,14 @@ func (Analyzer) Type() analyzers.AnalyzerType { return analyzers.AnalyzerTypeHug
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, ok := credInfo["key"]
if !ok || key == "" {
return nil, fmt.Errorf("key not found in credentialInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", fmt.Errorf("key not found in credentialInfo"),
)
}
info, err := AnalyzePermissions(a.Cfg, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err,
)
}
return secretInfoToAnalyzerResult(info), nil
}
+4 -4
View File
@@ -28,20 +28,20 @@ func (a Analyzer) Type() analyzers.AnalyzerType {
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
token, exist := credInfo["token"]
if !exist {
return nil, fmt.Errorf("token not found in credential info")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", fmt.Errorf("token not found in credential info"))
}
domain, exist := credInfo["domain"]
if !exist {
return nil, fmt.Errorf("domain not found in credential info")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", fmt.Errorf("domain not found in credential info"))
}
email, exist := credInfo["email"]
if !exist {
return nil, fmt.Errorf("email not found in credential info")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", fmt.Errorf("email not found in credential info"))
}
info, err := AnalyzePermissions(a.Cfg, token, domain, email)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err)
}
return secretInfoToAnalyzerResult(info), nil
@@ -29,16 +29,16 @@ func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analy
// check if the `key` exist in the credentials info
key, exist := credInfo["key"]
if !exist {
return nil, errors.New("key not found in credentials info")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("key not found in credentials info"))
}
if isSDKKey(key) {
return nil, errors.New("sdk keys cannot be analyzed")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("sdk keys cannot be analyzed"))
}
info, err := AnalyzePermissions(a.Cfg, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err)
}
return secretInfoToAnalyzerResult(info), nil
@@ -29,12 +29,14 @@ func (Analyzer) Type() analyzers.AnalyzerType { return analyzers.AnalyzerTypeMai
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, ok := credInfo["key"]
if !ok {
return nil, errors.New("key not found in credentialInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("key not found in credentialInfo"),
)
}
info, err := AnalyzePermissions(a.Cfg, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err,
)
}
return secretInfoToAnalyzerResult(info), nil
}
+4 -2
View File
@@ -33,12 +33,14 @@ func (Analyzer) Type() analyzers.AnalyzerType { return analyzers.AnalyzerTypeMai
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, ok := credInfo["key"]
if !ok {
return nil, errors.New("key not found in credentialInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("key not found in credentialInfo"),
)
}
info, err := AnalyzePermissions(a.Cfg, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err,
)
}
return secretInfoToAnalyzerResult(info), nil
+2 -2
View File
@@ -44,12 +44,12 @@ func (a Analyzer) Type() analyzers.AnalyzerType {
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, exist := credInfo["key"]
if !exist {
return nil, errors.New("key not found in credentials info")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("key not found in credentials info"))
}
info, err := AnalyzePermissions(a.Cfg, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err)
}
return secretInfoToAnalyzerResult(info), nil
+6 -3
View File
@@ -41,16 +41,19 @@ func (a Analyzer) Type() analyzers.AnalyzerType {
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, exist := credInfo["key"]
if !exist {
return nil, errors.New("key not found in credentials info")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("key not found in credentials info"),
)
}
secret, exist := credInfo["secret"]
if !exist {
return nil, errors.New("secret not found in credentials info")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("secret not found in credentials info"),
)
}
info, err := AnalyzePermissions(a.Cfg, key, secret)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err,
)
}
return secretInfoToAnalyzerResult(info), nil
+2 -2
View File
@@ -33,11 +33,11 @@ func (Analyzer) Type() analyzers.AnalyzerType { return analyzers.AnalyzerTypeMyS
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
uri, ok := credInfo["connection_string"]
if !ok {
return nil, fmt.Errorf("missing connection string")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", fmt.Errorf("missing connection string"))
}
info, err := AnalyzePermissions(a.Cfg, uri)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceDatabase, "", err)
}
return secretInfoToAnalyzerResult(info), nil
}
+4 -2
View File
@@ -25,12 +25,14 @@ func (a Analyzer) Type() analyzers.AnalyzerType {
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, exist := credInfo["key"]
if !exist {
return nil, fmt.Errorf("key not found in credential info")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", fmt.Errorf("key not found in credential info"),
)
}
info, err := AnalyzePermissions(a.Cfg, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err,
)
}
return secretInfoToAnalyzerResult(info), nil
+4 -2
View File
@@ -36,12 +36,14 @@ func (a Analyzer) Type() analyzers.AnalyzerType {
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, exist := credInfo["key"]
if !exist {
return nil, errors.New("key not found in credentials info")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("key not found in credentials info"),
)
}
info, err := AnalyzePermissions(a.Cfg, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err,
)
}
return secretInfoToAnalyzerResult(info), nil
+4 -2
View File
@@ -30,11 +30,13 @@ func (Analyzer) Type() analyzers.AnalyzerType { return analyzers.AnalyzerTypeNot
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, ok := credInfo["key"]
if !ok {
return nil, errors.New("missing key in credInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("missing key in credInfo"),
)
}
info, err := AnalyzePermissions(a.Cfg, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err,
)
}
return secretInfoToAnalyzerResult(info), nil
}
+2 -1
View File
@@ -31,7 +31,8 @@ func (Analyzer) Type() analyzers.AnalyzerType { return analyzers.AnalyzerTypeOpe
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
info, err := AnalyzePermissions(a.Cfg, credInfo["key"])
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err,
)
}
return secretInfoToAnalyzerResult(info), nil
}
+4 -2
View File
@@ -30,11 +30,13 @@ func (Analyzer) Type() analyzers.AnalyzerType { return analyzers.AnalyzerTypeOps
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, ok := credInfo["key"]
if !ok {
return nil, errors.New("missing key in credInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("missing key in credInfo"),
)
}
info, err := AnalyzePermissions(a.Cfg, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err,
)
}
return secretInfoToAnalyzerResult(info), nil
}
+4 -4
View File
@@ -31,20 +31,20 @@ func (a Analyzer) Type() analyzers.AnalyzerType {
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
secret, exist := credInfo["secret"]
if !exist {
return nil, errors.New("secret not found in credentials info")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("secret not found in credentials info"))
}
clientID, exist := credInfo["id"]
if !exist {
return nil, errors.New("id not found in credentials info")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("id not found in credentials info"))
}
accessToken, exist := credInfo["token"]
if !exist {
return nil, errors.New("token not found in credentials info")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("token not found in credentials info"))
}
info, err := AnalyzePermissions(a.Cfg, secret, clientID, accessToken)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err)
}
return secretInfoToAnalyzerResult(info), nil
@@ -31,15 +31,15 @@ func (Analyzer) Type() analyzers.AnalyzerType { return analyzers.AnalyzerTypePla
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
id, ok := credInfo["id"]
if !ok {
return nil, errors.New("missing id in credInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("missing id in credInfo"))
}
key, ok := credInfo["token"]
if !ok {
return nil, errors.New("missing key in credInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("missing key in credInfo"))
}
info, err := AnalyzePermissions(a.Cfg, id, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err)
}
return secretInfoToAnalyzerResult(info), nil
}
+2 -2
View File
@@ -30,12 +30,12 @@ func (Analyzer) Type() analyzers.AnalyzerType { return analyzers.AnalyzerTypePos
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
uri, ok := credInfo["connection_string"]
if !ok {
return nil, errors.New("connection string not found in credInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("connection string not found in credInfo"))
}
info, err := AnalyzePermissions(a.Cfg, uri)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceDatabase, "", err)
}
return secretInfoToAnalyzerResult(info), nil
}
+4 -2
View File
@@ -37,11 +37,13 @@ func (Analyzer) Type() analyzers.AnalyzerType { return analyzers.AnalyzerTypePos
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, ok := credInfo["key"]
if !ok {
return nil, errors.New("missing key in credInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("missing key in credInfo"),
)
}
info, err := AnalyzePermissions(a.Cfg, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err,
)
}
return secretInfoToAnalyzerResult(info), nil
}
+4 -2
View File
@@ -26,11 +26,13 @@ func (Analyzer) Type() analyzers.AnalyzerType { return analyzers.AnalyzerTypePos
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, ok := credInfo["key"]
if !ok {
return nil, fmt.Errorf("missing key in credInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", fmt.Errorf("missing key in credInfo"),
)
}
info, err := AnalyzePermissions(a.Cfg, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err,
)
}
return secretInfoToAnalyzerResult(info), nil
}
@@ -32,12 +32,12 @@ func (a Analyzer) Analyze(ctx context.Context, credInfo map[string]string) (*ana
// token will be already normalized by the time it reaches here
token, ok := credInfo["token"]
if !ok {
return nil, errors.New("token not found in credInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("token not found in credInfo"))
}
info, err := AnalyzePermissions(ctx, a.Cfg, token)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceCrypto, "", err)
}
return secretInfoToAnalyzerResult(info), nil
+4 -2
View File
@@ -47,11 +47,13 @@ func (Analyzer) Type() analyzers.AnalyzerType { return analyzers.AnalyzerTypeSen
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, ok := credInfo["key"]
if !ok {
return nil, fmt.Errorf("missing key in credInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", fmt.Errorf("missing key in credInfo"),
)
}
info, err := AnalyzePermissions(a.Cfg, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err,
)
}
return secretInfoToAnalyzerResult(info), nil
}
+3 -3
View File
@@ -34,17 +34,17 @@ func (Analyzer) Type() analyzers.AnalyzerType { return analyzers.AnalyzerTypeSho
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, ok := credInfo["key"]
if !ok {
return nil, errors.New("key not found in credentialInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("key not found in credentialInfo"))
}
storeUrl, ok := credInfo["store_url"]
if !ok {
return nil, errors.New("store_url not found in credentialInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("store_url not found in credentialInfo"))
}
info, err := AnalyzePermissions(a.Cfg, key, storeUrl)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err)
}
return secretInfoToAnalyzerResult(info), nil
}
+2 -2
View File
@@ -29,12 +29,12 @@ func (Analyzer) Type() analyzers.AnalyzerType { return analyzers.AnalyzerTypeSla
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, ok := credInfo["key"]
if !ok {
return nil, errors.New("key not found in credentialInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("key not found in credentialInfo"))
}
info, err := AnalyzePermissions(a.Cfg, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err)
}
return secretInfoToAnalyzerResult(info), nil
}
@@ -26,11 +26,13 @@ func (Analyzer) Type() analyzers.AnalyzerType { return analyzers.AnalyzerTypeSou
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, ok := credInfo["key"]
if !ok {
return nil, fmt.Errorf("missing key in credInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", fmt.Errorf("missing key in credInfo"),
)
}
info, err := AnalyzePermissions(a.Cfg, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err,
)
}
return secretInfoToAnalyzerResult(info), nil
}
+2 -2
View File
@@ -28,11 +28,11 @@ func (Analyzer) Type() analyzers.AnalyzerType { return analyzers.AnalyzerTypeSqu
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, ok := credInfo["key"]
if !ok {
return nil, errors.New("key not found in credentialInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("key not found in credentialInfo"))
}
info, err := AnalyzePermissions(a.Cfg, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err)
}
return secretInfoToAnalyzerResult(info), nil
}
+2 -2
View File
@@ -33,12 +33,12 @@ func (Analyzer) Type() analyzers.AnalyzerType { return analyzers.AnalyzerTypeStr
func (a Analyzer) Analyze(_ context.Context, credInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, ok := credInfo["key"]
if !ok {
return nil, errors.New("key not found in credentialInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("key not found in credentialInfo"))
}
info, err := AnalyzePermissions(a.Cfg, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err)
}
return secretInfoToAnalyzerResult(info), nil
}
+4 -4
View File
@@ -25,12 +25,12 @@ func (a *Analyzer) Type() analyzers.AnalyzerType {
func (a *Analyzer) Analyze(ctx context.Context, credentialInfo map[string]string) (*analyzers.AnalyzerResult, error) {
key, ok := credentialInfo["key"]
if !ok {
return nil, errors.New("key not found in credentialInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("key not found in credentialInfo"))
}
sid, ok := credentialInfo["sid"]
if !ok {
return nil, errors.New("sid not found in credentialInfo")
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationValidateCredentials, analyzers.ServiceConfig, "", errors.New("sid not found in credentialInfo"))
}
if a.Cfg == nil {
@@ -39,13 +39,13 @@ func (a *Analyzer) Analyze(ctx context.Context, credentialInfo map[string]string
info, err := AnalyzePermissions(a.Cfg, sid, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err)
}
// List parent and subaccounts
accounts, err := listTwilioAccounts(a.Cfg, sid, key)
if err != nil {
return nil, err
return nil, analyzers.NewAnalysisError(a.Type().String(), analyzers.OperationAnalyzePermissions, analyzers.ServiceAPI, "", err)
}
var permissions []Permission