Remove QUOTA file patch for Cyrus

Overview

This patch for the Cyrus IMAP server addresses a subtle but important issue with the Cyrus quota mechanism. When a folder is assigned a quota it becomes a quota root for all subfolders except those that have quotas defined and their children. Under Cyrus it is not possible to remove a quota root, and reassign the relevant subfolders to a parent quota root.
The following exposition is perhaps too technical for someone not familiar with the IMAP quota extension and the Cyrus project's implementation.

Definitions

The parent quota root of a folder is the first quota root found enroute to the root of the hierarchy. A quota root defines resource limits which apply to a folder and to all subfolders except those that are themselves quota roots or those that have a different parent quota root.

The phrase "folder X has no quota" is usually used in an ambiguous manner; it can mean:

  1. The folder belongs to a quota root which has an unlimited quota.
  2. The folder does not have a quota file, and therefore is subject to any limits a parent quota root might impose.
When we mean the first we will say "folder has no quota limit" and when we mean the second we will say "folder has no quota file".

The difference is evident from the output of the GETQUOTA command on a Cyrus IMAP server. In case number 1 where a folder has no quota limit we get:

. GETQUOTA test.qroot
* QUOTA test.qroot ()
. OK Completed
In case number 2 where the folder doesn't have a quota file we get:
. getquota test.noqroot
. NO Quota root does not exist

The Problem

In a complicated folder hierarchy it will often be the case that more than one quota root will exist between a root folder and one of it's subfolders.

Consider the example hierarchy:

. LIST test *
* LIST (\HasChildren) "." "test"
* LIST (\HasChildren) "." "test.root"
* LIST (\HasChildren) "." "test.root.subroot"
* LIST (\HasNoChildren) "." "test.root.subroot.subfolder"
* LIST (\HasNoChildren) "." "test.root.subfolder"
. OK Completed (0.000 secs 15 calls)
and suppose root and subroot are themselves quota roots:
. GETQUOTAROOT test.root
* QUOTAROOT test.root test.root
* QUOTA test.root (STORAGE 0 100)
. OK Completed
. GETQUOTAROOT test.root.subroot
* QUOTAROOT test.root.subroot test.root.subroot
* QUOTA test.root.subroot (STORAGE 0 200)
. OK Completed
Now say we want to remove the quota limit for test.root.subroot. In Cyrus this means that the quota file for this quota root will have a limit of '-1'. It is accomplished by giving a SETQUOTA command with no arguments:
. SETQUOTA test.root.subroot ()
. OK Completed
. GETQUOTA test.root.subroot
* QUOTA test.root.subroot ()
. OK Completed
The alternative meaning is totaly different. We wish to remove the quota file from test.root.subroot so as itself and it's subfolders now belong to the quota root at test.root.

The proposed solution

The rmquota patch makes the alternative meaning also possible, by introducing a dummy resource atom called 'remove'. When this resource is set on a folder any quota file will be removed and the affected subfolders will be updated correctly:

. SETQUOTA test.root.subroot (REMOVE 1)
. OK Completed
. GETQUOTA test.root.subroot
. NO Quota root does not exist
. GETQUOTAROOT test.root.subroot
* QUOTAROOT test.root.subroot test.root
* QUOTA test.root (STORAGE 0 100)
. OK Completed
. GETQUOTAROOT test.root.subroot.subfolder
* QUOTAROOT test.root.subroot.subfolder test.root
* QUOTA test.root (STORAGE 0 100)
. OK Completed

RFC2087 Compliance

We believe that this extension is compatible with RFC2087 although it may stretch a bit the intentions of the authors. According to the RFC SETQUOTA accepts a "list of resource limits" as the second argument, in which case one can regard REMOVE as a dummy "resource".

Motivation

This patch was an in-house hack for almost 2 years, originally written to support the web administration tool Cyrusmaster. The functionality it provides could not be replicated unless one erased the quota file by hand and then reconstructed the mailbox headers of the affected folders. Obviously a web administration tool could not do all this automatically and to ask the user to do it manually would defeat the purpose of a web administration tool. It has been tidied up and written so as to integrate with and contribute to the cyrus code base in a better way.

News

Sep, 07 2007: new remove quota file patch for cyrus 2.3.9 ready.
Mar, 4 2005: new remove quota file patch for cyrus 2.2.12 ready. Patch filename is updated to new format.
Nov, 24 2004: new remove quota file patch for cyrus 2.2.10 ready.
Jul, 31 2004: There will be no release for the patches for cyrus imapd 2.2.8 since they are identical with the patches for cyrus-imapd-2.2.7. Just use those.
Jul, 27 2004: new remove quota file patch for cyrus 2.2.7 ready.
Jun, 20 2004: new remove quota file patch for cyrus 2.2.6 ready.
Jun, 1 2004: new remove quota file patch for cyrus 2.2.5. As Simmon Matter reported there was a problem compiling with gcc 3.3.x because the wrapping of the lines in the syslog message made gcc produce an error. This is quite strange cause I've tested it with gcc 3.2.3 and the patch worked ok. Anyhow a new patch that adds two \ in the right places is out. (Building proccess was tested by Simmon). Special thanks to Simon Matters ( diff to previous)
May, 31 2004: new remove quota file patch for cyrus 2.2.5. A few minor changes. ( diff to previous)
May, 28 2004: new remove quota file patch for cyrus 2.2.4 ready. A quite reworked patch.
Mar, 24 2004: new remove quota file patch for cyrus 2.2.3-CVS ready. Fixes problems with non existent folders
Mar, 11 2004: remove quota file patch for cyrus 2.2.3-CVS ready
Jan, 23 2004: remove quota file patch for cyrus 2.2.3 ready
Dec, 05 2003: bug fix (stray 2.2 variable) for 2.1.16 patch. Thanks to Simon Matter for pointing it out
Dec, 03 2003: remove quota file patch for cyrus 2.2.2-BETA ready

Download

Issues to be considered

Links

  • More Cyrus patches

  • Cyrusmaster: a Cyrus administration web environment

  • email.uoa.gr homepage

  • Contact information

    For information, bugs, requests etc contact email (at) edunet.gr