// Package fakeauth provides middlewares that injects a fake userID, so the rest of the code // can continue to be multitenant. package fakeauth import ( "context" "net/http" "github.com/weaveworks/common/middleware" "github.com/weaveworks/common/server" "github.com/weaveworks/common/user" "google.golang.org/grpc" ) // SetupAuthMiddleware for the given server config. func SetupAuthMiddleware(config *server.Config, enabled bool, noGRPCAuthOn []string) middleware.Interface { if enabled { ignoredMethods := map[string]bool{} for _, m := range noGRPCAuthOn { ignoredMethods[m] = true } config.GRPCMiddleware = append(config.GRPCMiddleware, func(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp any, err error) { if ignoredMethods[info.FullMethod] { return handler(ctx, req) } return middleware.ServerUserHeaderInterceptor(ctx, req, info, handler) }) config.GRPCStreamMiddleware = append(config.GRPCStreamMiddleware, func(srv any, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { if ignoredMethods[info.FullMethod] { return handler(srv, ss) } return middleware.StreamServerUserHeaderInterceptor(srv, ss, info, handler) }, ) return middleware.AuthenticateUser } config.GRPCMiddleware = append(config.GRPCMiddleware, fakeGRPCAuthUniaryMiddleware, ) config.GRPCStreamMiddleware = append(config.GRPCStreamMiddleware, fakeGRPCAuthStreamMiddleware, ) return fakeHTTPAuthMiddleware } var fakeHTTPAuthMiddleware = middleware.Func(func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ctx := user.InjectOrgID(r.Context(), "fake") next.ServeHTTP(w, r.WithContext(ctx)) }) }) var fakeGRPCAuthUniaryMiddleware = func(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (any, error) { ctx = user.InjectOrgID(ctx, "fake") return handler(ctx, req) } var fakeGRPCAuthStreamMiddleware = func(srv any, ss grpc.ServerStream, _ *grpc.StreamServerInfo, handler grpc.StreamHandler) error { ctx := user.InjectOrgID(ss.Context(), "fake") return handler(srv, serverStream{ ctx: ctx, ServerStream: ss, }) } type serverStream struct { ctx context.Context grpc.ServerStream } func (ss serverStream) Context() context.Context { return ss.ctx }