Skip to content
Open
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cmd/api/src/api/tools/pg.go
Original file line number Diff line number Diff line change
Expand Up @@ -448,7 +448,7 @@ func (s *PGMigrator) MigrationStatus(response http.ResponseWriter, request *http
}

func (s *PGMigrator) OpenPostgresGraphConnection() (graph.Database, error) {
if pool, err := pg.NewPool(s.Cfg.Database.PostgreSQLConnectionString()); err != nil {
if pool, err := pg.NewPool(s.Cfg.Database); err != nil {
return nil, err
} else {
return dawgs.Open(s.ServerCtx, pg.DriverName, dawgs.Config{
Expand Down
2 changes: 1 addition & 1 deletion cmd/api/src/bootstrap/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ func ConnectGraph(ctx context.Context, cfg config.Configuration) (*graph.Databas
slog.InfoContext(ctx, "Connecting to graph using PostgreSQL")
connectionString = cfg.Database.PostgreSQLConnectionString()

pool, err = pg.NewPool(connectionString)
pool, err = pg.NewPool(cfg.Database)
if err != nil {
return nil, err
}
Expand Down
22 changes: 16 additions & 6 deletions cmd/api/src/cmd/dawgs-harness/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,11 @@ import (
"github.com/jackc/pgx/v5/pgxpool"
"github.com/jedib0t/go-pretty/v6/table"
"github.com/specterops/bloodhound/cmd/api/src/cmd/dawgs-harness/tests"
"github.com/specterops/bloodhound/cmd/api/src/config"
"github.com/specterops/bloodhound/packages/go/bhlog"
schema "github.com/specterops/bloodhound/packages/go/graphschema"
"github.com/specterops/dawgs"
"github.com/specterops/dawgs/drivers"
"github.com/specterops/dawgs/drivers/neo4j"
"github.com/specterops/dawgs/drivers/pg"
"github.com/specterops/dawgs/graph"
Expand All @@ -44,14 +46,14 @@ func fatalf(format string, args ...any) {
os.Exit(1)
}

func RunTestSuite(ctx context.Context, connectionStr, driverName string) tests.TestSuite {
func RunTestSuite(ctx context.Context, connectionStr, driverName string, cfg drivers.DatabaseConfiguration) tests.TestSuite {
var (
pool *pgxpool.Pool
err error
)

if driverName == pg.DriverName {
pool, err = pg.NewPool(connectionStr)
pool, err = pg.NewPool(cfg)
if err != nil {
fatalf("Failed creating a new pgxpool: %s", err)
}
Expand Down Expand Up @@ -141,10 +143,18 @@ func main() {

bhlog.ConfigureDefaultText(os.Stdout)

cfg, err := config.NewDefaultConfiguration()
if err != nil {
fmt.Errorf("failed to create default configuration: %w", err)
}
Comment on lines +146 to +149
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Critical: Error from NewDefaultConfiguration() is silently discarded.

fmt.Errorf creates an error value but doesn't do anything with it — the program continues with a zero-value cfg on failure. This should use fatalf (or similar) to halt execution.

Proposed fix
 	cfg, err := config.NewDefaultConfiguration()
 	if err != nil {
-		fmt.Errorf("failed to create default configuration: %w", err)
+		fatalf("failed to create default configuration: %v", err)
 	}
🤖 Prompt for AI Agents
In `@cmd/api/src/cmd/dawgs-harness/main.go` around lines 146 - 149, The call to
config.NewDefaultConfiguration() can fail but the code currently creates an
error value with fmt.Errorf and then continues with a nil/zero cfg; replace that
silent discard by checking err and terminating with a fatal log (e.g.,
log.Fatalf or fmt.Fatalf or panic) so the program doesn't continue with an
invalid cfg; update the error handling right after cfg, err :=
config.NewDefaultConfiguration() to log a descriptive message including the
wrapped err and exit (reference symbols: NewDefaultConfiguration, cfg, err).

cfg.Neo4J.Connection = neo4jConnectionStr
cfg.Database.Connection = pgConnectionStr

switch testType {
case "both":

n4jTestSuite := execSuite(neo4j.DriverName, func() tests.TestSuite {
return RunTestSuite(ctx, neo4jConnectionStr, neo4j.DriverName)
return RunTestSuite(ctx, neo4jConnectionStr, neo4j.DriverName, cfg.Database)
})

fmt.Println()
Expand All @@ -153,20 +163,20 @@ func main() {
time.Sleep(time.Second * 3)

pgTestSuite := execSuite(pg.DriverName, func() tests.TestSuite {
return RunTestSuite(ctx, pgConnectionStr, pg.DriverName)
return RunTestSuite(ctx, pgConnectionStr, pg.DriverName, cfg.Database)
})
fmt.Println()

OutputTestSuiteDeltas(pgTestSuite, n4jTestSuite)

case "postgres":
execSuite(pg.DriverName, func() tests.TestSuite {
return RunTestSuite(ctx, pgConnectionStr, pg.DriverName)
return RunTestSuite(ctx, pgConnectionStr, pg.DriverName, cfg.Database)
})

case "neo4j":
execSuite(neo4j.DriverName, func() tests.TestSuite {
return RunTestSuite(ctx, neo4jConnectionStr, neo4j.DriverName)
return RunTestSuite(ctx, neo4jConnectionStr, neo4j.DriverName, cfg.Database)
})
}
}
Expand Down
91 changes: 34 additions & 57 deletions cmd/api/src/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import (
"github.com/specterops/bloodhound/cmd/api/src/serde"
"github.com/specterops/bloodhound/packages/go/bhlog/attr"
"github.com/specterops/bloodhound/packages/go/crypto"
Dawgs "github.com/specterops/dawgs/drivers"
)

const (
Expand All @@ -50,15 +51,6 @@ func (s TLSConfiguration) Enabled() bool {
return s.CertFile != "" && s.KeyFile != ""
}

type DatabaseConfiguration struct {
Connection string `json:"connection"`
Address string `json:"addr"`
Database string `json:"database"`
Username string `json:"username"`
Secret string `json:"secret"`
MaxConcurrentSessions int `json:"max_concurrent_sessions"`
}

type CollectorManifest struct {
Latest string `json:"latest"`
Versions []CollectorVersion `json:"versions"`
Expand All @@ -72,22 +64,6 @@ type CollectorVersion struct {

type CollectorManifests map[string]CollectorManifest

func (s DatabaseConfiguration) PostgreSQLConnectionString() string {
if s.Connection == "" {
return fmt.Sprintf("postgresql://%s:%s@%s/%s", s.Username, s.Secret, s.Address, s.Database)
}

return s.Connection
}

func (s DatabaseConfiguration) Neo4jConnectionString() string {
if s.Connection == "" {
return fmt.Sprintf("neo4j://%s:%s@%s/%s", s.Username, s.Secret, s.Address, s.Database)
}

return s.Connection
}

type CryptoConfiguration struct {
JWT JWTConfiguration `json:"jwt"`
Argon2 Argon2Configuration `json:"argon2"`
Expand Down Expand Up @@ -135,38 +111,39 @@ type DefaultAdminConfiguration struct {
}

type Configuration struct {
Version int `json:"version"`
BindAddress string `json:"bind_addr"`
SlowQueryThreshold int64 `json:"slow_query_threshold"`
MaxGraphQueryCacheSize int `json:"max_graphdb_cache_size"`
MaxAPICacheSize int `json:"max_api_cache_size"`
MetricsPort string `json:"metrics_port"`
RootURL serde.URL `json:"root_url"`
WorkDir string `json:"work_dir"`
LogLevel string `json:"log_level"`
LogPath string `json:"log_path"`
TLS TLSConfiguration `json:"tls"`
GraphDriver string `json:"graph_driver"`
Database DatabaseConfiguration `json:"database"`
Neo4J DatabaseConfiguration `json:"neo4j"`
Crypto CryptoConfiguration `json:"crypto"`
SAML SAMLConfiguration `json:"saml"`
DefaultAdmin DefaultAdminConfiguration `json:"default_admin"`
CollectorsBucketURL serde.URL `json:"collectors_bucket_url"`
CollectorsBasePath string `json:"collectors_base_path"`
DatapipeInterval int `json:"datapipe_interval"`
EnableStartupWaitPeriod bool `json:"enable_startup_wait_period"`
EnableAPILogging bool `json:"enable_api_logging"`
EnableCypherMutations bool `json:"enable_cypher_mutations"`
DisableAnalysis bool `json:"disable_analysis"`
DisableCypherComplexityLimit bool `json:"disable_cypher_complexity_limit"`
DisableIngest bool `json:"disable_ingest"`
DisableMigrations bool `json:"disable_migrations"`
GraphQueryMemoryLimit uint16 `json:"graph_query_memory_limit"`
EnableTextLogger bool `json:"enable_text_logger"`
RecreateDefaultAdmin bool `json:"recreate_default_admin"`
EnableUserAnalytics bool `json:"enable_user_analytics"`
ForceDownloadEmbeddedCollectors bool `json:"force_download_embedded_collectors"`
Version int `json:"version"`
BindAddress string `json:"bind_addr"`
SlowQueryThreshold int64 `json:"slow_query_threshold"`
MaxGraphQueryCacheSize int `json:"max_graphdb_cache_size"`
MaxAPICacheSize int `json:"max_api_cache_size"`
MetricsPort string `json:"metrics_port"`
RootURL serde.URL `json:"root_url"`
WorkDir string `json:"work_dir"`
LogLevel string `json:"log_level"`
LogPath string `json:"log_path"`
TLS TLSConfiguration `json:"tls"`
GraphDriver string `json:"graph_driver"`
Database Dawgs.DatabaseConfiguration `json:"database"`
Neo4J Dawgs.DatabaseConfiguration `json:"neo4j"`
Crypto CryptoConfiguration `json:"crypto"`
SAML SAMLConfiguration `json:"saml"`
DefaultAdmin DefaultAdminConfiguration `json:"default_admin"`
CollectorsBucketURL serde.URL `json:"collectors_bucket_url"`
CollectorsBasePath string `json:"collectors_base_path"`
DatapipeInterval int `json:"datapipe_interval"`
EnableStartupWaitPeriod bool `json:"enable_startup_wait_period"`
EnableAPILogging bool `json:"enable_api_logging"`
EnableCypherMutations bool `json:"enable_cypher_mutations"`
DisableAnalysis bool `json:"disable_analysis"`
DisableCypherComplexityLimit bool `json:"disable_cypher_complexity_limit"`
DisableIngest bool `json:"disable_ingest"`
DisableMigrations bool `json:"disable_migrations"`
DisableTimeoutLimit bool `json:"disable_timeout_limit"`
GraphQueryMemoryLimit uint16 `json:"graph_query_memory_limit"`
EnableTextLogger bool `json:"enable_text_logger"`
RecreateDefaultAdmin bool `json:"recreate_default_admin"`
EnableUserAnalytics bool `json:"enable_user_analytics"`
ForceDownloadEmbeddedCollectors bool `json:"force_download_embedded_collectors"`
}

func (s Configuration) TempDirectory() string {
Expand Down
5 changes: 3 additions & 2 deletions cmd/api/src/config/default.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package config
import (
"fmt"

Dawgs "github.com/specterops/dawgs/drivers"
"github.com/specterops/dawgs/drivers/neo4j"

"github.com/specterops/bloodhound/cmd/api/src/serde"
Expand Down Expand Up @@ -73,10 +74,10 @@ func NewDefaultConfiguration() (Configuration, error) {
TLS: TLSConfiguration{},
SAML: SAMLConfiguration{},
GraphDriver: neo4j.DriverName, // Default to PG as the graph driver
Database: DatabaseConfiguration{
Database: Dawgs.DatabaseConfiguration{
MaxConcurrentSessions: 10,
},
Neo4J: DatabaseConfiguration{
Neo4J: Dawgs.DatabaseConfiguration{
MaxConcurrentSessions: 10,
},
Crypto: CryptoConfiguration{
Expand Down
14 changes: 12 additions & 2 deletions cmd/api/src/database/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,17 @@ import (
"time"

"github.com/gofrs/uuid"
"github.com/jackc/pgx/v5/stdlib"
"github.com/specterops/bloodhound/cmd/api/src/auth"
"github.com/specterops/bloodhound/cmd/api/src/config"
"github.com/specterops/bloodhound/cmd/api/src/database/migration"
"github.com/specterops/bloodhound/cmd/api/src/model"
"github.com/specterops/bloodhound/cmd/api/src/model/appcfg"
"github.com/specterops/bloodhound/cmd/api/src/services/agi"
"github.com/specterops/bloodhound/cmd/api/src/services/dataquality"
"github.com/specterops/bloodhound/cmd/api/src/services/upload"
"github.com/specterops/bloodhound/packages/go/bhlog/attr"
"github.com/specterops/dawgs/drivers/pg"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
Expand Down Expand Up @@ -237,15 +240,22 @@ func (s *BloodhoundDB) Transaction(ctx context.Context, fn func(tx *BloodhoundDB
}, opts...)
}

func OpenDatabase(connection string) (*gorm.DB, error) {
func OpenDatabase(cfg config.Configuration) (*gorm.DB, error) {
gormConfig := &gorm.Config{
Logger: &GormLogAdapter{
SlowQueryErrorThreshold: time.Second * 10,
SlowQueryWarnThreshold: time.Second * 1,
},
}

if db, err := gorm.Open(postgres.Open(connection), gormConfig); err != nil {
pool, err := pg.NewPool(cfg.Database)
if err != nil {
return nil, err
}

dbPool := stdlib.OpenDBFromPool(pool)

if db, err := gorm.Open(postgres.New(postgres.Config{Conn: dbPool}), gormConfig); err != nil {
return nil, err
} else {
return db, nil
Expand Down
2 changes: 1 addition & 1 deletion cmd/api/src/services/entrypoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ import (

// ConnectPostgres initializes a connection to PG, and returns errors if any
func ConnectPostgres(cfg config.Configuration) (*database.BloodhoundDB, error) {
if db, err := database.OpenDatabase(cfg.Database.PostgreSQLConnectionString()); err != nil {
if db, err := database.OpenDatabase(cfg); err != nil {
return nil, fmt.Errorf("error while attempting to create database connection: %w", err)
} else {
return database.NewBloodhoundDB(db, auth.NewIdentityResolver()), nil
Expand Down
16 changes: 15 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ require (
github.com/russellhaering/goxmldsig v1.5.0
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2
github.com/shirou/gopsutil/v3 v3.24.5
github.com/specterops/dawgs v0.4.5
github.com/specterops/dawgs v0.4.8-0.20260211001809-7d3b4dd80186
github.com/stretchr/testify v1.11.1
github.com/teambition/rrule-go v1.8.2
github.com/ulule/limiter/v3 v3.11.2
Expand Down Expand Up @@ -84,6 +84,20 @@ require (
github.com/antlr4-go/antlr/v4 v4.13.1 // indirect
github.com/ashanbrown/forbidigo v1.6.0 // indirect
github.com/ashanbrown/makezero v1.2.0 // indirect
github.com/aws/aws-sdk-go-v2 v1.39.3 // indirect
github.com/aws/aws-sdk-go-v2/config v1.31.13 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.18.17 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.10 // indirect
github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.6.10 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.10 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.10 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.2 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.10 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.29.7 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.2 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.38.7 // indirect
github.com/aws/smithy-go v1.23.1 // indirect
github.com/axiomhq/hyperloglog v0.2.6 // indirect
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
github.com/beevik/etree v1.5.0 // indirect
Expand Down
32 changes: 30 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,34 @@ github.com/ashanbrown/forbidigo v1.6.0 h1:D3aewfM37Yb3pxHujIPSpTf6oQk9sc9WZi8ger
github.com/ashanbrown/forbidigo v1.6.0/go.mod h1:Y8j9jy9ZYAEHXdu723cUlraTqbzjKF1MUyfOKL+AjcU=
github.com/ashanbrown/makezero v1.2.0 h1:/2Lp1bypdmK9wDIq7uWBlDF1iMUpIIS4A+pF6C9IEUU=
github.com/ashanbrown/makezero v1.2.0/go.mod h1:dxlPhHbDMC6N6xICzFBSK+4njQDdK8euNO0qjQMtGY4=
github.com/aws/aws-sdk-go-v2 v1.39.3 h1:h7xSsanJ4EQJXG5iuW4UqgP7qBopLpj84mpkNx3wPjM=
github.com/aws/aws-sdk-go-v2 v1.39.3/go.mod h1:yWSxrnioGUZ4WVv9TgMrNUeLV3PFESn/v+6T/Su8gnM=
github.com/aws/aws-sdk-go-v2/config v1.31.13 h1:wcqQB3B0PgRPUF5ZE/QL1JVOyB0mbPevHFoAMpemR9k=
github.com/aws/aws-sdk-go-v2/config v1.31.13/go.mod h1:ySB5D5ybwqGbT6c3GszZ+u+3KvrlYCUQNo62+hkKOFk=
github.com/aws/aws-sdk-go-v2/credentials v1.18.17 h1:skpEwzN/+H8cdrrtT8y+rvWJGiWWv0DeNAe+4VTf+Vs=
github.com/aws/aws-sdk-go-v2/credentials v1.18.17/go.mod h1:Ed+nXsaYa5uBINovJhcAWkALvXw2ZLk36opcuiSZfJM=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.10 h1:UuGVOX48oP4vgQ36oiKmW9RuSeT8jlgQgBFQD+HUiHY=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.10/go.mod h1:vM/Ini41PzvudT4YkQyE/+WiQJiQ6jzeDyU8pQKwCac=
github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.6.10 h1:xfgjONWMae6+y//dlhVukwt9N+I++FPuiwcQt7DI7Qg=
github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.6.10/go.mod h1:FO6aarJTHA2N3S8F2A4wKfnX9Jr6MPerJFaqoLgTctU=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.10 h1:mj/bdWleWEh81DtpdHKkw41IrS+r3uw1J/VQtbwYYp8=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.10/go.mod h1:7+oEMxAZWP8gZCyjcm9VicI0M61Sx4DJtcGfKYv2yKQ=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.10 h1:wh+/mn57yhUrFtLIxyFPh2RgxgQz/u+Yrf7hiHGHqKY=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.10/go.mod h1:7zirD+ryp5gitJJ2m1BBux56ai8RIRDykXZrJSp540w=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 h1:WKuaxf++XKWlHWu9ECbMlha8WOEGm0OUEZqm4K/Gcfk=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4/go.mod h1:ZWy7j6v1vWGmPReu0iSGvRiise4YI5SkR3OHKTZ6Wuc=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.2 h1:xtuxji5CS0JknaXoACOunXOYOQzgfTvGAc9s2QdCJA4=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.2/go.mod h1:zxwi0DIR0rcRcgdbl7E2MSOvxDyyXGBlScvBkARFaLQ=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.10 h1:DRND0dkCKtJzCj4Xl4OpVbXZgfttY5q712H9Zj7qc/0=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.10/go.mod h1:tGGNmJKOTernmR2+VJ0fCzQRurcPZj9ut60Zu5Fi6us=
github.com/aws/aws-sdk-go-v2/service/sso v1.29.7 h1:fspVFg6qMx0svs40YgRmE7LZXh9VRZvTT35PfdQR6FM=
github.com/aws/aws-sdk-go-v2/service/sso v1.29.7/go.mod h1:BQTKL3uMECaLaUV3Zc2L4Qybv8C6BIXjuu1dOPyxTQs=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.2 h1:scVnW+NLXasGOhy7HhkdT9AGb6kjgW7fJ5xYkUaqHs0=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.2/go.mod h1:FRNCY3zTEWZXBKm2h5UBUPvCVDOecTad9KhynDyGBc0=
github.com/aws/aws-sdk-go-v2/service/sts v1.38.7 h1:VEO5dqFkMsl8QZ2yHsFDJAIZLAkEbaYDB+xdKi0Feic=
github.com/aws/aws-sdk-go-v2/service/sts v1.38.7/go.mod h1:L1xxV3zAdB+qVrVW/pBIrIAnHFWHo6FBbFe4xOGsG/o=
github.com/aws/smithy-go v1.23.1 h1:sLvcH6dfAFwGkHLZ7dGiYF7aK6mg4CgKA/iDKjLDt9M=
github.com/aws/smithy-go v1.23.1/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0=
github.com/axiomhq/hyperloglog v0.2.6 h1:sRhvvF3RIXWQgAXaTphLp4yJiX4S0IN3MWTaAgZoRJw=
github.com/axiomhq/hyperloglog v0.2.6/go.mod h1:YjX/dQqCR/7QYX0g8mu8UZAjpIenz1FKM71UEsjFoTo=
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
Expand Down Expand Up @@ -552,8 +580,8 @@ github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9yS
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0=
github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs=
github.com/specterops/dawgs v0.4.5 h1:TdBsg2dvnIf9VGpUzA5jlGNrNT2hSwWKDgWy8YDOTGE=
github.com/specterops/dawgs v0.4.5/go.mod h1:qhuKAFNIL0NVf4HIEllbR9xIdJIHKTz2WP1INlkG8Zk=
github.com/specterops/dawgs v0.4.8-0.20260211001809-7d3b4dd80186 h1:9aj5k+aw7iFDW6j0Pnf6M4oINwKpQE6QFjm96039BbU=
github.com/specterops/dawgs v0.4.8-0.20260211001809-7d3b4dd80186/go.mod h1:Zlhb1si0g+/h9pUMUvCc2WHnh7SAWNr/Wy055LTTrUI=
github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA=
github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo=
github.com/spf13/cast v1.8.0 h1:gEN9K4b8Xws4EX0+a0reLmhq8moKn7ntRlQYgjPeCDk=
Expand Down
Loading
Loading