1
0
forked from tcp.direct/tcp.ac
tcp.ac/main.go

140 lines
2.7 KiB
Go
Raw Normal View History

2020-12-12 08:32:18 +00:00
package main
import (
"github.com/scottleedavis/go-exif-remove"
"gopkg.in/natefinch/lumberjack.v2"
"github.com/twharmon/gouid"
2020-12-12 15:24:45 +00:00
"github.com/gin-gonic/gin"
2020-12-12 08:32:18 +00:00
"io/ioutil"
"net/http"
"image"
"fmt"
"log"
2020-12-12 15:24:45 +00:00
"io"
2020-12-12 08:32:18 +00:00
)
var errLog *log.Logger
var debugBool bool = true
2020-12-12 15:24:45 +00:00
func errThrow(c *gin.Context, respcode int, Error string, msg string) {
errLog.Println(c.ClientIP() + ": " + Error)
2020-12-12 08:32:18 +00:00
if debugBool {
2020-12-12 15:24:45 +00:00
c.String(respcode, msg)
2020-12-12 08:32:18 +00:00
}
}
2020-12-12 15:24:45 +00:00
func imgPost(c *gin.Context) {
f, err := c.FormFile("upload")
2020-12-12 08:32:18 +00:00
if err != nil {
2020-12-12 15:24:45 +00:00
errThrow(c, http.StatusBadRequest, err.Error(), "no file detected within request")
2020-12-12 08:32:18 +00:00
}
2020-12-12 15:24:45 +00:00
fmt.Println("[imgPost] detected new upload: " + f.Filename)
file, err := f.Open()
2020-12-12 08:32:18 +00:00
if err != nil {
2020-12-12 15:24:45 +00:00
errThrow(c, http.StatusInternalServerError, err.Error(), "error processing file")
2020-12-12 08:32:18 +00:00
}
fmt.Println("[imgPost] verifying file is an image")
2020-12-12 15:24:45 +00:00
imageFormat, ok := checkImage(file)
2020-12-12 08:32:18 +00:00
if !ok {
2020-12-12 15:24:45 +00:00
errThrow(c, http.StatusBadRequest, err.Error(), "input does not appear to be an image")
2020-12-12 08:32:18 +00:00
return
}
fmt.Println("[imgPost] generating uid")
uid := gouid.String(8)
fmt.Println("[imgPost][" + uid + "] dumping byte form of file and scrubbing exif")
2020-12-12 15:24:45 +00:00
fbytes, err := ioutil.ReadAll(file)
2020-12-12 08:32:18 +00:00
Scrubbed, err := exifremove.Remove(fbytes)
2020-12-12 15:24:45 +00:00
if err != nil {
errThrow(c, http.StatusInternalServerError, err.Error(), "error scrubbing exif")
2020-12-12 08:32:18 +00:00
return
}
fmt.Println("[imgPost][" + uid + "] saving file (fin)")
// contentType := "image/" + imageFormat
2020-12-12 15:24:45 +00:00
err = ioutil.WriteFile("./live/img/" + uid + "." + imageFormat, Scrubbed, 755)
2020-12-12 08:32:18 +00:00
if err != nil {
2020-12-12 15:24:45 +00:00
errThrow(c, http.StatusInternalServerError, err.Error(), "error saving file")
2020-12-12 08:32:18 +00:00
return
}
}
func checkImage(r io.ReadSeeker) (string, bool) {
_, fmt, err := image.Decode(r)
_, err2 := r.Seek(0, 0)
if err != nil || err2 != nil {
return "", false
}
return fmt, true
}
func getSize(s io.Seeker) (size int64, err error) {
if _, err = s.Seek(0, 0); err != nil {
return
}
// 2 == from the end of the file
if size, err = s.Seek(0, 2); err != nil {
return
}
_, err = s.Seek(0, 0)
return
}
2020-12-12 15:24:45 +00:00
//////////////////////////////////////////////////////
func txtPost(c *gin.Context) {
return
}
2020-12-12 08:32:18 +00:00
2020-12-12 15:24:45 +00:00
//////////////////////////////////////////////////////
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)
}
2020-12-12 08:32:18 +00:00
func main() {
2020-12-12 15:24:45 +00:00
router := gin.Default()
2020-12-12 08:32:18 +00:00
2020-12-12 15:24:45 +00:00
router.MaxMultipartMemory = 12 << 20
imgR := router.Group("/i")
{
imgR.POST("/put", imgPost)
}
2020-12-12 08:32:18 +00:00
2020-12-12 15:24:45 +00:00
txtR := router.Group("/t")
{
txtR.POST("/put", txtPost)
}
urlR := router.Group("/u")
{
urlR.POST("/put", urlPost)
}
2020-12-12 08:32:18 +00:00
2020-12-12 15:24:45 +00:00
router.Run(":8081")
2020-12-12 08:32:18 +00:00
}