diff --git a/kernel/api/repo.go b/kernel/api/repo.go index c5f17bbaf..c42d1bf73 100644 --- a/kernel/api/repo.go +++ b/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) { ret := gulu.Ret.NewResult() defer c.JSON(http.StatusOK, ret) diff --git a/kernel/api/router.go b/kernel/api/router.go index c2d845914..548de485d 100644 --- a/kernel/api/router.go +++ b/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/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/importRepoKey", model.CheckAuth, importRepoKey) ginServer.Handle("POST", "/api/repo/createSnapshot", model.CheckAuth, createSnapshot) diff --git a/kernel/model/repository.go b/kernel/model/repository.go index c7964f8bf..c73f8cff2 100644 --- a/kernel/model/repository.go +++ b/kernel/model/repository.go @@ -18,6 +18,7 @@ package model import ( "crypto/rand" + "crypto/sha256" "encoding/base64" "errors" "fmt" @@ -125,6 +126,40 @@ func ResetRepo() (err error) { 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) { util.PushMsg(Conf.Language(136), 3000)