2014-01-09 06:42:05 +00:00
|
|
|
package models
|
2013-12-12 06:27:43 +00:00
|
|
|
|
2014-03-25 03:31:33 +00:00
|
|
|
import (
|
2016-01-13 02:46:17 +00:00
|
|
|
"crypto/rand"
|
2014-03-25 03:31:33 +00:00
|
|
|
"errors"
|
2016-01-13 02:46:17 +00:00
|
|
|
"fmt"
|
|
|
|
"io"
|
2014-03-25 03:31:33 +00:00
|
|
|
"log"
|
|
|
|
"os"
|
2014-01-13 03:36:26 +00:00
|
|
|
|
2016-01-19 03:13:32 +00:00
|
|
|
"bitbucket.org/liamstask/goose/lib/goose"
|
|
|
|
|
2016-01-10 17:03:17 +00:00
|
|
|
"github.com/gophish/gophish/config"
|
2016-01-13 02:46:17 +00:00
|
|
|
"github.com/jinzhu/gorm"
|
2015-02-07 02:24:10 +00:00
|
|
|
_ "github.com/mattn/go-sqlite3" // Blank import needed to import sqlite3
|
2014-03-25 03:31:33 +00:00
|
|
|
)
|
2014-01-13 03:36:26 +00:00
|
|
|
|
2016-03-09 04:37:55 +00:00
|
|
|
var db *gorm.DB
|
2014-03-25 03:31:33 +00:00
|
|
|
var err error
|
2015-02-07 02:24:10 +00:00
|
|
|
|
|
|
|
// ErrUsernameTaken is thrown when a user attempts to register a username that is taken.
|
2014-03-26 04:53:51 +00:00
|
|
|
var ErrUsernameTaken = errors.New("username already taken")
|
2015-02-07 02:24:10 +00:00
|
|
|
|
|
|
|
// Logger is a global logger used to show informational, warning, and error messages
|
2014-03-26 04:53:51 +00:00
|
|
|
var Logger = log.New(os.Stdout, " ", log.Ldate|log.Ltime|log.Lshortfile)
|
2013-12-12 07:00:22 +00:00
|
|
|
|
2014-03-28 04:31:51 +00:00
|
|
|
const (
|
2014-07-02 01:32:34 +00:00
|
|
|
CAMPAIGN_IN_PROGRESS string = "In progress"
|
|
|
|
CAMPAIGN_QUEUED string = "Queued"
|
2015-09-28 03:25:38 +00:00
|
|
|
CAMPAIGN_EMAILS_SENT string = "Emails Sent"
|
2014-07-02 01:32:34 +00:00
|
|
|
CAMPAIGN_COMPLETE string = "Completed"
|
2014-07-07 02:34:02 +00:00
|
|
|
EVENT_SENT string = "Email Sent"
|
2016-01-29 18:34:29 +00:00
|
|
|
EVENT_SENDING_ERROR string = "Error Sending Email"
|
2014-07-07 02:34:02 +00:00
|
|
|
EVENT_OPENED string = "Email Opened"
|
|
|
|
EVENT_CLICKED string = "Clicked Link"
|
2016-02-01 01:50:41 +00:00
|
|
|
EVENT_DATA_SUBMIT string = "Submitted Data"
|
2016-08-26 01:56:05 +00:00
|
|
|
EVENT_HTML_OPENED string = "HTML Opened"
|
|
|
|
EVENT_DOC_OPENED string = "WORD Opened"
|
2014-07-07 02:34:02 +00:00
|
|
|
STATUS_SUCCESS string = "Success"
|
2016-02-02 02:42:46 +00:00
|
|
|
STATUS_SENDING string = "Sending"
|
2014-07-07 02:34:02 +00:00
|
|
|
STATUS_UNKNOWN string = "Unknown"
|
2014-07-02 01:32:34 +00:00
|
|
|
ERROR string = "Error"
|
2014-03-28 04:31:51 +00:00
|
|
|
)
|
|
|
|
|
2014-03-26 19:50:16 +00:00
|
|
|
// Flash is used to hold flash information for use in templates.
|
|
|
|
type Flash struct {
|
|
|
|
Type string
|
|
|
|
Message string
|
|
|
|
}
|
|
|
|
|
2015-02-07 02:24:10 +00:00
|
|
|
// Response contains the attributes found in an API response
|
2014-06-02 03:30:23 +00:00
|
|
|
type Response struct {
|
2014-06-02 04:38:21 +00:00
|
|
|
Message string `json:"message"`
|
|
|
|
Success bool `json:"success"`
|
|
|
|
Data interface{} `json:"data"`
|
2014-06-02 03:30:23 +00:00
|
|
|
}
|
|
|
|
|
2016-01-13 02:46:17 +00:00
|
|
|
// Copy of auth.GenerateSecureKey to prevent cyclic import with auth library
|
|
|
|
func generateSecureKey() string {
|
|
|
|
k := make([]byte, 32)
|
|
|
|
io.ReadFull(rand.Reader, k)
|
|
|
|
return fmt.Sprintf("%x", k)
|
|
|
|
}
|
|
|
|
|
2014-03-25 03:31:33 +00:00
|
|
|
// Setup initializes the Conn object
|
|
|
|
// It also populates the Gophish Config object
|
2014-03-25 03:38:59 +00:00
|
|
|
func Setup() error {
|
2015-08-28 23:27:49 +00:00
|
|
|
create_db := false
|
|
|
|
if _, err = os.Stat(config.Conf.DBPath); err != nil || config.Conf.DBPath == ":memory:" {
|
|
|
|
create_db = true
|
|
|
|
}
|
2016-01-19 03:13:32 +00:00
|
|
|
// Setup the goose configuration
|
|
|
|
migrateConf := &goose.DBConf{
|
|
|
|
MigrationsDir: config.Conf.MigrationsPath,
|
|
|
|
Env: "production",
|
|
|
|
Driver: goose.DBDriver{
|
|
|
|
Name: "sqlite3",
|
|
|
|
OpenStr: config.Conf.DBPath,
|
|
|
|
Import: "github.com/mattn/go-sqlite3",
|
|
|
|
Dialect: &goose.Sqlite3Dialect{},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
// Get the latest possible migration
|
|
|
|
latest, err := goose.GetMostRecentDBVersion(migrateConf.MigrationsDir)
|
|
|
|
if err != nil {
|
|
|
|
Logger.Println(err)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
// Open our database connection
|
2014-03-26 19:50:16 +00:00
|
|
|
db, err = gorm.Open("sqlite3", config.Conf.DBPath)
|
2014-03-28 04:31:51 +00:00
|
|
|
db.LogMode(false)
|
2014-03-26 19:50:16 +00:00
|
|
|
db.SetLogger(Logger)
|
2016-08-03 04:28:22 +00:00
|
|
|
db.DB().SetMaxOpenConns(1)
|
2014-03-26 04:53:51 +00:00
|
|
|
if err != nil {
|
2014-03-26 19:50:16 +00:00
|
|
|
Logger.Println(err)
|
|
|
|
return err
|
2014-03-26 04:53:51 +00:00
|
|
|
}
|
2016-01-19 03:13:32 +00:00
|
|
|
// Migrate up to the latest version
|
|
|
|
err = goose.RunMigrationsOnDb(migrateConf, migrateConf.MigrationsDir, latest, db.DB())
|
|
|
|
if err != nil {
|
|
|
|
Logger.Println(err)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
//If the database didn't exist, we need to create the admin user
|
2015-08-28 23:27:49 +00:00
|
|
|
if create_db {
|
2014-03-25 03:31:33 +00:00
|
|
|
//Create the default user
|
2015-02-07 02:24:10 +00:00
|
|
|
initUser := User{
|
2014-03-25 03:31:33 +00:00
|
|
|
Username: "admin",
|
|
|
|
Hash: "$2a$10$IYkPp0.QsM81lYYPrQx6W.U6oQGw7wMpozrKhKAHUBVL4mkm/EvAS", //gophish
|
2014-03-26 04:53:51 +00:00
|
|
|
}
|
2016-01-13 02:46:17 +00:00
|
|
|
initUser.ApiKey = generateSecureKey()
|
2015-02-07 02:24:10 +00:00
|
|
|
err = db.Save(&initUser).Error
|
2014-03-26 04:53:51 +00:00
|
|
|
if err != nil {
|
|
|
|
Logger.Println(err)
|
2016-01-19 03:13:32 +00:00
|
|
|
return err
|
2014-03-26 04:53:51 +00:00
|
|
|
}
|
2014-03-25 03:31:33 +00:00
|
|
|
}
|
2014-03-25 03:38:59 +00:00
|
|
|
return nil
|
2013-12-12 07:00:22 +00:00
|
|
|
}
|