aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQuentin Dufour <quentin@deuxfleurs.fr>2024-01-24 23:09:29 +0100
committerQuentin Dufour <quentin@deuxfleurs.fr>2024-01-24 23:09:29 +0100
commitefd9ae5defd8647b709ad0e6cf17f3b28278c591 (patch)
treecc1a1cb1165eff5a1b2c73ce15fc74dd770cbf9b
parent06d37d3399499c94fff408056155db76f43c4afa (diff)
downloadaerogramme-feat/finalize-v0.2.tar.gz
aerogramme-feat/finalize-v0.2.zip
Fix postfix bugfeat/finalize-v0.2
-rw-r--r--src/auth.rs26
1 files changed, 17 insertions, 9 deletions
diff --git a/src/auth.rs b/src/auth.rs
index 4d2747f..a3edcbc 100644
--- a/src/auth.rs
+++ b/src/auth.rs
@@ -144,7 +144,7 @@ impl NetLoop {
// Parse command
let (_, cmd) = client_command(&self.read_buf).map_err(|_| anyhow!("Unable to parse command"))?;
- tracing::debug!(cmd=?cmd, "Received command");
+ tracing::trace!(cmd=?cmd, "Received command");
// Make some progress in our local state
self.state.progress(cmd, &self.login).await;
@@ -154,7 +154,10 @@ impl NetLoop {
// Build response
let srv_cmds = self.state.response();
- srv_cmds.iter().try_for_each(|r| r.encode(&mut self.write_buf))?;
+ srv_cmds.iter().try_for_each(|r| {
+ tracing::trace!(cmd=?r, "Sent command");
+ r.encode(&mut self.write_buf)
+ })?;
// Send responses if at least one command response has been generated
if !srv_cmds.is_empty() {
@@ -282,17 +285,19 @@ impl State {
match self {
Self::HandshakeDone { .. } => {
srv_cmd.push(ServerCommand::Version(Version { major: SERVER_MAJOR, minor: SERVER_MINOR }));
- srv_cmd.push(ServerCommand::Spid(1u64));
- srv_cmd.push(ServerCommand::Cuid(1u64));
-
- let mut cookie = [0u8; 16];
- thread_rng().fill(&mut cookie);
- srv_cmd.push(ServerCommand::Cookie(cookie));
srv_cmd.push(ServerCommand::Mech {
kind: Mechanism::Plain,
parameters: vec![MechanismParameters::PlainText],
});
+
+ srv_cmd.push(ServerCommand::Spid(15u64));
+ srv_cmd.push(ServerCommand::Cuid(19350u64));
+
+ let mut cookie = [0u8; 16];
+ thread_rng().fill(&mut cookie);
+ srv_cmd.push(ServerCommand::Cookie(cookie));
+
srv_cmd.push(ServerCommand::Done);
},
Self::AuthPlainProgress { id } => {
@@ -366,6 +371,8 @@ enum AuthOption {
ValidClientCert(String),
/// Ignore auth penalty tracking for this request
NoPenalty,
+ /// Unknown option sent by Postfix
+ NoLogin,
/// Username taken from client’s SSL certificate.
CertUsername,
/// IMAP ID string
@@ -574,6 +581,7 @@ fn auth_option<'a>(input: &'a [u8]) -> IResult<&'a [u8], AuthOption> {
value(Debug, tag_no_case(b"debug")),
value(NoPenalty, tag_no_case(b"no-penalty")),
value(ClientId, tag_no_case(b"client_id")),
+ value(NoLogin, tag_no_case(b"nologin")),
map(preceded(tag_no_case(b"session="), u64), |id| Session(id)),
map(preceded(tag_no_case(b"lip="), parameter_str), |ip| LocalIp(ip)),
map(preceded(tag_no_case(b"rip="), parameter_str), |ip| RemoteIp(ip)),
@@ -799,8 +807,8 @@ impl Encode for ServerCommand {
out.put(&b"CONT"[..]);
tab_enc(out);
out.put(id.to_string().as_bytes());
+ tab_enc(out);
if let Some(rdata) = data {
- tab_enc(out);
let b64 = base64::engine::general_purpose::STANDARD.encode(rdata);
out.put(b64.as_bytes());
}