157 lines
3.3 KiB
Rust
157 lines
3.3 KiB
Rust
use std::{
|
|
collections::BTreeMap,
|
|
sync::{atomic::AtomicU32, Arc},
|
|
time::Duration,
|
|
};
|
|
|
|
use ahash::AHashMap;
|
|
use imap_proto::{
|
|
protocol::{list::Attribute, ProtocolVersion},
|
|
receiver::Receiver,
|
|
Command,
|
|
};
|
|
use jmap::{auth::rate_limit::RemoteAddress, JMAP};
|
|
use tokio::{
|
|
io::{AsyncRead, ReadHalf},
|
|
sync::{mpsc, watch},
|
|
};
|
|
use utils::listener::{limiter::InFlight, ServerInstance};
|
|
|
|
pub mod client;
|
|
pub mod mailbox;
|
|
pub mod session;
|
|
pub mod writer;
|
|
|
|
#[derive(Clone)]
|
|
pub struct ImapSessionManager {
|
|
pub jmap: Arc<JMAP>,
|
|
pub imap: Arc<IMAP>,
|
|
}
|
|
|
|
impl ImapSessionManager {
|
|
pub fn new(jmap: Arc<JMAP>, imap: Arc<IMAP>) -> Self {
|
|
Self { jmap, imap }
|
|
}
|
|
}
|
|
|
|
pub struct IMAP {
|
|
pub max_request_size: usize,
|
|
pub name_shared: String,
|
|
pub name_all: String,
|
|
|
|
pub timeout_auth: Duration,
|
|
pub timeout_unauth: Duration,
|
|
|
|
pub greeting_plain: Vec<u8>,
|
|
pub greeting_tls: Vec<u8>,
|
|
}
|
|
|
|
pub struct Session<T: AsyncRead> {
|
|
pub jmap: Arc<JMAP>,
|
|
pub imap: Arc<IMAP>,
|
|
pub instance: Arc<ServerInstance>,
|
|
pub receiver: Receiver<Command>,
|
|
pub version: ProtocolVersion,
|
|
pub state: State,
|
|
pub is_tls: bool,
|
|
pub is_condstore: bool,
|
|
pub is_qresync: bool,
|
|
pub writer: mpsc::Sender<writer::Event>,
|
|
pub stream_rx: ReadHalf<T>,
|
|
pub in_flight: InFlight,
|
|
pub remote_addr: RemoteAddress,
|
|
pub span: tracing::Span,
|
|
}
|
|
|
|
pub struct SessionData {
|
|
pub account_id: u32,
|
|
pub jmap: Arc<JMAP>,
|
|
pub imap: Arc<IMAP>,
|
|
pub span: tracing::Span,
|
|
pub mailboxes: parking_lot::Mutex<Vec<Account>>,
|
|
pub writer: mpsc::Sender<writer::Event>,
|
|
pub state: AtomicU32,
|
|
}
|
|
|
|
#[derive(Debug, Default)]
|
|
pub struct Mailbox {
|
|
pub has_children: bool,
|
|
pub is_subscribed: bool,
|
|
pub special_use: Option<Attribute>,
|
|
pub total_messages: Option<u32>,
|
|
pub total_unseen: Option<u32>,
|
|
pub total_deleted: Option<u32>,
|
|
pub uid_validity: Option<u32>,
|
|
pub uid_next: Option<u32>,
|
|
pub size: Option<u32>,
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub struct Account {
|
|
pub account_id: u32,
|
|
pub prefix: Option<String>,
|
|
pub mailbox_names: BTreeMap<String, u32>,
|
|
pub mailbox_data: AHashMap<u32, Mailbox>,
|
|
pub state: Option<u64>,
|
|
}
|
|
|
|
pub struct SelectedMailbox {
|
|
pub id: MailboxId,
|
|
pub state: parking_lot::Mutex<MailboxData>,
|
|
pub saved_search: parking_lot::Mutex<SavedSearch>,
|
|
pub is_select: bool,
|
|
pub is_condstore: bool,
|
|
}
|
|
|
|
#[derive(Debug, PartialEq, Eq)]
|
|
pub struct MailboxId {
|
|
pub account_id: u32,
|
|
pub mailbox_id: Option<u32>,
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub struct MailboxData {
|
|
pub uid_next: u32,
|
|
pub uid_validity: u32,
|
|
pub jmap_ids: Vec<u32>,
|
|
pub imap_uids: Vec<u32>,
|
|
pub total_messages: usize,
|
|
pub last_state: u32,
|
|
}
|
|
|
|
#[derive(Debug, Default)]
|
|
pub struct MailboxSync {
|
|
pub added: Vec<String>,
|
|
pub changed: Vec<String>,
|
|
pub deleted: Vec<String>,
|
|
}
|
|
|
|
pub enum SavedSearch {
|
|
InFlight {
|
|
rx: watch::Receiver<Arc<Vec<ImapId>>>,
|
|
},
|
|
Results {
|
|
items: Arc<Vec<ImapId>>,
|
|
},
|
|
None,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Copy, Default)]
|
|
pub struct ImapId {
|
|
pub uid: u32,
|
|
pub seqnum: u32,
|
|
}
|
|
|
|
pub enum State {
|
|
NotAuthenticated {
|
|
auth_failures: u32,
|
|
},
|
|
Authenticated {
|
|
data: Arc<SessionData>,
|
|
},
|
|
Selected {
|
|
data: Arc<SessionData>,
|
|
mailbox: Arc<SelectedMailbox>,
|
|
},
|
|
}
|