Files
inbuxa-server/crates/managesieve/src/lib.rs
T
jcoffey-dev 7dae9b29fd Import upstream v0.16.22, stripped
Upstream commit: 474dd0229cb20cf513036619781ed97bd8073c3f
Enterprise-only files removed or emptied: 63
Enterprise-only snippets removed: 117 in 50 files
Dangling module declarations removed: 5
Cargo edits turning enterprise off: 14
Verification: clean
Enterprise feature gates left for rebuilt features: 19 in 18 files

Produced by tools/fork/strip.py. The full report is in docs/fork/strip-reports/ on main.
2026-09-18 10:21:56 -07:00

145 lines
4.9 KiB
Rust

/*
* SPDX-FileCopyrightText: 2020 Stalwart Labs LLC <[email protected]>
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL
*/
#![warn(clippy::large_futures)]
pub mod core;
pub mod op;
static SERVER_GREETING: &str = "Stalwart ManageSieve at your service.";
#[cfg(test)]
mod tests {
use imap_proto::receiver::{Error, Receiver, Request, State, Token};
use crate::core::Command;
#[test]
fn receiver_parse_managesieve() {
let mut receiver = Receiver::new().with_start_state(State::Command { is_uid: false });
for (frames, expected_requests) in [
(
vec!["Authenticate \"DIGEST-MD5\"\r\n"],
vec![Request {
tag: "".into(),
command: Command::Authenticate,
tokens: vec![Token::Argument(b"DIGEST-MD5".to_vec())],
}],
),
(
vec![
" AUTHENTICATE \"GSSAPI\" {56+}\r\n",
"cnNwYXV0aD1lYTQwZjYwMzM1YzQyN2I1NTI3Yjg0ZGJhYmNkZmZmZA==\r\n",
],
vec![Request {
tag: "".into(),
command: Command::Authenticate,
tokens: vec![
Token::Argument(b"GSSAPI".to_vec()),
Token::Argument(
b"cnNwYXV0aD1lYTQwZjYwMzM1YzQyN2I1NTI3Yjg0ZGJhYmNkZmZmZA==".to_vec(),
),
],
}],
),
(
vec!["Authenticate \"PLAIN\" \"QJIrweAPyo6Q1T9xu\"\r\n"],
vec![Request {
tag: "".into(),
command: Command::Authenticate,
tokens: vec![
Token::Argument(b"PLAIN".to_vec()),
Token::Argument(b"QJIrweAPyo6Q1T9xu".to_vec()),
],
}],
),
(
vec!["StartTls\r\n"],
vec![Request {
tag: "".into(),
command: Command::StartTls,
tokens: vec![],
}],
),
(
vec!["HAVESPACE \"myscript\" 999999\r\n"],
vec![Request {
tag: "".into(),
command: Command::HaveSpace,
tokens: vec![
Token::Argument(b"myscript".to_vec()),
Token::Argument(b"999999".to_vec()),
],
}],
),
(
vec![
"Putscript \"foo\" {31+}\r\n",
"#comment\r\n",
"InvalidSieveCommand\r\n\r\n",
],
vec![Request {
tag: "".into(),
command: Command::PutScript,
tokens: vec![
Token::Argument(b"foo".to_vec()),
Token::Argument(b"#comment\r\nInvalidSieveCommand\r\n".to_vec()),
],
}],
),
(
vec!["Listscripts\r\n"],
vec![Request {
tag: "".into(),
command: Command::ListScripts,
tokens: vec![],
}],
),
(
vec!["Setactive \"baz\"\r\n"],
vec![Request {
tag: "".into(),
command: Command::SetActive,
tokens: vec![Token::Argument(b"baz".to_vec())],
}],
),
(
vec!["Renamescript \"foo\" \"bar\"\r\n"],
vec![Request {
tag: "".into(),
command: Command::RenameScript,
tokens: vec![
Token::Argument(b"foo".to_vec()),
Token::Argument(b"bar".to_vec()),
],
}],
),
(
vec!["NOOP \"STARTTLS-SYNC-42\"\r\n"],
vec![Request {
tag: "".into(),
command: Command::Noop,
tokens: vec![Token::Argument(b"STARTTLS-SYNC-42".to_vec())],
}],
),
] {
let mut requests = Vec::new();
for frame in &frames {
let mut bytes = frame.as_bytes().iter();
loop {
match receiver.parse(&mut bytes) {
Ok(request) => requests.push(request),
Err(Error::NeedsMoreData | Error::NeedsLiteral { .. }) => break,
Err(err) => panic!("{:?} for frames {:#?}", err, frames),
}
}
}
assert_eq!(requests, expected_requests, "{:#?}", frames);
}
}
}