2026-02-14 02:34:09 +05:00
|
|
|
// /*
|
|
|
|
|
// - Copyright (c) 2021 Neil Alexander
|
|
|
|
|
// *
|
|
|
|
|
// - This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
|
// - License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
|
// - file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
|
// */
|
2021-07-07 18:15:07 +01:00
|
|
|
package smtpserver
|
|
|
|
|
|
2026-02-14 02:34:09 +05:00
|
|
|
//
|
|
|
|
|
//
|
|
|
|
|
// WAS DEPRECATED BUT ARCHIVED FOR RE-IMPLEMENTATION ON PROTOBUFF
|
|
|
|
|
//
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// import (
|
|
|
|
|
// "bytes"
|
|
|
|
|
// "crypto/ed25519"
|
|
|
|
|
// "encoding/hex"
|
|
|
|
|
// "fmt"
|
|
|
|
|
// "io"
|
|
|
|
|
// "time"
|
|
|
|
|
//
|
|
|
|
|
// "github.com/emersion/go-message"
|
|
|
|
|
// "github.com/emersion/go-smtp"
|
|
|
|
|
// "github.com/neilalexander/yggmail/internal/notify"
|
|
|
|
|
// "github.com/neilalexander/yggmail/internal/utils"
|
|
|
|
|
// )
|
|
|
|
|
//
|
|
|
|
|
// type SessionRemote struct {
|
|
|
|
|
// backend *Backend
|
|
|
|
|
// state *smtp.ConnectionState
|
|
|
|
|
// public ed25519.PublicKey
|
|
|
|
|
// from string
|
|
|
|
|
// recipient string
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// func (s *SessionRemote) Mail(from string, opts smtp.MailOptions) error {
|
|
|
|
|
// dPk, _, err := utils.ParseAddress(from)
|
|
|
|
|
// if err != nil {
|
|
|
|
|
// return fmt.Errorf("mail.ParseAddress: %w", err)
|
|
|
|
|
// }
|
|
|
|
|
// // Tranport layer work on hex16 addresses
|
|
|
|
|
// remote, err := hex.DecodeString(s.state.RemoteAddr.String())
|
|
|
|
|
//
|
|
|
|
|
// rPk := ed25519.PublicKey(remote)
|
|
|
|
|
// if err != nil {
|
|
|
|
|
// return fmt.Errorf("hex.Decode error decode key")
|
|
|
|
|
// }
|
|
|
|
|
// if !dPk.Equal(rPk) {
|
|
|
|
|
// return fmt.Errorf("not allowed to send incoming mail as %s", from)
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// s.from = from
|
|
|
|
|
// return nil
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// func (s *SessionRemote) Rcpt(to string) error {
|
|
|
|
|
// dPk, aPk, err := utils.ParseAddress(to)
|
|
|
|
|
// if err != nil {
|
|
|
|
|
// return fmt.Errorf("mail.ParseAddress: %w", err)
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// if !dPk.Equal(s.backend.NodePublicKey) {
|
|
|
|
|
// return fmt.Errorf("unexpected recipient for wrong domain or username")
|
|
|
|
|
// }
|
|
|
|
|
// if _, err := s.backend.Account.GetAccount(utils.EncodeString(aPk)); err != nil {
|
|
|
|
|
// return fmt.Errorf("unexpected recipient for wrong domain or username")
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// s.recipient = utils.EncodeString(aPk)
|
|
|
|
|
// return nil
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// func (s *SessionRemote) Data(r io.Reader) error {
|
|
|
|
|
// m, err := message.Read(r)
|
|
|
|
|
// if err != nil {
|
|
|
|
|
// return fmt.Errorf("message.Read: %w", err)
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// // TODO: Verify Message with Header:
|
|
|
|
|
// // Header: Sig-ED25519
|
|
|
|
|
//
|
|
|
|
|
// m.Header.Add(
|
|
|
|
|
// "Received", fmt.Sprintf("from Yggmail %s; %s",
|
|
|
|
|
// utils.EncodeString(s.public),
|
|
|
|
|
// time.Now().String(),
|
|
|
|
|
// ),
|
|
|
|
|
// )
|
|
|
|
|
// m.Header.Add(
|
|
|
|
|
// "Delivery-Date", time.Now().UTC().Format(time.RFC822),
|
|
|
|
|
// )
|
|
|
|
|
//
|
|
|
|
|
// var b bytes.Buffer
|
|
|
|
|
// if err := m.WriteTo(&b); err != nil {
|
|
|
|
|
// return fmt.Errorf("m.WriteTo: %w", err)
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// if id, err := s.backend.Storage.MailCreate(s.recipient, "INBOX", b.Bytes()); err != nil {
|
|
|
|
|
// return fmt.Errorf("s.backend.Storage.StoreMessageFor: %w", err)
|
|
|
|
|
// } else {
|
|
|
|
|
// s.backend.Log.Printf("Stored new mail from %s", s.from)
|
|
|
|
|
//
|
|
|
|
|
// if count, err := s.backend.Storage.MailCount(s.recipient, "INBOX"); err == nil {
|
|
|
|
|
// if err := s.backend.Notify.NotifyNew(s.recipient, notify.NewEmailEvent(s.recipient, "INBOX", int64(id), int64(count))); err != nil {
|
|
|
|
|
// s.backend.Log.Println("SMTP R: Failed to notify:", s.from)
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// return nil
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// func (s *SessionRemote) Reset() {}
|
|
|
|
|
//
|
|
|
|
|
// func (s *SessionRemote) Logout() error {
|
|
|
|
|
// return nil
|
|
|
|
|
// }
|