package controllers
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/sha256"
|
|
"fmt"
|
|
"github.com/revel/revel"
|
|
"image"
|
|
"image/jpeg"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"net/url"
|
|
"os"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
var pix = image.NewRGBA(image.Rectangle{image.Point{0, 0}, image.Point{1, 1}})
|
|
var img image.Image = pix
|
|
var buffer = new(bytes.Buffer)
|
|
var foo = jpeg.Encode(buffer, img, nil)
|
|
var content_length = strconv.Itoa(len(buffer.Bytes()))
|
|
|
|
type Pixel string
|
|
|
|
func (p Pixel) Apply(req *revel.Request, resp *revel.Response) {
|
|
resp.Out.Header().Add("Content-Type", "image/jpeg")
|
|
resp.Out.Header().Add("Content-Length", content_length)
|
|
resp.GetWriter().Write(buffer.Bytes())
|
|
}
|
|
|
|
type Hermes struct {
|
|
*revel.Controller
|
|
}
|
|
|
|
func (c Hermes) Index() revel.Result {
|
|
return c.Render()
|
|
}
|
|
|
|
func send_notification(title, recipient, token string) {
|
|
http.PostForm("https://gotify.yigitcolakoglu.com/message?token="+token,
|
|
url.Values{"title": {"E-mail Seen"}, "message": {fmt.Sprintf("To: %s \n Title: %s", recipient, title)}, "priority": {"5"}})
|
|
}
|
|
|
|
func (h Hermes) Read(title, recipient, user, provided_hash string) revel.Result {
|
|
ip := strings.Split(h.Request.RemoteAddr, ":")[0]
|
|
raw_userdata, _ := ioutil.ReadFile("storage/userdata")
|
|
userdata := strings.Split(string(raw_userdata), "\n")
|
|
key := ""
|
|
gotify_token := ""
|
|
for i := 0; i < len(userdata); i++ {
|
|
if strings.Split(userdata[i], " ")[0] == user {
|
|
key = strings.Split(userdata[i], " ")[1]
|
|
gotify_token = strings.Split(userdata[i], " ")[2]
|
|
}
|
|
}
|
|
if key == "" {
|
|
return Pixel("No dice")
|
|
}
|
|
identity := title + recipient + user + key
|
|
fmt.Printf(identity)
|
|
hash_string := fmt.Sprintf("%x", sha256.Sum256([]byte(identity)))
|
|
if hash_string != provided_hash {
|
|
fmt.Printf("Hashes don't match!\n")
|
|
return Pixel("You think you can fool me?")
|
|
}
|
|
if _, err := os.Stat("storage/ipdata/" + hash_string); os.IsNotExist(err) {
|
|
os.Create("storage/ipdata/" + hash_string)
|
|
}
|
|
raw_ipdata, _ := ioutil.ReadFile("storage/ipdata/" + hash_string)
|
|
ipdata := strings.Split(string(raw_ipdata), "\n")
|
|
for i := 0; i < len(ipdata)-1; i++ {
|
|
if ipdata[i] == ip {
|
|
fmt.Printf("IP collision detected!\n")
|
|
return Pixel("I see what you are trying to do!")
|
|
}
|
|
}
|
|
|
|
f, _ := os.OpenFile("storage/ipdata/"+hash_string, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
|
|
f.WriteString(fmt.Sprintf("%s\n", ip))
|
|
f.Close()
|
|
send_notification(title, recipient, gotify_token)
|
|
return Pixel("Success")
|
|
}
|