12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- package main
- import (
- "fmt"
- "net/http"
- "net/url"
- "path/filepath"
- "strings"
- "imuslab.com/zoraxy/mod/sshprox"
- )
- /*
- router.go
- This script holds the static resources router
- for the reverse proxy service
- */
- func FSHandler(handler http.Handler) http.Handler {
- return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- /*
- Development Mode Override
- => Web root is located in /
- */
- if development && strings.HasPrefix(r.URL.Path, "/web/") {
- u, _ := url.Parse(strings.TrimPrefix(r.URL.Path, "/web"))
- r.URL = u
- }
- /*
- Production Mode Override
- => Web root is located in /web
- */
- if !development && r.URL.Path == "/" {
- //Redirect to web UI
- http.Redirect(w, r, "/web/", http.StatusTemporaryRedirect)
- return
- }
- // Allow access to /script/*, /img/pubic/* and /login.html without authentication
- if strings.HasPrefix(r.URL.Path, ppf("/script/")) || strings.HasPrefix(r.URL.Path, ppf("/img/public/")) || r.URL.Path == ppf("/login.html") || r.URL.Path == ppf("/reset.html") || r.URL.Path == ppf("/favicon.png") {
- handler.ServeHTTP(w, r)
- return
- }
- // check authentication
- if !authAgent.CheckAuth(r) && requireAuth {
- http.Redirect(w, r, ppf("/login.html"), http.StatusTemporaryRedirect)
- return
- }
- //For WebSSH Routing
- //Example URL Path: /web.ssh/{{instance_uuid}}/*
- if strings.HasPrefix(r.URL.Path, "/web.ssh/") {
- requestPath := r.URL.Path
- parts := strings.Split(requestPath, "/")
- if !strings.HasSuffix(requestPath, "/") && len(parts) == 3 {
- http.Redirect(w, r, requestPath+"/", http.StatusTemporaryRedirect)
- return
- }
- if len(parts) > 2 {
- //Extract the instance ID from the request path
- instanceUUID := parts[2]
- fmt.Println(instanceUUID)
- //Rewrite the url so the proxy knows how to serve stuffs
- r.URL, _ = sshprox.RewriteURL("/web.ssh/"+instanceUUID, r.RequestURI)
- webSshManager.HandleHttpByInstanceId(instanceUUID, w, r)
- } else {
- fmt.Println(parts)
- http.Error(w, "Invalid Usage", http.StatusInternalServerError)
- }
- return
- }
- //Authenticated
- handler.ServeHTTP(w, r)
- })
- }
- // Production path fix wrapper. Fix the path on production or development environment
- func ppf(relativeFilepath string) string {
- if !development {
- return strings.ReplaceAll(filepath.Join("/web/", relativeFilepath), "\\", "/")
- }
- return relativeFilepath
- }
|