Fork/brand lowercase #23

Merged
jcoffey-dev merged 1 commits from fork/brand-lowercase into main 2026-09-23 04:12:06 +00:00
43 changed files with 131 additions and 131 deletions
+6 -6
View File
@@ -8,13 +8,13 @@
---
**INBUXA** is a mail and collaboration server: JMAP, IMAP, POP3, SMTP,
**inbuxa** is a mail and collaboration server: JMAP, IMAP, POP3, SMTP,
CalDAV, CardDAV and WebDAV, in one Rust binary, with ihasmail as its web front
end. It is a fork of [Stalwart](https://github.com/stalwartlabs/stalwart).
Project site: [inbuxa.org](https://inbuxa.org). Documentation: [docs.inbuxa.org](https://docs.inbuxa.org).
Stalwart ships some features only in a paid Enterprise Edition: multi-tenancy,
masked email, undelete and others. INBUXA ships everything to everybody under
masked email, undelete and others. **inbuxa** ships everything to everybody under
the AGPL-3.0, rebuilding those features independently and without using any
of Stalwart's Enterprise code.
@@ -54,18 +54,18 @@ already names, so none of their data moves.
## License and credits
INBUXA is free software under the [GNU Affero General Public License,
**inbuxa** is free software under the [GNU Affero General Public License,
version 3](./LICENSES/AGPL-3.0-only.txt).
It is a fork of Stalwart, copyright © Stalwart Labs LLC, **modified by
Coffey Labs in 2026**. Upstream's copyright notices are kept on every file
they cover, and every upstream file this fork changed says so in its header,
under the notice it came with. Stalwart's files are dual-licensed
AGPL-3.0-only or Stalwart's Enterprise License, and INBUXA takes them under
AGPL-3.0-only or Stalwart's Enterprise License, and **inbuxa** takes them under
the AGPL-3.0 only. A few of those files also carry code from other projects
under MIT or BSD licenses, which stays under those licenses;
[THIRD-PARTY.md](./THIRD-PARTY.md) lists it with its notices. "Stalwart" is
Stalwart Labs' name. INBUXA isn't affiliated with or endorsed by Stalwart
Stalwart Labs' name. **inbuxa** isn't affiliated with or endorsed by Stalwart
Labs.
The INBUXA mark reuses ihasmail's cat-and-envelope artwork.
The **inbuxa** mark reuses ihasmail's cat-and-envelope artwork.
+1 -1
View File
@@ -395,7 +395,7 @@ components:
WWW-Authenticate:
schema:
type: string
example: Bearer realm="INBUXA Server"
example: Bearer realm="inbuxa Server"
content:
application/problem+json:
schema:
+3 -3
View File
@@ -105,7 +105,7 @@ pub fn first_party_clients(
if let Some(url) = admin_url.map(|url| url.trim().trim_end_matches('/')).filter(|url| !url.is_empty()) {
clients.push(FirstPartyClient {
client_id: ADMIN_CLIENT_ID.to_string(),
description: "INBUXA Admin".to_string(),
description: "inbuxa Admin".to_string(),
redirect_uris: vec![format!("{url}/oauth/callback")],
secret: None,
});
@@ -356,7 +356,7 @@ mod tests {
fn web_interface() -> Application {
Application {
description: "INBUXA Web Interface".to_string(),
description: "inbuxa Web Interface".to_string(),
enabled: true,
url_prefix: Map::new(vec!["/admin".into(), "/account".into()]),
..Default::default()
@@ -370,7 +370,7 @@ mod tests {
clients,
vec![FirstPartyClient {
client_id: WEB_INTERFACE_CLIENT_ID.to_string(),
description: "INBUXA Web Interface (served by this server)".to_string(),
description: "inbuxa Web Interface (served by this server)".to_string(),
redirect_uris: vec![
"https://mail.example.org/admin/oauth/callback".to_string(),
"https://mail.example.org/account/oauth/callback".to_string(),
+15 -15
View File
@@ -299,28 +299,28 @@ impl LegacyProtocol {
pub fn refusal(&self, scope: RefusalScope) -> &'static str {
match (scope, self) {
(RefusalScope::Server, LegacyProtocol::Imap) => {
"This server allows only INBUXA webmail and JMAP apps. This mail app can't sign in."
"This server allows only inbuxa webmail and JMAP apps. This mail app can't sign in."
}
(RefusalScope::Server, LegacyProtocol::Pop3) => {
"[AUTH] This server allows only INBUXA webmail and JMAP apps. This mail app can't sign in."
"[AUTH] This server allows only inbuxa webmail and JMAP apps. This mail app can't sign in."
}
(RefusalScope::Server, LegacyProtocol::ManageSieve) => {
"This server allows only INBUXA webmail and JMAP apps."
"This server allows only inbuxa webmail and JMAP apps."
}
(RefusalScope::Server, LegacyProtocol::Submission) => {
"535 5.7.0 This server allows only INBUXA webmail and JMAP apps. This mail app can't send.\r\n"
"535 5.7.0 This server allows only inbuxa webmail and JMAP apps. This mail app can't send.\r\n"
}
(RefusalScope::Tenant(_), LegacyProtocol::Imap) => {
"Your organization allows only INBUXA webmail and JMAP apps. This mail app can't sign in."
"Your organization allows only inbuxa webmail and JMAP apps. This mail app can't sign in."
}
(RefusalScope::Tenant(_), LegacyProtocol::Pop3) => {
"[AUTH] Your organization allows only INBUXA webmail and JMAP apps. This mail app can't sign in."
"[AUTH] Your organization allows only inbuxa webmail and JMAP apps. This mail app can't sign in."
}
(RefusalScope::Tenant(_), LegacyProtocol::ManageSieve) => {
"Your organization allows only INBUXA webmail and JMAP apps."
"Your organization allows only inbuxa webmail and JMAP apps."
}
(RefusalScope::Tenant(_), LegacyProtocol::Submission) => {
"535 5.7.0 Your organization allows only INBUXA webmail and JMAP apps. This mail app can't send.\r\n"
"535 5.7.0 Your organization allows only inbuxa webmail and JMAP apps. This mail app can't send.\r\n"
}
}
}
@@ -541,7 +541,7 @@ mod tests {
let server = RefusalScope::Server;
assert_eq!(
LegacyProtocol::Imap.refusal(server),
"This server allows only INBUXA webmail and JMAP apps. This mail app can't sign in."
"This server allows only inbuxa webmail and JMAP apps. This mail app can't sign in."
);
assert!(
LegacyProtocol::Pop3
@@ -550,11 +550,11 @@ mod tests {
);
assert_eq!(
LegacyProtocol::ManageSieve.refusal(server),
"This server allows only INBUXA webmail and JMAP apps."
"This server allows only inbuxa webmail and JMAP apps."
);
assert_eq!(
LegacyProtocol::Submission.refusal(server),
"535 5.7.0 This server allows only INBUXA webmail and JMAP apps. This mail app can't send.\r\n"
"535 5.7.0 This server allows only inbuxa webmail and JMAP apps. This mail app can't send.\r\n"
);
}
@@ -564,19 +564,19 @@ mod tests {
let tenant = RefusalScope::Tenant(7);
assert_eq!(
LegacyProtocol::Imap.refusal(tenant),
"Your organization allows only INBUXA webmail and JMAP apps. This mail app can't sign in."
"Your organization allows only inbuxa webmail and JMAP apps. This mail app can't sign in."
);
assert_eq!(
LegacyProtocol::Pop3.refusal(tenant),
"[AUTH] Your organization allows only INBUXA webmail and JMAP apps. This mail app can't sign in."
"[AUTH] Your organization allows only inbuxa webmail and JMAP apps. This mail app can't sign in."
);
assert_eq!(
LegacyProtocol::ManageSieve.refusal(tenant),
"Your organization allows only INBUXA webmail and JMAP apps."
"Your organization allows only inbuxa webmail and JMAP apps."
);
assert_eq!(
LegacyProtocol::Submission.refusal(tenant),
"535 5.7.0 Your organization allows only INBUXA webmail and JMAP apps. This mail app can't send.\r\n"
"535 5.7.0 Your organization allows only inbuxa webmail and JMAP apps. This mail app can't send.\r\n"
);
let err = LegacyProtocol::Imap.refused(tenant, Some("example.org".into()));
assert_eq!(err.value_as_str(trc::Key::Policy), Some("tenant"));
+1 -1
View File
@@ -40,7 +40,7 @@ impl OpenIdDirectory {
pub async fn new(config: OidcConfig) -> Result<Self, OidcError> {
let http = utils::http::http_client_builder(false)
.user_agent("INBUXA/1.0") // types::brand!(); this crate does not depend on types
.user_agent("inbuxa/1.0") // types::brand!(); this crate does not depend on types
.timeout(Duration::from_secs(30))
.build()
.map_err(|e| OidcError::Network(format!("HTTP client build failed: {e}")))?;
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "inbuxa-features"
description = "INBUXA's rebuilt features: behavior Stalwart ships only in its Enterprise Edition, rebuilt clean-room"
description = "inbuxa's rebuilt features: behavior Stalwart ships only in its Enterprise Edition, rebuilt clean-room"
license = "AGPL-3.0-only"
version = "0.16.22"
edition = "2024"
+2 -2
View File
@@ -1,11 +1,11 @@
[package]
name = "inbuxa"
description = "INBUXA Mail and Collaboration Server, a fork of Stalwart"
description = "inbuxa mail and collaboration server, a fork of Stalwart"
authors = [ "Stalwart Labs LLC <[email protected]>"]
homepage = "https://inbuxa.org"
keywords = ["imap", "jmap", "smtp", "email", "mail", "webdav", "server"]
categories = ["email"]
# Upstream offers AGPL-3.0-only OR LicenseRef-SEL; INBUXA takes the AGPL only.
# Upstream offers AGPL-3.0-only OR LicenseRef-SEL; inbuxa takes the AGPL only.
license = "AGPL-3.0-only"
version = "0.16.23"
edition = "2024"
+5 -5
View File
@@ -732,7 +732,7 @@ impl Pickle for AddressBook {
impl Default for AddressBook {
fn default() -> Self {
Self {
default_display_name: Some("INBUXA Address Book".to_string()),
default_display_name: Some("inbuxa Address Book".to_string()),
default_href_name: Some("default".to_string()),
max_v_card_size: 524288u64,
max_address_books: Some(250u64),
@@ -4597,7 +4597,7 @@ impl Pickle for Calendar {
impl Default for Calendar {
fn default() -> Self {
Self {
default_display_name: Some("INBUXA Calendar".to_string()),
default_display_name: Some("inbuxa Calendar".to_string()),
default_href_name: Some("default".to_string()),
max_attendees: 20u64,
max_recurrence_expansions: 3000u64,
@@ -4734,7 +4734,7 @@ impl Default for CalendarAlarm {
allow_external_rcpts: false,
enable: true,
from_email: Default::default(),
from_name: "INBUXA Calendar".to_string(),
from_name: "inbuxa Calendar".to_string(),
min_trigger_interval: Duration::from_millis(3600000),
template: Default::default(),
}
@@ -28310,7 +28310,7 @@ impl MtaStageConnect {
ExpressionContext {
expr: &self.smtp_greeting,
default: Some(Expression {
else_: "system('hostname') + ' INBUXA ESMTP at your service'".to_string(),
else_: "system('hostname') + ' inbuxa ESMTP at your service'".to_string(),
..Default::default()
}),
property: Property::SmtpGreeting,
@@ -28374,7 +28374,7 @@ impl Default for MtaStageConnect {
fn default() -> Self {
Self {
smtp_greeting: Expression {
else_: "system('hostname') + ' INBUXA ESMTP at your service'".to_string(),
else_: "system('hostname') + ' inbuxa ESMTP at your service'".to_string(),
..Default::default()
},
hostname: Expression {
+1 -1
View File
@@ -205,7 +205,7 @@ impl ScimResponse {
if error.status == 401 {
response.headers.push((
"WWW-Authenticate",
"Bearer realm=\"INBUXA SCIM\"".to_string(),
"Bearer realm=\"inbuxa SCIM\"".to_string(),
));
}
response
+1 -1
View File
@@ -47,7 +47,7 @@ impl RegistryStore {
.collect::<String>();
eprintln!();
eprintln!("════════════════════════════════════════════════════════════");
eprintln!("🔑 INBUXA bootstrap mode - temporary administrator account");
eprintln!("🔑 inbuxa bootstrap mode - temporary administrator account");
eprintln!();
eprintln!(" username: admin");
eprintln!(" password: {password}");
+3 -3
View File
@@ -3729,8 +3729,8 @@ impl EventType {
EventType::Security(SecurityEvent::LegacyProtocolsChanged) => {
"Legacy mail protocols switch changed"
}
EventType::Server(ServerEvent::Startup) => "Starting INBUXA Server",
EventType::Server(ServerEvent::Shutdown) => "Shutting down INBUXA Server",
EventType::Server(ServerEvent::Startup) => "Starting inbuxa Server",
EventType::Server(ServerEvent::Shutdown) => "Shutting down inbuxa Server",
EventType::Server(ServerEvent::StartupError) => "Server startup error",
EventType::Server(ServerEvent::ThreadError) => "Server thread error",
EventType::Server(ServerEvent::Licensing) => "Server licensing event",
@@ -3983,7 +3983,7 @@ impl EventType {
EventType::Auth(AuthEvent::ClientRegistration) => "Authentication error",
// inbuxa: legacy-protocols LP-6
EventType::Auth(AuthEvent::LegacyProtocolRefused) => {
"This server allows only INBUXA webmail and JMAP apps"
"This server allows only inbuxa webmail and JMAP apps"
}
EventType::Auth(AuthEvent::Error) => "Authentication error",
EventType::Auth(AuthEvent::CredentialExpired) => "Credential expired",
+1 -1
View File
@@ -18,7 +18,7 @@
#[macro_export]
macro_rules! brand {
() => {
"INBUXA"
"inbuxa"
};
}
+1 -1
View File
@@ -147,7 +147,7 @@ pub fn build_http_client(
allow_invalid_certs: bool,
) -> Result<Client, String> {
let mut headers = build_http_headers(raw_headers, username, password, token, content_type)?;
headers.insert(USER_AGENT, "INBUXA/1.0.0".parse().unwrap()); // types::brand!(); utils does not depend on types
headers.insert(USER_AGENT, "inbuxa/1.0.0".parse().unwrap()); // types::brand!(); utils does not depend on types
match http_client_builder(allow_invalid_certs)
.connect_timeout(timeout)
File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
wa2yYpZjVWiT3bW8anintWsnNSjDQUXa8U-Va-s6mZQ
rWqJwNJkqgKsbC1eqcEmmIAMtJPmnlDlThR2ZtW_N1c
+1 -1
View File
@@ -6,7 +6,7 @@
<key>Label</key>
<string>inbuxa.mail</string>
<key>ServiceDescription</key>
<string>INBUXA</string>
<string>inbuxa</string>
<key>ProgramArguments</key>
<array>
<string>__PATH__/bin/inbuxa</string>
+1 -1
View File
@@ -1,5 +1,5 @@
[Unit]
Description=INBUXA Server
Description=inbuxa Server
Conflicts=postfix.service sendmail.service exim4.service
ConditionPathExists=__PATH__/etc/config.json
After=network-online.target
+4 -4
View File
@@ -49,7 +49,7 @@ HTTP = "http://127.0.0.1:18080"
# made to speak.
PORTS = {"imap": 18993, "pop3": 18995, "submissions": 18465, "smtp": 18025}
TLS_PORTS = {18993, 18995, 18465}
SMTP_REFUSAL = ("535 5.7.0 This server allows only INBUXA webmail and JMAP apps. "
SMTP_REFUSAL = ("535 5.7.0 This server allows only inbuxa webmail and JMAP apps. "
"This mail app can't send.")
INBUXA = "urn:inbuxa:jmap"
failures = []
@@ -333,7 +333,7 @@ def tenant_checks(admin, admin_pw, account):
"and still enabled for an account outside the tenant (test 13)")
# Refused on the tenant's domain, every way in the same words (tests 6-8).
imap_no = ("NO [ALERT] Your organization allows only INBUXA webmail and JMAP apps. "
imap_no = ("NO [ALERT] Your organization allows only inbuxa webmail and JMAP apps. "
"This mail app can't sign in.")
check(imap_login(PORTS["imap"], tu, user_pw) == imap_no,
"the tenant's user is refused over IMAP with the right password (test 6)")
@@ -341,10 +341,10 @@ def tenant_checks(admin, admin_pw, account):
check(imap_login(PORTS["imap"], "[email protected]", "x") == imap_no,
"and a made-up address on the domain gets the same (test 7)")
check(pop3_login(PORTS["pop3"], tu, user_pw) ==
"-ERR [AUTH] Your organization allows only INBUXA webmail and JMAP apps. "
"-ERR [AUTH] Your organization allows only inbuxa webmail and JMAP apps. "
"This mail app can't sign in.", "POP3 refuses in its own form (test 8)")
check(smtp_auths(PORTS["submissions"], tu, [user_pw])[0] ==
"535 5.7.0 Your organization allows only INBUXA webmail and JMAP apps. "
"535 5.7.0 Your organization allows only inbuxa webmail and JMAP apps. "
"This mail app can't send.", "submission refuses in its own form (test 8)")
check(imap_login(PORTS["imap"], admin, admin_pw).startswith("OK"),
"an account on another domain signs in over IMAP normally (test 6)")
+3 -3
View File
@@ -61,7 +61,7 @@ summary.rrule: Rrule(ICalendarRecurrenceRule { freq: Weekly, until: None, count:
summary.summary: Text("Meet me maybe")
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
X-MICROSOFT-CDO-OWNERAPPTID:299828133
@@ -176,7 +176,7 @@ summary.summary: Text("Meet me maybe")
~summary.description: Text("This is the event description")
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
X-MICROSOFT-CDO-OWNERAPPTID:299828133
@@ -224,7 +224,7 @@ END:VCALENDAR
# Make sure the original alarms are preserved
> get [email protected] [email protected]
BEGIN:VCALENDAR
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
X-MICROSOFT-CDO-OWNERAPPTID:299828133
+2 -2
View File
@@ -64,7 +64,7 @@ summary.location: Text("Conference Room A")
summary.summary: Text("Review Accounts")
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
LOCATION:Conference Room A
@@ -114,7 +114,7 @@ summary.location: Text("Conference Room A")
summary.summary: Text("Review Accounts")
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
LOCATION:Conference Room A
+3 -3
View File
@@ -146,7 +146,7 @@ summary.dtstart: Time(ItipTime { start: 867787200, tz_id: 32768 })
summary.summary: Text("Conference")
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
STATUS:CONFIRMED
@@ -402,7 +402,7 @@ summary.dtstart: Time(ItipTime { start: 867787200, tz_id: 32768 })
summary.summary: Text("Conference")
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
STATUS:CONFIRMED
@@ -450,7 +450,7 @@ summary.dtstart: Time(ItipTime { start: 867787200, tz_id: 32768 })
summary.summary: Text("Conference")
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
STATUS:CONFIRMED
@@ -37,7 +37,7 @@ summary.rrule: Rrule(ICalendarRecurrenceRule { freq: Monthly, until: Some(Partia
summary.summary: Text("IETF Calendaring Working Group Meeting")
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
CLASS:PUBLIC
@@ -117,7 +117,7 @@ summary.rrule: Rrule(ICalendarRecurrenceRule { freq: Monthly, until: Some(Partia
summary.summary: Text("IETF Calendaring Working Group Meeting")
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
CLASS:PUBLIC
@@ -207,7 +207,7 @@ summary.rrule: Rrule(ICalendarRecurrenceRule { freq: Monthly, until: Some(Partia
summary.summary: Text("IETF Calendaring Working Group Meeting")
BEGIN:VCALENDAR
METHOD:CANCEL
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
STATUS:CANCELLED
@@ -226,7 +226,7 @@ END:VCALENDAR
# Make sure B has the cancelled event
> get [email protected] [email protected]
BEGIN:VCALENDAR
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
CLASS:PUBLIC
@@ -358,7 +358,7 @@ summary.rrule: Rrule(ICalendarRecurrenceRule { freq: Monthly, until: Some(Partia
summary.summary: Text("IETF Calendaring Working Group Meeting")
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
CLASS:PUBLIC
@@ -386,7 +386,7 @@ END:VCALENDAR
# Make sure B has the complete event including all updates
> get [email protected] [email protected]
BEGIN:VCALENDAR
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
CLASS:PUBLIC
@@ -538,7 +538,7 @@ summary.rrule: Rrule(ICalendarRecurrenceRule { freq: Monthly, until: Some(Partia
summary.summary: Text("IETF Calendaring Working Group Meeting")
BEGIN:VCALENDAR
METHOD:CANCEL
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
DESCRIPTION:IETF-C&S Conference Call
@@ -564,7 +564,7 @@ END:VCALENDAR
# Make sure all instances in B were deleted
> get [email protected] [email protected]
BEGIN:VCALENDAR
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
CLASS:PUBLIC
@@ -677,7 +677,7 @@ summary.rrule: Rrule(ICalendarRecurrenceRule { freq: Weekly, until: None, count:
summary.summary: Text("Review Accounts")
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
LOCATION:The White Room
@@ -742,7 +742,7 @@ summary.summary: Text("Review Accounts")
~summary.rrule: Rrule(ICalendarRecurrenceRule { freq: Weekly, until: None, count: None, interval: None, bysecond: [], byminute: [], byhour: [], byday: [ICalendarDay { ordwk: None, weekday: Tuesday }], bymonthday: [], byyearday: [], byweekno: [], bymonth: [], bysetpos: [], wkst: Some(Sunday), rscale: None, skip: None })
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
LOCATION:The White Room
@@ -770,7 +770,7 @@ summary.rrule: Rrule(ICalendarRecurrenceRule { freq: Weekly, until: None, count:
summary.summary: Text("Review Accounts")
BEGIN:VCALENDAR
METHOD:CANCEL
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
LOCATION:The Red Room
@@ -791,7 +791,7 @@ END:VCALENDAR
# Make sure B has the updated event
> get [email protected] [email protected]
BEGIN:VCALENDAR
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
LOCATION:The White Room
@@ -812,7 +812,7 @@ END:VCALENDAR
# Make sure C has the updated event
> get [email protected] [email protected]
BEGIN:VCALENDAR
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
LOCATION:The Red Room
@@ -853,7 +853,7 @@ summary.rrule: Rrule(ICalendarRecurrenceRule { freq: Weekly, until: None, count:
summary.summary: Text("Review Accounts")
BEGIN:VCALENDAR
METHOD:REPLY
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
SUMMARY:Review Accounts
@@ -919,7 +919,7 @@ summary.rrule: Rrule(ICalendarRecurrenceRule { freq: Weekly, until: None, count:
summary.summary: Text("Weekly Sync")
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
SUMMARY:Weekly Sync
@@ -967,7 +967,7 @@ summary.rrule: Rrule(ICalendarRecurrenceRule { freq: Weekly, until: None, count:
summary.summary: Text("Weekly Sync")
BEGIN:VCALENDAR
METHOD:REPLY
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
SUMMARY:Weekly Sync
+20 -20
View File
@@ -32,7 +32,7 @@ summary.dtstart: Time(ItipTime { start: 867787200, tz_id: 32768 })
summary.summary: Text("Conference")
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
STATUS:CONFIRMED
@@ -61,7 +61,7 @@ END:VCALENDAR
# Make sure B receives the request
> get [email protected] [email protected]
BEGIN:VCALENDAR
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
STATUS:CONFIRMED
@@ -88,7 +88,7 @@ END:VCALENDAR
> put [email protected] [email protected]
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
BEGIN:VEVENT
DTSTAMP:19970701T200000Z
SEQUENCE:1
@@ -119,7 +119,7 @@ summary.dtstart: Time(ItipTime { start: 867787200, tz_id: 32768 })
summary.summary: Text("Conference")
BEGIN:VCALENDAR
METHOD:REPLY
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
SUMMARY:Conference
@@ -198,7 +198,7 @@ summary.summary: Text("Phone Conference")
~summary.summary: Text("Conference")
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
STATUS:CONFIRMED
@@ -228,7 +228,7 @@ END:VCALENDAR
# Make sure C receives the request
> get [email protected] [email protected]
BEGIN:VCALENDAR
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
STATUS:CONFIRMED
@@ -256,7 +256,7 @@ END:VCALENDAR
> put [email protected] [email protected]
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
BEGIN:VEVENT
DTSTAMP:19970701T180000Z
UID:[email protected]
@@ -287,7 +287,7 @@ summary.dtstart: Time(ItipTime { start: 867780000, tz_id: 32768 })
summary.summary: Text("Phone Conference")
BEGIN:VCALENDAR
METHOD:REPLY
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
SUMMARY:Phone Conference
@@ -313,7 +313,7 @@ summary.dtstart: Time(ItipTime { start: 867780000, tz_id: 32768 })
summary.summary: Text("Phone Conference")
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
STATUS:CONFIRMED
@@ -343,7 +343,7 @@ END:VCALENDAR
# Make sure E receives the request
> get [email protected] [email protected]
BEGIN:VCALENDAR
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
STATUS:CONFIRMED
@@ -398,7 +398,7 @@ END:VCALENDAR
> put [email protected] [email protected]
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
BEGIN:VEVENT
DTSTAMP:19970701T180000Z
SEQUENCE:2
@@ -430,7 +430,7 @@ summary.dtstart: Time(ItipTime { start: 867780000, tz_id: 32768 })
summary.summary: Text("Phone Conference")
BEGIN:VCALENDAR
METHOD:REPLY
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
SUMMARY:Phone Conference
@@ -479,7 +479,7 @@ END:VCALENDAR
# Make sure C receives the reply
> get [email protected] [email protected]
BEGIN:VCALENDAR
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
STATUS:CONFIRMED
@@ -508,7 +508,7 @@ END:VCALENDAR
> put [email protected] [email protected]
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
BEGIN:VEVENT
DTSTAMP:19970701T180000Z
SEQUENCE:2
@@ -540,7 +540,7 @@ summary.dtstart: Time(ItipTime { start: 867780000, tz_id: 32768 })
summary.summary: Text("Phone Conference")
BEGIN:VCALENDAR
METHOD:REPLY
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
SUMMARY:Phone Conference
@@ -564,7 +564,7 @@ END:VCALENDAR
# Make sure C receives the reply
> get [email protected] [email protected]
BEGIN:VCALENDAR
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
STATUS:CONFIRMED
@@ -650,7 +650,7 @@ summary.summary: Text("Phone Conference")
~summary.attendee: Participants([ItipParticipant { email: "[email protected]", name: None, is_organizer: true }, ItipParticipant { email: "[email protected]", name: None, is_organizer: false }, ItipParticipant { email: "[email protected]", name: None, is_organizer: false }, ItipParticipant { email: "[email protected]", name: None, is_organizer: false }, ItipParticipant { email: "[email protected]", name: Some("Hal"), is_organizer: false }, ItipParticipant { email: "[email protected]", name: None, is_organizer: false }])
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
STATUS:CONFIRMED
@@ -681,7 +681,7 @@ summary.dtstart: Time(ItipTime { start: 867780000, tz_id: 32768 })
summary.summary: Text("Phone Conference")
BEGIN:VCALENDAR
METHOD:CANCEL
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
STATUS:CANCELLED
@@ -702,7 +702,7 @@ END:VCALENDAR
# Make sure B receives the cancelation
> get [email protected] [email protected]
BEGIN:VCALENDAR
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
STATUS:CANCELLED
@@ -727,7 +727,7 @@ summary.dtstart: Time(ItipTime { start: 867780000, tz_id: 32768 })
summary.summary: Text("Phone Conference")
BEGIN:VCALENDAR
METHOD:CANCEL
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
STATUS:CANCELLED
+9 -9
View File
@@ -32,7 +32,7 @@ summary.dtstart: Time(ItipTime { start: 867776400, tz_id: 32768 })
summary.summary: Text("Create the requirements document")
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VTODO
PRIORITY:1
@@ -57,7 +57,7 @@ END:VCALENDAR
# Make sure B received the todo
> get [email protected] [email protected]
BEGIN:VCALENDAR
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VTODO
PRIORITY:1
@@ -103,7 +103,7 @@ summary.attendee: Participants([ItipParticipant { email: "[email protected]", name:
summary.dtstart: Time(ItipTime { start: 867776400, tz_id: 32768 })
BEGIN:VCALENDAR
METHOD:REPLY
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VTODO
STATUS:IN-PROCESS
@@ -172,7 +172,7 @@ summary.attendee: Participants([ItipParticipant { email: "[email protected]", name:
summary.dtstart: Time(ItipTime { start: 867776400, tz_id: 32768 })
BEGIN:VCALENDAR
METHOD:REPLY
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VTODO
PERCENT-COMPLETE:75
@@ -241,7 +241,7 @@ summary.attendee: Participants([ItipParticipant { email: "[email protected]", name:
summary.dtstart: Time(ItipTime { start: 867776400, tz_id: 32768 })
BEGIN:VCALENDAR
METHOD:REPLY
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VTODO
DUE:19970722T170000Z
@@ -317,7 +317,7 @@ summary.summary: Text("Send Status Reports to Area Managers")
~summary.summary: Text("Create the requirements document")
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VTODO
PRIORITY:1
@@ -347,7 +347,7 @@ summary.rrule: Rrule(ICalendarRecurrenceRule { freq: Monthly, until: None, count
summary.summary: Text("Create the requirements document")
BEGIN:VCALENDAR
METHOD:CANCEL
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VTODO
STATUS:CANCELLED
@@ -367,7 +367,7 @@ END:VCALENDAR
# Make sure "C" received the cancel request
> get [email protected] [email protected]
BEGIN:VCALENDAR
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VTODO
PRIORITY:1
@@ -451,7 +451,7 @@ summary.rrule: Rrule(ICalendarRecurrenceRule { freq: Monthly, until: None, count
summary.summary: Text("Send Status Reports to Area Managers")
BEGIN:VCALENDAR
METHOD:REPLY
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VTODO
PERCENT-COMPLETE:75
+4 -4
View File
@@ -47,7 +47,7 @@ summary.rrule: Rrule(ICalendarRecurrenceRule { freq: Daily, until: None, count:
summary.summary: Text("Review Internet-Draft")
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
SUMMARY:Review Internet-Draft
@@ -89,7 +89,7 @@ END:VCALENDAR
# Make sure the participant receives the event
> get [email protected] 9263504FD3AD
BEGIN:VCALENDAR
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
SUMMARY:Review Internet-Draft
@@ -185,7 +185,7 @@ summary.rrule: Rrule(ICalendarRecurrenceRule { freq: Daily, until: None, count:
summary.summary: Text("Review Internet-Draft")
BEGIN:VCALENDAR
METHOD:REPLY
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
SUMMARY:Review Internet-Draft
@@ -343,7 +343,7 @@ summary.rrule: Rrule(ICalendarRecurrenceRule { freq: Daily, until: None, count:
summary.summary: Text("Review Internet-Draft")
BEGIN:VCALENDAR
METHOD:REPLY
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
SUMMARY:Review Internet-Draft
+3 -3
View File
@@ -30,7 +30,7 @@ summary.dtstart: Time(ItipTime { start: 1243958400, tz_id: 32768 })
summary.summary: Text("Lunch")
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
SUMMARY:Lunch
@@ -83,7 +83,7 @@ END:VCALENDAR
# Make sure the message was received by the attendees
> get [email protected] 9263504FD3AD
BEGIN:VCALENDAR
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
SUMMARY:Lunch
@@ -170,7 +170,7 @@ summary.dtstart: Time(ItipTime { start: 1243958400, tz_id: 32768 })
summary.summary: Text("Lunch")
BEGIN:VCALENDAR
METHOD:REPLY
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
SUMMARY:Lunch
+4 -4
View File
@@ -26,7 +26,7 @@ summary.dtstart: Time(ItipTime { start: 1794322800, tz_id: 433 })
summary.summary: Text("Berlin meeting")
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
SUMMARY:Berlin meeting
@@ -92,7 +92,7 @@ summary.dtstart: Time(ItipTime { start: 1794322800, tz_id: 433 })
summary.summary: Text("Berlin meeting")
BEGIN:VCALENDAR
METHOD:REPLY
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
SUMMARY:Berlin meeting
@@ -144,7 +144,7 @@ summary.dtstart: Time(ItipTime { start: 1794322800, tz_id: 433 })
summary.summary: Text("Berlin meeting")
BEGIN:VCALENDAR
METHOD:CANCEL
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
STATUS:CANCELLED
@@ -228,7 +228,7 @@ summary.dtstart: Time(ItipTime { start: 1794322800, tz_id: 433 })
summary.summary: Text("Berlin meeting")
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
VERSION:2.0
BEGIN:VEVENT
SUMMARY:Berlin meeting
+1 -1
View File
@@ -47,7 +47,7 @@ pub async fn test(imap: &mut ImapConnection, _imap_check: &mut ImapConnection) {
imap.send("ID").await;
imap.assert_read(Type::Tagged, ResponseType::Ok)
.await
.assert_contains("* ID (\"name\" \"INBUXA\" \"version\" ");
.assert_contains("* ID (\"name\" \"inbuxa\" \"version\" ");
// Login should be disabled
imap.send("LOGIN [email protected] secret").await;
+2 -2
View File
@@ -45,7 +45,7 @@ pub async fn test(test: &TestServer) {
list[0],
json!({
"id": default_calendar_id,
"name": "INBUXA Calendar ([email protected])",
"name": "inbuxa Calendar ([email protected])",
"description": null,
"sortOrder": 0,
"isSubscribed": true,
@@ -310,7 +310,7 @@ pub async fn test(test: &TestServer) {
}));
response.list()[1].assert_is_equal(json!({
"id": default_calendar_id,
"name": "INBUXA Calendar ([email protected])",
"name": "inbuxa Calendar ([email protected])",
"description": (),
"sortOrder": 0,
"isSubscribed": true,
+2 -2
View File
@@ -38,7 +38,7 @@ pub async fn test(test: &TestServer) {
assert_eq!(
list[0],
json!({
"name": "INBUXA Address Book ([email protected])",
"name": "inbuxa Address Book ([email protected])",
"description": (),
"sortOrder": 0,
"isSubscribed": true,
@@ -148,7 +148,7 @@ pub async fn test(test: &TestServer) {
"id": addressbook_id,
}),
json!({
"name": "INBUXA Address Book ([email protected])",
"name": "inbuxa Address Book ([email protected])",
"description": (),
"sortOrder": 0,
"isSubscribed": true,
+1 -1
View File
@@ -106,7 +106,7 @@ async fn discovery(scim: &ScimTest) {
);
assert!(
!config.body.contains("stalw"),
"SCIM-4: documentation is INBUXA's own"
"SCIM-4: documentation is inbuxa's own"
);
let types = anonymous.get("/ResourceTypes").await;
+1 -1
View File
@@ -503,7 +503,7 @@ pub async fn branding_compat() {
let admin = std::env::var("INBUXA_COMPAT_ADMIN").expect("INBUXA_COMPAT_ADMIN");
assert!(
std::env::var("NO_INSERT").is_ok(),
"NO_INSERT must be set, or the copy of INBUXA's data is wiped"
"NO_INSERT must be set, or the copy of inbuxa's data is wiped"
);
let test = TestServerBuilder::new("branding_compat")
.await
+1 -1
View File
@@ -431,7 +431,7 @@ pub async fn masked_email_compat() {
.expect("masks JSON");
assert!(
std::env::var("NO_INSERT").is_ok(),
"NO_INSERT must be set, or the copy of INBUXA's data is wiped"
"NO_INSERT must be set, or the copy of inbuxa's data is wiped"
);
let test = TestServerBuilder::new("masked_email_compat")
+1 -1
View File
@@ -908,7 +908,7 @@ pub async fn tenant_compat() {
.expect("expected JSON");
assert!(
std::env::var("NO_INSERT").is_ok(),
"NO_INSERT must be set, or the copy of INBUXA's data is wiped"
"NO_INSERT must be set, or the copy of inbuxa's data is wiped"
);
let test = TestServerBuilder::new("tenant_compat")
+1 -1
View File
@@ -618,7 +618,7 @@ pub async fn undelete_compat() {
.expect("archived items JSON");
assert!(
std::env::var("NO_INSERT").is_ok(),
"NO_INSERT must be set, or the copy of INBUXA's data is wiped"
"NO_INSERT must be set, or the copy of inbuxa's data is wiped"
);
let test = TestServerBuilder::new("undelete_compat")
+2 -2
View File
@@ -907,7 +907,7 @@ const REPORT_10: &str = r#"<?xml version="1.0" encoding="utf-8" ?>
const REPORT_10_RESPONSE: &str = r#"BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
BEGIN:VFREEBUSY
DTSTART:20060104T140000Z
DTEND:20060105T220000Z
@@ -928,7 +928,7 @@ const REPORT_11: &str = r#"<?xml version="1.0" encoding="utf-8" ?>
const REPORT_11_RESPONSE: &str = r#"BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//INBUXA//INBUXA Server//EN
PRODID:-//inbuxa//inbuxa Server//EN
BEGIN:VFREEBUSY
DTSTART:20060101T000000Z
DTEND:20060104T140000Z