ygggo/internal/storage/storage.go
Kaiy Belist 39759db7c2 - Inter-node Protocol: Implemented a custom communication protocol based on Protobuf structures.
- Bridge Node Support: Added functionality to manage mail (send/receive) on remote nodes via a bridge node. Full transparent management requires a private key on the bridge, while the remote node can operate with only a public key.
 - End-to-End Encryption (E2EE): Integrated E2EE using age. Encryption and decryption occur strictly at the bridge level; node administrators cannot access message content.
 - New Addressing Schema: Transitioned from nodepub@yggmail to userpub@nodepub.
 - Key Adaptation: Implemented ed25519 to x25519 coordinate adaptation, allowing signing keys to be used for encryption.

Changed
 - Address Encoding: Switched from hex16 to base32 for the address space.
 - Memory Optimization: Replaced direct memory allocations with streaming for mail processing to reduce RAM overhead.
 - Code Refactoring: Performed decomposition of the original inherited codebase to improve maintainability.

Fixed
 - Mail Updates: Fixed the mail retrieval mechanism to ensure near-instant updates for incoming messages.

Changes to be committed:
	modified:   .gitignore
	modified:   README.md
	modified:   cmd/yggmail/main.go
	modified:   go.mod
	modified:   go.sum
	new file:   internal/account/manager.go
	new file:   internal/account/session.go
	modified:   internal/imapserver/backend.go
	modified:   internal/imapserver/imap.go
	modified:   internal/imapserver/mailbox.go
	modified:   internal/imapserver/notify.go
	modified:   internal/imapserver/user.go
	new file:   internal/notify/notify.go
	new file:   internal/notify/remote/remote.go
	new file:   internal/remote/client.go
	new file:   internal/remote/handlers.go
	new file:   internal/remote/io.go
	new file:   internal/remote/server.go
	new file:   internal/remote/sign.go
	new file:   internal/remote/types/request.pb.go
	new file:   internal/remote/types/request.proto
	new file:   internal/remote/types/response.pb.go
	new file:   internal/remote/types/response.proto
	new file:   internal/shell/shell.go
	modified:   internal/smtpsender/sender.go
	modified:   internal/smtpserver/backend.go
	modified:   internal/smtpserver/session_local.go
	modified:   internal/smtpserver/session_remote.go
	modified:   internal/smtpserver/smtp.go
	new file:   internal/storage/filestore/filestore.go
	new file:   internal/storage/local/storage.go
	new file:   internal/storage/remote/mail.go
	new file:   internal/storage/remote/mailbox.go
	new file:   internal/storage/remote/queue.go
	new file:   internal/storage/remote/storage.go
	new file:   internal/storage/remote/watch.go
	modified:   internal/storage/sqlite3/sqlite3.go
	new file:   internal/storage/sqlite3/table_accounts.go
	modified:   internal/storage/sqlite3/table_mailboxes.go
	modified:   internal/storage/sqlite3/table_mails.go
	modified:   internal/storage/sqlite3/table_queue.go
	modified:   internal/storage/storage.go
	modified:   internal/storage/types/types.go
	modified:   internal/utils/address.go
	new file:   internal/utils/age/age.go
	new file:   internal/utils/age/bech32/bech32.go
	new file:   internal/utils/crypt.go
	new file:   internal/utils/e2ee/crypt.go
	new file:   internal/utils/e2ee/e2ee_test.go
	new file:   internal/utils/e2ee/msg.go
	new file:   internal/utils/x25519.go
	modified:   internal/welcome/welcome.go
2026-02-14 02:34:09 +05:00

65 lines
2.4 KiB
Go

/*
* (Original 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 storage
import (
"io"
"github.com/neilalexander/yggmail/internal/storage/types"
)
type BlobStore interface {
StoreMail(aPk string, mailbox string, reader io.Reader) (string, int64, error)
ReadMail(location string) (io.ReadCloser, error)
DeleteMail(location string) error
MoveMail(oldLocation string, newMailbox string) (string, error)
}
type MailStore interface {
Storage
MailCreateRaw(pk string, mailbox string, data io.Reader, location string, size int64) (int, error)
}
type Storage interface {
ConfigGet(key string) (string, error)
ConfigSet(key, value string) error
ConfigSetPassword(password string) error
ConfigTryPassword(password string) (bool, error)
AccountGet(pk string) (*types.Account, error)
AccountCreate(acc *types.Account) error
AccountDelete(pk string) error
AccountList() ([]*types.Account, error)
MailboxSelect(pk string, mailbox string) (bool, error)
MailNextID(pk string, mailbox string) (int, error)
MailIDForSeq(pk string, mailbox string, seq int) (int, error)
MailUnseen(pk string, mailbox string) (int, error)
MailboxList(pk string, onlySubscribed bool) ([]string, error)
MailboxCreate(pk string, name string) error
MailboxRename(pk string, old, new string) error
MailboxDelete(pk string, name string) error
MailboxSubscribe(pk string, name string, subscribed bool) error
MailCreate(pk string, mailbox string, r io.Reader, size int) (int, error)
MailSelect(pk string, mailbox string, id int) (int, *types.Mail, error)
MailSearch(pk string, mailbox string) ([]uint32, error)
MailUpdateFlags(pk string, mailbox string, id int, seen, answered, flagged, deleted bool) error
MailDelete(pk string, mailbox string, id int) error
MailExpunge(pk string, mailbox string) error
MailCount(pk string, mailbox string) (int, error)
MailMove(pk string, mailbox string, id int, destination string) (int, error)
QueueListDestinations() ([]string, error)
QueueMailIDsForDestination(destination string) ([]types.QueuedMail, error)
QueueInsertDestinationForID(pk string, destination string, id int, from, rcpt string) error
QueueDeleteDestinationForID(pk string, destination string, id int) error
QueueSelectIsMessagePendingSend(pk string, mailbox string, id int) (bool, error)
}