2025-01-09 12:46:36 +01:00
|
|
|
package middleware
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"net/http"
|
|
|
|
|
|
|
|
"github.com/zitadel/zitadel/internal/api/authz"
|
|
|
|
zhttp "github.com/zitadel/zitadel/internal/api/http/middleware"
|
|
|
|
smetadata "github.com/zitadel/zitadel/internal/api/scim/metadata"
|
|
|
|
"github.com/zitadel/zitadel/internal/query"
|
|
|
|
"github.com/zitadel/zitadel/internal/zerrors"
|
|
|
|
)
|
|
|
|
|
|
|
|
func ScimContextMiddleware(q *query.Queries) func(next zhttp.HandlerFuncWithError) zhttp.HandlerFuncWithError {
|
|
|
|
return func(next zhttp.HandlerFuncWithError) zhttp.HandlerFuncWithError {
|
|
|
|
return func(w http.ResponseWriter, r *http.Request) error {
|
|
|
|
ctx, err := initScimContext(r.Context(), q)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return next(w, r.WithContext(ctx))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func initScimContext(ctx context.Context, q *query.Queries) (context.Context, error) {
|
2025-01-29 15:23:56 +01:00
|
|
|
data := smetadata.NewScimContextData()
|
2025-01-09 12:46:36 +01:00
|
|
|
ctx = smetadata.SetScimContextData(ctx, data)
|
|
|
|
|
|
|
|
userID := authz.GetCtxData(ctx).UserID
|
|
|
|
metadata, err := q.GetUserMetadataByKey(ctx, false, userID, string(smetadata.KeyProvisioningDomain), false)
|
|
|
|
if err != nil {
|
|
|
|
if zerrors.IsNotFound(err) {
|
|
|
|
return ctx, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
return ctx, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if metadata == nil {
|
|
|
|
return ctx, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
data.ProvisioningDomain = string(metadata.Value)
|
|
|
|
if data.ProvisioningDomain != "" {
|
|
|
|
data.ExternalIDScopedMetadataKey = smetadata.ScopeExternalIdKey(data.ProvisioningDomain)
|
|
|
|
}
|
|
|
|
return smetadata.SetScimContextData(ctx, data), nil
|
|
|
|
}
|