Fix quota: Include Sieve scripts in quota recalculations

This commit is contained in:
Maurus Decimus
2026-05-04 19:23:19 +02:00
parent 66867be369
commit d478ab9515
4 changed files with 9 additions and 3 deletions

View File

@@ -22,6 +22,7 @@ If you are upgrading from v0.16.x, replace the binary (or run `docker pull`). If
- Import tool fails to restore registry entries.
- FDB: Allow multiple FoundationDB instances in the same process.
- Autoconfig: Return `%EMAILADDRESS%` when no email address is provided.
- Quota: Include Sieve scripts in quota recalculations.
## [0.16.3] - 2026-04-30

View File

@@ -55,7 +55,7 @@ impl Server {
item_size: u64,
) -> trc::Result<()> {
if account.quota_disk != 0 {
let used_quota = self.get_used_quota_account(account.id).await? as u64;
let used_quota = self.get_used_quota_account(account.id).await?.max(0) as u64;
if used_quota + item_size > account.quota_disk {
return Err(trc::LimitEvent::Quota
@@ -76,7 +76,7 @@ impl Server {
let tenant = self.tenant(tenant_id).await.caused_by(trc::location!())?;
if tenant.quota_disk != 0 {
let used_quota = self.get_used_quota_tenant(tenant_id).await? as u64;
let used_quota = self.get_used_quota_tenant(tenant_id).await?.max(0) as u64;
if used_quota + item_size > tenant.quota_disk {
return Err(trc::LimitEvent::TenantQuota

View File

@@ -81,7 +81,7 @@ impl QuotaGet for Server {
QuotaProperty::Id => Value::Element(id.into()),
QuotaProperty::ResourceType => "octets".to_string().into(),
QuotaProperty::Used => {
(self.get_used_quota_account(account_id).await? as u64).into()
(self.get_used_quota_account(account_id).await?.max(0) as u64).into()
}
QuotaProperty::HardLimit => account.as_ref().disk_quota().into(),
QuotaProperty::Scope => "account".to_string().into(),

View File

@@ -20,6 +20,7 @@ use common::{
use email::{
cache::MessageCacheFetch,
message::{delete::EmailDeletion, ingest::EmailIngest, metadata::MessageData},
sieve::SieveScript,
};
use groupware::{
calendar::{Calendar, CalendarEvent, CalendarEventNotification},
@@ -450,6 +451,7 @@ async fn recalculate_quota(server: &Server, account_id: u32) -> trc::Result<()>
Collection::AddressBook,
Collection::ContactCard,
Collection::FileNode,
Collection::SieveScript,
] {
server
.archives(account_id, collection, &(), |_, archive| {
@@ -475,6 +477,9 @@ async fn recalculate_quota(server: &Server, account_id: u32) -> trc::Result<()>
Collection::FileNode => {
quota += archive.unarchive::<FileNode>()?.size() as i64;
}
Collection::SieveScript => {
quota += u32::from(archive.unarchive::<SieveScript>()?.size) as i64;
}
_ => {}
}
Ok(true)