imap-quota-plugin.c revision c2fbbf7515aa419dc8b2d62a3c2bb0471d51a391
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (c) 2005-2010 Dovecot authors, see the included COPYING file */
4462bd7b4c7ef3de006f060e155a90e5de7cae21Timo Sirainenconst char *imap_quota_plugin_version = DOVECOT_VERSION;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstatic void (*next_hook_client_created)(struct client **client);
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainenstatic const char *
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainenimap_quota_root_get_name(struct mail_user *user, struct mail_user *owner,
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen return t_strdup_printf("%s%c%s", owner->username,
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainenquota_send(struct client_command_context *cmd, struct mail_user *owner,
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen unsigned int i;
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen name = imap_quota_root_get_name(cmd->client->user, owner, root);
bf9ea5404a0094a8fb8199b677d81f803512c44eTimo Sirainen ret = quota_get_resource(root, "", *list, &value, &limit);
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen (unsigned long long)value,
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen (unsigned long long)limit);
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen } else if (ret < 0) {
bf9ea5404a0094a8fb8199b677d81f803512c44eTimo Sirainen "* BAD Internal quota calculation error");
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainenstatic bool cmd_getquotaroot(struct client_command_context *cmd)
0df9428baed48afaff90b4d4f03792d2fd756a43Timo Sirainen struct quota_user *quser = QUOTA_USER_CONTEXT(client->user);
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen /* <mailbox> */
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen if (!client_read_string_args(cmd, 1, &mailbox))
e593e507ee5ea3869271a631874c5c4b5c7a294dTimo Sirainen ns = client_find_namespace(cmd, mailbox, &storage_name, NULL);
ef2b2ef2e6a6eb5e4667f2e63faae8a3b646e8baTimo Sirainen if (ns->owner != NULL && ns->owner != client->user &&
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen client_send_tagline(cmd, "NO Not showing other users' quota.");
e593e507ee5ea3869271a631874c5c4b5c7a294dTimo Sirainen box = mailbox_alloc(ns->list, storage_name, MAILBOX_FLAG_READONLY |
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen /* send QUOTAROOT reply */
e593e507ee5ea3869271a631874c5c4b5c7a294dTimo Sirainen imap_quote_append_string(str, mailbox, FALSE);
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen while ((root = quota_root_iter_next(iter)) != NULL) {
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen name = imap_quota_root_get_name(client->user, ns->owner, root);
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen /* send QUOTA reply for each quotaroot */
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen while ((root = quota_root_iter_next(iter)) != NULL)
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen client_send_tagline(cmd, "OK Getquotaroot completed.");
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainenstatic bool cmd_getquota(struct client_command_context *cmd)
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen const char *root_name, *p;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen /* <quota root> */
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen if (!client_read_string_args(cmd, 1, &root_name))
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen root = quota_root_lookup(cmd->client->user, root_name);
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen if (root == NULL && cmd->client->user->admin) {
a443e5aaf632257bfd1e7aa9b3c42c09512bbe43Timo Sirainen /* we're an admin. see if there's a quota root for another
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen client_send_tagline(cmd, "NO Quota root doesn't exist.");
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen client_send_tagline(cmd, "OK Getquota completed.");
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainenstatic bool cmd_setquota(struct client_command_context *cmd)
c2fbbf7515aa419dc8b2d62a3c2bb0471d51a391Timo Sirainen const char *root_name, *name, *value_str, *error;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen /* <quota root> <resource limits> */
c2fbbf7515aa419dc8b2d62a3c2bb0471d51a391Timo Sirainen if (!imap_arg_get_astring(&args[0], &root_name) ||
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen client_send_command_error(cmd, "Invalid arguments.");
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen root = quota_root_lookup(cmd->client->user, root_name);
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen client_send_tagline(cmd, "NO Quota root doesn't exist.");
c2fbbf7515aa419dc8b2d62a3c2bb0471d51a391Timo Sirainen for (; !IMAP_ARG_IS_EOL(list_args); list_args += 2) {
c2fbbf7515aa419dc8b2d62a3c2bb0471d51a391Timo Sirainen if (!imap_arg_get_atom(&list_args[0], &name) ||
c2fbbf7515aa419dc8b2d62a3c2bb0471d51a391Timo Sirainen !imap_arg_get_atom(&list_args[1], &value_str) ||
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen client_send_command_error(cmd, "Invalid arguments.");
bf9ea5404a0094a8fb8199b677d81f803512c44eTimo Sirainen if (quota_set_resource(root, name, value, &error) < 0) {
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen client_send_tagline(cmd, "OK Setquota completed.");
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstatic void imap_quota_client_created(struct client **client)
cd2cd224d3216a243d55c71c298a5b7684de0ac4Timo Sirainen if (mail_user_is_plugin_loaded((*client)->user, imap_quota_module))
cd2cd224d3216a243d55c71c298a5b7684de0ac4Timo Sirainen str_append((*client)->capability_string, " QUOTA");
cd2cd224d3216a243d55c71c298a5b7684de0ac4Timo Sirainenvoid imap_quota_plugin_init(struct module *module)
66a872b4569c048e804f0731680d89c6042d8890Timo Sirainen command_register("GETQUOTAROOT", cmd_getquotaroot, 0);
66a872b4569c048e804f0731680d89c6042d8890Timo Sirainen command_register("GETQUOTA", cmd_getquota, 0);
66a872b4569c048e804f0731680d89c6042d8890Timo Sirainen command_register("SETQUOTA", cmd_setquota, 0);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen next_hook_client_created = hook_client_created;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen hook_client_created = imap_quota_client_created;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen hook_client_created = next_hook_client_created;
23fdad6c7e2581921f511e24cd9371c9eaebcef9Timo Sirainenconst char *imap_quota_plugin_dependencies[] = { "quota", NULL };