imap-quota-plugin.c revision e5dca7edde333c2759b0e6b1d0d00b94ea303322
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen/* Copyright (c) 2005-2013 Dovecot authors, see the included COPYING file */
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainenconst char *imap_quota_plugin_version = DOVECOT_ABI_VERSION;
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainenstatic imap_client_created_func_t *next_hook_client_created;
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainenstatic const char *
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainenimap_quota_root_get_name(struct mail_user *user, struct mail_user *owner,
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen return t_strdup_printf("%s%c%s", owner->username,
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainenquota_reply_write(string_t *str, struct mail_user *user,
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen struct mail_user *owner, struct quota_root *root)
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen unsigned int i;
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen name = imap_quota_root_get_name(user, owner, root);
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen ret = quota_get_resource(root, "", *list, &value, &limit);
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen (unsigned long long)value,
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen (unsigned long long)limit);
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen str_append(str, "* BAD Internal quota calculation error\r\n");
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainenstatic bool cmd_getquotaroot(struct client_command_context *cmd)
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen struct quota_user *quser = QUOTA_USER_CONTEXT(client->user);
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen /* <mailbox> */
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen if (!client_read_string_args(cmd, 1, &mailbox))
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen if (ns->owner != NULL && ns->owner != client->user) {
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen client_send_tagline(cmd, "NO Not showing other users' quota.");
f83a33d8ddb275984cd89835ee8afe0ff584fe91Timo Sirainen box = mailbox_alloc(ns->list, mailbox, MAILBOX_FLAG_READONLY);
f83a33d8ddb275984cd89835ee8afe0ff584fe91Timo Sirainen /* build QUOTAROOT reply and QUOTA reply for all quota roots */
34861542d8975d85bc87a2e21e40ada22545b672Timo Sirainen imap_append_astring(quotaroot_reply, orig_mailbox);
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen while ((root = quota_root_iter_next(iter)) != NULL) {
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen name = imap_quota_root_get_name(client->user, ns->owner, root);
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen quota_reply_write(quota_reply, client->user, ns->owner, root);
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen /* send replies */
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen client_send_line(client, str_c(quotaroot_reply));
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen o_stream_nsend(client->output, str_data(quota_reply),
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen client_send_tagline(cmd, "OK Getquotaroot completed.");
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainenparse_quota_root(struct mail_user *user, const char *root_name,
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen struct mail_user **owner_r, struct quota_root **root_r)
77717f1e9e8442fd2cdbca87cbc45c03d0b5fcaeTimo Sirainen const char *p;
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen /* we're an admin. see if there's a quota root for another user. */
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen *owner_r = mail_user_find(user, t_strdup_until(root_name, p));
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainenstatic bool cmd_getquota(struct client_command_context *cmd)
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen /* <quota root> */
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen if (!client_read_string_args(cmd, 1, &root_name))
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen if (!parse_quota_root(cmd->client->user, root_name, &owner, &root)) {
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen client_send_tagline(cmd, "NO Quota root doesn't exist.");
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen quota_reply_write(quota_reply, cmd->client->user, owner, root);
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen o_stream_nsend(cmd->client->output, str_data(quota_reply),
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen client_send_tagline(cmd, "OK Getquota completed.");
091e808a5af4dbc40aacde8dd1fbf98fae52e6c1Timo Sirainenstatic bool cmd_setquota(struct client_command_context *cmd)
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen const char *root_name, *name, *value_str, *error;
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen /* <quota root> <resource limits> */
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen if (!imap_arg_get_astring(&args[0], &root_name) ||
091e808a5af4dbc40aacde8dd1fbf98fae52e6c1Timo Sirainen client_send_command_error(cmd, "Invalid arguments.");
091e808a5af4dbc40aacde8dd1fbf98fae52e6c1Timo Sirainen client_send_tagline(cmd, "NO Quota can be changed only by admin.");
091e808a5af4dbc40aacde8dd1fbf98fae52e6c1Timo Sirainen if (!parse_quota_root(cmd->client->user, root_name, &owner, &root)) {
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen client_send_tagline(cmd, "NO Quota root doesn't exist.");
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen for (; !IMAP_ARG_IS_EOL(list_args); list_args += 2) {
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen if (!imap_arg_get_atom(&list_args[0], &name) ||
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen !imap_arg_get_atom(&list_args[1], &value_str) ||
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen client_send_command_error(cmd, "Invalid arguments.");
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen if (quota_set_resource(root, name, value, &error) < 0) {
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen client_send_tagline(cmd, "OK Setquota completed.");
b22f3db16d33b8e509b7331e46108c313e7f3b94Timo Sirainenstatic void imap_quota_client_created(struct client **client)
b22f3db16d33b8e509b7331e46108c313e7f3b94Timo Sirainen if (mail_user_is_plugin_loaded((*client)->user, imap_quota_module))
b22f3db16d33b8e509b7331e46108c313e7f3b94Timo Sirainen str_append((*client)->capability_string, " QUOTA");
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainenvoid imap_quota_plugin_init(struct module *module)
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen command_register("GETQUOTAROOT", cmd_getquotaroot, 0);
b22f3db16d33b8e509b7331e46108c313e7f3b94Timo Sirainen command_register("GETQUOTA", cmd_getquota, 0);
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen command_register("SETQUOTA", cmd_setquota, 0);
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen imap_client_created_hook_set(imap_quota_client_created);
b22f3db16d33b8e509b7331e46108c313e7f3b94Timo Sirainen imap_client_created_hook_set(next_hook_client_created);
b22f3db16d33b8e509b7331e46108c313e7f3b94Timo Sirainenconst char *imap_quota_plugin_dependencies[] = { "quota", NULL };
b22f3db16d33b8e509b7331e46108c313e7f3b94Timo Sirainenconst char imap_quota_plugin_binary_dependency[] = "imap";