Bug report: Domain ...
 
Notifications
Clear all

Bug report: Domain "Mailbox Quota" page in Admin Console

2 Posts
1 Users
0 Reactions
49 Views
(@miriosal)
New Member
Joined: 2 weeks ago
Posts: 2
Topic starter  

Environment

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:

  1. Open the Admin Console and navigate normally (via UI clicks) to Domains → <domain> → Mailbox Quota. The page loads correctly.
  2. Copy the resulting URL (e.g. /manage/domains/<domain-id>/mailbox_quota), or simply press F5 while on that page.
  3. 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:

  1. Navigate correctly (via UI clicks, avoiding Bug 1) to Domains → <domain> → Mailbox Quota.
  2. 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's GetQuotaUsageRequest, obtained directly via zmsoap (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 the used/limit/more/searchTotal fields referenced above.

   
Quote
(@miriosal)
New Member
Joined: 2 weeks ago
Posts: 2
Topic starter  

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"/>


   
ReplyQuote