dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

commit 819361c3018594eea0f158e0414779f9f0812739
parent 6890cca621d442b16c78d92db77bf35a252da222
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Mon, 30 Jan 2023 21:26:01 -0800

get file metadata

Diffstat:
Mcmd/dkfupload/main.go | 89++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------
Mpkg/web/handlers/handlers.go | 17+++++++++++++----
2 files changed, 79 insertions(+), 27 deletions(-)

diff --git a/cmd/dkfupload/main.go b/cmd/dkfupload/main.go @@ -3,11 +3,13 @@ package main import ( "bytes" "context" + "crypto/sha256" "encoding/hex" "flag" "fmt" "github.com/dustin/go-humanize" "golang.org/x/net/proxy" + "io" "log" "math" "math/rand" @@ -15,7 +17,9 @@ import ( "net" "net/http" "net/http/cookiejar" + "net/url" "os" + "strconv" "strings" "sync" "time" @@ -33,19 +37,27 @@ func main() { var filedropUUID string var fileName string var dry bool - var local bool + var isLocal bool var maxChunkSize int64 - flag.StringVar(&filedropUUID, "filedrop-uuid", "", "dkf filedrop uuid") - flag.StringVar(&filedropUUID, "u", "", "dkf filedrop uuid") - flag.StringVar(&fileName, "file", "", "file to upload") - flag.StringVar(&fileName, "f", "", "file to upload") - flag.IntVar(&nbThreads, "threads", 20, "nb threads") - flag.Int64Var(&maxChunkSize, "chunk-size", 10<<20, "chunk size") // 10MB + filedropUUIDUsage := "dkf filedrop uuid" + fileNameUsage := "file to upload" + nbThreadsUsage := "nb threads" + nbThreadsDefaultValue := 20 + chunkSizeUsage := "chunk size" + chunkSizeDefaultValue := int64(10 << 20) + flag.StringVar(&filedropUUID, "filedrop-uuid", "", filedropUUIDUsage) + flag.StringVar(&filedropUUID, "u", "", filedropUUIDUsage) + flag.StringVar(&fileName, "file", "", fileNameUsage) + flag.StringVar(&fileName, "f", "", fileNameUsage) + flag.IntVar(&nbThreads, "threads", nbThreadsDefaultValue, nbThreadsUsage) + flag.IntVar(&nbThreads, "t", nbThreadsDefaultValue, nbThreadsUsage) + flag.Int64Var(&maxChunkSize, "chunk-size", chunkSizeDefaultValue, chunkSizeUsage) // 10MB + flag.Int64Var(&maxChunkSize, "c", chunkSizeDefaultValue, chunkSizeUsage) // 10MB flag.BoolVar(&dry, "dry", false, "dry run") - flag.BoolVar(&local, "local", false, "localhost development") + flag.BoolVar(&isLocal, "local", false, "localhost development") flag.Parse() - baseUrl := Ternary(local, localhostAddr, dkfBaseURL) + baseUrl := Ternary(isLocal, localhostAddr, dkfBaseURL) f, err := os.Open(fileName) if err != nil { @@ -55,11 +67,19 @@ func main() { if err != nil { log.Fatalln(err.Error()) } + + h := sha256.New() + if _, err := io.Copy(h, f); err != nil { + log.Fatalln(err) + } + fileSha256 := hex.EncodeToString(h.Sum(nil)) + fileSize := fs.Size() nbChunks := int64(math.Ceil(float64(fileSize) / float64(maxChunkSize))) log.Printf("filedrop UUID: %s\n", filedropUUID) log.Printf(" file: %s\n", fs.Name()) + log.Printf(" sha256: %s\n", fileSha256) log.Printf(" file size: %s (%s)\n", humanize.Bytes(uint64(fileSize)), humanize.Comma(fileSize)) log.Printf(" chunks size: %s (%s)\n", humanize.Bytes(uint64(maxChunkSize)), humanize.Comma(maxChunkSize)) log.Printf(" nb chunks: %d\n", nbChunks) @@ -69,6 +89,25 @@ func main() { } log.Println(strings.Repeat("-", 80)) + { + client := doGetClient(isLocal) + body := url.Values{} + body.Set("fileName", fs.Name()) + body.Set("fileSize", strconv.FormatInt(fileSize, 10)) + body.Set("fileSha256", fileSha256) + req, _ := http.NewRequest(http.MethodPost, baseUrl+"/file-drop/"+filedropUUID+"/tmp-init", strings.NewReader(body.Encode())) + req.Header.Set("User-Agent", userAgent) + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + resp, err := client.Do(req) + if err != nil { + log.Fatalln(err) + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + log.Fatalln(fmt.Errorf("invalid status code %s", resp.Status)) + } + } + chunksCh := make(chan int64) go func() { for chunkNum := int64(0); chunkNum < nbChunks; chunkNum++ { @@ -82,20 +121,7 @@ func main() { for i := 0; i < nbThreads; i++ { go func(i int, wg *sync.WaitGroup, chunksCh chan int64) { - var client *http.Client - hasToSucceed(func() error { - username := fmt.Sprintf("user_%d", i) - password := GenerateTokenN(8) - if local { - client = http.DefaultClient - } else { - client, err = GetHttpClient(&proxy.Auth{User: username, Password: password}) - if err != nil { - return err - } - } - return nil - }) + client := doGetClient(isLocal) buf := make([]byte, maxChunkSize) for chunkNum := range chunksCh { @@ -142,6 +168,23 @@ func main() { log.Printf("All done\n") } +func doGetClient(isLocal bool) (client *http.Client) { + hasToSucceed(func() error { + if isLocal { + client = http.DefaultClient + } else { + token := GenerateTokenN(8) + var err error + client, err = GetHttpClient(&proxy.Auth{User: token, Password: token}) + if err != nil { + return err + } + } + return nil + }) + return +} + // Will keep retrying a callback until no error is returned func hasToSucceed(clb func() error) { waitTime := 5 diff --git a/pkg/web/handlers/handlers.go b/pkg/web/handlers/handlers.go @@ -4306,6 +4306,19 @@ func FileDropHandler(c echo.Context) error { } func FileDropTmpInitHandler(c echo.Context) error { + filedropUUID := c.Param("uuid") + if err := os.Mkdir(filepath.Join(config.Global.ProjectFiledropPath(), filedropUUID), 0755); err != nil { + logrus.Error(err) + return c.NoContent(http.StatusInternalServerError) + } + fileName := c.Request().PostFormValue("fileName") + fileSize := c.Request().PostFormValue("fileSize") + fileSha256 := c.Request().PostFormValue("fileSha256") + data := []byte(fileName + "\n" + fileSize + "\n" + fileSha256) + if err := os.WriteFile(filepath.Join(config.Global.ProjectFiledropPath(), filedropUUID, "metadata"), data, 0644); err != nil { + logrus.Error(err) + return c.NoContent(http.StatusInternalServerError) + } return c.NoContent(http.StatusOK) } @@ -4319,10 +4332,6 @@ func FileDropTmpHandler(c echo.Context) error { defer file.Close() fileName := handler.Filename by, _ := io.ReadAll(file) - if err := os.MkdirAll(filepath.Join(config.Global.ProjectFiledropPath(), filedropUUID), 0755); err != nil { - logrus.Error(err) - return c.NoContent(http.StatusInternalServerError) - } p := filepath.Join(config.Global.ProjectFiledropPath(), filedropUUID, fileName) if err := os.WriteFile(p, by, 0644); err != nil { logrus.Error(err)