package kolide import ( "bytes" "html/template" "time" ) // PasswordResetStore manages password resets in the Datastore type PasswordResetStore interface { NewPasswordResetRequest(req *PasswordResetRequest) (*PasswordResetRequest, error) SavePasswordResetRequest(req *PasswordResetRequest) error DeletePasswordResetRequest(req *PasswordResetRequest) error DeletePasswordResetRequestsForUser(userID uint) error FindPassswordResetByID(id uint) (*PasswordResetRequest, error) FindPassswordResetsByUserID(id uint) ([]*PasswordResetRequest, error) FindPassswordResetByToken(token string) (*PasswordResetRequest, error) FindPassswordResetByTokenAndUserID(token string, id uint) (*PasswordResetRequest, error) } // Mailer is an email campaign // Types which implement the Campaign interface // can be marshalled into an email body type Mailer interface { Message() ([]byte, error) } type Email struct { Subject string To []string Config *AppConfig Mailer Mailer } type MailService interface { SendEmail(e Email) error } // PasswordResetRequest represents a database table for // Password Reset Requests type PasswordResetRequest struct { UpdateCreateTimestamps ID uint ExpiresAt time.Time `db:"expires_at"` UserID uint `db:"user_id"` Token string } // SMTPTestMailer is used to build an email message that will be used as // a test message when testing SMTP configuration type SMTPTestMailer struct { KolideServerURL string } func (m *SMTPTestMailer) Message() ([]byte, error) { t, err := getTemplate("server/mail/templates/smtp_setup.html") if err != nil { return nil, err } var msg bytes.Buffer if err = t.Execute(&msg, m); err != nil { return nil, err } return msg.Bytes(), nil } type PasswordResetMailer struct { // URL for the Kolide application KolideServerURL template.URL // Token password reset token Token string } func (r PasswordResetMailer) Message() ([]byte, error) { t, err := getTemplate("server/mail/templates/password_reset.html") if err != nil { return nil, err } var msg bytes.Buffer if err = t.Execute(&msg, r); err != nil { return nil, err } return msg.Bytes(), nil } func getTemplate(templatePath string) (*template.Template, error) { templateData, err := Asset(templatePath) if err != nil { return nil, err } t, err := template.New("email_template").Parse(string(templateData)) if err != nil { return nil, err } return t, nil }