// /* // - 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/. // */ package smtpserver // // // 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 // }