diff --git a/go.mod b/go.mod index 5814c956..d93211f3 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/aws/aws-sdk-go v1.30.3 github.com/eikenb/pipeat v0.0.0-20190316224601-fb1f3a9aa29f github.com/fsnotify/fsnotify v1.4.9 // indirect - github.com/go-chi/chi v4.1.0+incompatible + github.com/go-chi/chi v4.1.1+incompatible github.com/go-chi/render v1.0.1 github.com/go-sql-driver/mysql v1.5.0 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 @@ -28,10 +28,10 @@ require ( github.com/rs/zerolog v1.18.0 github.com/spf13/afero v1.2.2 // indirect github.com/spf13/cast v1.3.1 // indirect - github.com/spf13/cobra v0.0.7 + github.com/spf13/cobra v1.0.0 github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.6.2 + github.com/spf13/viper v1.6.3 go.etcd.io/bbolt v1.3.4 golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 golang.org/x/sys v0.0.0-20200331124033-c3d80250170d diff --git a/go.sum b/go.sum index 3ce2e284..6ee3821f 100644 --- a/go.sum +++ b/go.sum @@ -53,6 +53,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= @@ -75,8 +76,8 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-chi/chi v4.1.0+incompatible h1:ETj3cggsVIY2Xao5ExCu6YhEh5MD6JTfcBzS37R260w= -github.com/go-chi/chi v4.1.0+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= +github.com/go-chi/chi v4.1.1+incompatible h1:MmTgB0R8Bt/jccxp+t6S/1VGIKdJw5J74CK/c9tTfA4= +github.com/go-chi/chi v4.1.1+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= github.com/go-chi/render v1.0.1 h1:4/5tis2cKaNdnv9zFLfXzcquC9HbeZgCnxGnKrltBS8= github.com/go-chi/render v1.0.1/go.mod h1:pq4Rr7HbnsdaeHagklXub+p6Wd16Af5l9koip1OvJns= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -236,8 +237,8 @@ github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTd github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.7 h1:FfTH+vuMXOas8jmfb5/M7dzEYx7LpcLb7a0LPe34uOU= -github.com/spf13/cobra v0.0.7/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -245,8 +246,8 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.6.2 h1:7aKfF+e8/k68gda3LOjo5RxiUqddoFxVq4BKBPrxk5E= -github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= +github.com/spf13/viper v1.6.3 h1:pDDu1OyEDTKzpJwdq4TiuLyMsUgRa/BT5cn5O62NoHs= +github.com/spf13/viper v1.6.3/go.mod h1:jUMtyi0/lB5yZH/FjyGAoH7IMNrIhlBf6pXZmbMDvzw= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= diff --git a/httpd/router.go b/httpd/router.go index 68a3efd4..8bcf1c18 100644 --- a/httpd/router.go +++ b/httpd/router.go @@ -2,6 +2,7 @@ package httpd import ( "net/http" + "strings" "github.com/drakkan/sftpgo/dataprovider" "github.com/drakkan/sftpgo/logger" @@ -69,69 +70,22 @@ func initializeRouter(staticFilesPath string, profiler bool) { render.JSON(w, r, sftpd.GetConnectionsStats()) }) - router.Delete(activeConnectionsPath+"/{connectionID}", func(w http.ResponseWriter, r *http.Request) { - handleCloseConnection(w, r) - }) - - router.Get(quotaScanPath, func(w http.ResponseWriter, r *http.Request) { - getQuotaScans(w, r) - }) - - router.Post(quotaScanPath, func(w http.ResponseWriter, r *http.Request) { - startQuotaScan(w, r) - }) - - router.Get(userPath, func(w http.ResponseWriter, r *http.Request) { - getUsers(w, r) - }) - - router.Post(userPath, func(w http.ResponseWriter, r *http.Request) { - addUser(w, r) - }) - - router.Get(userPath+"/{userID}", func(w http.ResponseWriter, r *http.Request) { - getUserByID(w, r) - }) - - router.Put(userPath+"/{userID}", func(w http.ResponseWriter, r *http.Request) { - updateUser(w, r) - }) - - router.Delete(userPath+"/{userID}", func(w http.ResponseWriter, r *http.Request) { - deleteUser(w, r) - }) - - router.Get(dumpDataPath, func(w http.ResponseWriter, r *http.Request) { - dumpData(w, r) - }) - - router.Get(loadDataPath, func(w http.ResponseWriter, r *http.Request) { - loadData(w, r) - }) - - router.Get(webUsersPath, func(w http.ResponseWriter, r *http.Request) { - handleGetWebUsers(w, r) - }) - - router.Get(webUserPath, func(w http.ResponseWriter, r *http.Request) { - handleWebAddUserGet(w, r) - }) - - router.Get(webUserPath+"/{userID}", func(w http.ResponseWriter, r *http.Request) { - handleWebUpdateUserGet(chi.URLParam(r, "userID"), w, r) - }) - - router.Post(webUserPath, func(w http.ResponseWriter, r *http.Request) { - handleWebAddUserPost(w, r) - }) - - router.Post(webUserPath+"/{userID}", func(w http.ResponseWriter, r *http.Request) { - handleWebUpdateUserPost(chi.URLParam(r, "userID"), w, r) - }) - - router.Get(webConnectionsPath, func(w http.ResponseWriter, r *http.Request) { - handleWebGetConnections(w, r) - }) + router.Delete(activeConnectionsPath+"/{connectionID}", handleCloseConnection) + router.Get(quotaScanPath, getQuotaScans) + router.Post(quotaScanPath, startQuotaScan) + router.Get(userPath, getUsers) + router.Post(userPath, addUser) + router.Get(userPath+"/{userID}", getUserByID) + router.Put(userPath+"/{userID}", updateUser) + router.Delete(userPath+"/{userID}", deleteUser) + router.Get(dumpDataPath, dumpData) + router.Get(loadDataPath, loadData) + router.Get(webUsersPath, handleGetWebUsers) + router.Get(webUserPath, handleWebAddUserGet) + router.Get(webUserPath+"/{userID}", handleWebUpdateUserGet) + router.Post(webUserPath, handleWebAddUserPost) + router.Post(webUserPath+"/{userID}", handleWebUpdateUserPost) + router.Get(webConnectionsPath, handleWebGetConnections) }) router.Group(func(router chi.Router) { @@ -155,15 +109,16 @@ func handleCloseConnection(w http.ResponseWriter, r *http.Request) { } func fileServer(r chi.Router, path string, root http.FileSystem) { - fs := http.StripPrefix(path, http.FileServer(root)) - if path != "/" && path[len(path)-1] != '/' { r.Get(path, http.RedirectHandler(path+"/", http.StatusMovedPermanently).ServeHTTP) path += "/" } path += "*" - r.Get(path, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + r.Get(path, func(w http.ResponseWriter, r *http.Request) { + rctx := chi.RouteContext(r.Context()) + pathPrefix := strings.TrimSuffix(rctx.RoutePattern(), "/*") + fs := http.StripPrefix(pathPrefix, http.FileServer(root)) fs.ServeHTTP(w, r) - })) + }) } diff --git a/httpd/web.go b/httpd/web.go index 3e4e2a06..818493f0 100644 --- a/httpd/web.go +++ b/httpd/web.go @@ -17,6 +17,7 @@ import ( "github.com/drakkan/sftpgo/sftpd" "github.com/drakkan/sftpgo/utils" "github.com/drakkan/sftpgo/vfs" + "github.com/go-chi/chi" ) const ( @@ -478,8 +479,8 @@ func handleWebAddUserGet(w http.ResponseWriter, r *http.Request) { renderAddUserPage(w, dataprovider.User{Status: 1}, "") } -func handleWebUpdateUserGet(userID string, w http.ResponseWriter, r *http.Request) { - id, err := strconv.ParseInt(userID, 10, 64) +func handleWebUpdateUserGet(w http.ResponseWriter, r *http.Request) { + id, err := strconv.ParseInt(chi.URLParam(r, "userID"), 10, 64) if err != nil { renderBadRequestPage(w, err) return @@ -509,9 +510,9 @@ func handleWebAddUserPost(w http.ResponseWriter, r *http.Request) { } } -func handleWebUpdateUserPost(userID string, w http.ResponseWriter, r *http.Request) { +func handleWebUpdateUserPost(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize) - id, err := strconv.ParseInt(userID, 10, 64) + id, err := strconv.ParseInt(chi.URLParam(r, "userID"), 10, 64) if err != nil { renderBadRequestPage(w, err) return