diff --git a/godo/files/fs.go b/godo/files/fs.go index cce2530..0562ce5 100644 --- a/godo/files/fs.go +++ b/godo/files/fs.go @@ -88,7 +88,7 @@ func HandleReadDir(w http.ResponseWriter, r *http.Request) { return } osFileInfo.Content = string(content) - + osFileInfo.IsPwd = IsHaveHiddenFile(basePath, osFileInfo.Path) // 检查文件内容是否以"link::"开头 if strings.HasPrefix(osFileInfo.Content, "link::") { osFileInfo.IsSymlink = true @@ -129,7 +129,7 @@ func HandleStat(w http.ResponseWriter, r *http.Request) { libs.HTTPError(w, http.StatusNotFound, err.Error()) return } - + osFileInfo.IsPwd = IsHaveHiddenFile(basePath, osFileInfo.Path) res := libs.APIResponse{ Message: "File information retrieved successfully.", Data: osFileInfo, @@ -318,6 +318,7 @@ func HandleCopyFile(w http.ResponseWriter, r *http.Request) { // 带加密写 func HandleWriteFile(w http.ResponseWriter, r *http.Request) { filePath := r.URL.Query().Get("filePath") + pwd := r.Header.Get("filePwd") basePath, err := libs.GetOsDir() if err != nil { libs.HTTPError(w, http.StatusInternalServerError, err.Error()) @@ -366,6 +367,12 @@ func HandleWriteFile(w http.ResponseWriter, r *http.Request) { libs.SuccessMsg(w, "", "success") return } + // 校验密码 + salt := GetSalt(r) + if !CheckFilePwd(pwd, salt) { + libs.HTTPError(w, http.StatusBadRequest, "密码错误") + return + } // 加密 data, err := libs.EncryptData(filedata, libs.EncryptionKey) if err != nil { @@ -377,6 +384,12 @@ func HandleWriteFile(w http.ResponseWriter, r *http.Request) { http.Error(w, err.Error(), http.StatusInternalServerError) return } + // 加密文件在同级目录下创建一个同名隐藏文件 + hiddenFilePath := filepath.Join(basePath, "."+filePath) + _, err = os.Create(hiddenFilePath) + if err != nil { + libs.ErrorMsg(w, "创建隐藏文件失败") + } // 判断下是否添加到桌面上 CheckAddDesktop(filePath) libs.SuccessMsg(w, "", "success") diff --git a/godo/files/os.go b/godo/files/os.go index 6e263f0..f5c2d49 100644 --- a/godo/files/os.go +++ b/godo/files/os.go @@ -54,6 +54,7 @@ type OsFileInfo struct { Ext string `json:"ext"` // 文件扩展名 Title string `json:"title"` // 文件名(不包含扩展名) ID int `json:"id,omitempty"` // 文件ID(可选) + IsPwd bool `json:"isPwd"` // 是否加密 } // validateFilePath 验证路径不为空 @@ -379,3 +380,10 @@ func GetPwdFlag() int { } return isPwd.(int) } + +// 判读一个目录下有没有同名隐藏文件 +func IsHaveHiddenFile(basePath, filePath string) bool { + hiddenFilePath := filepath.Join(basePath, "."+filePath) + _, err := os.Stat(hiddenFilePath) + return err == nil +} diff --git a/godo/files/pwdfile.go b/godo/files/pwdfile.go index 45422df..0c54d55 100644 --- a/godo/files/pwdfile.go +++ b/godo/files/pwdfile.go @@ -53,7 +53,6 @@ func HandleReadFile(w http.ResponseWriter, r *http.Request) { return } - var data []byte fileContent, err = libs.DecryptData(fileContent, libs.EncryptionKey) if err != nil { libs.HTTPError(w, http.StatusInternalServerError, err.Error()) @@ -63,7 +62,7 @@ func HandleReadFile(w http.ResponseWriter, r *http.Request) { content := string(fileContent) // 检查文件内容是否以"link::"开头 if !strings.HasPrefix(content, "link::") { - content = base64.StdEncoding.EncodeToString(data) + content = base64.StdEncoding.EncodeToString(fileContent) } // 初始响应 @@ -74,7 +73,7 @@ func HandleReadFile(w http.ResponseWriter, r *http.Request) { // 设置文件密码 func HandleSetFilePwd(w http.ResponseWriter, r *http.Request) { fPwd := r.Header.Get("filepPwd") - salt := r.Header.Get("salt") + salt := GetSalt(r) // 服务端再hash加密 hashPwd := libs.HashPassword(fPwd, salt) @@ -99,7 +98,7 @@ func HandleSetFilePwd(w http.ResponseWriter, r *http.Request) { // 更改文件密码 func HandleChangeFilePwd(w http.ResponseWriter, r *http.Request) { filePwd := r.Header.Get("filePwd") - salt := r.Header.Get("salt") + salt := GetSalt(r) if filePwd == "" || salt == "" { libs.ErrorMsg(w, "密码为空") return