mirror of
https://github.com/evilsocket/arc.git
synced 2024-05-26 22:37:37 +03:00
82 lines
1.9 KiB
Go
82 lines
1.9 KiB
Go
package events
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/tls"
|
|
"fmt"
|
|
"github.com/evilsocket/arc/config"
|
|
"github.com/evilsocket/arc/pgp"
|
|
"github.com/evilsocket/islazy/log"
|
|
"gopkg.in/gomail.v2"
|
|
"os"
|
|
"os/exec"
|
|
)
|
|
|
|
func doEmailReport(event Event) (err error) {
|
|
smtp := config.Conf.Scheduler.Reports.SMTP
|
|
|
|
contentType := "text/html"
|
|
reportType := "plaintext"
|
|
if pgpConf.Enabled {
|
|
reportType = "PGP encrypted"
|
|
}
|
|
|
|
body := event.Description
|
|
if pgpConf.Enabled {
|
|
contentType = "text/plain"
|
|
if err, body = pgp.Encrypt(body); err != nil {
|
|
return fmt.Errorf("could not PGP encrypt the message: %v", err)
|
|
}
|
|
}
|
|
|
|
log.Info("reporting %s event '%s' to %s ...",
|
|
reportType,
|
|
event.Title,
|
|
config.Conf.Scheduler.Reports.To)
|
|
|
|
if smtp.Filled() {
|
|
log.Info("using smtp server")
|
|
|
|
d := gomail.NewDialer(smtp.Address, smtp.Port, smtp.Username, smtp.Password)
|
|
d.TLSConfig = &tls.Config{InsecureSkipVerify: true}
|
|
|
|
m := gomail.NewMessage()
|
|
m.SetHeader("From", fmt.Sprintf("Arc Reporting System <%s>", smtp.Username))
|
|
m.SetHeader("To", config.Conf.Scheduler.Reports.To)
|
|
m.SetHeader("Subject", event.Title)
|
|
|
|
m.SetBody(contentType, body)
|
|
|
|
if err := d.DialAndSend(m); err != nil {
|
|
return err
|
|
}
|
|
} else if sendmailPath, err := exec.LookPath("sendmail"); err != nil {
|
|
return fmt.Errorf("error searching sendmail binary: %v", err)
|
|
} else {
|
|
log.Info("using %s", sendmailPath)
|
|
|
|
cmd := exec.Command(sendmailPath, "-t")
|
|
|
|
body = "From: arc@localhost\n" +
|
|
fmt.Sprintf("To: %s", config.Conf.Scheduler.Reports.To) + "\n" +
|
|
fmt.Sprintf("Subject: %s", event.Title) + "\n" +
|
|
fmt.Sprintf("Content-Type: %s", contentType) + "\n" +
|
|
"Content-Transfer-Encoding: 7BIT\n" +
|
|
"Content-Disposition: inline\n" +
|
|
"MIME-Version: 1.0\n" +
|
|
"\n" +
|
|
body
|
|
|
|
buffer := bytes.Buffer{}
|
|
buffer.Write([]byte(body))
|
|
|
|
cmd.Stdin = &buffer
|
|
cmd.Stdout = os.Stdout
|
|
cmd.Stderr = os.Stderr
|
|
|
|
return cmd.Run()
|
|
}
|
|
|
|
return nil
|
|
}
|