From 4852b93c67cdbde01f0d3659a2974beb3321d0d7 Mon Sep 17 00:00:00 2001 From: Ben Sarmiento Date: Fri, 26 Jan 2024 09:52:37 +0100 Subject: [PATCH] Upload logs handler --- internal/handlers/router.go | 11 ++++++++ pkg/logutil/factory.go | 56 +++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/internal/handlers/router.go b/internal/handlers/router.go index 04c2508..66f82d4 100644 --- a/internal/handlers/router.go +++ b/internal/handlers/router.go @@ -91,6 +91,8 @@ func AttachHandlers(router *chi.Mux, downloader *universal.Downloader, torMgr *t // logs route router.Get("/logs", hs.logsHandler) router.Get("/logs/", hs.logsHandler) + router.Get("/logs/upload", hs.uploadLogsHandler) + router.Get("/logs/upload/", hs.uploadLogsHandler) router.MethodNotAllowed(func(resp http.ResponseWriter, req *http.Request) { hs.log.Debugf("Method not allowed: %s %s %v", req.Method, req.URL, req.Header) @@ -453,3 +455,12 @@ func (hs *Handlers) logsHandler(resp http.ResponseWriter, req *http.Request) { } fmt.Fprint(resp, logs) } + +func (hs *Handlers) uploadLogsHandler(resp http.ResponseWriter, req *http.Request) { + url, err := hs.log.UploadLogFile() + if err != nil { + http.Error(resp, err.Error(), http.StatusInternalServerError) + return + } + http.Redirect(resp, req, url, http.StatusFound) +} diff --git a/pkg/logutil/factory.go b/pkg/logutil/factory.go index e259b49..c21d75a 100644 --- a/pkg/logutil/factory.go +++ b/pkg/logutil/factory.go @@ -4,7 +4,10 @@ import ( "bytes" "fmt" "io" + "mime/multipart" + "net/http" "os" + "path/filepath" "go.uber.org/zap" "go.uber.org/zap/zapcore" @@ -111,3 +114,56 @@ func (l *Logger) GetLogsFromFile() (string, error) { return buffer.String(), nil } + +func (l *Logger) UploadLogFile() (string, error) { + file, err := os.Open(l.logPath) + if err != nil { + return "", err + } + defer file.Close() + + // Prepare a form that you will submit to that URL. + var b bytes.Buffer + w := multipart.NewWriter(&b) + fw, err := w.CreateFormFile("file", filepath.Base(l.logPath)) + if err != nil { + return "", err + } + + // Copy the file into the form file + if _, err = io.Copy(fw, file); err != nil { + return "", err + } + + // Close the multipart writer to set the terminating boundary + if err = w.Close(); err != nil { + return "", err + } + + // Create a request and add the proper headers. + req, err := http.NewRequest("POST", "https://0x0.st/", &b) + if err != nil { + return "", err + } + req.Header.Set("Content-Type", w.FormDataContentType()) + + // Send the request + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + return "", err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return "", fmt.Errorf("failed to upload log file, server responded with status code: %d", resp.StatusCode) + } + + // Read the response body + responseBody, err := io.ReadAll(resp.Body) + if err != nil { + return "", err + } + + return string(responseBody), nil +}