Просмотр исходного кода

:art: Support exporting/importing S3 and WebDAV configurations https://github.com/siyuan-note/siyuan/issues/9566

Daniel 1 год назад
Родитель
Сommit
af6036eefe
1 измененных файлов с 114 добавлено и 6 удалено
  1. 114 6
      kernel/api/sync.go

+ 114 - 6
kernel/api/sync.go

@@ -44,7 +44,7 @@ func importSyncProviderWebDAV(c *gin.Context) {
 		return
 		return
 	}
 	}
 
 
-	files := form.File["file[]"]
+	files := form.File["file"]
 	if 1 != len(files) {
 	if 1 != len(files) {
 		ret.Code = -1
 		ret.Code = -1
 		ret.Msg = "invalid upload file"
 		ret.Msg = "invalid upload file"
@@ -69,11 +69,43 @@ func importSyncProviderWebDAV(c *gin.Context) {
 		return
 		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 = util.AESDecrypt(string(data))
 	data, _ = hex.DecodeString(string(data))
 	data, _ = hex.DecodeString(string(data))
 	webdav := &conf.WebDAV{}
 	webdav := &conf.WebDAV{}
 	if err = gulu.JSON.UnmarshalJSON(data, webdav); nil != err {
 	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.Code = -1
 		ret.Msg = err.Error()
 		ret.Msg = err.Error()
 		return
 		return
@@ -81,7 +113,7 @@ func importSyncProviderWebDAV(c *gin.Context) {
 
 
 	err = model.SetSyncProviderWebDAV(webdav)
 	err = model.SetSyncProviderWebDAV(webdav)
 	if nil != err {
 	if nil != err {
-		logging.LogErrorf("import S3 provider failed: %s", err)
+		logging.LogErrorf("import WebDAV provider failed: %s", err)
 		ret.Code = -1
 		ret.Code = -1
 		ret.Msg = err.Error()
 		ret.Msg = err.Error()
 		return
 		return
@@ -123,7 +155,29 @@ func exportSyncProviderWebDAV(c *gin.Context) {
 		return
 		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{}{
 	ret.Data = map[string]interface{}{
 		"name": name,
 		"name": name,
 		"zip":  zipPath,
 		"zip":  zipPath,
@@ -142,7 +196,7 @@ func importSyncProviderS3(c *gin.Context) {
 		return
 		return
 	}
 	}
 
 
-	files := form.File["file[]"]
+	files := form.File["file"]
 	if 1 != len(files) {
 	if 1 != len(files) {
 		ret.Code = -1
 		ret.Code = -1
 		ret.Msg = "invalid upload file"
 		ret.Msg = "invalid upload file"
@@ -167,6 +221,38 @@ func importSyncProviderS3(c *gin.Context) {
 		return
 		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 = util.AESDecrypt(string(data))
 	data, _ = hex.DecodeString(string(data))
 	data, _ = hex.DecodeString(string(data))
 	s3 := &conf.S3{}
 	s3 := &conf.S3{}
@@ -221,7 +307,29 @@ func exportSyncProviderS3(c *gin.Context) {
 		return
 		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{}{
 	ret.Data = map[string]interface{}{
 		"name": name,
 		"name": name,
 		"zip":  zipPath,
 		"zip":  zipPath,