backend

package
v0.0.0-...-90479f1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 26, 2016 License: MIT Imports: 2 Imported by: 0

Documentation

Overview

IMAP server backend interface.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Backend

type Backend interface {
	// Authenticate a user.
	Login(username, password string) (User, error)
}

An IMAP server backend. A backend operation always deals with users.

type ExpungeUpdate

type ExpungeUpdate struct {
	Update
	SeqNum uint32
}

An expunge update.

type Mailbox

type Mailbox interface {
	// Get this mailbox name.
	Name() string

	// Get this mailbox info.
	Info() (*common.MailboxInfo, error)

	// Get this mailbox status.
	// See RFC 3501 section 6.3.10 for a list of items that can be requested.
	Status(items []string) (*common.MailboxStatus, error)

	// Add the mailbox to the server's set of "active" or "subscribed" mailboxes.
	Subscribe() error

	// Remove the mailbox to the server's set of "active" or "subscribed"
	// mailboxes.
	Unsubscribe() error

	// Requests a checkpoint of the currently selected mailbox. A checkpoint
	// refers to any implementation-dependent housekeeping associated with the
	// mailbox (e.g., resolving the server's in-memory state of the mailbox with
	// the state on its disk). A checkpoint MAY take a non-instantaneous amount of
	// real time to complete. If a server implementation has no such housekeeping
	// considerations, CHECK is equivalent to NOOP.
	Check() error

	// Get a list of messages.
	// seqset must be interpreted as UIDs if uid is set to true and as message
	// sequence numbers otherwise.
	// See RFC 3501 section 6.4.5 for a list of items that can be requested.
	//
	// Messages must be sent to ch. When the function returns, ch must be closed.
	ListMessages(uid bool, seqset *common.SeqSet, items []string, ch chan<- *common.Message) error

	// Search messages.
	SearchMessages(uid bool, criteria *common.SearchCriteria) ([]uint32, error)

	// Append a new message to this mailbox. The \Recent flag will be added no
	// matter flags is empty or not. If date is nil, the current time will be
	// used.
	//
	// If the Backend implements Updater, it must notify the client immediately
	// via a mailbox update.
	CreateMessage(flags []string, date *time.Time, body []byte) error

	// Alter flags for the specified message(s).
	//
	// If the Backend implements Updater, it must notify the client immediately
	// via a message update.
	UpdateMessagesFlags(uid bool, seqset *common.SeqSet, operation common.FlagsOp, flags []string) error

	// Copy the specified message(s) to the end of the specified destination
	// mailbox. The flags and internal date of the message(s) SHOULD be preserved,
	// and the Recent flag SHOULD be set, in the copy.
	//
	// If the destination mailbox does not exist, a server SHOULD return an error.
	// It SHOULD NOT automatically create the mailbox.
	//
	// If the Backend implements Updater, it must notify the client immediately
	// via a mailbox update.
	CopyMessages(uid bool, seqset *common.SeqSet, dest string) error

	// Permanently removes all messages that have the \Deleted flag set from the
	// currently selected mailbox.
	//
	// If the Backend implements Updater, it must notify the client immediately
	// via an expunge update.
	Expunge() error
}

Mailbox represents a mailbox belonging to a user in the mail storage system. A mailbox operation always deals with messages.

type MailboxUpdate

type MailboxUpdate struct {
	Update
	*common.MailboxStatus
}

A mailbox update.

type MessageUpdate

type MessageUpdate struct {
	Update
	*common.Message
}

A message update.

type StatusUpdate

type StatusUpdate struct {
	Update
	*common.StatusResp
}

A status update. See RFC 3501 section 7.1 for a list of status responses.

type Update

type Update struct {
	// The user targeted by this update. If empty, all connected users will
	// be notified.
	Username string
	// The mailbox targeted by this update. If empty, the update targets all
	// mailboxes.
	Mailbox string
}

Update contains user and mailbox information about an unilateral backend update.

type Updater

type Updater interface {
	// Updates returns a set of channels where updates are sent to.
	Updates() *Updates
}

