225 lines
7.3 KiB
Go
225 lines
7.3 KiB
Go
package main
|
|
|
|
import (
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/gorilla/mux"
|
|
"github.com/zeevdiukman/zprox/internal/auth"
|
|
"github.com/zeevdiukman/zprox/internal/config"
|
|
)
|
|
|
|
func BuildRoutes(routerData *config.Router, handlers map[string]func(string, string) http.HandlerFunc, epr *mux.Router) {
|
|
routerData.Routes.ForEach(func(routeID string, route *config.Route) string {
|
|
blockedRoutes := map[string]string{}
|
|
route.ForEachRule(func(routeID string, ruleName, ruleValue string) string {
|
|
if ruleName == "!Host" || ruleName == "!PathPrefix" || ruleName == "!Path" || ruleName == "!Headers" {
|
|
blockedRoutes[routeID] = ruleValue
|
|
return "break"
|
|
}
|
|
return ""
|
|
|
|
})
|
|
|
|
if len(blockedRoutes) > 0 {
|
|
nrBlock := epr.NewRoute().Name(routeID + "_block")
|
|
route.ForEachRule(func(routeID string, ruleName, ruleValue string) string {
|
|
switch ruleName {
|
|
case "!Host":
|
|
{
|
|
nrBlock = nrBlock.Host(ruleValue)
|
|
|
|
}
|
|
case "!PathPrefix":
|
|
{
|
|
nrBlock = nrBlock.PathPrefix(ruleValue)
|
|
|
|
}
|
|
case "!Path":
|
|
{
|
|
nrBlock = nrBlock.Path(ruleValue)
|
|
|
|
}
|
|
case "!Headers":
|
|
{
|
|
ruleValue := strings.Split(ruleValue, ":")
|
|
nrBlock = nrBlock.Headers(ruleValue[0], ruleValue[1])
|
|
}
|
|
default:
|
|
|
|
}
|
|
return ""
|
|
})
|
|
nrBlock.HandlerFunc(http.NotFound)
|
|
}
|
|
|
|
nr := epr.NewRoute().Name(routeID)
|
|
route.ForEachRule(func(routeID string, ruleName, ruleValue string) string {
|
|
switch ruleName {
|
|
case "Host":
|
|
{
|
|
nr = nr.Host(ruleValue)
|
|
|
|
}
|
|
case "PathPrefix":
|
|
{
|
|
nr = nr.PathPrefix(ruleValue)
|
|
|
|
}
|
|
case "Path":
|
|
{
|
|
nr = nr.Path(ruleValue)
|
|
|
|
}
|
|
case "Headers":
|
|
{
|
|
ruleValue := strings.Split(ruleValue, ":")
|
|
nr = nr.Headers(ruleValue[0], ruleValue[1])
|
|
}
|
|
default:
|
|
}
|
|
|
|
return ""
|
|
})
|
|
|
|
serviceURL := config.Data.Services[routerData.Service]
|
|
handler := handlers[routerData.EntryPoint]
|
|
|
|
h := handler(serviceURL, routeID)
|
|
nr.HandlerFunc(h)
|
|
return ""
|
|
})
|
|
}
|
|
|
|
func buildAuthRoutes(epmr *mux.Router, routerData *config.Router) {
|
|
if routerData.Auth.Enabled {
|
|
var authSubrouter *mux.Router
|
|
authConfig := config.Data.AuthMap[routerData.Auth.Provider]
|
|
authPrefix := authConfig.Paths.Prefix
|
|
// LoginPath := authConfig.Paths.Login
|
|
logoutPath := authConfig.Paths.Logout
|
|
callbackPath := authConfig.Paths.Callback
|
|
// PostLogoutPath := authConfig.Paths.PostLogout
|
|
authRoute := epmr.NewRoute().Name(routerData.Name)
|
|
routerData.Routes.ForEach(func(routeID string, v *config.Route) string {
|
|
if isRouteProtected, ok := v.Rule["Auth"]; (ok && isRouteProtected != "false") || !ok {
|
|
if host, ok := v.Rule["Host"]; ok && host != "" {
|
|
authSubrouter = authRoute.Host(host).PathPrefix(authPrefix + "/").Subrouter()
|
|
} else {
|
|
authSubrouter = authRoute.PathPrefix(authPrefix + "/").Subrouter()
|
|
}
|
|
authSubrouter.Use(func(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
})
|
|
// authSubrouter.Path(LoginPath).HandlerFunc(auth.LoginHandler(authConfig,routerData))
|
|
authSubrouter.Path(logoutPath).HandlerFunc(auth.LogoutHandler(authConfig, routerData))
|
|
authSubrouter.Path(callbackPath).HandlerFunc(auth.CallbackHandler(authConfig, routerData))
|
|
// authSubrouter.Path(PostLogoutPath).HandlerFunc(auth.PostLogoutHandler(authConfig, routerData))
|
|
return "break"
|
|
}
|
|
return ""
|
|
})
|
|
}
|
|
}
|
|
|
|
// func buildAuthRoutes(epmr *mux.Router, routerData *config.Router, handlers map[string]func(string, string) http.HandlerFunc) {
|
|
// if routerData.Auth.Enabled {
|
|
|
|
// host := ""
|
|
|
|
// routerData.Routes.ForEach(func(routeID string, v *config.Route) string {
|
|
// if isRouteProtected, ok := v.Rule["Auth"]; (ok && isRouteProtected != "false") || !ok {
|
|
// if _, ok := v.Rule["Host"]; ok {
|
|
// host = v.Rule["Host"]
|
|
|
|
// return "break"
|
|
// }
|
|
// }
|
|
// return ""
|
|
// })
|
|
// if host != "" {
|
|
// dump.P(host)
|
|
// // var r *mux.Router
|
|
// authConfig := config.Data.AuthMap[routerData.Auth.Provider]
|
|
// authPrefix := authConfig.Paths.Prefix
|
|
// // loginPath := authConfig.Paths.Login
|
|
// // logoutPath := authConfig.Paths.Logout
|
|
// callbackPath := authConfig.Paths.Callback
|
|
// // postLogoutPath := authConfig.Paths.PostLogout
|
|
// authRoute := epmr.NewRoute().Name(routerData.Name)
|
|
// // authSubrouter = authRoute.Host(host).PathPrefix(authPrefix).Subrouter()
|
|
// authRoute = authRoute.PathPrefix(authPrefix)
|
|
// authRoute = authRoute.Path("/callback")
|
|
// authRoute.Handler(auth.CallbackHandler(authConfig, routerData))
|
|
// handler := handlers[routerData.EntryPoint]
|
|
// h := handler(serviceURL, routeID)
|
|
// nr.HandlerFunc(h)
|
|
// // authSubrouter.Path(loginPath).HandlerFunc(auth.LoginHandler(authConfig, routerData))
|
|
// // authSubrouter.Path(logoutPath).HandlerFunc(auth.LogoutHandler(authConfig, routerData))
|
|
// // authSubrouter.Path(callbackPath).HandlerFunc(auth.CallbackHandler(authConfig, routerData))
|
|
// // authSubrouter.Path(postLogoutPath).HandlerFunc(auth.PostLogoutHandler(authConfig, routerData))
|
|
// }
|
|
|
|
// // if isRouteProtected, ok := route.Rule["Auth"]; (ok && isRouteProtected != "false") || !ok {
|
|
// // if host, ok := v.Rule["Host"]; ok && host != "" {
|
|
// // dump.P(authPrefix)
|
|
// // return "break"
|
|
// // }
|
|
// // } else {
|
|
// // authSubrouter = authRoute.PathPrefix(authPrefix).Subrouter()
|
|
// // }
|
|
// // authSubrouter.Use(func(next http.Handler) http.Handler {
|
|
// // return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
// // next.ServeHTTP(w, r)
|
|
// // })
|
|
// // serviceURL := config.Data.Services[routerData.Service]
|
|
|
|
// // handler := handlers[routerData.EntryPoint]
|
|
// // h := handler(serviceURL, routeID)
|
|
// // nr.HandlerFunc(h)
|
|
|
|
// // return ""
|
|
// // })
|
|
|
|
// // return "break"
|
|
// // }
|
|
// // return ""
|
|
// // })
|
|
// }
|
|
// }
|
|
|
|
// func buildAuthRoutes(epmr *mux.Router, routerData *config.Router) {
|
|
// if routerData.Auth.Enabled {
|
|
// var authSubrouter *mux.Router
|
|
// authConfig := config.Data.AuthMap[routerData.Auth.Provider]
|
|
// authPrefix := authConfig.Paths.Prefix
|
|
// LoginPath := authConfig.Paths.Login
|
|
// LogoutPath := authConfig.Paths.Logout
|
|
// CallbackPath := authConfig.Paths.Callback
|
|
// PostLogoutPath := authConfig.Paths.PostLogout
|
|
// authRoute := epmr.NewRoute().Name(routerData.Name)
|
|
// routerData.Routes.ForEach(func(routeID string, v *config.Route) string {
|
|
// if isRouteProtected, ok := v.Rule["Auth"]; (ok && isRouteProtected != "false") || !ok {
|
|
// if host, ok := v.Rule["Host"]; ok && host != "" {
|
|
// authSubrouter = authRoute.Host(host).PathPrefix(authPrefix + "/").Subrouter()
|
|
// } else {
|
|
// authSubrouter = authRoute.PathPrefix(authPrefix + "/").Subrouter()
|
|
// }
|
|
// authSubrouter.Use(func(next http.Handler) http.Handler {
|
|
// return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
// next.ServeHTTP(w, r)
|
|
// })
|
|
// })
|
|
// authSubrouter.Path(LoginPath).HandlerFunc(auth.LoginHandler(authConfig))
|
|
// authSubrouter.Path(LogoutPath).HandlerFunc(auth.LogoutHandler(authConfig, routerData))
|
|
// authSubrouter.Path(CallbackPath).HandlerFunc(auth.CallbackHandler(authConfig))
|
|
// authSubrouter.Path(PostLogoutPath).HandlerFunc(auth.PostLogoutHandler(authConfig, routerData))
|
|
// return "break"
|
|
// }
|
|
// return ""
|
|
// })
|
|
// }
|
|
// }
|