v0.6.0 auth restructuring, scram auth added, more tests added
This commit is contained in:
+35
-31
@@ -6,61 +6,61 @@ import (
|
||||
)
|
||||
|
||||
type AuthConfig struct {
|
||||
// Authentication type: "none", "basic", "bearer", "mtls"
|
||||
// Authentication type: "none", "basic", "scram", "bearer", "mtls"
|
||||
Type string `toml:"type"`
|
||||
|
||||
// Basic auth
|
||||
BasicAuth *BasicAuthConfig `toml:"basic_auth"`
|
||||
|
||||
// Bearer token auth
|
||||
BasicAuth *BasicAuthConfig `toml:"basic_auth"`
|
||||
ScramAuth *ScramAuthConfig `toml:"scram_auth"`
|
||||
BearerAuth *BearerAuthConfig `toml:"bearer_auth"`
|
||||
}
|
||||
|
||||
type BasicAuthConfig struct {
|
||||
// Static users (for simple deployments)
|
||||
Users []BasicAuthUser `toml:"users"`
|
||||
|
||||
// External auth file
|
||||
UsersFile string `toml:"users_file"`
|
||||
|
||||
// Realm for WWW-Authenticate header
|
||||
Realm string `toml:"realm"`
|
||||
Realm string `toml:"realm"`
|
||||
}
|
||||
|
||||
type BasicAuthUser struct {
|
||||
Username string `toml:"username"`
|
||||
// Password hash (Argon2id)
|
||||
PasswordHash string `toml:"password_hash"`
|
||||
Username string `toml:"username"`
|
||||
PasswordHash string `toml:"password_hash"` // Argon2
|
||||
}
|
||||
|
||||
type ScramAuthConfig struct {
|
||||
Users []ScramUser `toml:"users"`
|
||||
}
|
||||
|
||||
type ScramUser struct {
|
||||
Username string `toml:"username"`
|
||||
StoredKey string `toml:"stored_key"` // base64
|
||||
ServerKey string `toml:"server_key"` // base64
|
||||
Salt string `toml:"salt"` // base64
|
||||
ArgonTime uint32 `toml:"argon_time"`
|
||||
ArgonMemory uint32 `toml:"argon_memory"`
|
||||
ArgonThreads uint8 `toml:"argon_threads"`
|
||||
}
|
||||
|
||||
type BearerAuthConfig struct {
|
||||
// Static tokens
|
||||
Tokens []string `toml:"tokens"`
|
||||
|
||||
// JWT validation
|
||||
JWT *JWTConfig `toml:"jwt"`
|
||||
// TODO: Maybe future development
|
||||
// // JWT validation
|
||||
// JWT *JWTConfig `toml:"jwt"`
|
||||
}
|
||||
|
||||
type JWTConfig struct {
|
||||
// JWKS URL for key discovery
|
||||
JWKSURL string `toml:"jwks_url"`
|
||||
|
||||
// Static signing key (if not using JWKS)
|
||||
SigningKey string `toml:"signing_key"`
|
||||
|
||||
// Expected issuer
|
||||
Issuer string `toml:"issuer"`
|
||||
|
||||
// Expected audience
|
||||
Audience string `toml:"audience"`
|
||||
}
|
||||
// TODO: Maybe future development
|
||||
// type JWTConfig struct {
|
||||
// JWKSURL string `toml:"jwks_url"`
|
||||
// SigningKey string `toml:"signing_key"`
|
||||
// Issuer string `toml:"issuer"`
|
||||
// Audience string `toml:"audience"`
|
||||
// }
|
||||
|
||||
func validateAuth(pipelineName string, auth *AuthConfig) error {
|
||||
if auth == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
validTypes := map[string]bool{"none": true, "basic": true, "bearer": true, "mtls": true}
|
||||
validTypes := map[string]bool{"none": true, "basic": true, "scram": true, "bearer": true, "mtls": true}
|
||||
if !validTypes[auth.Type] {
|
||||
return fmt.Errorf("pipeline '%s': invalid auth type: %s", pipelineName, auth.Type)
|
||||
}
|
||||
@@ -69,6 +69,10 @@ func validateAuth(pipelineName string, auth *AuthConfig) error {
|
||||
return fmt.Errorf("pipeline '%s': basic auth type specified but config missing", pipelineName)
|
||||
}
|
||||
|
||||
if auth.Type == "scram" && auth.ScramAuth == nil {
|
||||
return fmt.Errorf("pipeline '%s': scram auth type specified but config missing", pipelineName)
|
||||
}
|
||||
|
||||
if auth.Type == "bearer" && auth.BearerAuth == nil {
|
||||
return fmt.Errorf("pipeline '%s': bearer auth type specified but config missing", pipelineName)
|
||||
}
|
||||
|
||||
@@ -180,10 +180,10 @@ func applyConsoleTargetOverrides(cfg *Config) error {
|
||||
return fmt.Errorf("invalid LOGWISP_CONSOLE_TARGET value: %s", consoleTarget)
|
||||
}
|
||||
|
||||
// Apply to all console sinks
|
||||
// Apply to console sinks
|
||||
for i, pipeline := range cfg.Pipelines {
|
||||
for j, sink := range pipeline.Sinks {
|
||||
if sink.Type == "stdout" || sink.Type == "stderr" {
|
||||
if sink.Type == "console" {
|
||||
if sink.Options == nil {
|
||||
cfg.Pipelines[i].Sinks[j].Options = make(map[string]any)
|
||||
}
|
||||
@@ -193,10 +193,5 @@ func applyConsoleTargetOverrides(cfg *Config) error {
|
||||
}
|
||||
}
|
||||
|
||||
// Also update logging console target if applicable
|
||||
if cfg.Logging.Console != nil && consoleTarget == "split" {
|
||||
cfg.Logging.Console.Target = "split"
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -36,7 +36,7 @@ type PipelineConfig struct {
|
||||
|
||||
// Represents an input data source
|
||||
type SourceConfig struct {
|
||||
// Source type: "directory", "stdin", "tcp", "http"
|
||||
// Source type
|
||||
Type string `toml:"type"`
|
||||
|
||||
// Type-specific configuration options
|
||||
@@ -45,7 +45,7 @@ type SourceConfig struct {
|
||||
|
||||
// Represents an output destination
|
||||
type SinkConfig struct {
|
||||
// Sink type: "http", "tcp", "file", "stdout", "stderr"
|
||||
// Sink type
|
||||
Type string `toml:"type"`
|
||||
|
||||
// Type-specific configuration options
|
||||
@@ -404,7 +404,7 @@ func validateSink(pipelineName string, sinkIndex int, cfg *SinkConfig, allPorts
|
||||
}
|
||||
}
|
||||
|
||||
case "stdout", "stderr":
|
||||
case "console":
|
||||
// No specific validation needed for console sinks
|
||||
|
||||
default:
|
||||
|
||||
Reference in New Issue
Block a user