From c61f528e2412cfa04cb37fa315cf04b6107004c5 Mon Sep 17 00:00:00 2001 From: Mickael KERJEAN Date: Thu, 10 Jan 2019 02:54:32 +1100 Subject: [PATCH] fix (share): fix edge cases around the path and start migrate tests --- client/helpers/path.test.js | 48 ------ client/pages/filespage/share.js | 8 +- client/pages/viewerpage.js | 2 - client/pages/viewerpage/ide.js | 14 +- config/emacs.el | 2 +- server/common/config.go | 4 +- server/common/config_test.go | 45 ------ server/common/crypto_test.go | 46 ------ server/common/files.go | 24 ++- server/common/utils.go | 28 ++++ server/ctrl/config.go | 3 +- server/ctrl/export.go | 12 +- server/ctrl/session.go | 7 +- server/ctrl/share.go | 18 ++- server/ctrl/static.go | 41 +++--- server/main.go | 1 - server/middleware/session.go | 43 ++++-- server/model/files.go | 16 +- server/model/files_test.go | 250 -------------------------------- server/model/share_test.go | 159 -------------------- 20 files changed, 146 insertions(+), 625 deletions(-) delete mode 100644 client/helpers/path.test.js delete mode 100644 server/common/config_test.go delete mode 100644 server/common/crypto_test.go delete mode 100644 server/model/files_test.go delete mode 100644 server/model/share_test.go diff --git a/client/helpers/path.test.js b/client/helpers/path.test.js deleted file mode 100644 index 199ced16..00000000 --- a/client/helpers/path.test.js +++ /dev/null @@ -1,48 +0,0 @@ -const p = require("./path"); - -describe("Path", () => { - it("can create beautiful with proper convention for folder or file", () => { - let res = p.pathBuilder("/test/polo", "polo", "file"); - expect(res).toBe("/test/polo/polo"); - - res = p.pathBuilder("/test/polo", "polo", "directory"); - expect(res).toBe("/test/polo/polo/"); - }); - - it("can extract the filename from a path", () => { - let res = p.basename("/var/www/html/test") - expect(res).toBe("test"); - }); - - it("can extract the dirname from a path", () => { - let res = p.basename("/var/www/html/test/") - expect(res).toBe("test"); - }); - - it("can transform 2 absolute path as relative", () => { - let res = p.absoluteToRelative("/var/www/", "/var/www/html/test"); - expect(res).toBe("./html/test"); - - res = p.absoluteToRelative("/var/www/html/test/", "/var/www/polo"); - expect(res).toBe("../../polo") - - res = p.absoluteToRelative("/var/www/html/test", "/var/www/polo"); - expect(res).toBe("../polo") - - res = p.absoluteToRelative("/var/www/html/test", "/var/www/polo/"); - expect(res).toBe("../polo/") - - res = p.absoluteToRelative("/var/www/", "/var/www/html/test/"); - expect(res).toBe("./html/test/"); - - res = p.absoluteToRelative("/var/www/", "/var/www/"); - expect(res).toBe("./"); - - res = p.absoluteToRelative("/var/www", "/var/www/"); - expect(res).toBe("./www/"); - - res = p.absoluteToRelative("/var/test/", "/var/www"); - expect(res).toBe("../www"); - }); - -}); diff --git a/client/pages/filespage/share.js b/client/pages/filespage/share.js index 2c64c6de..b7410d9f 100644 --- a/client/pages/filespage/share.js +++ b/client/pages/filespage/share.js @@ -161,12 +161,12 @@ export class ShareComponent extends React.Component { render(){ const beautifulPath = function(from, to){ + to = from.replace(/\/$/, "") + to; if(filetype(from) === "directory"){ - from = from.split("/"); - from = from.slice(0, from.length - 1); - from = from.join("/"); + from = from.split("/") + from = from.slice(0, from.length - 1) + from = from.join("/") } - let p = absoluteToRelative(from, to); return p.length < to.length ? p : to; }; diff --git a/client/pages/viewerpage.js b/client/pages/viewerpage.js index 312339ac..91d4be23 100644 --- a/client/pages/viewerpage.js +++ b/client/pages/viewerpage.js @@ -67,7 +67,6 @@ export class ViewerPage extends React.Component { Files.options(this.state.path) ]).then((d) => { const [content, options] = d; - console.log(options); options.allowed this.setState({ content: content, @@ -75,7 +74,6 @@ export class ViewerPage extends React.Component { acl: options["allow"] }); }).catch((err) => { - console.log(err); if(err && err.code === 'BINARY_FILE'){ this.setState({opener: 'download', loading: false}); }else{ diff --git a/client/pages/viewerpage/ide.js b/client/pages/viewerpage/ide.js index 3c20c608..680873ce 100644 --- a/client/pages/viewerpage/ide.js +++ b/client/pages/viewerpage/ide.js @@ -122,13 +122,13 @@ export class IDE extends React.Component { Save current file - Export as HTML - Export as PDF - Export as Text - Export as Latex - Export as Calendar - Export as Beamer - Export as Open office + Export as HTML + Export as PDF + Export as Text + Export as Latex + Export as Calendar + Export as Beamer + Export as Open office Export as Markdown diff --git a/config/emacs.el b/config/emacs.el index efc681e4..b859873e 100644 --- a/config/emacs.el +++ b/config/emacs.el @@ -4,7 +4,7 @@ (setq org-todo-keywords (quote ((sequence "TODO(t)" "DOING(d)" "WAITING(w)" "|" "CANCEL(C)" "DEFERRED(F)" "DONE(D)")))) ;; html export -(setq org-html-head "") +(setq org-html-head "") (setq org-html-validation-link nil) (setq org-html-creator-string "Using Filestash") diff --git a/server/common/config.go b/server/common/config.go index 8f774915..5ba91def 100644 --- a/server/common/config.go +++ b/server/common/config.go @@ -263,9 +263,7 @@ func JsonIterator(json string) []JSONIterator { } else if value.IsArray() { return true } - if value.Value != nil { - j = append(j, JSONIterator{k, value.Value()}) - } + j = append(j, JSONIterator{k, value.Value()}) return true }) } diff --git a/server/common/config_test.go b/server/common/config_test.go deleted file mode 100644 index 1933e232..00000000 --- a/server/common/config_test.go +++ /dev/null @@ -1,45 +0,0 @@ -package common - -import ( - "testing" - "github.com/stretchr/testify/assert" -) - -func TestConfigGet(t *testing.T) { - c := NewConfiguration() - assert.Equal(t, nil, c.Get("foo").Interface()) - assert.Equal(t, nil, c.Get("foo.bar").Interface()) -} - -func TestConfigDefault(t *testing.T) { - c := NewConfiguration() - assert.Equal(t, "test", c.Get("foo.bar").Default("test").Interface()) - assert.Equal(t, "test", c.Get("foo.bar").Default("test").String()) - assert.Equal(t, "test", c.Get("foo.bar").String()) - assert.Equal(t, "test", c.Get("foo.bar").Default("nope").String()) - assert.Equal(t, "nope", c.Get("foo.bar.test").Default("nope").String()) -} - -func TestConfigTypeCase(t *testing.T) { - c := NewConfiguration() - assert.Equal(t, nil, c.Get("foo.bar.nil").Default(nil).Interface()) - assert.Equal(t, true, c.Get("foo.bar.bool").Default(true).Bool()) - assert.Equal(t, 100, c.Get("foo.bar.int").Default(100).Int()) - assert.Equal(t, "test", c.Get("foo.bar.string").Default("test").String()) -} - -func TestConfigSet(t *testing.T) { - assert.Equal(t, "test", Config.Get("foo.bar").Set("test").String()) - assert.Equal(t, "valu", Config.Get("foo.bar").Set("valu").String()) - assert.Equal(t, "valu", Config.Get("foo.bar.test.bar.foo").Set("valu").String()) -} - -func BenchmarkGetConfigElement(b *testing.B) { - c := NewConfiguration() - c.Get("foo.bar.test.foo").Set("test") - c.Get("foo.bar.test.bar.foo").Set("valu") - - for n := 0; n < b.N; n++ { - c.Get("foo.bar.test.foo").String() - } -} diff --git a/server/common/crypto_test.go b/server/common/crypto_test.go deleted file mode 100644 index ce3331a9..00000000 --- a/server/common/crypto_test.go +++ /dev/null @@ -1,46 +0,0 @@ -package common - -import ( - "testing" - "github.com/stretchr/testify/assert" -) - -func TestEncryptString(t *testing.T) { - key := "test|test|test|test|test" - text := "I'm some text" - a, err := EncryptString(key, text) - assert.NoError(t, err) - assert.NotNil(t, a) - assert.NotEqual(t, a, text) - - b, err := DecryptString(key, a) - assert.NoError(t, err) - assert.Equal(t, b, text) - -} - -func TestIDGeneration(t *testing.T) { - session := make(map[string]string) - session["foo"] = "bar" - app := &App{ - Session: session, - } - - id1 := GenerateID(app) - session["user"] = "polo" - id2 := GenerateID(app) - session["doesn_t_matter"] = "N/A" - id3 := GenerateID(app) - - assert.NotEqual(t, id1, id2) - assert.Equal(t, id2, id3) -} - -func TestStringGeneration(t *testing.T) { - str := QuickString(10) - str1 := QuickString(16) - str2 := QuickString(24) - assert.Equal(t, len(str), 10) - assert.Equal(t, len(str1), 16) - assert.Equal(t, len(str2), 24) -} diff --git a/server/common/files.go b/server/common/files.go index 5f6363ff..be8be21d 100644 --- a/server/common/files.go +++ b/server/common/files.go @@ -16,17 +16,31 @@ func GetAbsolutePath(p string) string { } func IsDirectory(path string) bool { - if string(path[len(path)-1]) != "/" { + if path == "" { + return false + } + if path[len(path) - 1:] != "/" { return false } return true } -func JoinPath(base, file string) (string, error) { +/* + * Join 2 path together, result has a file + */ +func JoinPath(base, file string) string { filePath := filepath.Join(base, file) - if strings.HasPrefix(filePath, base) == false { - return "", ErrNotValid + return base } - return filePath, nil + return filePath +} + +func EnforceDirectory(path string) string { + if path == "" { + return "/" + } else if path[len(path) - 1:] == "/" { + return path + } + return path + "/" } diff --git a/server/common/utils.go b/server/common/utils.go index 1263731f..739d1ac3 100644 --- a/server/common/utils.go +++ b/server/common/utils.go @@ -3,6 +3,7 @@ package common import ( "bytes" "encoding/json" + "sync" ) func NewBool(t bool) *bool { @@ -66,3 +67,30 @@ func PrettyPrint(json_dirty []byte) []byte { json_pretty.Write([]byte("\n")) return json_pretty.Bytes() } + +type SafeMapStringString struct { + sync.RWMutex + internal map[string]string +} + +func NewSafeMapStringString() SafeMapStringString { + return SafeMapStringString{ + internal: make(map[string]string), + } +} + +func(this SafeMapStringString) Set(key string, value string) { + this.Lock() + this.internal[key] = value + this.Unlock() +} + +func(this SafeMapStringString) Gets(keys ...string) []string{ + this.RLock() + defer this.RUnlock() + res := make([]string, len(keys)) + for i, key := range keys { + res[i] = this.internal[key] + } + return res +} diff --git a/server/ctrl/config.go b/server/ctrl/config.go index 13842203..af8f525a 100644 --- a/server/ctrl/config.go +++ b/server/ctrl/config.go @@ -1,6 +1,7 @@ package ctrl import ( + "encoding/json" . "github.com/mickael-kerjean/filestash/server/common" "io" "io/ioutil" @@ -91,7 +92,7 @@ func PrivateConfigUpdateHandler(ctx App, res http.ResponseWriter, req *http.Requ func PublicConfigHandler(ctx App, res http.ResponseWriter, req *http.Request) { cfg := Config.Export() - if c, err := Config.MarshalJSON(); err == nil { + if c, err := json.Marshal(cfg); err == nil { hash := Hash(string(c)) if req.Header.Get("If-None-Match") == hash { res.WriteHeader(http.StatusNotModified) diff --git a/server/ctrl/export.go b/server/ctrl/export.go index 7549a606..8c6a12ce 100644 --- a/server/ctrl/export.go +++ b/server/ctrl/export.go @@ -21,6 +21,12 @@ func init() { os.MkdirAll(EXPORT_PATH, os.ModePerm) } func FileExport(ctx App, res http.ResponseWriter, req *http.Request) { + http.SetCookie(res, &http.Cookie{ + Name: "download", + Value: "", + MaxAge: -1, + Path: "/", + }) query := req.URL.Query() p := mux.Vars(req) mimeType := fmt.Sprintf("%s/%s", p["mtype0"], p["mtype1"]) @@ -32,12 +38,6 @@ func FileExport(ctx App, res http.ResponseWriter, req *http.Request) { SendErrorResult(res, ErrPermissionDenied) return } - http.SetCookie(res, &http.Cookie{ - Name: "download", - Value: "", - MaxAge: -1, - Path: "/", - }) var tmpPath string = EXPORT_PATH + "/export_" + QuickString(10) var cmd *exec.Cmd diff --git a/server/ctrl/session.go b/server/ctrl/session.go index 9ccb1fc3..d40a8189 100644 --- a/server/ctrl/session.go +++ b/server/ctrl/session.go @@ -37,6 +37,7 @@ func SessionGet(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) if err != nil { @@ -60,9 +61,9 @@ func SessionAuthenticate(ctx App, res http.ResponseWriter, req *http.Request) { } } - home, err := model.GetHome(backend, ctx.Session["path"]) + home, err := model.GetHome(backend, session["path"]) if err != nil { - SendErrorResult(res, err) + SendErrorResult(res, ErrInvalidPassword) return } @@ -88,8 +89,6 @@ func SessionAuthenticate(ctx App, res http.ResponseWriter, req *http.Request) { if home == "" { SendSuccessResult(res, nil) - } else if ctx.Body["path"] != nil { - SendSuccessResult(res, nil) } else { SendSuccessResult(res, home) } diff --git a/server/ctrl/share.go b/server/ctrl/share.go index 78d6bca4..b6ea0027 100644 --- a/server/ctrl/share.go +++ b/server/ctrl/share.go @@ -11,20 +11,34 @@ import ( ) 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), - req.URL.Query().Get("path"), + path, ) if err != nil { SendErrorResult(res, err) return } + + for i:=0; i we need to take extra care of which path to use as a chroot + var path string = req.URL.Query().Get("path") + if strings.HasPrefix(req.URL.Path, "/api/export/") == true { + var re = regexp.MustCompile(`^/api/export/[^\/]+/[^\/]+/[^\/]+(\/.+)$`) + path = re.ReplaceAllString(req.URL.Path, `$1`) } - res["path"] = strings.TrimSuffix(ctx.Share.Path, path) + "/" + if strings.HasSuffix(ctx.Share.Path, path) == false { + return make(map[string]string), ErrPermissionDenied + } + session["path"] = strings.TrimSuffix(ctx.Share.Path, path) + "/" } - return res, err + return session, err } else { cookie, err := req.Cookie(COOKIE_NAME_AUTH) if err != nil { - return res, nil + return session, nil } str = cookie.Value str, err = DecryptString(SECRET_KEY, str) if err != nil { // This typically happen when changing the secret key - return res, nil + return session, nil } - err = json.Unmarshal([]byte(str), &res) - return res, err + err = json.Unmarshal([]byte(str), &session) + return session, err } } diff --git a/server/model/files.go b/server/model/files.go index 289baaef..842d00e4 100644 --- a/server/model/files.go +++ b/server/model/files.go @@ -47,21 +47,25 @@ func NewBackend(ctx *App, conn map[string]string) (IBackend, error) { } func GetHome(b IBackend, base string) (string, error) { + if _, err := b.Ls(base); err != nil { + return base, err + } + if obj, ok := b.(interface{ Home() (string, error) }); ok { absolute, err := obj.Home() if err != nil { return "", err } - if strings.HasPrefix(absolute, base) == false { - return "", nil + absolute = EnforceDirectory(absolute) + base = EnforceDirectory(base) + if strings.HasPrefix(absolute, base) { + return "/" + absolute[len(base):], nil } - return absolute[len(base):], nil + return "/", nil } - _, err := b.Ls("/") - return base, err + return base, nil } - func MapStringInterfaceToMapStringString(m map[string]interface{}) map[string]string { res := make(map[string]string) for key, value := range m { diff --git a/server/model/files_test.go b/server/model/files_test.go deleted file mode 100644 index 30356c62..00000000 --- a/server/model/files_test.go +++ /dev/null @@ -1,250 +0,0 @@ -package model - -import ( - . "github.com/mickael-kerjean/filestash/server/common" - "io/ioutil" - "strings" - "testing" -) - -var app *App - -func init() { - app = &App{} -} - -// func TestWebdav(t *testing.T) { -// if os.Getenv("WEBDAV_URL") == "" { -// fmt.Println("- skipped webdav") -// return -// } -// b, err := NewBackend(&App{}, map[string]string{ -// "type": "webdav", -// "url": os.Getenv("WEBDAV_URL"), -// }) -// if err != nil { -// t.Errorf("Can't create WebDav backend") -// } -// setup(t, b) -// suite(t, b) -// tearDown(t, b) -// } - -// func TestFtp(t *testing.T) { -// if os.Getenv("FTP_USERNAME") == "" || os.Getenv("FTP_PASSWORD") == "" { -// fmt.Println("- skipped ftp") -// return -// } -// b, err := NewBackend(&App{}, map[string]string{ -// "type": "ftp", -// "hostname": "127.0.0.1", -// "username": os.Getenv("FTP_USERNAME"), -// "password": os.Getenv("FTP_PASSWORD"), -// }) -// if err != nil { -// t.Errorf("Can't create FTP backend") -// } -// setup(t, b) -// suite(t, b) -// tearDown(t, b) -// b.Rm("/tmp/") -// } - -// func TestSFtp(t *testing.T) { -// if os.Getenv("SFTP_USERNAME") == "" || os.Getenv("SFTP_PASSWORD") == "" { -// fmt.Println("- skipped sftp") -// return -// } -// b, err := NewBackend(&App{}, map[string]string{ -// "type": "sftp", -// "hostname": "127.0.0.1", -// "username": os.Getenv("SFTP_USERNAME"), -// "password": os.Getenv("SFTP_PASSWORD"), -// }) -// if err != nil { -// t.Errorf("Can't create SFTP backend") -// } -// setup(t, b) -// suite(t, b) -// tearDown(t, b) -// } - -// func TestGit(t *testing.T) { -// if os.Getenv("GIT_USERNAME") == "" || os.Getenv("GIT_PASSWORD") == "" { -// fmt.Println("- skipped git") -// return -// } -// b, err := NewBackend(app, map[string]string{ -// "type": "git", -// "repo": "https://github.com/mickael-kerjean/tmp", -// "username": os.Getenv("GIT_EMAIL"), -// "password": os.Getenv("GIT_PASSWORD"), -// }) -// if err != nil { -// t.Errorf("Can't create Git backend") -// } -// setup(t, b) -// suite(t, b) -// tearDown(t, b) -// } - -// func TestS3(t *testing.T) { -// b, err := NewBackend(&App{}, map[string]string{ -// "type": "s3", -// "access_key_id": "Q3AM3UQ867SPQQA43P2F", -// "secret_access_key": "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG", -// "endpoint": "https://play.minio.io:9000/", -// }) -// if err != nil { -// t.Errorf("Can't create S3 backend") -// } -// setup(t, b) -// // suite(t, b) -// //tearDown(t, b) -// } - -// func TestDropbox(t *testing.T) { -// if os.Getenv("DROPBOX_TOKEN") == "" { -// fmt.Println("- skipped Dropbox") -// return -// } -// b, err := NewBackend(app, map[string]string{ -// "type": "dropbox", -// "bearer": os.Getenv("DROPBOX_TOKEN"), -// }) -// if err != nil { -// t.Errorf("Can't create a Dropbox backend") -// } -// setup(t, b) -// suite(t, b) -// tearDown(t, b) -// } - -// func TestGoogleDrive(t *testing.T) { -// if os.Getenv("GDRIVE_TOKEN") == "" { -// fmt.Println("- skipped Google Drive") -// return -// } -// b, err := NewBackend(app, map[string]string{ -// "type": "gdrive", -// "expiry": "", -// "token": os.Getenv("GDRIVE_TOKEN"), -// }) -// if err != nil { -// t.Errorf("Can't create a Google Drive backend") -// } -// setup(t, b) -// suite(t, b) -// tearDown(t, b) -// } - -func setup(t *testing.T, b IBackend) { - b.Rm("/tmp/test/") - b.Mkdir("/tmp/") - b.Mkdir("/tmp/test/") -} -func tearDown(t *testing.T, b IBackend) { - b.Rm("/tmp/test/") -} - -func suite(t *testing.T, b IBackend) { - // create state - content := "lorem ipsum" - b.Mkdir("/tmp/test/trash/") - b.Touch("/tmp/test/test0.txt") - b.Save("/tmp/test/test0.txt", strings.NewReader(content)) - b.Save("/tmp/test/test1.txt", strings.NewReader(content)) - b.Touch("/tmp/test/test2.txt") - b.Mv("/tmp/test/test0.txt", "/tmp/test/trash/test0.txt") - - // list all files - tmp0, err := b.Ls("/tmp/test/") - if err != nil { - t.Errorf("Ls error: %s", err) - return - } - if len(tmp0) != 3 { - t.Errorf("LS error: got: %d elmnt, want: %d", len(tmp0), 3) - return - } - - // read file - tmp1, err := b.Cat("/tmp/test/trash/test0.txt") - if err != nil { - t.Errorf("Cat error: %s", err) - return - } - tmp2, err := ioutil.ReadAll(tmp1) - if err != nil { - t.Errorf("Cat error: %s", err) - return - } - if string(tmp2) != content { - t.Errorf("Incorrect file: %s, want: %s.", tmp2, content) - return - } - if obj, ok := tmp1.(interface{ Close() error }); ok { - obj.Close() - } - tmp1, err = b.Cat("/tmp/test/test1.txt") - if err != nil { - t.Errorf("Cat error: %s", err) - return - } - tmp2, err = ioutil.ReadAll(tmp1) - if err != nil { - t.Errorf("Cat error: %s", err) - return - } - if string(tmp2) != content { - t.Errorf("Incorrect file: %s, want: %s.", tmp2, content) - return - } - if obj, ok := tmp1.(interface{ Close() error }); ok { - obj.Close() - } - - tmp1, err = b.Cat("/tmp/test/test2.txt") - if err != nil { - t.Errorf("Cat error: %s", err) - return - } - tmp2, err = ioutil.ReadAll(tmp1) - if err != nil { - t.Errorf("Cat error: %s", err) - return - } - if string(tmp2) != "" { - t.Errorf("Incorrect file: %s, want: %s.", tmp2, "") - return - } - if obj, ok := tmp1.(interface{ Close() error }); ok { - obj.Close() - } - - // remove file - b.Rm("/tmp/test/test2.txt") - tmp0, err = b.Ls("/tmp/test/") - if len(tmp0) != 2 { - t.Errorf("Test folder elements, got: %d, want: %d.", len(tmp0), 2) - return - } - - tmp0, err = b.Ls("/tmp/test/") - if err != nil { - t.Errorf("Ls error %s", err) - return - } - if len(tmp0) != 2 { - t.Errorf("LS error: got: %d elmnt, want: %d", len(tmp0), 2) - return - } - - // remove folder - b.Rm("/tmp/test/") - tmp0, err = b.Ls("/tmp/test/") - if err == nil { - t.Errorf("Removed folder still exists: %d", len(tmp0)) - return - } -} diff --git a/server/model/share_test.go b/server/model/share_test.go deleted file mode 100644 index 29b7e3a2..00000000 --- a/server/model/share_test.go +++ /dev/null @@ -1,159 +0,0 @@ -package model - -import ( - "testing" - . "github.com/mickael-kerjean/filestash/server/common" - "github.com/stretchr/testify/assert" -) - -var shareObj = Share{ - Backend: "foo", - Id: "foo", - Path: "/var/www/", - Password: NewString("password"), - Users: nil, - CanRead: true, - CanManageOwn: true, - CanShare: true, - Expire: func() *int64{ - a := int64(1537759505787) - return &a - }(), -} - - -////////////////////////////////////////////// -//// UPSERT - -func TestShareSimpleUpsert(t *testing.T) { - err := ShareUpsert(&shareObj); - assert.NoError(t, err) -} - -func TestShareMultipleUpsert(t *testing.T) { - err := ShareUpsert(&shareObj); - assert.NoError(t, err) - - err = ShareUpsert(&shareObj); - assert.NoError(t, err) - - _, err = ShareGet(shareObj.Id) - assert.NoError(t, err) -} - -func TestShareUpsertIsProperlyInserted(t *testing.T) { - err := ShareUpsert(&shareObj); - assert.NoError(t, err) - - var obj Share - obj.Id = "foo" - obj, err = ShareGet(obj.Id) - assert.NoError(t, err) - assert.NotNil(t, obj.Password) -} - -////////////////////////////////////////////// -//// get - -func TestShareGetNonExisting(t *testing.T) { - var s Share = shareObj - s.Id = "nothing" - _, err := ShareGet(s.Id); - assert.Error(t, err, "Shouldn't be able to get something that doesn't exist yet") -} - -func TestShareGetExisting(t *testing.T) { - err := ShareUpsert(&shareObj); - assert.NoError(t, err, "Upsert issue") - - _, err = ShareGet(shareObj.Id); - assert.NoError(t, err) -} - -func TestShareGetExistingMakeSureDataIsOk(t *testing.T) { - err := ShareUpsert(&shareObj); - assert.NoError(t, err, "Upsert issue") - - var obj Share - obj.Id = "foo" - obj.Backend = shareObj.Backend - obj, err = ShareGet(obj.Id); - assert.NoError(t, err) - assert.Equal(t, "foo", obj.Id) - assert.Equal(t, "/var/www/", obj.Path) - assert.Equal(t, true, obj.CanManageOwn) - assert.Equal(t, true, obj.CanShare) - assert.Equal(t, true, obj.CanRead) - assert.Equal(t, false, obj.CanWrite) - assert.Equal(t, false, obj.CanUpload) - assert.Equal(t, "foo", obj.Backend) - assert.Equal(t, shareObj.Expire, obj.Expire) -} - -////////////////////////////////////////////// -//// LIST - -func TestShareListAll(t *testing.T) { - // Initialise test - err := ShareUpsert(&shareObj); - assert.NoError(t, err, "Upsert issue") - - // Actual test - list, err := ShareList(shareObj.Backend, shareObj.Path) - assert.NoError(t, err) - assert.Len(t, list, 1) - assert.NotNil(t, list[0].Password) -} - - -////////////////////////////////////////////// -//// DELETE - -func TestShareDeleteShares(t *testing.T) { - // Initialise test - err := ShareUpsert(&shareObj); - assert.NoError(t, err, "Upsert issue") - shareObj, err = ShareGet(shareObj.Id) - assert.NoError(t, err) - - // Actual Test - err = ShareDelete(shareObj.Id); - assert.NoError(t, err) - - _, err = ShareGet(shareObj.Id) - assert.Error(t, err) -} - - - -////////////////////////////////////////////// -//// PROOF - -func TestShareVerifyEquivalence(t *testing.T) { - p1 := Proof { - Key: "password", - Value: "I'm something random", - } - p2 := Proof { - Key: p1.Key, - Id: "hash", - } - res := shareProofAreEquivalent(p1, p2) - assert.Equal(t, false, res) - - p2.Id = Hash(p1.Key + "::" + p1.Value) - res = shareProofAreEquivalent(p1, p2) - assert.Equal(t, true, res) - - p2.Key = "email" - res = shareProofAreEquivalent(p1, p2) - assert.Equal(t, false, res) - - p1.Key = "email" - p1.Value = "test@gmail.com,polo@gmail.com,jean@gmail.com" - p2.Key = "email" - p2.Id = Hash(p1.Key + "::" + "polo@gmail.com") - res = shareProofAreEquivalent(p1, p2) - assert.Equal(t, true, res) - -}