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)
-
-}