oauth2-proxy/oauth2-proxy

View on GitHub
pkg/apis/middleware/scope.go

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
package middleware

import (
    "context"
    "net/http"

    "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/sessions"
)

type scopeKey string

// RequestScopeKey uses a typed string to reduce likelihood of clashing
// with other context keys
const RequestScopeKey scopeKey = "request-scope"

// RequestScope contains information regarding the request that is being made.
// The RequestScope is used to pass information between different middlewares
// within the chain.
type RequestScope struct {
    // ReverseProxy tracks whether OAuth2-Proxy is operating in reverse proxy
    // mode and if request `X-Forwarded-*` headers should be trusted
    ReverseProxy bool

    // RequestID is set to the request's `X-Request-Id` header if set.
    // Otherwise a random UUID is set.
    RequestID string

    // Session details the authenticated users information (if it exists).
    Session *sessions.SessionState

    // SaveSession indicates whether the session storage should attempt to save
    // the session or not.
    SaveSession bool

    // ClearSession indicates whether the user should be logged out or not.
    ClearSession bool

    // SessionRevalidated indicates whether the session has been revalidated since
    // it was loaded or not.
    SessionRevalidated bool

    // Upstream tracks which upstream was used for this request
    Upstream string
}

// GetRequestScope returns the current request scope from the given request
func GetRequestScope(req *http.Request) *RequestScope {
    scope := req.Context().Value(RequestScopeKey)
    if scope == nil {
        return nil
    }

    return scope.(*RequestScope)
}

// AddRequestScope adds a RequestScope to a request
func AddRequestScope(req *http.Request, scope *RequestScope) *http.Request {
    ctx := context.WithValue(req.Context(), RequestScopeKey, scope)
    return req.WithContext(ctx)
}