diff --git a/server/common/types.go b/server/common/types.go
index 060d4a7a..bb8457a0 100644
--- a/server/common/types.go
+++ b/server/common/types.go
@@ -27,13 +27,13 @@ type IAuth interface {
}
type IAuthorisation interface {
- Ls(ctx App, path string) error
- Cat(ctx App, path string) error
- Mkdir(ctx App, path string) error
- Rm(ctx App, path string) error
- Mv(ctx App, from string, to string) error
- Save(ctx App, path string) error
- Touch(ctx App, path string) error
+ Ls(ctx *App, path string) error
+ Cat(ctx *App, path string) error
+ Mkdir(ctx *App, path string) error
+ Rm(ctx *App, path string) error
+ Mv(ctx *App, from string, to string) error
+ Save(ctx *App, path string) error
+ Touch(ctx *App, path string) error
}
type IFile interface {
diff --git a/server/ctrl/admin.go b/server/ctrl/admin.go
index 9a396a4a..c9e34043 100644
--- a/server/ctrl/admin.go
+++ b/server/ctrl/admin.go
@@ -9,7 +9,7 @@ import (
"time"
)
-func AdminSessionGet(ctx App, res http.ResponseWriter, req *http.Request) {
+func AdminSessionGet(ctx *App, res http.ResponseWriter, req *http.Request) {
if admin := Config.Get("auth.admin").String(); admin == "" {
SendSuccessResult(res, true)
return
@@ -40,7 +40,7 @@ func AdminSessionGet(ctx App, res http.ResponseWriter, req *http.Request) {
SendSuccessResult(res, true)
}
-func AdminSessionAuthenticate(ctx App, res http.ResponseWriter, req *http.Request) {
+func AdminSessionAuthenticate(ctx *App, res http.ResponseWriter, req *http.Request) {
// Step 1: Deliberatly make the request slower to make hacking attempt harder for the attacker
time.Sleep(1500 * time.Millisecond)
@@ -75,7 +75,7 @@ func AdminSessionAuthenticate(ctx App, res http.ResponseWriter, req *http.Reques
SendSuccessResult(res, true)
}
-func AdminBackend(ctx App, res http.ResponseWriter, req *http.Request) {
+func AdminBackend(ctx *App, res http.ResponseWriter, req *http.Request) {
drivers := Backend.Drivers()
backends := make(map[string]Form, len(drivers))
for key := range drivers {
@@ -85,7 +85,7 @@ func AdminBackend(ctx App, res http.ResponseWriter, req *http.Request) {
return
}
-func AdminAuthenticationMiddleware(ctx App, res http.ResponseWriter, req *http.Request) {
+func AdminAuthenticationMiddleware(ctx *App, res http.ResponseWriter, req *http.Request) {
drivers := Hooks.Get.AuthenticationMiddleware()
middlewares := make(map[string]Form, len(drivers))
for id, driver := range drivers {
diff --git a/server/ctrl/config.go b/server/ctrl/config.go
index 415d68e0..f78a45a1 100644
--- a/server/ctrl/config.go
+++ b/server/ctrl/config.go
@@ -15,7 +15,7 @@ var (
configpath = filepath.Join(GetCurrentDir(), CONFIG_PATH, "config.json")
)
-func FetchLogHandler(ctx App, res http.ResponseWriter, req *http.Request) {
+func FetchLogHandler(ctx *App, res http.ResponseWriter, req *http.Request) {
file, err := os.OpenFile(logpath, os.O_RDONLY, os.ModePerm)
if err != nil {
SendErrorResult(res, err)
@@ -47,11 +47,11 @@ func FetchLogHandler(ctx App, res http.ResponseWriter, req *http.Request) {
io.Copy(res, file)
}
-func PrivateConfigHandler(ctx App, res http.ResponseWriter, req *http.Request) {
+func PrivateConfigHandler(ctx *App, res http.ResponseWriter, req *http.Request) {
SendSuccessResult(res, Config)
}
-func PrivateConfigUpdateHandler(ctx App, res http.ResponseWriter, req *http.Request) {
+func PrivateConfigUpdateHandler(ctx *App, res http.ResponseWriter, req *http.Request) {
b, _ := ioutil.ReadAll(req.Body)
if err := SaveConfig(b); err != nil {
SendErrorResult(res, err)
@@ -61,7 +61,7 @@ func PrivateConfigUpdateHandler(ctx App, res http.ResponseWriter, req *http.Requ
SendSuccessResult(res, nil)
}
-func PublicConfigHandler(ctx App, res http.ResponseWriter, req *http.Request) {
+func PublicConfigHandler(ctx *App, res http.ResponseWriter, req *http.Request) {
cfg := Config.Export()
SendSuccessResultWithEtagAndGzip(res, req, cfg)
}
diff --git a/server/ctrl/export.go b/server/ctrl/export.go
index 30abdd5c..0f9dee99 100644
--- a/server/ctrl/export.go
+++ b/server/ctrl/export.go
@@ -17,7 +17,7 @@ import (
//go:generate sh -c "go run ../generator/emacs-el.go > export_generated.go && go fmt export_generated.go"
var EmacsElConfig string = ""
-func FileExport(ctx App, res http.ResponseWriter, req *http.Request) {
+func FileExport(ctx *App, res http.ResponseWriter, req *http.Request) {
http.SetCookie(res, &http.Cookie{
Name: "download",
Value: "",
@@ -32,7 +32,7 @@ func FileExport(ctx App, res http.ResponseWriter, req *http.Request) {
if err != nil {
SendErrorResult(res, err)
return
- } else if model.CanRead(&ctx) == false {
+ } else if model.CanRead(ctx) == false {
SendErrorResult(res, ErrPermissionDenied)
return
}
diff --git a/server/ctrl/files.go b/server/ctrl/files.go
index 4930c1d6..3c15f32c 100644
--- a/server/ctrl/files.go
+++ b/server/ctrl/files.go
@@ -51,9 +51,9 @@ func init() {
ZipTimeout()
}
-func FileLs(ctx App, res http.ResponseWriter, req *http.Request) {
- if model.CanRead(&ctx) == false {
- if model.CanUpload(&ctx) == false {
+func FileLs(ctx *App, res http.ResponseWriter, req *http.Request) {
+ if model.CanRead(ctx) == false {
+ if model.CanUpload(ctx) == false {
Log.Debug("ls::permission 'permission denied'")
SendErrorResult(res, ErrPermissionDenied)
return
@@ -111,20 +111,20 @@ func FileLs(ctx App, res http.ResponseWriter, req *http.Request) {
perms = obj.Meta(path)
}
- if model.CanEdit(&ctx) == false {
+ if model.CanEdit(ctx) == false {
perms.CanCreateFile = NewBool(false)
perms.CanCreateDirectory = NewBool(false)
perms.CanRename = NewBool(false)
perms.CanMove = NewBool(false)
perms.CanDelete = NewBool(false)
}
- if model.CanUpload(&ctx) == false {
+ if model.CanUpload(ctx) == false {
perms.CanCreateDirectory = NewBool(false)
perms.CanRename = NewBool(false)
perms.CanMove = NewBool(false)
perms.CanDelete = NewBool(false)
}
- if model.CanShare(&ctx) == false {
+ if model.CanShare(ctx) == false {
perms.CanShare = NewBool(false)
}
@@ -137,7 +137,7 @@ func FileLs(ctx App, res http.ResponseWriter, req *http.Request) {
SendSuccessResultsWithMetadata(res, files, perms)
}
-func FileCat(ctx App, res http.ResponseWriter, req *http.Request) {
+func FileCat(ctx *App, res http.ResponseWriter, req *http.Request) {
header := res.Header()
http.SetCookie(res, &http.Cookie{
Name: "download",
@@ -145,7 +145,7 @@ func FileCat(ctx App, res http.ResponseWriter, req *http.Request) {
MaxAge: -1,
Path: "/",
})
- if model.CanRead(&ctx) == false {
+ if model.CanRead(ctx) == false {
Log.Debug("cat::permission 'permission denied'")
SendErrorResult(res, ErrPermissionDenied)
return
@@ -198,7 +198,7 @@ func FileCat(ctx App, res http.ResponseWriter, req *http.Request) {
// plugin hooks
for _, obj := range Hooks.Get.ProcessFileContentBeforeSend() {
- if file, err = obj(file, &ctx, &res, req); err != nil {
+ if file, err = obj(file, ctx, &res, req); err != nil {
Log.Debug("cat::hooks '%s'", err.Error())
SendErrorResult(res, err)
return
@@ -300,7 +300,7 @@ func FileCat(ctx App, res http.ResponseWriter, req *http.Request) {
file.Close()
}
-func FileAccess(ctx App, res http.ResponseWriter, req *http.Request) {
+func FileAccess(ctx *App, res http.ResponseWriter, req *http.Request) {
path, err := PathBuilder(ctx, req.URL.Query().Get("path"))
if err != nil {
Log.Debug("access::path '%s'", err.Error())
@@ -313,18 +313,18 @@ func FileAccess(ctx App, res http.ResponseWriter, req *http.Request) {
}
allowed := []string{}
- if model.CanRead(&ctx) {
+ if model.CanRead(ctx) {
if perms.CanSee == nil || *perms.CanSee == true {
allowed = append(allowed, "GET")
}
}
- if model.CanEdit(&ctx) {
+ if model.CanEdit(ctx) {
if (perms.CanCreateFile == nil || *perms.CanCreateFile == true) &&
(perms.CanCreateDirectory == nil || *perms.CanCreateDirectory == true) {
allowed = append(allowed, "PUT")
}
}
- if model.CanUpload(&ctx) {
+ if model.CanUpload(ctx) {
if perms.CanUpload == nil || *perms.CanUpload == true {
allowed = append(allowed, "POST")
}
@@ -334,7 +334,7 @@ func FileAccess(ctx App, res http.ResponseWriter, req *http.Request) {
SendSuccessResult(res, nil)
}
-func FileSave(ctx App, res http.ResponseWriter, req *http.Request) {
+func FileSave(ctx *App, res http.ResponseWriter, req *http.Request) {
path, err := PathBuilder(ctx, req.URL.Query().Get("path"))
if err != nil {
Log.Debug("save::path '%s'", err.Error())
@@ -342,8 +342,8 @@ func FileSave(ctx App, res http.ResponseWriter, req *http.Request) {
return
}
- if model.CanEdit(&ctx) == false {
- if model.CanUpload(&ctx) == false {
+ if model.CanEdit(ctx) == false {
+ if model.CanUpload(ctx) == false {
Log.Debug("save::permission 'permission denied'")
SendErrorResult(res, ErrPermissionDenied)
return
@@ -384,8 +384,8 @@ func FileSave(ctx App, res http.ResponseWriter, req *http.Request) {
SendSuccessResult(res, nil)
}
-func FileMv(ctx App, res http.ResponseWriter, req *http.Request) {
- if model.CanEdit(&ctx) == false {
+func FileMv(ctx *App, res http.ResponseWriter, req *http.Request) {
+ if model.CanEdit(ctx) == false {
Log.Debug("mv::permission 'permission denied'")
SendErrorResult(res, NewError("Permission denied", 403))
return
@@ -426,8 +426,8 @@ func FileMv(ctx App, res http.ResponseWriter, req *http.Request) {
SendSuccessResult(res, nil)
}
-func FileRm(ctx App, res http.ResponseWriter, req *http.Request) {
- if model.CanEdit(&ctx) == false {
+func FileRm(ctx *App, res http.ResponseWriter, req *http.Request) {
+ if model.CanEdit(ctx) == false {
Log.Debug("rm::permission 'permission denied'")
SendErrorResult(res, NewError("Permission denied", 403))
return
@@ -457,8 +457,8 @@ func FileRm(ctx App, res http.ResponseWriter, req *http.Request) {
SendSuccessResult(res, nil)
}
-func FileMkdir(ctx App, res http.ResponseWriter, req *http.Request) {
- if model.CanUpload(&ctx) == false {
+func FileMkdir(ctx *App, res http.ResponseWriter, req *http.Request) {
+ if model.CanUpload(ctx) == false {
Log.Debug("mkdir::permission 'permission denied'")
SendErrorResult(res, NewError("Permission denied", 403))
return
@@ -488,8 +488,8 @@ func FileMkdir(ctx App, res http.ResponseWriter, req *http.Request) {
SendSuccessResult(res, nil)
}
-func FileTouch(ctx App, res http.ResponseWriter, req *http.Request) {
- if model.CanUpload(&ctx) == false {
+func FileTouch(ctx *App, res http.ResponseWriter, req *http.Request) {
+ if model.CanUpload(ctx) == false {
Log.Debug("touch::permission 'permission denied'")
SendErrorResult(res, NewError("Permission denied", 403))
return
@@ -519,9 +519,9 @@ func FileTouch(ctx App, res http.ResponseWriter, req *http.Request) {
SendSuccessResult(res, nil)
}
-func FileDownloader(ctx App, res http.ResponseWriter, req *http.Request) {
+func FileDownloader(ctx *App, res http.ResponseWriter, req *http.Request) {
var err error
- if model.CanRead(&ctx) == false {
+ if model.CanRead(ctx) == false {
Log.Debug("downloader::permission 'permission denied'")
SendErrorResult(res, ErrPermissionDenied)
return
@@ -544,8 +544,8 @@ func FileDownloader(ctx App, res http.ResponseWriter, req *http.Request) {
resHeader.Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s.zip\"", filename))
start := time.Now()
- var addToZipRecursive func(App, *zip.Writer, string, string, *[]string) error
- addToZipRecursive = func(c App, zw *zip.Writer, backendPath string, zipRoot string, errList *[]string) (err error) {
+ var addToZipRecursive func(*App, *zip.Writer, string, string, *[]string) error
+ addToZipRecursive = func(c *App, zw *zip.Writer, backendPath string, zipRoot string, errList *[]string) (err error) {
if time.Now().Sub(start) > time.Duration(ZipTimeout())*time.Second {
Log.Debug("downloader::timeout zip not completed due to timeout")
return ErrTimeout
@@ -630,7 +630,7 @@ func FileDownloader(ctx App, res http.ResponseWriter, req *http.Request) {
}
}
-func PathBuilder(ctx App, path string) (string, error) {
+func PathBuilder(ctx *App, path string) (string, error) {
if path == "" {
return "", NewError("No path available", 400)
}
diff --git a/server/ctrl/report.go b/server/ctrl/report.go
index 8aec8850..bd32db18 100644
--- a/server/ctrl/report.go
+++ b/server/ctrl/report.go
@@ -8,19 +8,19 @@ import (
"path/filepath"
)
-func ReportHandler(ctx App, res http.ResponseWriter, req *http.Request) {
+func ReportHandler(ctx *App, res http.ResponseWriter, req *http.Request) {
// This function is quite dumb indeed, the goal is to show a report trace in the logs
SendSuccessResult(res, nil)
}
-func WellKnownSecurityHandler(ctx App, res http.ResponseWriter, req *http.Request) {
+func WellKnownSecurityHandler(ctx *App, res http.ResponseWriter, req *http.Request) {
res.WriteHeader(http.StatusOK)
res.Write([]byte("# If you would like to report a security issue\n"))
res.Write([]byte("# you may report it to me via email\n"))
res.Write([]byte("Contact: mickael@kerjean.me"))
}
-func HealthHandler(ctx App, res http.ResponseWriter, req *http.Request) {
+func HealthHandler(ctx *App, res http.ResponseWriter, req *http.Request) {
res.Header().Set("Access-Control-Allow-Origin", "*")
// CHECK 1: open the config file
file, err := os.OpenFile(
diff --git a/server/ctrl/search.go b/server/ctrl/search.go
index ca0b4559..845fd2c3 100644
--- a/server/ctrl/search.go
+++ b/server/ctrl/search.go
@@ -7,13 +7,13 @@ import (
"strings"
)
-func FileSearch(ctx App, res http.ResponseWriter, req *http.Request) {
+func FileSearch(ctx *App, res http.ResponseWriter, req *http.Request) {
path, err := PathBuilder(ctx, req.URL.Query().Get("path"))
if err != nil {
path = "/"
}
q := req.URL.Query().Get("q")
- if model.CanRead(&ctx) == false {
+ if model.CanRead(ctx) == false {
Log.Debug("ctrl::search 'can not read \"%s\"'", path)
SendErrorResult(res, ErrPermissionDenied)
return
@@ -25,7 +25,7 @@ func FileSearch(ctx App, res http.ResponseWriter, req *http.Request) {
SendErrorResult(res, ErrMissingDependency)
return
}
- searchResults, err = searchEngine.Query(ctx, path, q)
+ searchResults, err = searchEngine.Query(*ctx, path, q)
if err != nil {
SendErrorResult(res, err)
return
diff --git a/server/ctrl/session.go b/server/ctrl/session.go
index f7a7acd4..ec90d6fa 100644
--- a/server/ctrl/session.go
+++ b/server/ctrl/session.go
@@ -21,7 +21,7 @@ type Session struct {
IsAuth bool `json:"is_authenticated"`
}
-func SessionGet(ctx App, res http.ResponseWriter, req *http.Request) {
+func SessionGet(ctx *App, res http.ResponseWriter, req *http.Request) {
r := Session{
IsAuth: false,
}
@@ -39,12 +39,12 @@ func SessionGet(ctx App, res http.ResponseWriter, req *http.Request) {
SendSuccessResult(res, r)
}
-func SessionAuthenticate(ctx App, res http.ResponseWriter, req *http.Request) {
+func SessionAuthenticate(ctx *App, res http.ResponseWriter, req *http.Request) {
ctx.Body["timestamp"] = time.Now().String()
session := model.MapStringInterfaceToMapStringString(ctx.Body)
session["path"] = EnforceDirectory(session["path"])
- backend, err := model.NewBackend(&ctx, session)
+ backend, err := model.NewBackend(ctx, session)
if err != nil {
Log.Debug("session::auth 'NewBackend' %+v", err)
SendErrorResult(res, err)
@@ -61,7 +61,7 @@ func SessionAuthenticate(ctx App, res http.ResponseWriter, req *http.Request) {
return
}
session = model.MapStringInterfaceToMapStringString(ctx.Body)
- backend, err = model.NewBackend(&ctx, session)
+ backend, err = model.NewBackend(ctx, session)
if err != nil {
Log.Debug("session::auth 'OAuthToken::NewBackend' %+v", err)
SendErrorResult(res, NewError("Can't authenticate", 401))
@@ -128,7 +128,7 @@ func SessionAuthenticate(ctx App, res http.ResponseWriter, req *http.Request) {
SendSuccessResult(res, nil)
}
-func SessionLogout(ctx App, res http.ResponseWriter, req *http.Request) {
+func SessionLogout(ctx *App, res http.ResponseWriter, req *http.Request) {
go func() {
// user typically expect the logout to feel instant but in our case we still need to make sure
// the connection is closed as lot of backend requires to hold an active session which we cache.
@@ -136,7 +136,7 @@ func SessionLogout(ctx App, res http.ResponseWriter, req *http.Request) {
// then close which can take a few seconds and make for a bad user experience.
// By pushing that connection close in a goroutine, we make sure the logout is much faster for
// the user while still retaining that functionality.
- SessionTry(func(c App, _res http.ResponseWriter, _req *http.Request) {
+ SessionTry(func(c *App, _res http.ResponseWriter, _req *http.Request) {
if c.Backend != nil {
if obj, ok := c.Backend.(interface{ Close() error }); ok {
obj.Close()
@@ -173,12 +173,12 @@ func SessionLogout(ctx App, res http.ResponseWriter, req *http.Request) {
SendSuccessResult(res, nil)
}
-func SessionOAuthBackend(ctx App, res http.ResponseWriter, req *http.Request) {
+func SessionOAuthBackend(ctx *App, res http.ResponseWriter, req *http.Request) {
vars := mux.Vars(req)
a := map[string]string{
"type": vars["service"],
}
- b, err := model.NewBackend(&ctx, a)
+ b, err := model.NewBackend(ctx, a)
if err != nil {
Log.Debug("session::oauth 'NewBackend' %+v", err)
SendErrorResult(res, err)
@@ -210,7 +210,7 @@ func SessionOAuthBackend(ctx App, res http.ResponseWriter, req *http.Request) {
SendSuccessResult(res, redirectUrl.String())
}
-func SessionAuthMiddleware(ctx App, res http.ResponseWriter, req *http.Request) {
+func SessionAuthMiddleware(ctx *App, res http.ResponseWriter, req *http.Request) {
SSOCookieName := "ssoref"
// Step0: Initialisation
@@ -360,7 +360,7 @@ func SessionAuthMiddleware(ctx App, res http.ResponseWriter, req *http.Request)
return
}
- if _, err := model.NewBackend(&ctx, session); err != nil {
+ if _, err := model.NewBackend(ctx, session); err != nil {
Log.Debug("session::authMiddleware 'backend connection failed %+v - %s'", session, err.Error())
http.Redirect(
res, req,
diff --git a/server/ctrl/share.go b/server/ctrl/share.go
index a1e90e77..01798eff 100644
--- a/server/ctrl/share.go
+++ b/server/ctrl/share.go
@@ -10,14 +10,14 @@ import (
"strings"
)
-func ShareList(ctx App, res http.ResponseWriter, req *http.Request) {
+func ShareList(ctx *App, res http.ResponseWriter, req *http.Request) {
path, err := PathBuilder(ctx, req.URL.Query().Get("path"))
if err != nil {
SendErrorResult(res, err)
return
}
listOfSharedLinks, err := model.ShareList(
- GenerateID(&ctx),
+ GenerateID(ctx),
path,
)
if err != nil {
@@ -32,7 +32,7 @@ func ShareList(ctx App, res http.ResponseWriter, req *http.Request) {
SendSuccessResults(res, listOfSharedLinks)
}
-func ShareUpsert(ctx App, res http.ResponseWriter, req *http.Request) {
+func ShareUpsert(ctx *App, res http.ResponseWriter, req *http.Request) {
share_id := mux.Vars(req)["share"]
if share_id == "private" {
Log.Debug("share::upsert 'private'")
@@ -59,7 +59,7 @@ func ShareUpsert(ctx App, res http.ResponseWriter, req *http.Request) {
}(),
Backend: func() string {
if ctx.Share.Id == "" {
- return GenerateID(&ctx)
+ return GenerateID(ctx)
}
return ctx.Share.Backend
}(),
@@ -93,7 +93,7 @@ func ShareUpsert(ctx App, res http.ResponseWriter, req *http.Request) {
SendSuccessResult(res, nil)
}
-func ShareDelete(ctx App, res http.ResponseWriter, req *http.Request) {
+func ShareDelete(ctx *App, res http.ResponseWriter, req *http.Request) {
share_target := mux.Vars(req)["share"]
if err := model.ShareDelete(share_target); err != nil {
Log.Debug("share::delete '%s'", err.Error())
@@ -103,7 +103,7 @@ func ShareDelete(ctx App, res http.ResponseWriter, req *http.Request) {
SendSuccessResult(res, nil)
}
-func ShareVerifyProof(ctx App, res http.ResponseWriter, req *http.Request) {
+func ShareVerifyProof(ctx *App, res http.ResponseWriter, req *http.Request) {
var submittedProof model.Proof
var verifiedProof []model.Proof
var requiredProof []model.Proof
diff --git a/server/ctrl/static.go b/server/ctrl/static.go
index d056413d..bcca10ff 100644
--- a/server/ctrl/static.go
+++ b/server/ctrl/static.go
@@ -17,8 +17,8 @@ import (
//go:embed static/404.html
var HtmlPage404 []byte
-func StaticHandler(_path string) func(App, http.ResponseWriter, *http.Request) {
- return func(ctx App, res http.ResponseWriter, req *http.Request) {
+func StaticHandler(_path string) func(*App, http.ResponseWriter, *http.Request) {
+ return func(ctx *App, res http.ResponseWriter, req *http.Request) {
var base string = GetAbsolutePath(_path)
var srcPath string
if srcPath = JoinPath(base, req.URL.Path); srcPath == base {
@@ -29,8 +29,8 @@ func StaticHandler(_path string) func(App, http.ResponseWriter, *http.Request) {
}
}
-func IndexHandler(_path string) func(App, http.ResponseWriter, *http.Request) {
- return func(ctx App, res http.ResponseWriter, req *http.Request) {
+func IndexHandler(_path string) func(*App, http.ResponseWriter, *http.Request) {
+ return func(ctx *App, res http.ResponseWriter, req *http.Request) {
urlObj, err := URL.Parse(req.URL.String())
if err != nil {
NotFoundHandler(ctx, res, req)
@@ -68,7 +68,7 @@ func IndexHandler(_path string) func(App, http.ResponseWriter, *http.Request) {
}
}
-func NotFoundHandler(ctx App, res http.ResponseWriter, req *http.Request) {
+func NotFoundHandler(ctx *App, res http.ResponseWriter, req *http.Request) {
res.WriteHeader(http.StatusNotFound)
res.Write(HtmlPage404)
}
@@ -79,7 +79,7 @@ var listOfPlugins map[string][]string = map[string][]string{
"custom": []string{},
}
-func AboutHandler(ctx App, res http.ResponseWriter, req *http.Request) {
+func AboutHandler(ctx *App, res http.ResponseWriter, req *http.Request) {
t, _ := template.New("about").Parse(Page(`
{{index .App 0}}
@@ -121,7 +121,7 @@ func AboutHandler(ctx App, res http.ResponseWriter, req *http.Request) {
}})
}
-func ManifestHandler(ctx App, res http.ResponseWriter, req *http.Request) {
+func ManifestHandler(ctx *App, res http.ResponseWriter, req *http.Request) {
res.WriteHeader(http.StatusFound)
res.Write([]byte(fmt.Sprintf(`{
"name": "%s",
@@ -146,7 +146,7 @@ func ManifestHandler(ctx App, res http.ResponseWriter, req *http.Request) {
}`, Config.Get("general.name"), Config.Get("general.name"))))
}
-func RobotsHandler(ctx App, res http.ResponseWriter, req *http.Request) {
+func RobotsHandler(ctx *App, res http.ResponseWriter, req *http.Request) {
res.Write([]byte(""))
}
@@ -181,7 +181,7 @@ func InitPluginList(code []byte) {
}
}
-func CustomCssHandler(ctx App, res http.ResponseWriter, req *http.Request) {
+func CustomCssHandler(ctx *App, res http.ResponseWriter, req *http.Request) {
res.Header().Set("Content-Type", "text/css")
io.WriteString(res, Hooks.Get.CSS())
io.WriteString(res, Config.Get("general.custom_css").String())
diff --git a/server/ctrl/webdav.go b/server/ctrl/webdav.go
index c9b2c600..c554fe00 100644
--- a/server/ctrl/webdav.go
+++ b/server/ctrl/webdav.go
@@ -9,16 +9,16 @@ import (
"strings"
)
-func WebdavHandler(ctx App, res http.ResponseWriter, req *http.Request) {
+func WebdavHandler(ctx *App, res http.ResponseWriter, req *http.Request) {
if ctx.Share.Id == "" {
http.NotFound(res, req)
return
}
// https://github.com/golang/net/blob/master/webdav/webdav.go#L49-L68
- canRead := model.CanRead(&ctx)
- canWrite := model.CanRead(&ctx)
- canUpload := model.CanUpload(&ctx)
+ canRead := model.CanRead(ctx)
+ canWrite := model.CanRead(ctx)
+ canUpload := model.CanUpload(ctx)
switch req.Method {
case "OPTIONS", "GET", "HEAD", "POST", "PROPFIND":
if canRead == false {
@@ -53,8 +53,8 @@ func WebdavHandler(ctx App, res http.ResponseWriter, req *http.Request) {
* an imbecile and considering we can't even see the source code they are running, the best approach we
* could go on is: "crap in, crap out" where useless request coming in are identified and answer appropriatly
*/
-func WebdavBlacklist(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) {
+func WebdavBlacklist(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) {
base := filepath.Base(req.URL.String())
if req.Method == "PUT" || req.Method == "MKCOL" {
diff --git a/server/main.go b/server/main.go
index 7bb074f5..df1a32ef 100644
--- a/server/main.go
+++ b/server/main.go
@@ -22,10 +22,10 @@ var EmbedPluginList []byte
func main() {
app := App{}
- Init(&app)
+ Init(app)
}
-func Init(a *App) {
+func Init(a App) {
var (
r *mux.Router = mux.NewRouter()
middlewares []Middleware
@@ -34,89 +34,89 @@ func Init(a *App) {
// API for Session
session := r.PathPrefix("/api/session").Subrouter()
middlewares = []Middleware{ApiHeaders, SecureHeaders, SecureAjax, SessionStart}
- session.HandleFunc("", NewMiddlewareChain(SessionGet, middlewares, *a)).Methods("GET")
+ session.HandleFunc("", NewMiddlewareChain(SessionGet, middlewares, a)).Methods("GET")
middlewares = []Middleware{ApiHeaders, SecureHeaders, SecureAjax, BodyParser}
- session.HandleFunc("", NewMiddlewareChain(SessionAuthenticate, middlewares, *a)).Methods("POST")
+ session.HandleFunc("", NewMiddlewareChain(SessionAuthenticate, middlewares, a)).Methods("POST")
middlewares = []Middleware{ApiHeaders, SecureHeaders, SecureAjax}
- session.HandleFunc("", NewMiddlewareChain(SessionLogout, middlewares, *a)).Methods("DELETE")
+ session.HandleFunc("", NewMiddlewareChain(SessionLogout, middlewares, a)).Methods("DELETE")
middlewares = []Middleware{ApiHeaders, SecureHeaders}
- session.HandleFunc("/auth/{service}", NewMiddlewareChain(SessionOAuthBackend, middlewares, *a)).Methods("GET")
- session.HandleFunc("/auth/", NewMiddlewareChain(SessionAuthMiddleware, middlewares, *a)).Methods("GET", "POST")
+ session.HandleFunc("/auth/{service}", NewMiddlewareChain(SessionOAuthBackend, middlewares, a)).Methods("GET")
+ session.HandleFunc("/auth/", NewMiddlewareChain(SessionAuthMiddleware, middlewares, a)).Methods("GET", "POST")
// API for Admin Console
middlewares = []Middleware{ApiHeaders, SecureAjax}
admin := r.PathPrefix("/admin/api").Subrouter()
- admin.HandleFunc("/session", NewMiddlewareChain(AdminSessionGet, middlewares, *a)).Methods("GET")
- admin.HandleFunc("/session", NewMiddlewareChain(AdminSessionAuthenticate, middlewares, *a)).Methods("POST")
+ admin.HandleFunc("/session", NewMiddlewareChain(AdminSessionGet, middlewares, a)).Methods("GET")
+ admin.HandleFunc("/session", NewMiddlewareChain(AdminSessionAuthenticate, middlewares, a)).Methods("POST")
middlewares = []Middleware{ApiHeaders, AdminOnly, SecureAjax}
- admin.HandleFunc("/config", NewMiddlewareChain(PrivateConfigHandler, middlewares, *a)).Methods("GET")
- admin.HandleFunc("/config", NewMiddlewareChain(PrivateConfigUpdateHandler, middlewares, *a)).Methods("POST")
+ admin.HandleFunc("/config", NewMiddlewareChain(PrivateConfigHandler, middlewares, a)).Methods("GET")
+ admin.HandleFunc("/config", NewMiddlewareChain(PrivateConfigUpdateHandler, middlewares, a)).Methods("POST")
middlewares = []Middleware{IndexHeaders, AdminOnly}
- admin.HandleFunc("/logs", NewMiddlewareChain(FetchLogHandler, middlewares, *a)).Methods("GET")
+ admin.HandleFunc("/logs", NewMiddlewareChain(FetchLogHandler, middlewares, a)).Methods("GET")
// API for File management
files := r.PathPrefix("/api/files").Subrouter()
middlewares = []Middleware{ApiHeaders, SecureHeaders, SessionStart, LoggedInOnly}
- files.HandleFunc("/cat", NewMiddlewareChain(FileCat, middlewares, *a)).Methods("GET", "HEAD")
- files.HandleFunc("/zip", NewMiddlewareChain(FileDownloader, middlewares, *a)).Methods("GET")
+ files.HandleFunc("/cat", NewMiddlewareChain(FileCat, middlewares, a)).Methods("GET", "HEAD")
+ files.HandleFunc("/zip", NewMiddlewareChain(FileDownloader, middlewares, a)).Methods("GET")
middlewares = []Middleware{ApiHeaders, SecureHeaders, SecureAjax, SessionStart, LoggedInOnly}
- files.HandleFunc("/cat", NewMiddlewareChain(FileAccess, middlewares, *a)).Methods("OPTIONS")
- files.HandleFunc("/cat", NewMiddlewareChain(FileSave, middlewares, *a)).Methods("POST")
- files.HandleFunc("/ls", NewMiddlewareChain(FileLs, middlewares, *a)).Methods("GET")
- files.HandleFunc("/mv", NewMiddlewareChain(FileMv, middlewares, *a)).Methods("GET")
- files.HandleFunc("/rm", NewMiddlewareChain(FileRm, middlewares, *a)).Methods("GET")
- files.HandleFunc("/mkdir", NewMiddlewareChain(FileMkdir, middlewares, *a)).Methods("GET")
- files.HandleFunc("/touch", NewMiddlewareChain(FileTouch, middlewares, *a)).Methods("GET")
+ files.HandleFunc("/cat", NewMiddlewareChain(FileAccess, middlewares, a)).Methods("OPTIONS")
+ files.HandleFunc("/cat", NewMiddlewareChain(FileSave, middlewares, a)).Methods("POST")
+ files.HandleFunc("/ls", NewMiddlewareChain(FileLs, middlewares, a)).Methods("GET")
+ files.HandleFunc("/mv", NewMiddlewareChain(FileMv, middlewares, a)).Methods("GET")
+ files.HandleFunc("/rm", NewMiddlewareChain(FileRm, middlewares, a)).Methods("GET")
+ files.HandleFunc("/mkdir", NewMiddlewareChain(FileMkdir, middlewares, a)).Methods("GET")
+ files.HandleFunc("/touch", NewMiddlewareChain(FileTouch, middlewares, a)).Methods("GET")
middlewares = []Middleware{ApiHeaders, SessionStart, LoggedInOnly}
- files.HandleFunc("/search", NewMiddlewareChain(FileSearch, middlewares, *a)).Methods("GET")
+ files.HandleFunc("/search", NewMiddlewareChain(FileSearch, middlewares, a)).Methods("GET")
// API for Shared link
share := r.PathPrefix("/api/share").Subrouter()
middlewares = []Middleware{ApiHeaders, SecureHeaders, SecureAjax, SessionStart, LoggedInOnly}
- share.HandleFunc("", NewMiddlewareChain(ShareList, middlewares, *a)).Methods("GET")
+ share.HandleFunc("", NewMiddlewareChain(ShareList, middlewares, a)).Methods("GET")
middlewares = []Middleware{ApiHeaders, SecureHeaders, SecureAjax, BodyParser}
- share.HandleFunc("/{share}/proof", NewMiddlewareChain(ShareVerifyProof, middlewares, *a)).Methods("POST")
+ share.HandleFunc("/{share}/proof", NewMiddlewareChain(ShareVerifyProof, middlewares, a)).Methods("POST")
middlewares = []Middleware{ApiHeaders, SecureHeaders, SecureAjax, CanManageShare}
- share.HandleFunc("/{share}", NewMiddlewareChain(ShareDelete, middlewares, *a)).Methods("DELETE")
+ share.HandleFunc("/{share}", NewMiddlewareChain(ShareDelete, middlewares, a)).Methods("DELETE")
middlewares = []Middleware{ApiHeaders, SecureHeaders, SecureAjax, BodyParser, CanManageShare}
- share.HandleFunc("/{share}", NewMiddlewareChain(ShareUpsert, middlewares, *a)).Methods("POST")
+ share.HandleFunc("/{share}", NewMiddlewareChain(ShareUpsert, middlewares, a)).Methods("POST")
// Webdav server / Shared Link
middlewares = []Middleware{IndexHeaders, SecureHeaders}
- r.HandleFunc("/s/{share}", NewMiddlewareChain(IndexHandler(FILE_INDEX), middlewares, *a)).Methods("GET")
+ r.HandleFunc("/s/{share}", NewMiddlewareChain(IndexHandler(FILE_INDEX), middlewares, a)).Methods("GET")
middlewares = []Middleware{WebdavBlacklist, SessionStart}
- r.PathPrefix("/s/{share}").Handler(NewMiddlewareChain(WebdavHandler, middlewares, *a))
+ r.PathPrefix("/s/{share}").Handler(NewMiddlewareChain(WebdavHandler, middlewares, a))
middlewares = []Middleware{ApiHeaders, SecureHeaders, RedirectSharedLoginIfNeeded, SessionStart, LoggedInOnly}
- r.PathPrefix("/api/export/{share}/{mtype0}/{mtype1}").Handler(NewMiddlewareChain(FileExport, middlewares, *a))
+ r.PathPrefix("/api/export/{share}/{mtype0}/{mtype1}").Handler(NewMiddlewareChain(FileExport, middlewares, a))
// Application Resources
middlewares = []Middleware{ApiHeaders}
- r.HandleFunc("/api/config", NewMiddlewareChain(PublicConfigHandler, middlewares, *a)).Methods("GET")
- r.HandleFunc("/api/backend", NewMiddlewareChain(AdminBackend, middlewares, *a)).Methods("GET")
- r.HandleFunc("/api/middlewares/authentication", NewMiddlewareChain(AdminAuthenticationMiddleware, middlewares, *a)).Methods("GET")
+ r.HandleFunc("/api/config", NewMiddlewareChain(PublicConfigHandler, middlewares, a)).Methods("GET")
+ r.HandleFunc("/api/backend", NewMiddlewareChain(AdminBackend, middlewares, a)).Methods("GET")
+ r.HandleFunc("/api/middlewares/authentication", NewMiddlewareChain(AdminAuthenticationMiddleware, middlewares, a)).Methods("GET")
middlewares = []Middleware{StaticHeaders}
- r.PathPrefix("/assets").Handler(http.HandlerFunc(NewMiddlewareChain(StaticHandler(FILE_ASSETS), middlewares, *a))).Methods("GET")
- r.HandleFunc("/favicon.ico", NewMiddlewareChain(StaticHandler(FILE_ASSETS+"/assets/logo/"), middlewares, *a)).Methods("GET")
- r.HandleFunc("/sw_cache.js", NewMiddlewareChain(StaticHandler(FILE_ASSETS+"/assets/worker/"), middlewares, *a)).Methods("GET")
+ r.PathPrefix("/assets").Handler(http.HandlerFunc(NewMiddlewareChain(StaticHandler(FILE_ASSETS), middlewares, a))).Methods("GET")
+ r.HandleFunc("/favicon.ico", NewMiddlewareChain(StaticHandler(FILE_ASSETS+"/assets/logo/"), middlewares, a)).Methods("GET")
+ r.HandleFunc("/sw_cache.js", NewMiddlewareChain(StaticHandler(FILE_ASSETS+"/assets/worker/"), middlewares, a)).Methods("GET")
// Other endpoints
middlewares = []Middleware{ApiHeaders}
- r.HandleFunc("/report", NewMiddlewareChain(ReportHandler, middlewares, *a)).Methods("POST")
+ r.HandleFunc("/report", NewMiddlewareChain(ReportHandler, middlewares, a)).Methods("POST")
middlewares = []Middleware{IndexHeaders}
- r.HandleFunc("/about", NewMiddlewareChain(AboutHandler, middlewares, *a)).Methods("GET")
- r.HandleFunc("/robots.txt", NewMiddlewareChain(RobotsHandler, []Middleware{}, *a))
- r.HandleFunc("/manifest.json", NewMiddlewareChain(ManifestHandler, []Middleware{}, *a)).Methods("GET")
- r.HandleFunc("/.well-known/security.txt", NewMiddlewareChain(WellKnownSecurityHandler, []Middleware{}, *a)).Methods("GET")
- r.HandleFunc("/healthz", NewMiddlewareChain(HealthHandler, []Middleware{}, *a)).Methods("GET")
- r.HandleFunc("/custom.css", NewMiddlewareChain(CustomCssHandler, []Middleware{}, *a)).Methods("GET")
+ r.HandleFunc("/about", NewMiddlewareChain(AboutHandler, middlewares, a)).Methods("GET")
+ r.HandleFunc("/robots.txt", NewMiddlewareChain(RobotsHandler, []Middleware{}, a))
+ r.HandleFunc("/manifest.json", NewMiddlewareChain(ManifestHandler, []Middleware{}, a)).Methods("GET")
+ r.HandleFunc("/.well-known/security.txt", NewMiddlewareChain(WellKnownSecurityHandler, []Middleware{}, a)).Methods("GET")
+ r.HandleFunc("/healthz", NewMiddlewareChain(HealthHandler, []Middleware{}, a)).Methods("GET")
+ r.HandleFunc("/custom.css", NewMiddlewareChain(CustomCssHandler, []Middleware{}, a)).Methods("GET")
if os.Getenv("DEBUG") == "true" {
initDebugRoutes(r)
}
- initPluginsRoutes(r, a)
+ initPluginsRoutes(r, &a)
- r.PathPrefix("/admin").Handler(http.HandlerFunc(NewMiddlewareChain(IndexHandler(FILE_INDEX), middlewares, *a))).Methods("GET")
- r.PathPrefix("/").Handler(http.HandlerFunc(NewMiddlewareChain(IndexHandler(FILE_INDEX), middlewares, *a))).Methods("GET", "POST")
+ r.PathPrefix("/admin").Handler(http.HandlerFunc(NewMiddlewareChain(IndexHandler(FILE_INDEX), middlewares, a))).Methods("GET")
+ r.PathPrefix("/").Handler(http.HandlerFunc(NewMiddlewareChain(IndexHandler(FILE_INDEX), middlewares, a))).Methods("GET", "POST")
// Routes are served via plugins to avoid getting stuck with plain HTTP. The idea is to
// support many more protocols in the future: HTTPS, HTTP2, TOR or whatever that sounds
diff --git a/server/middleware/context.go b/server/middleware/context.go
index bbae792f..8c6861e2 100644
--- a/server/middleware/context.go
+++ b/server/middleware/context.go
@@ -7,7 +7,7 @@ import (
"net/http"
)
-func BodyParser(fn func(App, http.ResponseWriter, *http.Request)) func(ctx App, res http.ResponseWriter, req *http.Request) {
+func BodyParser(fn func(*App, http.ResponseWriter, *http.Request)) func(ctx *App, res http.ResponseWriter, req *http.Request) {
extractBody := func(req *http.Request) (map[string]interface{}, error) {
var body map[string]interface{}
byt, err := ioutil.ReadAll(req.Body)
@@ -20,7 +20,7 @@ func BodyParser(fn func(App, http.ResponseWriter, *http.Request)) func(ctx App,
return body, nil
}
- return func(ctx App, res http.ResponseWriter, req *http.Request) {
+ return func(ctx *App, res http.ResponseWriter, req *http.Request) {
var err error
if ctx.Body, err = extractBody(req); err != nil {
SendErrorResult(res, ErrNotValid)
diff --git a/server/middleware/http.go b/server/middleware/http.go
index ec65df74..b9581e3b 100644
--- a/server/middleware/http.go
+++ b/server/middleware/http.go
@@ -7,8 +7,8 @@ import (
"path/filepath"
)
-func ApiHeaders(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) {
+func ApiHeaders(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) {
header := res.Header()
header.Set("Content-Type", "application/json")
header.Set("Cache-Control", "no-cache")
@@ -16,8 +16,8 @@ func ApiHeaders(fn func(App, http.ResponseWriter, *http.Request)) func(ctx App,
}
}
-func StaticHeaders(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) {
+func StaticHeaders(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) {
header := res.Header()
header.Set("Content-Type", GetMimeType(filepath.Ext(req.URL.Path)))
header.Set("Cache-Control", "max-age=2592000")
@@ -25,8 +25,8 @@ func StaticHeaders(fn func(App, http.ResponseWriter, *http.Request)) func(ctx Ap
}
}
-func IndexHeaders(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) {
+func IndexHeaders(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) {
header := res.Header()
header.Set("Content-Type", "text/html")
header.Set("Cache-Control", "no-cache")
@@ -59,8 +59,8 @@ func IndexHeaders(fn func(App, http.ResponseWriter, *http.Request)) func(ctx App
}
}
-func SecureHeaders(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) {
+func SecureHeaders(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) {
if host := Config.Get("general.host").String(); host != "" {
if req.Host != host && req.Host != fmt.Sprintf("%s:443", host) {
Log.Error("Request coming from \"%s\" was blocked, only traffic from \"%s\" is allowed. You can change this from the admin console under configure -> host", req.Host, host)
@@ -78,8 +78,8 @@ func SecureHeaders(fn func(App, http.ResponseWriter, *http.Request)) func(ctx Ap
}
}
-func SecureAjax(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) {
+func SecureAjax(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) {
if req.Header.Get("X-Requested-With") != "XmlHttpRequest" {
Log.Warning("Intrusion detection: %s - %s", req.RemoteAddr, req.URL.String())
SendErrorResult(res, ErrNotAllowed)
diff --git a/server/middleware/index.go b/server/middleware/index.go
index 9a175906..132a0f6b 100644
--- a/server/middleware/index.go
+++ b/server/middleware/index.go
@@ -9,17 +9,17 @@ import (
"time"
)
-type Middleware func(func(App, http.ResponseWriter, *http.Request)) func(App, http.ResponseWriter, *http.Request)
+type Middleware func(func(*App, http.ResponseWriter, *http.Request)) func(*App, http.ResponseWriter, *http.Request)
-func NewMiddlewareChain(fn func(App, http.ResponseWriter, *http.Request), m []Middleware, app App) http.HandlerFunc {
+func NewMiddlewareChain(fn func(*App, http.ResponseWriter, *http.Request), m []Middleware, app App) http.HandlerFunc {
return func(res http.ResponseWriter, req *http.Request) {
var resw ResponseWriter = NewResponseWriter(res)
- var f func(App, http.ResponseWriter, *http.Request) = fn
+ var f func(*App, http.ResponseWriter, *http.Request) = fn
for i := len(m) - 1; i >= 0; i-- {
f = m[i](f)
}
- f(app, &resw, req)
+ f(&app, &resw, req)
if req.Body != nil {
req.Body.Close()
}
@@ -65,12 +65,16 @@ type LogEntry struct {
Duration float64 `json:"responseTime"`
Version string `json:"version"`
Backend string `json:"backend"`
+ Share string `json:"share"`
+ License string `json:"license"`
+ Session string `json:"session"`
}
func Logger(ctx App, res http.ResponseWriter, req *http.Request) {
if obj, ok := res.(*ResponseWriter); ok && req.RequestURI != "/about" {
point := LogEntry{
- Version: APP_VERSION,
+ Version: APP_VERSION + "." + BUILD_DATE,
+ License: LICENSE,
Scheme: req.URL.Scheme,
Host: req.Host,
Method: req.Method,
@@ -81,7 +85,24 @@ func Logger(ctx App, res http.ResponseWriter, req *http.Request) {
Ip: req.RemoteAddr,
Referer: req.Referer(),
Duration: float64(time.Now().Sub(obj.start)) / (1000 * 1000),
- Backend: ctx.Session["type"],
+ Backend: func() string {
+ if ctx.Session["type"] == "" {
+ return "null"
+ }
+ return ctx.Session["type"]
+ }(),
+ Share: func() string {
+ if ctx.Share.Id == "" {
+ return "null"
+ }
+ return ctx.Share.Id
+ }(),
+ Session: func() string {
+ if ctx.Session["type"] == "" {
+ return "null"
+ }
+ return GenerateID(&ctx)
+ }(),
}
if Config.Get("log.telemetry").Bool() {
telemetry.Record(point)
diff --git a/server/middleware/session.go b/server/middleware/session.go
index 1cf1470a..38b43af6 100644
--- a/server/middleware/session.go
+++ b/server/middleware/session.go
@@ -13,8 +13,8 @@ import (
"strings"
)
-func LoggedInOnly(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) {
+func LoggedInOnly(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) {
if ctx.Backend == nil || ctx.Session == nil {
SendErrorResult(res, ErrPermissionDenied)
return
@@ -23,8 +23,8 @@ func LoggedInOnly(fn func(App, http.ResponseWriter, *http.Request)) func(ctx App
}
}
-func AdminOnly(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) {
+func AdminOnly(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) {
if admin := Config.Get("auth.admin").String(); admin != "" {
c, err := req.Cookie(COOKIE_NAME_ADMIN)
if err != nil {
@@ -49,18 +49,18 @@ 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) {
- return func(ctx App, res http.ResponseWriter, req *http.Request) {
+func SessionStart(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) {
var err error
if ctx.Share, err = _extractShare(req); err != nil {
SendErrorResult(res, err)
return
}
- if ctx.Session, err = _extractSession(req, &ctx); err != nil {
+ if ctx.Session, err = _extractSession(req, ctx); err != nil {
SendErrorResult(res, err)
return
}
- if ctx.Backend, err = _extractBackend(req, &ctx); err != nil {
+ if ctx.Backend, err = _extractBackend(req, ctx); err != nil {
if len(ctx.Session) == 0 {
SendErrorResult(res, ErrNotAuthorized)
return
@@ -72,17 +72,17 @@ func SessionStart(fn func(App, http.ResponseWriter, *http.Request)) func(ctx App
}
}
-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) {
+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)
+ 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) {
+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)
if share_id == "" {
if mux.Vars(req)["share"] == "private" {
@@ -102,8 +102,8 @@ func RedirectSharedLoginIfNeeded(fn func(App, http.ResponseWriter, *http.Request
}
}
-func CanManageShare(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) {
+func CanManageShare(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 := mux.Vars(req)["share"]
if share_id == "" {
Log.Debug("middleware::session::share 'invalid share id'")
@@ -127,12 +127,12 @@ func CanManageShare(fn func(App, http.ResponseWriter, *http.Request)) func(ctx A
// the user that's currently logged in can manage the link. 2 scenarios here:
// 1) scenario 1: the user is the very same one that generated the shared link in the first place
ctx.Share = Share{}
- if ctx.Session, err = _extractSession(req, &ctx); err != nil {
+ if ctx.Session, err = _extractSession(req, ctx); err != nil {
Log.Debug("middleware::session::share 'cannot extract session - %s'", err.Error())
SendErrorResult(res, err)
return
}
- if s.Backend == GenerateID(&ctx) {
+ if s.Backend == GenerateID(ctx) {
fn(ctx, res, req)
return
}
@@ -143,13 +143,13 @@ func CanManageShare(fn func(App, http.ResponseWriter, *http.Request)) func(ctx A
SendErrorResult(res, err)
return
}
- if ctx.Session, err = _extractSession(req, &ctx); err != nil {
+ if ctx.Session, err = _extractSession(req, ctx); err != nil {
Log.Debug("middleware::session::share 'cannot extract session 2 - %s'", err.Error())
SendErrorResult(res, err)
return
}
- id := GenerateID(&ctx)
+ id := GenerateID(ctx)
if s.Backend == id {
if s.CanShare == true {
fn(ctx, res, req)
diff --git a/server/plugin/plg_authorisation_example/index.go b/server/plugin/plg_authorisation_example/index.go
index 4368e95f..00ab5763 100644
--- a/server/plugin/plg_authorisation_example/index.go
+++ b/server/plugin/plg_authorisation_example/index.go
@@ -10,37 +10,37 @@ func init() {
type AuthM struct{}
-func (this AuthM) Ls(ctx App, path string) error {
+func (this AuthM) Ls(ctx *App, path string) error {
Log.Stdout("LS %+v", ctx.Session)
return nil
}
-func (this AuthM) Cat(ctx App, path string) error {
+func (this AuthM) Cat(ctx *App, path string) error {
Log.Stdout("CAT %+v", ctx.Session)
return nil
}
-func (this AuthM) Mkdir(ctx App, path string) error {
+func (this AuthM) Mkdir(ctx *App, path string) error {
Log.Stdout("MKDIR %+v", ctx.Session)
return ErrNotAllowed
}
-func (this AuthM) Rm(ctx App, path string) error {
+func (this AuthM) Rm(ctx *App, path string) error {
Log.Stdout("RM %+v", ctx.Session)
return ErrNotAllowed
}
-func (this AuthM) Mv(ctx App, from string, to string) error {
+func (this AuthM) Mv(ctx *App, from string, to string) error {
Log.Stdout("MV %+v", ctx.Session)
return ErrNotAllowed
}
-func (this AuthM) Save(ctx App, path string) error {
+func (this AuthM) Save(ctx *App, path string) error {
Log.Stdout("SAVE %+v", ctx.Session)
return ErrNotAllowed
}
-func (this AuthM) Touch(ctx App, path string) error {
+func (this AuthM) Touch(ctx *App, path string) error {
Log.Stdout("TOUCH %+v", ctx.Session)
return ErrNotAllowed
}
diff --git a/server/plugin/plg_editor_onlyoffice/index.go b/server/plugin/plg_editor_onlyoffice/index.go
index 7ae9e536..55e1af9e 100644
--- a/server/plugin/plg_editor_onlyoffice/index.go
+++ b/server/plugin/plg_editor_onlyoffice/index.go
@@ -157,8 +157,8 @@ func StaticHandler(res http.ResponseWriter, req *http.Request) {
reverseProxy.ServeHTTP(res, req)
}
-func IframeContentHandler(ctx App, res http.ResponseWriter, req *http.Request) {
- if model.CanRead(&ctx) == false {
+func IframeContentHandler(ctx *App, res http.ResponseWriter, req *http.Request) {
+ if model.CanRead(ctx) == false {
SendErrorResult(res, ErrPermissionDenied)
return
} else if oodsLocation := Config.Get("features.office.onlyoffice_server").String(); oodsLocation == "" {
@@ -188,7 +188,7 @@ func IframeContentHandler(ctx App, res http.ResponseWriter, req *http.Request) {
return
}
- userId = GenerateID(&ctx)
+ userId = GenerateID(ctx)
f, err := ctx.Backend.Cat(path)
if err != nil {
SendErrorResult(res, err)
@@ -199,7 +199,7 @@ func IframeContentHandler(ctx App, res http.ResponseWriter, req *http.Request) {
filename = filepath.Base(path)
oodsMode = func() string {
- if model.CanEdit(&ctx) == false {
+ if model.CanEdit(ctx) == false {
return "view"
}
return "edit"
diff --git a/server/plugin/plg_video_transcoder/index.go b/server/plugin/plg_video_transcoder/index.go
index 7d258232..e461155c 100644
--- a/server/plugin/plg_video_transcoder/index.go
+++ b/server/plugin/plg_video_transcoder/index.go
@@ -164,7 +164,7 @@ func hls_playlist(reader io.ReadCloser, ctx *App, res *http.ResponseWriter, req
return NewReadCloserFromBytes([]byte(response)), nil
}
-func hls_transcode(ctx App, res http.ResponseWriter, req *http.Request) {
+func hls_transcode(ctx *App, res http.ResponseWriter, req *http.Request) {
segmentNumber, err := strconv.Atoi(mux.Vars(req)["segment"])
if err != nil {
Log.Info("[plugin hls] invalid segment request '%s'", mux.Vars(req)["segment"])