From 5724939500e6dff5e0e73096552424f90c6d4d59 Mon Sep 17 00:00:00 2001 From: Zeev Diukman Date: Mon, 3 Mar 2025 14:27:20 +0000 Subject: [PATCH] 3 --- .air.toml | 6 +- .air.toml.bkup | 52 ++++ .vscode/launch.json | 15 ++ cmd/server/handlers.go | 130 +++++----- cmd/server/main.go | 317 +++++++++++++------------ config.yml | 44 ++-- internal/config/config.go | 95 ++++++-- internal/config/types.go | 93 -------- internal/config/types_auth_.go | 36 +++ internal/config/types_config.go | 20 ++ internal/config/types_entry_points.go | 8 + internal/config/types_reverse_proxy.go | 12 + internal/config/types_tls.go | 15 ++ internal/router/router.go | 69 +++++- pkg/helper/helper.go | 18 +- tmp/build-errors.log | 2 +- tmp/main | Bin 13311269 -> 13331352 bytes 17 files changed, 576 insertions(+), 356 deletions(-) create mode 100644 .air.toml.bkup create mode 100644 .vscode/launch.json delete mode 100644 internal/config/types.go create mode 100644 internal/config/types_auth_.go create mode 100644 internal/config/types_config.go create mode 100644 internal/config/types_entry_points.go create mode 100644 internal/config/types_reverse_proxy.go create mode 100644 internal/config/types_tls.go diff --git a/.air.toml b/.air.toml index a924b80..1f3f809 100644 --- a/.air.toml +++ b/.air.toml @@ -5,16 +5,16 @@ tmp_dir = "tmp" [build] args_bin = [] bin = "./tmp/main" - cmd = "go build -o ./tmp/main ./cmd/server/." + cmd = "go build -buildvcs=false -o ./tmp/main ./cmd/server/" delay = 1000 - exclude_dir = ["assets", "tmp", "vendor", "testdata","docker"] + exclude_dir = ["assets", "tmp", "vendor", "testdata"] exclude_file = [] exclude_regex = ["_test.go"] exclude_unchanged = false follow_symlink = false full_bin = "" include_dir = [] - include_ext = ["go", "tpl", "tmpl", "html","yml","yaml"] + include_ext = ["go", "tpl", "tmpl", "html","yml"] include_file = [] kill_delay = "0s" log = "build-errors.log" diff --git a/.air.toml.bkup b/.air.toml.bkup new file mode 100644 index 0000000..a924b80 --- /dev/null +++ b/.air.toml.bkup @@ -0,0 +1,52 @@ +root = "." +testdata_dir = "testdata" +tmp_dir = "tmp" + +[build] + args_bin = [] + bin = "./tmp/main" + cmd = "go build -o ./tmp/main ./cmd/server/." + delay = 1000 + exclude_dir = ["assets", "tmp", "vendor", "testdata","docker"] + exclude_file = [] + exclude_regex = ["_test.go"] + exclude_unchanged = false + follow_symlink = false + full_bin = "" + include_dir = [] + include_ext = ["go", "tpl", "tmpl", "html","yml","yaml"] + include_file = [] + kill_delay = "0s" + log = "build-errors.log" + poll = false + poll_interval = 0 + post_cmd = [] + pre_cmd = [] + rerun = false + rerun_delay = 500 + send_interrupt = false + stop_on_error = false + +[color] + app = "" + build = "yellow" + main = "magenta" + runner = "green" + watcher = "cyan" + +[log] + main_only = false + silent = false + time = false + +[misc] + clean_on_exit = false + +[proxy] + app_port = 0 + enabled = false + proxy_port = 0 + +[screen] + clear_on_rebuild = false + keep_scroll = true diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..55240e5 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Attach to Process", + "type": "go", + "request": "attach", + "mode": "local", + "processId": 0 + } + ] +} \ No newline at end of file diff --git a/cmd/server/handlers.go b/cmd/server/handlers.go index 9f1cb53..968d924 100644 --- a/cmd/server/handlers.go +++ b/cmd/server/handlers.go @@ -10,87 +10,85 @@ import ( ) func CallbackHandler(w http.ResponseWriter, r *http.Request) { - config.Wrapper(func(c *config.Config) { - // ctx := context.Background() - query := r.URL.Query() + configData := config.Get() - code := query.Get("code") - state := query.Get("state") + // ctx := context.Background() + query := r.URL.Query() - verifier := app.SessionManager.GetString(r.Context(), "code_verifier") - if verifier == "" { - http.Error(w, "Code verifier not found in session", http.StatusBadRequest) - return - } - expectedState := app.SessionManager.GetString(r.Context(), "state") - if state != expectedState { - http.Error(w, "Invalid state parameter", http.StatusBadRequest) - return - } - // originalURL, err := decodeState(state) - // if err != nil { - // dump.P(err.Error()) - // http.Error(w, "Invalid state", http.StatusBadRequest) - // return - // } - originalPath := app.SessionManager.GetString(r.Context(), "original_path") + code := query.Get("code") + state := query.Get("state") - authName := c.GetAuthNameByDomain(r.Host) - token, fullResponse, e := exchangeCode(code, verifier, c, authName) - if e != nil { - dump.Println("exchangeCode: " + e.Error()) - } + verifier := appData.SessionManager.GetString(r.Context(), "code_verifier") + if verifier == "" { + http.Error(w, "Code verifier not found in session", http.StatusBadRequest) + return + } + expectedState := appData.SessionManager.GetString(r.Context(), "state") + if state != expectedState { + http.Error(w, "Invalid state parameter", http.StatusBadRequest) + return + } + originalURL, err := decodeState(state) + if err != nil { + dump.P(err.Error()) + http.Error(w, "Invalid state", http.StatusBadRequest) + return + } + dump.P("Original_Path: " + originalURL) + // originalPath := appData.SessionManager.GetString(r.Context(), "original_path") - app.SessionManager.Put(r.Context(), "access_token", token.AccessToken) - app.SessionManager.Put(r.Context(), "full_token", fullResponse) + authName := configData.GetAuthNameByDomain(r.Host) + token, fullResponse, e := exchangeCode(code, verifier, authName) + if e != nil { + dump.Println("exchangeCode: " + e.Error()) + } - // SetAuthHeader(w, token.AccessToken) - http.Redirect(w, r, originalPath, http.StatusFound) - // http.Redirect(w, r, originalURL, http.StatusFound) - }) + appData.SessionManager.Put(r.Context(), "access_token", token.AccessToken) + appData.SessionManager.Put(r.Context(), "full_token", fullResponse) + + // SetAuthHeader(w, token.AccessToken) + // http.Redirect(w, r, originalPath, http.StatusFound) + http.Redirect(w, r, originalURL, http.StatusFound) } func LogoutHandler(w http.ResponseWriter, r *http.Request) { - config.Wrapper(func(c *config.Config) { + configData := config.Get() - //TODO: only after returninig, delete the session! - app.SessionManager.Remove(r.Context(), "access_token") - app.SessionManager.Remove(r.Context(), "full_token") + //TODO: only after returninig, delete the session! + appData.SessionManager.Remove(r.Context(), "access_token") + appData.SessionManager.Remove(r.Context(), "full_token") - authName := c.DataMaps.DomainToAuth[r.Host] - a := c.Auth[authName] - u := a.OpenID.EndPoints.Logout - http.Redirect(w, r, u, http.StatusFound) - }) + authName := configData.DataMaps.DomainToAuth[r.Host] + a := configData.AuthMap[authName] + u := a.OpenID.EndPoints.Logout + http.Redirect(w, r, u, http.StatusFound) } func LoginHandler(w http.ResponseWriter, r *http.Request) { - config.Wrapper(func(c *config.Config) { + configData := config.Get() - authName := c.DataMaps.DomainToAuth[r.Host] + authName := configData.DataMaps.DomainToAuth[r.Host] - // state := helper.RandStringByBits(64) - nonce := helper.RandStringByBits(64) - authURL, _ := url.Parse(c.Auth[authName].OpenID.EndPoints.Auth) - query := authURL.Query() + // state := helper.RandStringByBits(64) + nonce := helper.RandStringByBits(64) + authURL, _ := url.Parse(configData.AuthMap[authName].OpenID.EndPoints.Auth) + query := authURL.Query() - codeVerifier, _ := generateCodeVerifier() - codeChallenge := generateCodeChallenge(codeVerifier) - - originalPath := app.SessionManager.GetString(r.Context(), "original_path") - state := generateState(url.QueryEscape(originalPath)) - query.Set("client_id", c.Auth[authName].OpenID.ClientID) - query.Set("response_type", "code") - query.Set("scope", "openid") - query.Set("redirect_uri", c.Auth[authName].OpenID.RedirectURI) - query.Set("code_challenge", codeChallenge) - query.Set("code_challenge_method", "S256") - query.Set("state", state) - query.Set("nonce", nonce) - authURL.RawQuery = query.Encode() - app.SessionManager.Put(r.Context(), "state", state) - app.SessionManager.Put(r.Context(), "code_verifier", codeVerifier) - http.Redirect(w, r, authURL.String(), http.StatusFound) - }) + codeVerifier, _ := generateCodeVerifier() + codeChallenge := generateCodeChallenge(codeVerifier) + originalPath := appData.SessionManager.GetString(r.Context(), "original_path") + state := generateState(url.QueryEscape(originalPath)) + query.Set("client_id", configData.AuthMap[authName].OpenID.ClientID) + query.Set("response_type", "code") + query.Set("scope", "openid") + query.Set("redirect_uri", configData.AuthMap[authName].OpenID.RedirectURI) + query.Set("code_challenge", codeChallenge) + query.Set("code_challenge_method", "S256") + query.Set("state", state) + query.Set("nonce", nonce) + authURL.RawQuery = query.Encode() + appData.SessionManager.Put(r.Context(), "state", state) + appData.SessionManager.Put(r.Context(), "code_verifier", codeVerifier) + http.Redirect(w, r, authURL.String(), http.StatusFound) } diff --git a/cmd/server/main.go b/cmd/server/main.go index ddef881..02b7388 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -36,87 +36,94 @@ type EntryPoint struct { type ReverseProxies map[string]ReverseProxy type ReverseProxy *httputil.ReverseProxy -var app = logic.NewApp() +var ( + appData *logic.App = logic.NewApp() + + // configData *config.Config +) func main() { helper.AppRunner(func() { - config.Wrapper(func(c *config.Config) { - groups := logic.NewGroups() - mainRouter := router.New() - groups.ForEach(func(k string, g *logic.Group) { - groupSubRouter := mainRouter.Mux.NewRoute().Subrouter() - groupSubRouter.Use(Domain_Middleware) - for k := range g.ReverseProxies { - rpConfig := c.ReverseProxies[k] - domain := rpConfig.Domain - proxy := reverse_proxy.New(rpConfig.Host) - proxy.Name = domain - newRoute := groupSubRouter.NewRoute() - subRouter := newRoute.Host(domain).Subrouter() - if rpConfig.Auth != "" { - if _, ok := c.Auth[rpConfig.Auth]; !ok { - err := errors.New("Error: Auth " + rpConfig.Auth + " not exist!") - panic(err.Error()) - } - pths := c.Auth[rpConfig.Auth].Paths - authRoute := subRouter.NewRoute() - subRouter.Use(Middleware_SetHeaders) - authSubRouter := authRoute.PathPrefix(pths.Prefix).Subrouter() - authSubRouter.Path(pths.Login).Handler(http.HandlerFunc(LoginHandler)) - authSubRouter.Path(pths.Logout).Handler(http.HandlerFunc(LogoutHandler)) - authSubRouter.Path(pths.Callback).Handler(http.HandlerFunc(CallbackHandler)) - subRouter.Use(authMiddleware) + configData := config.Get() + //////////TESTING AREA////////////////// + + //////////////////////////////////////// + groups := logic.NewGroups() + mainRouter := router.New() + groups.ForEach(func(groupName string, g *logic.Group) { + mainRouter.AddGroupRouter(groupName) + mainRouter.GetGroupRouter(groupName).Mux.Use(Domain_Middleware) + for k := range g.ReverseProxies { + rpConfig := configData.ReverseProxies[k] + domain := rpConfig.Domain + proxy := reverse_proxy.New(rpConfig.Host) + proxy.Name = domain + mainRouter.AddHostSubRouter(groupName, domain) + if rpConfig.Auth != "" { + if _, ok := configData.AuthMap[rpConfig.Auth]; !ok { + err := errors.New("Error: Auth " + rpConfig.Auth + " not exist!") + panic(err.Error()) } - subRouter.PathPrefix("/").Handler(proxy.Httputil) - - // Filter out static file requests first + pths := configData.AuthMap[rpConfig.Auth].Paths + hostRouterMux := mainRouter.GetHostSubRouter(groupName, domain).Mux + hostRouterMux.Use(Middleware_SetHeaders) + hostRouterMux.Use(authMiddleware) + authRoute := hostRouterMux.NewRoute() + authSubRouter := authRoute.PathPrefix(pths.Prefix).Subrouter() + authSubRouter.Path(pths.Login).Handler(http.HandlerFunc(LoginHandler)) + authSubRouter.Path(pths.Logout).Handler(http.HandlerFunc(LogoutHandler)) + authSubRouter.Path(pths.Callback).Handler(http.HandlerFunc(CallbackHandler)) } + mainRouter.GetHostSubRouter(groupName, domain).Mux.PathPrefix("/").Handler(proxy.Httputil) + // Filter out static file requests first - if len(g.ReverseProxies) > 0 { - tlsConfig := &tls.Config{ + } - GetCertificate: func(info *tls.ClientHelloInfo) (*tls.Certificate, error) { - // crt, key := "", "" + if len(g.ReverseProxies) > 0 { + tlsConfig := &tls.Config{ - crt, key := c.GetCertsPairByDomain(info.ServerName) + GetCertificate: func(info *tls.ClientHelloInfo) (*tls.Certificate, error) { + // crt, key := "", "" - if crt == "" && key == "" { - // crt = c.TLS.Certs["default"].Cert - // key = c.TLS.Certs["default"].Key - // panic("Error: TLS cert and key not found!") + crt, key := configData.GetCertsPairByDomain(info.ServerName) + + if crt == "" && key == "" { + // crt = configData.TLS.Certs["default"].Cert + // key = configData.TLS.Certs["default"].Key + // panic("Error: TLS cert and key not found!") - } - cert, err := loadCertificate(crt, key) - if err != nil { - return nil, err - } - return &cert, nil - }, - } - server := &http.Server{ - Addr: ":" + g.Port, - Handler: app.SessionManager.LoadAndSave(groupSubRouter), - TLSConfig: tlsConfig, - } - var err error - go func() { - ipAddr := helper.GetIP() - log.Println("Test server is running at http://" + ipAddr + ":" + g.Port) - if g.TLS { - err = server.ListenAndServeTLS("", "") - } else { - err = server.ListenAndServe() } + cert, err := loadCertificate(crt, key) if err != nil { - log.Println(err.Error()) + return nil, err } - }() + return &cert, nil + }, } + server := &http.Server{ + Addr: ":" + g.Port, + Handler: appData.SessionManager.LoadAndSave(mainRouter.GetGroupRouter(groupName).Mux), + TLSConfig: tlsConfig, + } + var err error + go func() { + ipAddr := helper.GetIP() + log.Println("Test server is running at http://" + ipAddr + ":" + g.Port) + if g.TLS { + err = server.ListenAndServeTLS("", "") + } else { + err = server.ListenAndServe() + } + if err != nil { + log.Println(err.Error()) + } + }() + } - }) - helper.StartTestHTTPServer(3000) }) + helper.StartTestHTTPServer(3000, "app") + helper.StartTestHTTPServer(3001, "oded") }) } @@ -130,67 +137,69 @@ func main() { func authMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + configData := config.Get() + currentPath := r.URL.Path + authName := configData.GetAuthNameByDomain(r.Host) + loginPath := configData.AuthMap[authName].Paths.Prefix + configData.AuthMap[authName].Paths.Login + logoutPath := configData.AuthMap[authName].Paths.Prefix + configData.AuthMap[authName].Paths.Logout + callbackPath := configData.AuthMap[authName].Paths.Prefix + configData.AuthMap[authName].Paths.Callback + // TODO: mark auth reverse proxy in yaml + proxyName := configData.GetProxyNameByDomain(r.Host) + if configData.ReverseProxies[proxyName].IsAuthServer { + next.ServeHTTP(w, r) + return + } - config.Wrapper(func(c *config.Config) { - currentPath := r.URL.Path - authName := c.GetAuthNameByDomain(r.Host) - loginPath := c.Auth[authName].Paths.Prefix + c.Auth[authName].Paths.Login - logoutPath := c.Auth[authName].Paths.Prefix + c.Auth[authName].Paths.Logout - callbackPath := c.Auth[authName].Paths.Prefix + c.Auth[authName].Paths.Callback - // TODO: mark auth reverse proxy in yaml + switch currentPath { + case loginPath: + { + // fmt.Fprintln(w, "LOGIN") + next.ServeHTTP(w, r) - if r.Host == "keycloak.z.com" { + } + case logoutPath: + { + next.ServeHTTP(w, r) + // return + } + case callbackPath: + { + + next.ServeHTTP(w, r) + // return + } + default: + { + + accessToken := appData.SessionManager.GetString(r.Context(), "access_token") + if accessToken == "" { + + authName := configData.DataMaps.DomainToAuth[r.Host] + http.Redirect(w, r, configData.AuthMap[authName].Paths.Prefix+configData.AuthMap[authName].Paths.Login, http.StatusFound) + return + } + // auth.SetAuthHeader(w, accessToken) + a := configData.AuthMap[authName] + pths := a.Paths + prefix := pths.Prefix + login := pths.Login + logout := pths.Logout + loginPath := prefix + login + logoutPath := prefix + logout + if loginPath == r.URL.Path || logoutPath == r.URL.Path { + next.ServeHTTP(w, r) + // return + } + + tokenOk := IsAuthorizedJWT(accessToken, authName) + + if !tokenOk { + http.Redirect(w, r, loginPath, http.StatusFound) + return + } next.ServeHTTP(w, r) } - switch currentPath { - case loginPath: - { - // fmt.Fprintln(w, "LOGIN") - next.ServeHTTP(w, r) - - } - case logoutPath: - { - next.ServeHTTP(w, r) - // return - } - case callbackPath: - { - - next.ServeHTTP(w, r) - // return - } - default: - { - - accessToken := app.SessionManager.GetString(r.Context(), "access_token") - if accessToken == "" { - authName := c.DataMaps.DomainToAuth[r.Host] - http.Redirect(w, r, c.Auth[authName].Paths.Prefix+c.Auth[authName].Paths.Login, http.StatusFound) - return - } - // auth.SetAuthHeader(w, accessToken) - a := c.Auth[authName] - pths := a.Paths - prefix := pths.Prefix - login := pths.Login - logout := pths.Logout - loginPath := prefix + login - logoutPath := prefix + logout - if loginPath == r.URL.Path || logoutPath == r.URL.Path { - next.ServeHTTP(w, r) - // return - } - - tokenOk := IsAuthorizedJWT(accessToken, c, "default") - if !tokenOk { - http.Redirect(w, r, loginPath, http.StatusFound) - return - } - next.ServeHTTP(w, r) - } - } - }) + } }) } @@ -200,8 +209,8 @@ func Domain_Middleware(next http.Handler) http.Handler { // c := config.Get() // requestedPath := r.URL.Path - // authName := c.GetAuthNameByDomain(r.Host) - // auth := c.Auth[authName] + // authName := configData.GetAuthNameByDomain(r.Host) + // auth := configData.AuthMap[authName] // excludedPaths := []string{ // auth.Paths.Prefix + auth.Paths.Login, // auth.Paths.Prefix + auth.Paths.Callback, @@ -210,7 +219,7 @@ func Domain_Middleware(next http.Handler) http.Handler { // contains := helper.IsSliceContains(excludedPaths, requestedPath) // contains := slices.Contains(excludedPaths, requestedPath) // if !contains { - // app.SessionManager.Put(r.Context(), "original_path", requestedPath) + // appData.SessionManager.Put(r.Context(), "original_path", requestedPath) // } // dump.P(requestedPath) @@ -303,12 +312,22 @@ func decodeState(encodedState string) (string, error) { } return stateData["redirect_uri"], nil } -func exchangeCode(code string, verifier string, c *config.Config, authName string) (*TokenResponse, string, error) { + +func exchangeCode(code string, verifier string, authName string) (*TokenResponse, string, error) { + configData := config.Get() + clientID := configData.AuthMap[authName].OpenID.ClientID + clientSecert := configData.AuthMap[authName].OpenID.ClientSecert + redirectURI := configData.AuthMap[authName].OpenID.RedirectURI + // if strings.Contains(redirectURI,"<{{dynamic}}>") { + // configData.GenerateDynamicRedirectUri() + // } + + // GenerateDynamicRedirectUri data := url.Values{} data.Set("grant_type", "authorization_code") - data.Set("client_id", c.Auth[authName].OpenID.ClientID) - data.Set("client_secret", c.Auth[authName].OpenID.ClientSecert) - data.Set("redirect_uri", c.Auth[authName].OpenID.RedirectURI) + data.Set("client_id", clientID) + data.Set("client_secret", clientSecert) + data.Set("redirect_uri", redirectURI) data.Set("code", code) data.Set("scope", "openid zapp") if verifier != "" { @@ -318,7 +337,7 @@ func exchangeCode(code string, verifier string, c *config.Config, authName strin TLSClientConfig: &tls.Config{InsecureSkipVerify: DEVELOPMENT}, } client := &http.Client{Transport: tr} - u := c.Auth[authName].OpenID.EndPoints.Token + u := configData.AuthMap[authName].OpenID.EndPoints.Token r, _ := http.NewRequest(http.MethodPost, u, strings.NewReader(data.Encode())) r.Header.Add("Content-Type", "application/x-www-form-urlencoded") resp, err := client.Do(r) @@ -358,7 +377,9 @@ func generateCodeChallenge(verifier string) string { return base64.RawURLEncoding.EncodeToString(hash[:]) } -func IsAuthorizedJWT(rawAccessToken string, c *config.Config, authName string) bool { +func IsAuthorizedJWT(rawAccessToken string, authName string) bool { + configData := config.Get() + tr := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, } @@ -367,14 +388,14 @@ func IsAuthorizedJWT(rawAccessToken string, c *config.Config, authName string) b Transport: tr, } ctx := oidc.ClientContext(context.Background(), client) - provider, err := oidc.NewProvider(ctx, c.Auth[authName].OpenID.EndPoints.Issuer) + provider, err := oidc.NewProvider(ctx, configData.AuthMap[authName].OpenID.EndPoints.Issuer) if err != nil { dump.Println("authorisation failed while getting the provider: " + err.Error()) return false } oidcConfig := &oidc.Config{ - ClientID: c.Auth[authName].OpenID.ClientID, + ClientID: configData.AuthMap[authName].OpenID.ClientID, } verifier := provider.Verifier(oidcConfig) idToken, err := verifier.Verify(ctx, rawAccessToken) @@ -394,22 +415,22 @@ func IsAuthorizedJWT(rawAccessToken string, c *config.Config, authName string) b /////////////////////////////////// /////////////////////////////////// -func isStaticFileRequest(path string) bool { - // Check for common static file prefixes - if strings.HasPrefix(path, "/static/") || strings.HasPrefix(path, "/assets/") { - return true - } +// func isStaticFileRequest(path string) bool { +// // Check for common static file prefixes +// if strings.HasPrefix(path, "/static/") || strings.HasPrefix(path, "/assets/") { +// return true +// } - // Check for common static file extensions - staticExtensions := []string{ - ".css", ".js", ".jpg", ".jpeg", ".png", ".gif", ".svg", ".ico", - } +// // Check for common static file extensions +// staticExtensions := []string{ +// ".css", ".js", ".jpg", ".jpeg", ".png", ".gif", ".svg", ".ico", +// } - for _, ext := range staticExtensions { - if strings.HasSuffix(path, ext) { - return true - } - } +// for _, ext := range staticExtensions { +// if strings.HasSuffix(path, ext) { +// return true +// } +// } - return false -} +// return false +// } diff --git a/config.yml b/config.yml index e81ac4b..d4652ae 100644 --- a/config.yml +++ b/config.yml @@ -8,7 +8,6 @@ reverse_proxies: enabled: true certs: default auth_server: true - app: domain: app.z.com host: http://127.0.0.1:3000 @@ -16,7 +15,16 @@ reverse_proxies: tls: enabled: true certs: default - auth: default + auth: app_auth + oded: + domain: oded.z.com + host: http://127.0.0.1:3001 + entry_point: https + tls: + enabled: true + certs: default + auth: oded_auth + tls: certs: @@ -32,7 +40,7 @@ entry_points: port: 80 auth: - default: + app_auth: paths: prefix: /auth login: /login @@ -43,19 +51,25 @@ auth: realm: dev client_id: dev_client client_secret: dWhSJgARBAuBAXN7sUTpqpIq2sKQdugs - redirect_uri: https://app.z.com/auth/callback + redirect_uri: <{{dynamic}}>/auth/callback post_logout_redirect_uri: https://app.z.com/auth/logout - config_path: /realms/{{realm}}/.well-known/openid-configuration - # config_fields: - # - issuer - # - authorization_endpoint - # - token_endpoint - # - introspection_endpoint - # - userinfo_endpoint - # - end_session_endpoint - # - jwks_uri - # issuer: http://127.0.0.1:8080/realms/dev - + config_path: /realms/<{{realm}}>/.well-known/openid-configuration + oded_auth: + paths: + prefix: /auth + login: /login + logout: /logout + callback: /callback + open_id: + host: http://127.0.0.1:8080 + realm: dev + client_id: dev_client + client_secret: dWhSJgARBAuBAXN7sUTpqpIq2sKQdugs + # redirect_uri: https://oded.z.com/auth/callback + redirect_uri: <{{dynamic}}>/auth/callback + post_logout_redirect_uri: https://oded.z.com/auth/logout + # post_logout_redirect_uri: <{{dynamic}}>/auth/logout + config_path: /realms/<{{realm}}>/.well-known/openid-configuration # scope: openid profile email diff --git a/internal/config/config.go b/internal/config/config.go index 1ce23b1..9a7f7ee 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -15,20 +15,28 @@ const Viper_File_Name string = "config" const Viper_File_Type string = "yaml" const Viper_File_Path string = "." -var c *Config +var ( + configData *Config +) func init() { - helper.New().Screen.Clear() - c = createConfig() - + h := helper.New() + h.Screen.Clear() + configData = createConfig() } + func Wrapper(fn func(c *Config)) { - fn(c) + fn(configData) } func Get() *Config { - return c + + return configData +} +func Get2() *Config { + return configData } func createConfig() *Config { + c := &Config{} c.initViper() c.setViperOptions(Viper_File_Name, Viper_File_Type, Viper_File_Path) @@ -76,6 +84,19 @@ func (rp *ReverseProxies) ForEach(fn func(rpName string, rpConfig *ReverseProxy) } } +func (rp *ReverseProxies) ForEachReturn(fn func(rpName string, rpConfig *ReverseProxy) (res ForEachReturn)) *ForEachReturn { + res := ForEachReturn{} + for rpName, rpData := range *rp { + res = append(fn(rpName, &rpData), res) + } + return &res +} + +// func (rp AuthMap) ForEach(fn func(authName string, authConfig Auth)) { +// for authName, authConfig := range rp { +// fn(authName, authConfig) +// } +// } func (c *Config) fetchEndPointsByAuthName(authName string) map[string]any { configURL := c.KeycloakWellknownURL(authName) resp := helper.IsFetchOK[EndPoints](configURL, "", http.Get) @@ -89,10 +110,10 @@ func (c *Config) fetchEndPointsByAuthName(authName string) map[string]any { } func (c *Config) initOpenIDEndPoints() { - for authName := range c.Auth { + for authName := range c.AuthMap { data := c.fetchEndPointsByAuthName(authName) - c.Auth[authName].OpenID.EndPoints = &EndPoints{ + c.AuthMap[authName].OpenID.EndPoints = &EndPoints{ Issuer: data["issuer"].(string), Auth: data["authorization_endpoint"].(string), Introspection: data["introspection_endpoint"].(string), @@ -107,17 +128,35 @@ func (c *Config) initOpenIDEndPoints() { } func (c *Config) KeycloakWellknownURL(authName string) string { - if _, ok := c.Auth[authName]; !ok { + if _, ok := c.AuthMap[authName]; !ok { return "" } - hostUrl := c.Auth[authName].OpenID.Host - realm := c.Auth[authName].OpenID.Realm - configPath := c.Auth[authName].OpenID.ConfigPath + hostUrl := c.AuthMap[authName].OpenID.Host + realm := c.AuthMap[authName].OpenID.Realm + configPath := c.AuthMap[authName].OpenID.ConfigPath u := hostUrl - u += strings.ReplaceAll(configPath, "{{realm}}", realm) + u += strings.ReplaceAll(configPath, "<{{realm}}>", realm) return u } +func (c *Config) GenerateDynamicRedirectUri(proxyName string, authName string) string { + if _, ok := c.AuthMap[authName]; !ok { + return "" + } + + proto := "http" + + domain := c.ReverseProxies[proxyName].Domain + tls := c.ReverseProxies[proxyName].TLS.Enabled + if tls { + proto = "https" + } + redirectURI := c.AuthMap[authName].OpenID.RedirectURI + u := redirectURI + u = strings.ReplaceAll(redirectURI, "<{{dynamic}}>", proto+"://"+domain) + + return u +} func (c *Config) initDomainToProxyNameMap() { mp := make(map[string]string) c.ReverseProxies.ForEach(func(rpName string, rpConfig *ReverseProxy) { @@ -126,17 +165,22 @@ func (c *Config) initDomainToProxyNameMap() { c.DataMaps.DomainToProxy = mp } func (c *Config) initDomainToProxyAuthName() { + authMap := map[string]int{} - for authName := range c.Auth { + for authName := range c.AuthMap { authMap[authName] = 1 } + mp := make(map[string]string) c.ReverseProxies.ForEach(func(rpName string, rpConfig *ReverseProxy) { if v, ok := authMap[rpConfig.Auth]; ok && v == 1 { mp[rpConfig.Domain] = rpConfig.Auth + } + }) c.DataMaps.DomainToAuth = mp + } func (c *Config) initDomainToCertName() { crtMap := map[string]int{} @@ -155,6 +199,7 @@ func (c *Config) initDomainToCertName() { func (c *Config) GetAuthNameByDomain(domain string) string { return c.DataMaps.DomainToAuth[domain] } + func (c *Config) GetProxyNameByDomain(domain string) string { return c.DataMaps.DomainToProxy[domain] } @@ -174,5 +219,25 @@ func (c *Config) GetCertsPairByDomain(domain string) (string, string) { } return crt, key - +} + +func (c *Config) GetProxiesSliceByAuthName(authName string) []string { + slc := &[]string{} + c.ReverseProxies.ForEach(func(rpName string, rpConfig *ReverseProxy) { + isOK := true + if authName != rpConfig.Auth { + isOK = false + } + if _, ok := c.AuthMap[authName]; !ok { + isOK = false + } + + if isOK { + helper.AppendToPointer(slc, rpName) + } + }) + return *slc +} +func (c *Config) GetAuthNameByProxyName(proxyName string) string { + return c.ReverseProxies[proxyName].Auth } diff --git a/internal/config/types.go b/internal/config/types.go deleted file mode 100644 index 5f14c3a..0000000 --- a/internal/config/types.go +++ /dev/null @@ -1,93 +0,0 @@ -package config - -import "github.com/spf13/viper" - -type Config struct { - Viper *viper.Viper - DataMaps DataMaps - ReverseProxies ReverseProxies `mapstructure:"reverse_proxies"` - TLS TLS `mapstructure:"tls"` - EntryPoints EntryPoints `mapstructure:"entry_points"` - Auth map[string]*AuthInstance `mapstructure:"auth"` -} - -type DataMaps struct { - DomainToProxy map[string]string - DomainToAuth map[string]string - DomainToCert map[string]string -} - -// AUTH -// type Auth map[string]AuthInstance - -type AuthInstance struct { - Paths Paths `mapstructure:"paths"` - OpenID OpenID `mapstructure:"open_id"` -} -type Paths struct { - Prefix string `mapstructure:"prefix"` - Login string `mapstructure:"login"` - Logout string `mapstructure:"logout"` - Callback string `mapstructure:"callback"` -} -type OpenID struct { - Host string `mapstructure:"host"` - Realm string `mapstructure:"realm"` - ClientID string `mapstructure:"client_id"` - ClientSecert string `mapstructure:"client_secret"` - RedirectURI string `mapstructure:"redirect_uri"` - PostLogoutRedirectURI string `mapstructure:"post_logout_redirect_uri"` - ConfigPath string `mapstructure:"config_path"` - EndPoints *EndPoints -} - -type EndPoints struct { - Issuer string - Auth string - Introspection string - Token string - UserInfo string - Logout string - JwksUri string -} - -// type OpenIdEndPoints struct { -// Issuer string -// Authorization string -// Token string -// Introspection string -// UserInfo string -// EndSession string -// } - -// ReverseProxies - -type ReverseProxies map[string]ReverseProxy - -type ReverseProxy struct { - Domain string `mapstructure:"domain"` - Host string `mapstructure:"host"` - EntryPoint string `mapstructure:"entry_point"` - TLS TLS_RP `mapstructure:"tls"` - Auth string `mapstructure:"auth"` -} -type TLS_RP struct { - Enabled bool `mapstructure:"enabled"` - Certs string `mapstructure:"certs"` -} - -// TLS -type TLS struct { - Certs map[string]Certs `mapstructure:"certs"` -} -type Certs struct { - Cert string `mapstructure:"cert"` - Key string `mapstructure:"key"` -} - -// EntryPoints -type EntryPoints map[string]EntryPoint -type EntryPoint struct { - Port string `mapstructure:"port"` - TLS bool `mapstructure:"tls"` -} diff --git a/internal/config/types_auth_.go b/internal/config/types_auth_.go new file mode 100644 index 0000000..271260a --- /dev/null +++ b/internal/config/types_auth_.go @@ -0,0 +1,36 @@ +package config + +type AuthMap map[string]*Auth + +type Auth struct { + Paths Paths `mapstructure:"paths"` + OpenID OpenID `mapstructure:"open_id"` +} + +type Paths struct { + Prefix string `mapstructure:"prefix"` + Login string `mapstructure:"login"` + Logout string `mapstructure:"logout"` + Callback string `mapstructure:"callback"` +} + +type OpenID struct { + Host string `mapstructure:"host"` + Realm string `mapstructure:"realm"` + ClientID string `mapstructure:"client_id"` + ClientSecert string `mapstructure:"client_secret"` + RedirectURI string `mapstructure:"redirect_uri"` + PostLogoutRedirectURI string `mapstructure:"post_logout_redirect_uri"` + ConfigPath string `mapstructure:"config_path"` + EndPoints *EndPoints +} + +type EndPoints struct { + Issuer string + Auth string + Introspection string + Token string + UserInfo string + Logout string + JwksUri string +} diff --git a/internal/config/types_config.go b/internal/config/types_config.go new file mode 100644 index 0000000..d9729f4 --- /dev/null +++ b/internal/config/types_config.go @@ -0,0 +1,20 @@ +package config + +import "github.com/spf13/viper" + +type Config struct { + Viper *viper.Viper + DataMaps DataMaps + ReverseProxies ReverseProxies `mapstructure:"reverse_proxies"` + TLS TLS `mapstructure:"tls"` + EntryPoints EntryPoints `mapstructure:"entry_points"` + AuthMap AuthMap `mapstructure:"auth"` +} + +type DataMaps struct { + DomainToProxy map[string]string + DomainToAuth map[string]string + DomainToCert map[string]string +} + +type ForEachReturn []any diff --git a/internal/config/types_entry_points.go b/internal/config/types_entry_points.go new file mode 100644 index 0000000..6cf3102 --- /dev/null +++ b/internal/config/types_entry_points.go @@ -0,0 +1,8 @@ +package config + +type EntryPoints map[string]EntryPoint + +type EntryPoint struct { + Port string `mapstructure:"port"` + TLS bool `mapstructure:"tls"` +} diff --git a/internal/config/types_reverse_proxy.go b/internal/config/types_reverse_proxy.go new file mode 100644 index 0000000..58ef9b8 --- /dev/null +++ b/internal/config/types_reverse_proxy.go @@ -0,0 +1,12 @@ +package config + +type ReverseProxies map[string]ReverseProxy + +type ReverseProxy struct { + Domain string `mapstructure:"domain"` + Host string `mapstructure:"host"` + EntryPoint string `mapstructure:"entry_point"` + TLS TLS_RP `mapstructure:"tls"` + Auth string `mapstructure:"auth"` + IsAuthServer bool `mapstructure:"auth_server"` +} diff --git a/internal/config/types_tls.go b/internal/config/types_tls.go new file mode 100644 index 0000000..6b47800 --- /dev/null +++ b/internal/config/types_tls.go @@ -0,0 +1,15 @@ +package config + +type TLS struct { + Certs map[string]Certs `mapstructure:"certs"` +} + +type Certs struct { + Cert string `mapstructure:"cert"` + Key string `mapstructure:"key"` +} + +type TLS_RP struct { + Enabled bool `mapstructure:"enabled"` + Certs string `mapstructure:"certs"` +} diff --git a/internal/router/router.go b/internal/router/router.go index 7934fc2..c528c9c 100644 --- a/internal/router/router.go +++ b/internal/router/router.go @@ -1,24 +1,77 @@ package router -import "github.com/gorilla/mux" +import ( + "github.com/gorilla/mux" + "zeevdiukman.com/zprox/pkg/helper" +) func New() *MainRouter { r := &MainRouter{} - r.SetMux() + r.setMux() return r } -func (r *MainRouter) SetMux() { +func (r *MainRouter) setMux() { r.Mux = mux.NewRouter() } +func (mainRouter *MainRouter) AddGroupRouter(groupName string) *GroupRouter { + s := mainRouter.Mux.NewRoute().Subrouter() + groupRouter := &GroupRouter{ + Mux: s, + } + + newMap := make(GroupRouters) + helper.MapIter(mainRouter.GroupRouters, func(grName string, gr *GroupRouter) { + newMap[grName] = gr + }) + newMap[groupName] = groupRouter + + mainRouter.GroupRouters = newMap + return groupRouter +} +func (mainRouter *MainRouter) GetGroupRouter(groupName string) *GroupRouter { + return mainRouter.GroupRouters[groupName] +} +func (mainRouter *MainRouter) GetHostSubRouter(groupName string, domain string) *SubRouter { + return mainRouter.GroupRouters[groupName].SubRouters[domain] +} +func (mainRouter *MainRouter) AddHostSubRouter(groupName string, domain string) *SubRouter { + groupSubRouter := mainRouter.GroupRouters[groupName] + newRoute := groupSubRouter.Mux.NewRoute() + hostSubRouter := &SubRouter{ + Mux: newRoute.Host(domain).Subrouter(), + } + newMap := make(SubRouters) + helper.MapIter(mainRouter.GroupRouters[groupName].SubRouters, func(grName string, gr *SubRouter) { + newMap[grName] = gr + }) + newMap[domain] = hostSubRouter + mainRouter.GroupRouters[groupName].SubRouters = newMap + return hostSubRouter +} + +func (mainRouter *MainRouter) AddGroupSubRouter(groupName string, subRouterName string) *SubRouter { + gsr := mainRouter.GetGroupRouter(groupName).Mux.NewRoute().Subrouter() + subRouter := &SubRouter{ + Mux: gsr, + } + mainRouter.GroupRouters[groupName].SubRouters[subRouterName] = subRouter + return subRouter +} type MainRouter struct { - Subrouters Subrouters + GroupRouters GroupRouters + Mux *mux.Router +} + +type GroupRouters map[string]*GroupRouter + +type GroupRouter struct { + SubRouters SubRouters Mux *mux.Router } -type Subrouters map[string]SubRouter + +type SubRouters map[string]*SubRouter type SubRouter struct { - Name string - Group string - *mux.Router + Mux *mux.Router } diff --git a/pkg/helper/helper.go b/pkg/helper/helper.go index aba6ec0..859b8e2 100644 --- a/pkg/helper/helper.go +++ b/pkg/helper/helper.go @@ -275,7 +275,7 @@ func CapitalizeFirstLetter(input string) string { return string(runes) // Convert rune slice back to string } -func MapIter[K comparable, V comparable](m map[K]V, fn func(K, V)) { +func MapIter[K string, V any](m map[K]V, fn func(K, V)) { for p, d := range m { fn(p, d) } @@ -456,25 +456,25 @@ func AppRunner(runApp func()) { <-ctx.Done() //do stuff after ending wg.Wait() - fmt.Println("BYE BYE!") + log.Println("AppRunner stopped") os.Exit(0) } -func StartTestHTTPServer(port int) { +func StartTestHTTPServer(port int, name string) { p := strconv.Itoa(port) go func() { log.Println("Test server is running at http://" + GetIP() + ":" + p) r := mux.NewRouter() r.Path("/").HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - fmt.Fprintln(w, "/ OK") + fmt.Fprintln(w, r.Host+"/ OK") }) r.Path("/test1").HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - fmt.Fprintln(w, "/test1 OK") + fmt.Fprintln(w, r.Host+"/test1 OK") }) r.Path("/test2").HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - fmt.Fprintln(w, "/test2 OK") + fmt.Fprintln(w, r.Host+"/test2 OK") }) - err := http.ListenAndServe(":3000", r) + err := http.ListenAndServe(":"+p, r) if err != nil { log.Println(err.Error()) } @@ -510,3 +510,7 @@ func GetIP(prefix ...string) string { } return prfx } + +func AppendToPointer[T any](slc *[]T, val T) { + *slc = append(*slc, val) +} diff --git a/tmp/build-errors.log b/tmp/build-errors.log index 028e360..883239f 100644 --- a/tmp/build-errors.log +++ b/tmp/build-errors.log @@ -1 +1 @@ -exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1 \ No newline at end of file +exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1exit status 1 \ No newline at end of file diff --git a/tmp/main b/tmp/main index 4396bf25ba95c1bd73725cb354c334728ad708a1..70476bda63c8a163d8333a17e4c59b665142ae4d 100755 GIT binary patch delta 5803778 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