From af6036eefeff4908c7eb3d8d7ee195544dbdb772 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Thu, 2 Nov 2023 10:26:59 +0800 Subject: [PATCH] :art: Support exporting/importing S3 and WebDAV configurations https://github.com/siyuan-note/siyuan/issues/9566 --- kernel/api/sync.go | 120 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 114 insertions(+), 6 deletions(-) diff --git a/kernel/api/sync.go b/kernel/api/sync.go index 46b70acf8..022566b73 100644 --- a/kernel/api/sync.go +++ b/kernel/api/sync.go @@ -44,7 +44,7 @@ func importSyncProviderWebDAV(c *gin.Context) { return } - files := form.File["file[]"] + files := form.File["file"] if 1 != len(files) { ret.Code = -1 ret.Msg = "invalid upload file" @@ -69,11 +69,43 @@ func importSyncProviderWebDAV(c *gin.Context) { return } + tmpDir := filepath.Join(util.TempDir, "import") + if err = os.MkdirAll(tmpDir, 0755); nil != err { + logging.LogErrorf("import WebDAV provider failed: %s", err) + ret.Code = -1 + ret.Msg = err.Error() + return + } + + tmp := filepath.Join(tmpDir, f.Filename) + if err = os.WriteFile(tmp, data, 0644); nil != err { + logging.LogErrorf("import WebDAV provider failed: %s", err) + ret.Code = -1 + ret.Msg = err.Error() + return + } + + if err = gulu.Zip.Unzip(tmp, tmpDir); nil != err { + logging.LogErrorf("import WebDAV provider failed: %s", err) + ret.Code = -1 + ret.Msg = err.Error() + return + } + + tmp = filepath.Join(tmpDir, f.Filename[:len(f.Filename)-4]) + data, err = os.ReadFile(tmp) + if nil != err { + logging.LogErrorf("import WebDAV provider failed: %s", err) + ret.Code = -1 + ret.Msg = err.Error() + return + } + data = util.AESDecrypt(string(data)) data, _ = hex.DecodeString(string(data)) webdav := &conf.WebDAV{} if err = gulu.JSON.UnmarshalJSON(data, webdav); nil != err { - logging.LogErrorf("import S3 provider failed: %s", err) + logging.LogErrorf("import WebDAV provider failed: %s", err) ret.Code = -1 ret.Msg = err.Error() return @@ -81,7 +113,7 @@ func importSyncProviderWebDAV(c *gin.Context) { err = model.SetSyncProviderWebDAV(webdav) if nil != err { - logging.LogErrorf("import S3 provider failed: %s", err) + logging.LogErrorf("import WebDAV provider failed: %s", err) ret.Code = -1 ret.Msg = err.Error() return @@ -123,7 +155,29 @@ func exportSyncProviderWebDAV(c *gin.Context) { return } - zipPath := "/export/" + name + zipFile, err := gulu.Zip.Create(tmp + ".zip") + if nil != err { + logging.LogErrorf("export WebDAV provider failed: %s", err) + ret.Code = -1 + ret.Msg = err.Error() + return + } + + if err = zipFile.AddEntry(name, tmp); nil != err { + logging.LogErrorf("export WebDAV provider failed: %s", err) + ret.Code = -1 + ret.Msg = err.Error() + return + } + + if err = zipFile.Close(); nil != err { + logging.LogErrorf("export WebDAV provider failed: %s", err) + ret.Code = -1 + ret.Msg = err.Error() + return + } + + zipPath := "/export/" + name + ".zip" ret.Data = map[string]interface{}{ "name": name, "zip": zipPath, @@ -142,7 +196,7 @@ func importSyncProviderS3(c *gin.Context) { return } - files := form.File["file[]"] + files := form.File["file"] if 1 != len(files) { ret.Code = -1 ret.Msg = "invalid upload file" @@ -167,6 +221,38 @@ func importSyncProviderS3(c *gin.Context) { return } + tmpDir := filepath.Join(util.TempDir, "import") + if err = os.MkdirAll(tmpDir, 0755); nil != err { + logging.LogErrorf("import S3 provider failed: %s", err) + ret.Code = -1 + ret.Msg = err.Error() + return + } + + tmp := filepath.Join(tmpDir, f.Filename) + if err = os.WriteFile(tmp, data, 0644); nil != err { + logging.LogErrorf("import S3 provider failed: %s", err) + ret.Code = -1 + ret.Msg = err.Error() + return + } + + if err = gulu.Zip.Unzip(tmp, tmpDir); nil != err { + logging.LogErrorf("import S3 provider failed: %s", err) + ret.Code = -1 + ret.Msg = err.Error() + return + } + + tmp = filepath.Join(tmpDir, f.Filename[:len(f.Filename)-4]) + data, err = os.ReadFile(tmp) + if nil != err { + logging.LogErrorf("import S3 provider failed: %s", err) + ret.Code = -1 + ret.Msg = err.Error() + return + } + data = util.AESDecrypt(string(data)) data, _ = hex.DecodeString(string(data)) s3 := &conf.S3{} @@ -221,7 +307,29 @@ func exportSyncProviderS3(c *gin.Context) { return } - zipPath := "/export/" + name + zipFile, err := gulu.Zip.Create(tmp + ".zip") + if nil != err { + logging.LogErrorf("export S3 provider failed: %s", err) + ret.Code = -1 + ret.Msg = err.Error() + return + } + + if err = zipFile.AddEntry(name, tmp); nil != err { + logging.LogErrorf("export S3 provider failed: %s", err) + ret.Code = -1 + ret.Msg = err.Error() + return + } + + if err = zipFile.Close(); nil != err { + logging.LogErrorf("export S3 provider failed: %s", err) + ret.Code = -1 + ret.Msg = err.Error() + return + } + + zipPath := "/export/" + name + ".zip" ret.Data = map[string]interface{}{ "name": name, "zip": zipPath,