Browse Source

:art: 支持通过密码短语派生数据仓库密钥 https://github.com/siyuan-note/siyuan/issues/5478

Liang Ding 3 years ago
parent
commit
25d3985ed0
3 changed files with 58 additions and 0 deletions
  1. 22 0
      kernel/api/repo.go
  2. 1 0
      kernel/api/router.go
  3. 35 0
      kernel/model/repository.go

+ 22 - 0
kernel/api/repo.go

@@ -252,6 +252,28 @@ func importRepoKey(c *gin.Context) {
 	}
 	}
 }
 }
 
 
+func initRepoKeyFromPassphrase(c *gin.Context) {
+	ret := gulu.Ret.NewResult()
+	defer c.JSON(http.StatusOK, ret)
+
+	arg, ok := util.JsonArg(c, ret)
+	if !ok {
+		return
+	}
+
+	pass := arg["pass"].(string)
+	if err := model.InitRepoKeyFromPassphrase(pass); nil != err {
+		ret.Code = -1
+		ret.Msg = fmt.Sprintf(model.Conf.Language(137), err)
+		ret.Data = map[string]interface{}{"closeTimeout": 5000}
+		return
+	}
+
+	ret.Data = map[string]interface{}{
+		"key": model.Conf.Repo.Key,
+	}
+}
+
 func initRepoKey(c *gin.Context) {
 func initRepoKey(c *gin.Context) {
 	ret := gulu.Ret.NewResult()
 	ret := gulu.Ret.NewResult()
 	defer c.JSON(http.StatusOK, ret)
 	defer c.JSON(http.StatusOK, ret)

+ 1 - 0
kernel/api/router.go

@@ -244,6 +244,7 @@ func ServeAPI(ginServer *gin.Engine) {
 	ginServer.Handle("POST", "/api/bazaar/getBazaarPackageREAME", model.CheckAuth, getBazaarPackageREAME)
 	ginServer.Handle("POST", "/api/bazaar/getBazaarPackageREAME", model.CheckAuth, getBazaarPackageREAME)
 
 
 	ginServer.Handle("POST", "/api/repo/initRepoKey", model.CheckAuth, initRepoKey)
 	ginServer.Handle("POST", "/api/repo/initRepoKey", model.CheckAuth, initRepoKey)
+	ginServer.Handle("POST", "/api/repo/InitRepoKeyFromPassphrase", model.CheckAuth, initRepoKeyFromPassphrase)
 	ginServer.Handle("POST", "/api/repo/resetRepo", model.CheckAuth, resetRepo)
 	ginServer.Handle("POST", "/api/repo/resetRepo", model.CheckAuth, resetRepo)
 	ginServer.Handle("POST", "/api/repo/importRepoKey", model.CheckAuth, importRepoKey)
 	ginServer.Handle("POST", "/api/repo/importRepoKey", model.CheckAuth, importRepoKey)
 	ginServer.Handle("POST", "/api/repo/createSnapshot", model.CheckAuth, createSnapshot)
 	ginServer.Handle("POST", "/api/repo/createSnapshot", model.CheckAuth, createSnapshot)

+ 35 - 0
kernel/model/repository.go

@@ -18,6 +18,7 @@ package model
 
 
 import (
 import (
 	"crypto/rand"
 	"crypto/rand"
+	"crypto/sha256"
 	"encoding/base64"
 	"encoding/base64"
 	"errors"
 	"errors"
 	"fmt"
 	"fmt"
@@ -125,6 +126,40 @@ func ResetRepo() (err error) {
 	return
 	return
 }
 }
 
 
+func InitRepoKeyFromPassphrase(passphrase string) (err error) {
+	util.PushMsg(Conf.Language(136), 3000)
+
+	if err = os.RemoveAll(Conf.Repo.GetSaveDir()); nil != err {
+		return
+	}
+	if err = os.MkdirAll(Conf.Repo.GetSaveDir(), 0755); nil != err {
+		return
+	}
+
+	passphrase = gulu.Str.RemoveInvisible(passphrase)
+	passphrase = strings.TrimSpace(passphrase)
+	if "" == passphrase {
+		return errors.New(Conf.Language(142))
+	}
+
+	salt := fmt.Sprintf("%x", sha256.Sum256([]byte(passphrase)))[:16]
+	key, err := encryption.KDF(passphrase, salt)
+	if nil != err {
+		logging.LogErrorf("init data repo key failed: %s", err)
+		return
+	}
+	Conf.Repo.Key = key
+	Conf.Save()
+
+	time.Sleep(1 * time.Second)
+	util.PushMsg(Conf.Language(138), 3000)
+	time.Sleep(1 * time.Second)
+	if initErr := IndexRepo("[Init] Init data repo"); nil != initErr {
+		util.PushErrMsg(fmt.Sprintf(Conf.Language(140), initErr), 0)
+	}
+	return
+}
+
 func InitRepoKey() (err error) {
 func InitRepoKey() (err error) {
 	util.PushMsg(Conf.Language(136), 3000)
 	util.PushMsg(Conf.Language(136), 3000)