think about extensions / auth api

This commit is contained in:
Michael Zhang 2021-11-04 12:29:07 -05:00
parent ac592a9370
commit 08d2e8c4b4
Signed by: michael
GPG key ID: BDA47A31A3C8EE6B
2 changed files with 39 additions and 13 deletions

View file

@ -1,8 +1,19 @@
# Daemon API # Daemon API
To communicate with the daemon start by connecting to the socket it exposes. To communicate with the daemon start by connecting to the socket it exposes.
This opens a long-lasting connection that can be used to send RPC messages. The This opens a long-lasting connection that can be used to send RPC messages.
following messages are planned:
## Authentication
If connecting over a network rather than a socket, the client should
authenticate in order to talk to panorama at all. The framework for this is _TLS
client authentication_.
### Namespace `panorama::auth`
TODO:
## Standard API
### Namespace `panorama::mail` ### Namespace `panorama::mail`
@ -33,3 +44,13 @@ TODO: send with retry?
``` ```
Search for messages, returns a summary of messages + first sentence. Search for messages, returns a summary of messages + first sentence.
## Extensions
Since extensions may be separate processes, they must also communicate with the
daemon, but since the daemon is responsible for launching them, they don't have
to connect to the socket explicitly.
### Namespace `panorama::extensions`

View file

@ -4,13 +4,14 @@ use anyhow::Result;
use crossbeam::queue::ArrayQueue; use crossbeam::queue::ArrayQueue;
use tokio::sync::Semaphore; use tokio::sync::Semaphore;
use crate::{interface::ImapClient, proto::response::Envelope}; use crate::{client::auth::{AuthMethod, Login}, interface::ImapClient, proto::response::Envelope};
use super::client::{ClientAuthenticated, Config, ConfigBuilder}; use super::client::{ClientAuthenticated, Config, ConfigBuilder};
#[derive(Debug)] #[derive(Debug)]
pub struct PoolConfig { pub struct PoolConfig {
pub max_connections: usize, pub max_connections: usize,
pub client_config: Config,
} }
/// A pool of IMAP connections. /// A pool of IMAP connections.
@ -33,25 +34,25 @@ impl ImapClient for ImapPool {
} }
impl ImapPool { impl ImapPool {
pub fn new(config: Config, pool_config: PoolConfig) -> Self { pub fn new(pool_config: PoolConfig) -> Self {
debug!("Created new IMAP pool with config {:?}", pool_config); debug!("Created new IMAP pool with config {:?}", pool_config);
let inner = InnerPool::init(config, pool_config); let inner = InnerPool::init(pool_config);
ImapPool(Arc::new(inner)) ImapPool(Arc::new(inner))
} }
} }
pub struct InnerPool { pub struct InnerPool {
config: Config, config: PoolConfig,
semaphore: Semaphore, semaphore: Semaphore,
connections: ArrayQueue<ClientAuthenticated>, connections: ArrayQueue<ClientAuthenticated>,
} }
impl InnerPool { impl InnerPool {
pub fn init(config: Config, pool_config: PoolConfig) -> Self { pub fn init(config: PoolConfig) -> Self {
InnerPool { InnerPool {
config, config,
semaphore: Semaphore::new(pool_config.max_connections), semaphore: Semaphore::new(config.max_connections),
connections: ArrayQueue::new(pool_config.max_connections), connections: ArrayQueue::new(config.max_connections),
} }
} }
@ -66,12 +67,16 @@ impl InnerPool {
// no existing connection, time to make a new one // no existing connection, time to make a new one
None => { None => {
let client = ConfigBuilder::default() let client = ConfigBuilder::default()
.hostname(self.config.hostname.clone()) .hostname(self.config.client_config.hostname.clone())
.port(self.config.port) .port(self.config.client_config.port)
.tls(self.config.tls) .tls(self.config.client_config.tls)
.open() .open()
.await?; .await?;
debug!("Client connected to {}", self.config.hostname); debug!("Client connected to {}", self.config.client_config.hostname);
// authenticate
let client_auth = client.auth(Login {
});
} }
}; };