1
0
forked from tcp.direct/tcp.ac

look i'm drunk but it RUNS

This commit is contained in:
kayos@tcp.direct 2020-12-12 07:24:45 -08:00
parent da795b293b
commit 29053e277a

136
main.go

@ -4,59 +4,43 @@ import (
"github.com/scottleedavis/go-exif-remove" "github.com/scottleedavis/go-exif-remove"
"gopkg.in/natefinch/lumberjack.v2" "gopkg.in/natefinch/lumberjack.v2"
"github.com/twharmon/gouid" "github.com/twharmon/gouid"
"mime/multipart" "github.com/gin-gonic/gin"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"errors"
"image" "image"
"fmt" "fmt"
"log" "log"
"io"
) )
var errLog *log.Logger var errLog *log.Logger
var debugBool bool = true var debugBool bool = true
func init() { func errThrow(c *gin.Context, respcode int, Error string, msg string) {
err := &lumberjack.Logger{ errLog.Println(c.ClientIP() + ": " + Error)
Filename: "error.log",
MaxSize: 50, // megabytes
MaxBackups: 8,
MaxAge: 28, // days
Compress: true,
}
errLog = log.New(err, "", log.Ldate|log.Ltime|log.Lshortfile)
}
func errThrow(w http.ResponseWriter, r *http.Request, Error, msg string) {
errLog.Println(remoteAddr(r) + ": " + Error)
if debugBool { if debugBool {
fmt.Fprintf(w, msg) c.String(respcode, msg)
} }
} }
func imgPost(w http.ResponseWriter, r *http.Request) { func imgPost(c *gin.Context) {
fmt.Println("[imgPost] detected new upload") f, err := c.FormFile("upload")
err := r.ParseMultipartForm(12 << 20)
if err != nil { if err != nil {
errThrow(w, r, http.StatusBadRequest, err.Error(), "error parsing upload data") errThrow(c, http.StatusBadRequest, err.Error(), "no file detected within request")
return
} }
fmt.Println("[imgPost] creating file handler and checking size") fmt.Println("[imgPost] detected new upload: " + f.Filename)
f, size, err := extractFile(r, "upload")
file, err := f.Open()
if err != nil { if err != nil {
errThrow(r, http.StatusBadRequest, err.Error(), "upload data is invalid") errThrow(c, http.StatusInternalServerError, err.Error(), "error processing file")
return
} }
defer f.Close()
fmt.Println("[imgPost] verifying file is an image") fmt.Println("[imgPost] verifying file is an image")
imageFormat, ok := checkImage(f) imageFormat, ok := checkImage(file)
if !ok { if !ok {
errThrow(r, http.StatusBadRequest, "not an image", "input does not appear to be an image") errThrow(c, http.StatusBadRequest, err.Error(), "input does not appear to be an image")
return return
} }
@ -64,10 +48,10 @@ func imgPost(w http.ResponseWriter, r *http.Request) {
uid := gouid.String(8) uid := gouid.String(8)
fmt.Println("[imgPost][" + uid + "] dumping byte form of file and scrubbing exif") fmt.Println("[imgPost][" + uid + "] dumping byte form of file and scrubbing exif")
fbytes, err := ioutil.ReadAll(f) fbytes, err := ioutil.ReadAll(file)
Scrubbed, err := exifremove.Remove(fbytes) Scrubbed, err := exifremove.Remove(fbytes)
if _, err:= io.Copy(buf, f); err != nil { if err != nil {
errThrow(r, http.StatusInternalServerError, err.Error(), "error scrubbing exif") errThrow(c, http.StatusInternalServerError, err.Error(), "error scrubbing exif")
return return
} }
@ -75,23 +59,13 @@ func imgPost(w http.ResponseWriter, r *http.Request) {
// contentType := "image/" + imageFormat // contentType := "image/" + imageFormat
err := ioutil.WriteFile("./live/img/" + uid + "." + imageFormat, Scrubbed) err = ioutil.WriteFile("./live/img/" + uid + "." + imageFormat, Scrubbed, 755)
if err != nil { if err != nil {
errThrow(r, http.StatusInternalServerError, err.Error(), "error saving file") errThrow(c, http.StatusInternalServerError, err.Error(), "error saving file")
return return
} }
} }
func remoteAddr(r *http.Request) (ip string) {
forwarded := r.Header.Get("X-FORWARDED-FOR")
if forwarded != "" {
return forwarded
}
return r.RemoteAddr
}
///// Stolen functions below //////////////////////////////////////
func checkImage(r io.ReadSeeker) (string, bool) { func checkImage(r io.ReadSeeker) (string, bool) {
_, fmt, err := image.Decode(r) _, fmt, err := image.Decode(r)
_, err2 := r.Seek(0, 0) _, err2 := r.Seek(0, 0)
@ -102,32 +76,6 @@ func checkImage(r io.ReadSeeker) (string, bool) {
return fmt, true return fmt, true
} }
func extractFile(r *http.Request, field string) (multipart.File, int64, error) {
files, found := r.MultipartForm.file[field]
if !found || len(files) < 1 {
return nil, "", 0, fmt.Errorf("'%s' not found", field)
}
file := files[0]
fmt.Printf("Uploaded File: %+v\n", r.Filename)
fmt.Printf("File Size: %+v\n", r.Size)
fmt.Printf("MIME Header: %+v\n", r.Header)
f, err := file.Open()
if err != nil {
return nil, "", 0, errors.New("could not open multipart file")
}
size, err := getSize(f)
if err != nil {
return nil, "", 0, errors.New("could not find size of file")
}
return f, size, nil
}
func getSize(s io.Seeker) (size int64, err error) { func getSize(s io.Seeker) (size int64, err error) {
if _, err = s.Seek(0, 0); err != nil { if _, err = s.Seek(0, 0); err != nil {
return return
@ -142,16 +90,50 @@ func getSize(s io.Seeker) (size int64, err error) {
return return
} }
//////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////
func txtPost(c *gin.Context) {
return
}
//////////////////////////////////////////////////////
func urlPost(c *gin.Context) {
return
}
func init() {
err := &lumberjack.Logger{
Filename: "error.log",
MaxSize: 50, // megabytes
MaxBackups: 8,
MaxAge: 28, // days
Compress: true,
}
errLog = log.New(err, "", log.Ldate|log.Ltime|log.Lshortfile)
}
func main() { func main() {
router := gin.Default()
router := goji.NewMux() router.MaxMultipartMemory = 12 << 20
router.HandleFunc(pat.Post("/i/put"), imgPost) imgR := router.Group("/i")
router.HandleFunc(pat.Post("/t/put"), txtPost) {
router.HandleFunc(pat.Post("/u/put"), urlPost) imgR.POST("/put", imgPost)
}
http.ListenAndServe("0.0.0.0:8080", router) txtR := router.Group("/t")
{
txtR.POST("/put", txtPost)
}
urlR := router.Group("/u")
{
urlR.POST("/put", urlPost)
}
router.Run(":8081")
} }