TapIt - SMS Phishing Framework
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

243 lines
7.4 KiB

package main
import (
"github.com/jinzhu/gorm"
"github.com/gorilla/mux"
"time"
"net/http"
"strings"
"encoding/json"
"io/ioutil"
"strconv"
)
// TextTemplate is the persistent object within Postgres
type TextTemplate struct {
gorm.Model
Name string
TemplateStr string
}
// TextTemplateJson is the temporary object for JSON data passing
type TextTemplateJson struct {
Id int `json:"id"`
Name string `json:"name"`
TemplateStr string `json:"templateStr"`
CreateDate time.Time `json:"createDate"`
}
func (tapit *Tapit) handleTextTemplate(w http.ResponseWriter, r *http.Request) {
if strings.ToUpper(r.Method) == "GET" {
tapit.getTextTemplates(w, r)
} else if strings.ToUpper(r.Method) == "POST" {
tapit.createTextTemplate(w, r)
} else {
http.Error(w, "HTTP method not implemented", 400)
return
}
}
func (tapit *Tapit) getTextTemplates(w http.ResponseWriter, r *http.Request) {
textTemplates := []TextTemplate{}
tapit.db.Find(&textTemplates)
jsonResults, err := json.Marshal(textTemplatesToJson(textTemplates))
if err != nil {
http.Error(w, err.Error(), 500)
return
} else {
w.Header().Set("Content-Type", "application/json")
w.Write(jsonResults)
return
}
}
func textTemplatesToJson(textTemplates []TextTemplate) []TextTemplateJson {
textTemplateJson := make([]TextTemplateJson, 0)
for _, textTemplate := range textTemplates {
var currentTextTemplateJson TextTemplateJson
currentTextTemplateJson.Id = int(textTemplate.ID)
currentTextTemplateJson.Name = textTemplate.Name
currentTextTemplateJson.TemplateStr = textTemplate.TemplateStr
currentTextTemplateJson.CreateDate = textTemplate.CreatedAt
textTemplateJson = append(textTemplateJson, currentTextTemplateJson)
}
return textTemplateJson
}
func jsonToTextTemplate(textTemplateJson TextTemplateJson) TextTemplate {
var resultTextTemplate TextTemplate
resultTextTemplate.Name = textTemplateJson.Name
resultTextTemplate.TemplateStr = textTemplateJson.TemplateStr
return resultTextTemplate
}
func (tapit *Tapit) createTextTemplate(w http.ResponseWriter, r *http.Request) {
// start doing work
requestBody, err:= ioutil.ReadAll(r.Body)
if err != nil {
http.Error(w, "Bad request", 400)
return
}
newTextTemplateJson := TextTemplateJson{}
err = json.Unmarshal(requestBody, &newTextTemplateJson)
if err != nil {
http.Error(w, "Bad request", 400)
return
}
if newTextTemplateJson.Name != "" && newTextTemplateJson.TemplateStr != "" {
newTextTemplate := jsonToTextTemplate(newTextTemplateJson)
tapit.db.NewRecord(&newTextTemplate)
tapit.db.Create(&newTextTemplate)
if newTextTemplate.ID == 0 {
notifyPopup(w, r, "failure", "Failed to create text template", nil)
return
}
newTextTemplateJson.Id = int(newTextTemplate.ID)
newTextTemplateJson.CreateDate = newTextTemplate.CreatedAt
notifyPopup(w, r, "success", "Successfully added new text template", newTextTemplate)
return
} else {
notifyPopup(w, r, "failure", "Please fill in all details", nil)
return
}
}
func (tapit *Tapit) getSpecificTextBody(id uint) string {
var textTemplate TextTemplate
var dbSearchTT TextTemplate
dbSearchTT.ID = id
tapit.db.Where(&dbSearchTT).First(&textTemplate)
return textTemplate.TemplateStr
}
func (tapit *Tapit) handleSpecificTextTemplate(w http.ResponseWriter, r *http.Request) {
if strings.ToUpper(r.Method) == "PUT" {
tapit.updateTextTemplate(w, r)
} else if strings.ToUpper(r.Method) == "DELETE" {
tapit.deleteTextTemplate(w,r)
} else if strings.ToUpper(r.Method) == "GET" {
tapit.getTextTemplate(w,r)
} else {
http.Error(w, "HTTP method not implemented", 400)
return
}
}
func (tapit *Tapit) updateTextTemplate(w http.ResponseWriter, r *http.Request) {
requestBody, err:= ioutil.ReadAll(r.Body)
if err != nil {
http.Error(w, "Bad request", 400)
return
}
var newTextTemplateJson TextTemplateJson
err = json.Unmarshal(requestBody, &newTextTemplateJson)
if err != nil {
http.Error(w, "Bad request", 400)
return
}
if newTextTemplateJson.Name != "" {
var newTextTemplate TextTemplate
// get current phonebook
var dbSearchTT TextTemplate
dbSearchTT.ID = uint(newTextTemplateJson.Id)
tapit.db.Where(&dbSearchTT).First(&newTextTemplate)
if newTextTemplate.ID == uint(newTextTemplateJson.Id) {
// update name & template
newTextTemplate.Name = newTextTemplateJson.Name
newTextTemplate.TemplateStr = newTextTemplateJson.TemplateStr
// update database
tapit.db.Save(&newTextTemplate)
if newTextTemplate.ID == 0 {
notifyPopup(w, r, "failure", "Failed to update phonebook", nil)
return
}
newTextTemplateJson.Id = int(newTextTemplate.ID)
newTextTemplateJson.CreateDate = newTextTemplate.CreatedAt
notifyPopup(w, r, "success", "Successfully updated text template", newTextTemplateJson)
return
} else {
notifyPopup(w, r, "failure", "Failed to update text template", nil)
return
}
} else {
notifyPopup(w, r, "failure", "Please enter the phonebook name", nil)
return
}
}
func (tapit *Tapit) deleteTextTemplate(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
tempID, err := strconv.Atoi(vars["id"])
if err != nil {
http.Error(w, "Bad request", 400)
return
}
// start working
var textTemplate TextTemplate
// get tt
var dbSearchTT TextTemplate
dbSearchTT.ID = uint(tempID)
tapit.db.Where(dbSearchTT).First(&textTemplate)
if textTemplate.ID == uint(tempID) {
// finally delete it
tapit.db.Delete(&textTemplate)
notifyPopup(w, r, "success", "Successfully deleted phonebook", nil)
return
} else {
http.Error(w, "Bad request", 400)
return
}
}
func (tapit *Tapit) getTextTemplate(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
tempID, err := strconv.Atoi(vars["id"])
if err != nil {
http.Error(w, "Bad request", 400)
return
}
// start working
var textTemplate TextTemplate
// get tt
var dbSearchTT TextTemplate
dbSearchTT.ID = uint(tempID)
tapit.db.Where(dbSearchTT).First(&textTemplate)
if textTemplate.ID == uint(tempID) {
jsonResults, err := json.Marshal(textTemplateToJson(textTemplate))
if err != nil {
http.Error(w, err.Error(), 500)
return
} else {
w.Header().Set("Content-Type", "application/json")
w.Write(jsonResults)
return
}
} else {
http.Error(w, "Bad request", 400)
return
}
}
func textTemplateToJson(textTemplate TextTemplate) TextTemplateJson {
var result TextTemplateJson
result.Id = int(textTemplate.ID)
result.Name = textTemplate.Name
result.TemplateStr = textTemplate.TemplateStr
result.CreateDate = textTemplate.CreatedAt
return result
}