Working on importing emails from source (still doesn't work yet!)

pull/24/head
unknown 2015-02-15 21:53:30 -06:00
parent cb081f4a17
commit 759f86447d
6 changed files with 80 additions and 8 deletions

View File

@ -3,6 +3,7 @@ package controllers
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"io/ioutil"
"net/http" "net/http"
"strconv" "strconv"
"text/template" "text/template"
@ -335,8 +336,8 @@ func API_Pages_Id(w http.ResponseWriter, r *http.Request) {
} }
} }
// API_Import_Group imports a CSV of group members
func API_Import_Group(w http.ResponseWriter, r *http.Request) { func API_Import_Group(w http.ResponseWriter, r *http.Request) {
Logger.Println("Parsing CSV....")
ts, err := util.ParseCSV(r) ts, err := util.ParseCSV(r)
if checkError(err, w, "Error deleting template", http.StatusInternalServerError) { if checkError(err, w, "Error deleting template", http.StatusInternalServerError) {
return return
@ -344,6 +345,19 @@ func API_Import_Group(w http.ResponseWriter, r *http.Request) {
JSONResponse(w, ts, http.StatusOK) JSONResponse(w, ts, http.StatusOK)
} }
// API_Import_Email allows for the importing of email.
// Returns a Message object
func API_Import_Email(w http.ResponseWriter, r *http.Request) {
if r.Method == "POST" {
body, err := ioutil.ReadAll(r.Body)
if err != nil {
Logger.Println(err)
}
w.Header().Set("Content-Type", "text/plain")
fmt.Fprintf(w, "%s", body)
}
}
// JSONResponse attempts to set the status code, c, and marshal the given interface, d, into a response that // JSONResponse attempts to set the status code, c, and marshal the given interface, d, into a response that
// is written to the given ResponseWriter. // is written to the given ResponseWriter.
func JSONResponse(w http.ResponseWriter, d interface{}, c int) { func JSONResponse(w http.ResponseWriter, d interface{}, c int) {

View File

@ -47,6 +47,7 @@ func CreateAdminRouter() http.Handler {
api.HandleFunc("/pages/", Use(API_Pages, mid.RequireAPIKey)) api.HandleFunc("/pages/", Use(API_Pages, mid.RequireAPIKey))
api.HandleFunc("/pages/{id:[0-9]+}", Use(API_Pages_Id, mid.RequireAPIKey)) api.HandleFunc("/pages/{id:[0-9]+}", Use(API_Pages_Id, mid.RequireAPIKey))
api.HandleFunc("/import/group", API_Import_Group) api.HandleFunc("/import/group", API_Import_Group)
api.HandleFunc("/import/email", API_Import_Email)
// Setup static file serving // Setup static file serving
router.PathPrefix("/").Handler(http.FileServer(http.Dir("./static/"))) router.PathPrefix("/").Handler(http.FileServer(http.Dir("./static/")))

View File

@ -653,13 +653,12 @@ app.controller('TemplateCtrl', function($scope, $modal, TemplateService, ngTable
} }
}) })
var TemplateModalCtrl = function($scope, $upload, $modalInstance) { var TemplateModalCtrl = function($scope, $upload, $modalInstance, $modal) {
$scope.editorOptions = { $scope.editorOptions = {
fullPage: true, fullPage: true,
allowedContent: true allowedContent: true
} }
$scope.onFileSelect = function($files) { $scope.onFileSelect = function($files) {
console.log($files)
angular.forEach($files, function(file, key) { angular.forEach($files, function(file, key) {
var reader = new FileReader(); var reader = new FileReader();
reader.onload = function(e) { reader.onload = function(e) {
@ -686,6 +685,31 @@ var TemplateModalCtrl = function($scope, $upload, $modalInstance) {
$scope.removeFile = function(file) { $scope.removeFile = function(file) {
$scope.template.attachments.splice($scope.template.attachments.indexOf(file), 1); $scope.template.attachments.splice($scope.template.attachments.indexOf(file), 1);
} }
$scope.importEmail = function() {
var emailInstance = $modal.open({
templateUrl: '/js/app/partials/modals/importEmailModal.html',
controller: ImportEmailCtrl,
scope: $scope
});
emailInstance.result.then(function(raw) {
$scope.template.subject = raw;
}, function() {});
};
};
var ImportEmailCtrl = function($scope, $http, $modalInstance) {
$scope.email = {}
$scope.ok = function() {
// Simple POST request example (passing data) :
$http.post('/api/import/email', $scope.email.raw,
{ headers : {"Content-Type" : "text/plain"}}
).success(function(data) {console.log("Success: " + data)})
.error(function(data) {console.log("Error: " + data)});
$modalInstance.close($scope.email.raw)
};
$scope.cancel = function() {$modalInstance.dismiss()}
}; };
app.controller('LandingPageCtrl', function($scope, $modal, LandingPageService, ngTableParams) { app.controller('LandingPageCtrl', function($scope, $modal, LandingPageService, ngTableParams) {

View File

@ -0,0 +1,19 @@
<!-- Import Email Modal -->
<div class="modal-header">
<button type="button" class="close" ng-click="cancel()">&times;</button>
<h4 class="modal-title">Import Email</h4>
</div>
<div class="modal-body">
<tabset>
<tab>
<tab-heading>
<span>Raw <i class="fa fa-question-circle" tooltip="Input the raw email content, or &quot;source&quot;" tooltip-placement="right"></i></span>
</tab-heading>
<textarea rows="10" style="font-family:monospace;" class="form-control" ng-model="email.raw" placeholder="Email Content"></textarea>
</tab>
</tabset>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" ng-click="cancel()">Cancel</button>
<button type="button" class="btn btn-primary" ng-click="ok()">Import</button>
</div>

View File

@ -9,11 +9,9 @@
<div class="form-group"> <div class="form-group">
<input type="text" class="form-control" ng-model="template.name" placeholder="Template name" id="name" autofocus/> <input type="text" class="form-control" ng-model="template.name" placeholder="Template name" id="name" autofocus/>
</div> </div>
<fieldset disabled> <div class="form-group">
<div class="form-group"> <button class="btn btn-danger btn-disabled" ng-click="importEmail()"><i class="fa fa-envelope"></i> Import Email (Coming Soon!)</button>
<button class="btn btn-danger btn-disabled"><i class="fa fa-envelope"></i> Import Email (Coming Soon!)</button> </div>
</div>
</fieldset>
<label class="control-label" for="subject">Subject:</label> <label class="control-label" for="subject">Subject:</label>
<div class="form-group"> <div class="form-group">
<input type="text" class="form-control" ng-model="template.subject" placeholder="Email Subject" id="subject" /> <input type="text" class="form-control" ng-model="template.subject" placeholder="Email Subject" id="subject" />

View File

@ -4,11 +4,27 @@ import (
"encoding/csv" "encoding/csv"
"fmt" "fmt"
"io" "io"
"io/ioutil"
"net/http" "net/http"
"net/mail"
"github.com/jordan-wright/email"
"github.com/jordan-wright/gophish/models" "github.com/jordan-wright/gophish/models"
) )
// ParseMail takes in an HTTP Request and returns an Email object
// TODO: This function will likely be changed to take in a []byte
func ParseMail(r *http.Request) (email.Email, error) {
e := email.Email{}
m, err := mail.ReadMessage(r.Body)
if err != nil {
fmt.Println(err)
}
body, err := ioutil.ReadAll(m.Body)
e.HTML = body
return e, err
}
func ParseCSV(r *http.Request) ([]models.Target, error) { func ParseCSV(r *http.Request) ([]models.Target, error) {
mr, err := r.MultipartReader() mr, err := r.MultipartReader()
ts := []models.Target{} ts := []models.Target{}