A Backend that implements Updater is able to send unilateral backend updates. Backends not implementing this interface don't correctly send unilateral updates, for instance if a user logs in from two connections and deletes a message from one of them, the over is not aware that such a mesage has been deleted. More importantly, backends implementing Updater can notify the user for external updates such as new message notifications.

type UpdaterMailbox

type UpdaterMailbox interface {
	// Poll requests mailbox updates.
	Poll() error
}

A Mailbox that implements UpdaterMailbox is able to poll updates for new messages or message status updates during a period of inactivity.

type Updates

type Updates struct {
	Statuses  chan *StatusUpdate
	Mailboxes chan *MailboxUpdate
	Messages  chan *MessageUpdate
	Expunges  chan *ExpungeUpdate
}

Updates contains channels where unilateral backend updates will be sent.

type User

type User interface {
	// Get this user's username.
	Username() string

	// Returns a list of mailboxes belonging to this user.
	// If subscribed is set to true, only returns subscribed mailboxes.
	ListMailboxes(subscribed bool) ([]Mailbox, error)

	// Get a mailbox.
	GetMailbox(name string) (Mailbox, error)

	// Create a new mailbox.
	//
	// If the mailbox already exists, an error must be returned. If the mailbox
	// name is suffixed with the server's hierarchy separator character, this is a
	// declaration that the client intends to create mailbox names under this name
	// in the hierarchy.
	//
	// If the server's hierarchy separator character appears elsewhere in
	// the name, the server SHOULD create any superior hierarchical names
	// that are needed for the CREATE command to be successfully
	// completed.  In other words, an attempt to create "foo/bar/zap" on
	// a server in which "/" is the hierarchy separator character SHOULD
	// create foo/ and foo/bar/ if they do not already exist.
	//
	// If a new mailbox is created with the same name as a mailbox which
	// was deleted, its unique identifiers MUST be greater than any
	// unique identifiers used in the previous incarnation of the mailbox
	// UNLESS the new incarnation has a different unique identifier
	// validity value.
	CreateMailbox(name string) error

	// Permanently remove the mailbox with the given name. It is an error to
	// attempt to delete INBOX or a mailbox name that does not exist.
	//
	// The DELETE command MUST NOT remove inferior hierarchical names.
	// For example, if a mailbox "foo" has an inferior "foo.bar"
	// (assuming "." is the hierarchy delimiter character), removing
	// "foo" MUST NOT remove "foo.bar".
	//
	// The value of the highest-used unique identifier of the deleted
	// mailbox MUST be preserved so that a new mailbox created with the
	// same name will not reuse the identifiers of the former
	// incarnation, UNLESS the new incarnation has a different unique
	// identifier validity value.
	DeleteMailbox(name string) error

	// Change the name of a mailbox. It is an error to attempt to rename from a
	// mailbox name that does not exist or to a mailbox name that already exists.
	//
	// If the name has inferior hierarchical names, then the inferior
	// hierarchical names MUST also be renamed.  For example, a rename of
	// "foo" to "zap" will rename "foo/bar" (assuming "/" is the
	// hierarchy delimiter character) to "zap/bar".
	//
	// If the server's hierarchy separator character appears in the name,
	// the server SHOULD create any superior hierarchical names that are
	// needed for the RENAME command to complete successfully.  In other
	// words, an attempt to rename "foo/bar/zap" to baz/rag/zowie on a
	// server in which "/" is the hierarchy separator character SHOULD
	// create baz/ and baz/rag/ if they do not already exist.
	//
	// The value of the highest-used unique identifier of the old mailbox
	// name MUST be preserved so that a new mailbox created with the same
	// name will not reuse the identifiers of the former incarnation,
	// UNLESS the new incarnation has a different unique identifier
	// validity value.
	//
	// Renaming INBOX is permitted, and has special behavior.  It moves
	// all messages in INBOX to a new mailbox with the given name,
	// leaving INBOX empty.  If the server implementation supports
	// inferior hierarchical names of INBOX, these are unaffected by a
	// rename of INBOX.
	RenameMailbox(existingName, newName string) error
}

User represents a user in the mail storage system. A user operation always deals with mailboxes.

Directories

Path Synopsis
A memory backend.
A memory backend.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL