From a82177e719a09bd7db57b255b01132bf6de0adc2 Mon Sep 17 00:00:00 2001 From: Mickael Kerjean Date: Tue, 30 Aug 2022 17:24:25 +1000 Subject: [PATCH] maintain (ctx): pass app context as pointer --- server/common/types.go | 14 +-- server/ctrl/admin.go | 8 +- server/ctrl/config.go | 8 +- server/ctrl/export.go | 4 +- server/ctrl/files.go | 58 ++++++------ server/ctrl/report.go | 6 +- server/ctrl/search.go | 6 +- server/ctrl/session.go | 20 ++--- server/ctrl/share.go | 12 +-- server/ctrl/static.go | 18 ++-- server/ctrl/webdav.go | 12 +-- server/main.go | 90 +++++++++---------- server/middleware/context.go | 4 +- server/middleware/http.go | 20 ++--- server/middleware/index.go | 33 +++++-- server/middleware/session.go | 40 ++++----- .../plugin/plg_authorisation_example/index.go | 14 +-- server/plugin/plg_editor_onlyoffice/index.go | 8 +- server/plugin/plg_video_transcoder/index.go | 2 +- 19 files changed, 199 insertions(+), 178 deletions(-) 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"])