package webhooks import ( "context" "encoding/hex" "fmt" "time" "git.sr.ht/~sircmpwn/core-go/auth" ) type AuthConfig struct { TokenHash string Grants string ClientID *string Expires time.Time } // Pulls auth details out of the config context and returns a structure of all // of the information necessary to build a webhook context with the same // authentication parameters. func NewAuthConfig(ctx context.Context) (AuthConfig, error) { user := auth.ForContext(ctx) switch user.AuthMethod { case auth.AUTH_OAUTH_LEGACY: return AuthConfig{}, fmt.Errorf("Native webhooks are not supported with legacy OAuth") case auth.AUTH_OAUTH2: ac := AuthConfig{ TokenHash: hex.EncodeToString(user.TokenHash[:]), Grants: user.BearerToken.Grants, Expires: user.BearerToken.Expires.Time(), } if user.BearerToken.ClientID != "" { clientID := user.BearerToken.ClientID ac.ClientID = &clientID } return ac, nil case auth.AUTH_COOKIE: // TODO: Should this work? return AuthConfig{}, fmt.Errorf("Native webhooks are not supported with web authentication") case auth.AUTH_INTERNAL: // TODO: Should this work? panic("Internal webtoken auth is not supported") } panic("Unreachable") }