diff --git a/.drone.yml b/.drone.yml
index 6d4d749e..5e218852 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -79,8 +79,10 @@ steps:
- ./dist/filestash &
- cd ../test/e2e
- npm install > /dev/null 2>&1
+ - node servers/webdav.js &
- npm test
- kill -9 %1
+ - kill -9 %2
- name: release
image: plugins/docker
diff --git a/client/pages/adminpage/setup.js b/client/pages/adminpage/setup.js
index 3ef958ca..1aa92d3b 100644
--- a/client/pages/adminpage/setup.js
+++ b/client/pages/adminpage/setup.js
@@ -25,6 +25,7 @@ export class SetupPage extends React.Component {
this.setState({enable_telemetry: config.log.telemetry.value}, () => {
if(this.state.enable_telemetry === true) return;
this.unlisten = this.props.history.listen((location, action) => {
+ this.unlisten();
alert.now((
@@ -37,7 +38,7 @@ export class SetupPage extends React.Component {
- ), () => this.unlisten());
+ ));
});
});
diff --git a/docker/prod/Dockerfile b/docker/prod/Dockerfile
index 1a58e83e..040d8eb9 100644
--- a/docker/prod/Dockerfile
+++ b/docker/prod/Dockerfile
@@ -75,7 +75,8 @@ RUN mkdir -p $GOPATH/src/github.com/mickael-kerjean/ && \
#################
# Create machine user
addgroup -S filestash && adduser -S -g filestash filestash && \
- chown -R filestash:filestash /app/
+ chown -R filestash:filestash /app/ && \
+ chown filestash:filestash /app/data/config/config.json
EXPOSE 8334
VOLUME ["/app/data/config/"]
diff --git a/server/main.go b/server/main.go
index 68e5f3fd..b524a946 100644
--- a/server/main.go
+++ b/server/main.go
@@ -45,8 +45,9 @@ func Init(a *App) {
session.HandleFunc("", NewMiddlewareChain(SessionGet, middlewares, *a)).Methods("GET")
middlewares = []Middleware{ ApiHeaders, SecureHeaders, BodyParser }
session.HandleFunc("", NewMiddlewareChain(SessionAuthenticate, middlewares, *a)).Methods("POST")
- middlewares = []Middleware{ ApiHeaders, SecureHeaders }
+ middlewares = []Middleware{ ApiHeaders, SecureHeaders, SessionTry }
session.HandleFunc("", NewMiddlewareChain(SessionLogout, middlewares, *a)).Methods("DELETE")
+ middlewares = []Middleware{ ApiHeaders, SecureHeaders }
session.HandleFunc("/auth/{service}", NewMiddlewareChain(SessionOAuthBackend, middlewares, *a)).Methods("GET")
// API for admin
diff --git a/server/middleware/session.go b/server/middleware/session.go
index dfd1017f..94fe8c77 100644
--- a/server/middleware/session.go
+++ b/server/middleware/session.go
@@ -48,10 +48,6 @@ func AdminOnly(fn func(App, http.ResponseWriter, *http.Request)) func(ctx App, r
}
func SessionStart (fn func(App, http.ResponseWriter, *http.Request)) func(ctx App, res http.ResponseWriter, req *http.Request) {
- extractBackend := func(req *http.Request, ctx *App) (IBackend, error) {
- return model.NewBackend(ctx, ctx.Session)
- }
-
return func(ctx App, res http.ResponseWriter, req *http.Request) {
var err error
if ctx.Share, err = _extractShare(req); err != nil {
@@ -62,7 +58,7 @@ func SessionStart (fn func(App, http.ResponseWriter, *http.Request)) func(ctx Ap
SendErrorResult(res, err)
return
}
- if ctx.Backend, err = extractBackend(req, &ctx); err != nil {
+ if ctx.Backend, err = _extractBackend(req, &ctx); err != nil {
SendErrorResult(res, err)
return
}
@@ -70,6 +66,15 @@ func SessionStart (fn func(App, http.ResponseWriter, *http.Request)) func(ctx Ap
}
}
+func SessionTry (fn func(App, http.ResponseWriter, *http.Request)) func(ctx App, res http.ResponseWriter, req *http.Request) {
+ return func(ctx App, res http.ResponseWriter, req *http.Request) {
+ ctx.Share, _ = _extractShare(req)
+ ctx.Session, _ = _extractSession(req, &ctx)
+ ctx.Backend, _ = _extractBackend(req, &ctx)
+ fn(ctx, res, req)
+ }
+}
+
func RedirectSharedLoginIfNeeded(fn func(App, http.ResponseWriter, *http.Request)) func(ctx App, res http.ResponseWriter, req *http.Request) {
return func(ctx App, res http.ResponseWriter, req *http.Request) {
share_id := _extractShareId(req)
@@ -227,3 +232,7 @@ func _extractSession(req *http.Request, ctx *App) (map[string]string, error) {
return session, err
}
}
+
+func _extractBackend(req *http.Request, ctx *App) (IBackend, error) {
+ return model.NewBackend(ctx, ctx.Session)
+}
diff --git a/server/model/backend/ftp.go b/server/model/backend/ftp.go
index 95ac3db4..0e894c7a 100644
--- a/server/model/backend/ftp.go
+++ b/server/model/backend/ftp.go
@@ -1,6 +1,7 @@
package backend
import (
+ "fmt"
. "github.com/mickael-kerjean/filestash/server/common"
"github.com/secsy/goftp"
"io"
@@ -28,8 +29,7 @@ type Ftp struct {
}
func (f Ftp) Init(params map[string]string, app *App) (IBackend, error) {
- c := FtpCache.Get(params)
- if c != nil {
+ if c := FtpCache.Get(params); c != nil {
d := c.(*Ftp)
return d, nil
}
@@ -48,8 +48,7 @@ func (f Ftp) Init(params map[string]string, app *App) (IBackend, error) {
conn := 5
if params["conn"] != "" {
- i, err := strconv.Atoi(params["conn"])
- if err == nil && i > 0 {
+ if i, err := strconv.Atoi(params["conn"]); err == nil && i > 0 {
conn = i
}
}
@@ -60,7 +59,7 @@ func (f Ftp) Init(params map[string]string, app *App) (IBackend, error) {
ConnectionsPerHost: conn,
Timeout: 10 * time.Second,
}
- client, err := goftp.DialConfig(config, params["hostname"]+":"+params["port"])
+ client, err := goftp.DialConfig(config, fmt.Sprintf("%s:%s", params["hostname"], params["port"]))
if err != nil {
return nil, err
}
@@ -125,19 +124,7 @@ func (f Ftp) Home() (string, error) {
return f.client.Getwd()
}
-func (f Ftp) Ls(path string) ([]os.FileInfo, error) {
- // by default FTP don't seem to mind a readdir on a non existing
- // directory so we first need to make sure the directory exists
- conn, err := f.client.OpenRawConn()
- if err != nil {
- return nil, err
- }
- i, s, err := conn.SendCommand("CWD %s", path)
- if err != nil {
- return nil, NewError(err.Error(), 404)
- } else if i >= 300 {
- return nil, NewError(s, 404)
- }
+func (f Ftp) Ls(path string) ([]os.FileInfo, error) {
return f.client.ReadDir(path)
}
diff --git a/server/model/backend/webdav.go b/server/model/backend/webdav.go
index 9e6d20a6..3794f624 100644
--- a/server/model/backend/webdav.go
+++ b/server/model/backend/webdav.go
@@ -105,9 +105,10 @@ func (w WebDav) Ls(path string) ([]os.FileInfo, error) {
return nil, NewError("Server not found", 404)
}
- URLDav := regexp.MustCompile(`^http[s]?://[^/]*`).ReplaceAllString(w.params.url+encodeURL(path), "")
+ LongURLDav := w.params.url+encodeURL(path)
+ ShortURLDav := regexp.MustCompile(`^http[s]?://[^/]*`).ReplaceAllString(LongURLDav, "")
for _, tag := range r.Responses {
- if tag.Href == URLDav || tag.Href + "/" == URLDav {
+ if tag.Href == ShortURLDav || tag.Href == LongURLDav {
continue
}
for i, prop := range tag.Props {