Environment
- Carbonio Release: 26.6.2
- OS: Ubuntu 24.04.4 LTS (Noble)
- Package:
carbonio-admin-console-ui0.15.2-1ubuntu - Package:
carbonio-appserver4.5.1-1noble - Affected page:
https://<host>:6071/carbonioAdmin/manage/domains/<domain-id>/mailbox_quota
Summary
The domain "Mailbox Quota" page in the Admin Console never displays per-account quota usage. Two distinct frontend bugs were identified, both in carbonio-admin-console-ui (shell.mjs). The backend SOAP API (GetQuotaUsageRequest) works correctly in all tested scenarios.
Bug 1 — Routing fails on hard reload / direct navigation
Steps to reproduce:
- Open the Admin Console and navigate normally (via UI clicks) to Domains →
<domain>→ Mailbox Quota. The page loads correctly. - Copy the resulting URL (e.g.
/manage/domains/<domain-id>/mailbox_quota), or simply press F5 while on that page. - The page fails to render. No visible error banner, but the browser console shows:
shell.mjs:1016 No account name available for GetAccount request
shell.mjs:1012 No routes matched location
"/manage/domains/<domain-id>/mailbox_quota"
Analysis: "No routes matched location" is a React Router warning, thrown when matchRoutes() is evaluated before the application has finished its client-side bootstrap (a well-known class of SPA bug: routes for some sections appear to be registered conditionally, likely gated behind an async data/feature-flag load that hasn't completed yet at the time of the initial route match on a hard reload or deep link).
Confirmed: navigating to the same page via in-app clicks (no reload) works without any routing error. Only direct navigation/reload of the deep link triggers the failure.
Impact: the page cannot be bookmarked, shared as a direct link, or reloaded — it must always be reached by clicking through the UI from the Admin Console home.
Bug 2 — Quota values not displayed (field name mismatch)
Steps to reproduce:
- Navigate correctly (via UI clicks, avoiding Bug 1) to Domains →
<domain>→ Mailbox Quota. - The table renders 10 accounts per page (with working pagination), but the quota "used" / "limit" columns are always empty / zero. The account name column populates correctly.
Root cause (confirmed via static analysis of shell.mjs):
The real SOAP response from GetQuotaUsageRequest (captured from the browser's Network tab) looks like this:
{
"Body": {
"GetQuotaUsageResponse": {
"account": [
{
"name": "user@example.com",
"id": "9abcdbb0-ba1e-43af-a98d-23fb41a49a6c",
"used": 42844716157,
"limit": 46170898432
}
],
"more": true,
"searchTotal": 94
}
}
}
(more/searchTotal reflect normal, working pagination — 10 accounts per page — not a bug.)
The table row-mapping function in shell.mjs reads different, non-existent property names:
A6=(e,t,n=!1)=>{let r=[];return e.forEach(e=>{
let[i,a]=k6(e?.mailsQuotaUsed??0, e.mailsQuotaLimit??0, t),
o={name:n?e?.accountName:e?.name, id:n?e?.accountId:e?.id, ...}
It reads e.mailsQuotaUsed / e.mailsQuotaLimit, which do not exist on the account objects returned by GetQuotaUsageRequest (the actual fields are used and limit). The ??0 fallback silently converts this to zero/empty instead of surfacing an error, while e.name (which does exist on the response object) renders correctly — matching the exact symptom observed: account names populate, quota values never do.
Suggested fix: update the mapping function to read used and limit (matching the actual GetQuotaUsageResponse schema) instead of mailsQuotaUsed / mailsQuotaLimit.
Evidence attached
2026-08-08_GetQuotaUsageRequest_evidence.xml— full SOAP/XML response for the domain'sGetQuotaUsageRequest, obtained directly viazmsoap(bypassing the frontend, no pagination limit) — confirms the backend returns complete and correct data.2026-08-08_GetQuotaUsageRequest_browser_paginated.json— actual JSON response captured from the browser's Network tab during a normal page load, showing theused/limit/more/searchTotalfields referenced above.
2026-08-08_GetQuotaUsageRequest_browser_paginated.json:
{"Header":{"context":{"change":{"token":19399},"_jsns":"urn:zimbra"}},"Body":{"GetQuotaUsageResponse":{"account":[{"name":"XXXXXXXXXXXXXXX","id":"9abcdbb0-ba1e-43af-a98d-23fb41a49a6c","used":42844716157,"limit":46170898432},{"name":"XXXXXXXXXXXXXXX","id":"42197d93-e3f9-434d-9576-3dafb92f00c4","used":31591497830,"limit":42949672960},{"name":"XXXXXXXXXXXXXXX","id":"ab50466b-1e55-4313-954a-7df972293956","used":30527877417,"limit":42949672960},{"name":"XXXXXXXXXXXXXXX","id":"6c641b30-de38-4b29-9085-e729a4447b92","used":23796864268,"limit":42949672960},{"name":"XXXXXXXXXXXXXXX","id":"2b52f80d-facf-4b7a-bcb1-f84e0f3c4cdd","used":20891980563,"limit":34359738368},{"name":"XXXXXXXXXXXXXXX","id":"b21e9839-ae13-4d5e-b5bd-9b2f884fce6c","used":20110684845,"limit":42949672960},{"name":"XXXXXXXXXXXXXXX","id":"d19b4684-0680-4f3a-8526-4af6a182e718","used":17378090026,"limit":42949672960},{"name":"XXXXXXXXXXXXXXX","id":"eabbd76e-5057-4d8c-a7fa-088431e0f242","used":14408995038,"limit":42949672960},{"name":"XXXXXXXXXXXXXXX","id":"0d2f8839-8295-4052-a6f3-bcc23de29c5e","used":13753357082,"limit":42949672960},{"name":"XXXXXXXXXXXXXXX","id":"8a290730-1977-4a72-bae3-91ea89409d8a","used":12470583976,"limit":42949672960}],"more":true,"searchTotal":94,"_jsns":"urn:zimbraAdmin"}},"_jsns":"urn:zimbraSoap"}
2026-08-08_GetQuotaUsageRequest_evidence.xml:
<GetQuotaUsageResponse searchTotal="94" more="0" xmlns="urn:zimbraAdmin">
<account limit="46170898432" name="XXXXXXXXXXXXXXX" id="9abcdbb0-ba1e-43af-a98d-23fb41a49a6c" used="42844716157"/>
