package core import ( "aufs/config" "aufs/db" "aufs/util" "encoding/json" "fmt" "net/http" "os" "path/filepath" "strings" ) // json 结构体 type Response struct { Status string `json:"status"` //状态 Data FilesListJson `json:"data"` //目录下的文件 Curdir string `json:"curdir"` // 扫描的目录 WorksDir string `json:"workdir"` //监听目录 Hostip string `json:"hostip"` //运行的主机ip } // 文件输出的结构 type FileJson struct { Fname string `json:"fname"` Dirflag bool `json:"dirflag"` Isbackup int `json:"isbackup"` Fhash string `json:"hash"` // hash Fsize string `json:"size"` //文件大小, 输出带单位的大小 Frehash string `json:"rehash"` // 参考hash } type FilesListJson struct { Flist []FileJson `json:"list"` } // 获取运行的路径 var Gpath string // 遍历监视目录,发送到json中 func SerInfo(w http.ResponseWriter, r *http.Request) { // 监听的目录通过?p=的方式传入 urlpath := r.URL.Query().Get("p") // 防止逃逸,造成漏洞 if strings.Contains(urlpath, "../") || urlpath == "" { urlpath = "." } // urlpath 进行base64 解码 dsrpath := util.Base64dec(urlpath) // 监听的根目录 realFilePath := filepath.Join(config.G.FilePath, dsrpath) // 时间目录的情况 fileInfo, err := os.Stat(realFilePath) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // 链接数据库 db.Init() // 获取请求的信息 rcflists := db.Fquery(util.Bas64end(dsrpath)) // // list json var flist FilesListJson //针对目录的情况才输出 // todo 如果是文件的话 暂时不处理 if fileInfo.IsDir() { // 遍历目录 files, err := os.ReadDir(realFilePath) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // 遍历 for _, v := range files { // fmt.Printf("rang v:%v\n", v) isbak := 0 rchash := "" //参考的hash // 如果有 backup if strings.Contains(v.Name(), "backup") { isbak = 1 } // 如果是文件的话,就计算hash和大小 if v.IsDir() { //While entry is A Directory flist.Flist = append(flist.Flist, FileJson{Fname: v.Name(), Dirflag: v.IsDir(), Isbackup: isbak, Fhash: "", Fsize: "", Frehash: ""}) } else { // 计算文件的hash funame := filepath.Join(realFilePath, v.Name()) fhash := util.CalacHash(funame) // for _, av := range rcflists { if av.Fname == v.Name() { rchash = av.Fhash } } // 文件大小 // 获取文件大小(以字节为单位) sizeInBytes := fileInfo.Size() sizeStr := fmt.Sprintf("%.2f KB", float64(sizeInBytes)/1024) // output flist.Flist = append(flist.Flist, FileJson{Fname: v.Name(), Dirflag: v.IsDir(), Isbackup: isbak, Fhash: fhash, Fsize: sizeStr, Frehash: rchash}) } } } // respone file list response := Response{ Status: "success", Curdir: urlpath, WorksDir: config.G.FilePath, Hostip: config.G.LocalIP, Data: flist, } // 开启跨域 uCorsHadler(w, r) json.NewEncoder(w).Encode(response) } // 跨域函数 func uCorsHadler(w http.ResponseWriter, r *http.Request) { // 设置跨域响应头 w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS,PUT,DELETET") // w.Header().Set("Access-Control-Allow-Headers", "Content-Type,Accept,Accept-Length,Accept-Encoding,X-XSRF-TOKEN,X-XSRF-TOKEN") w.Header().Set("Access-Control-Allow-Headers", "*") // w.Header().Set("Content-Type", "application/json") // 如果是OPTIONS请求,返回200 OK if r.Method == "OPTIONS" { // fmt.Printf("options is now \n") // w.WriteHeader(http.StatusOK) return } }