package main import ( "flag" "fmt" "log" "net/http" "git.teamworkapps.com/shortcut/enhancedfileserver" "github.com/gorilla/mux" ) type config struct { listen string port int username string password string noindex bool nocache bool log bool } var c config func init() { flag.StringVar(&c.listen, "listen", "0.0.0.0", "IP address to listen.") flag.IntVar(&c.port, "port", 8000, "Listen port for interface (ports below 1024 may require super user privileges)") flag.StringVar(&c.username, "username", "", "Require this username tp access. Default is 'admin' if you specify a password.") flag.StringVar(&c.password, "password", "", "Require this password to access interface") flag.BoolVar(&c.noindex, "noindex", false, "Disable directory indexing") flag.BoolVar(&c.log, "log", false, "Enable simple request log") flag.BoolVar(&c.nocache, "nocache", false, "Set http headers to prevent caching of files") flag.Parse() } func main() { r := mux.NewRouter() if c.username == "" && c.password != "" { c.username = "admin" } if c.log { r.Use(queryLog) } if c.username != "" && c.password != "" { r.Use(basicAuth) } if c.nocache { r.Use(noCache) } if c.noindex { r.PathPrefix("/").Handler(http.StripPrefix("/", enhancedfileserver.FileServerNoIndex(http.Dir("./")))) } else { r.PathPrefix("/").Handler(http.StripPrefix("/", enhancedfileserver.FileServer(http.Dir("./")))) } a := fmt.Sprintf("%s:%d", c.listen, c.port) log.Fatal(http.ListenAndServe(a, r)) } func noCache(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Add("Cache-control", "no-cache, no-store") next.ServeHTTP(w, r) }) } func basicAuth(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if c.username != "" && c.password != "" { user, pass, ok := r.BasicAuth() if !ok || user != c.username || pass != c.password { w.Header().Set("WWW-Authenticate", `Basic realm="mydomains"`) http.Error(w, "Unauthorized", http.StatusUnauthorized) return } } next.ServeHTTP(w, r) }) } func queryLog(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Printf("%s - %s", r.RemoteAddr, r.URL) next.ServeHTTP(w, r) }) }