quota-status.c revision c5acac1fd44571aabefc1b4db291488b87f822a0
2454dfa32c93c20a8522c6ed42fe057baaac9f9aStephan Bosch/* Copyright (c) 2013 Dovecot authors, see the included COPYING file */
9fc97c8aa8190df87624d214bcc5d0b5362bec93Timo Sirainenstatic struct mail_storage_service_ctx *storage_service;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic void client_connected(struct master_service_connection *conn)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen connection_init_server(clients, &client->conn,
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen master_service_client_connection_accept(conn);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic void client_reset(struct quota_client *client)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenquota_check(struct mail_user *user, uoff_t mail_size, const char **error_r)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen struct quota_user *quser = QUOTA_USER_CONTEXT(user);
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen /* no quota for user */
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen ns = mail_namespace_find_inbox(user->namespaces);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen ret = quota_test_alloc(ctx, I_MAX(1, mail_size), &too_large);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen *error_r = "Internal quota calculation error";
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen else if (ret == 0)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen *error_r = quser->quota->set->quota_exceeded_msg;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenstatic void client_handle_request(struct quota_client *client)
4ca83616715c3bd417e34ced2c1d61852513e427Timo Sirainen struct mail_storage_service_user *service_user;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen o_stream_send_str(client->conn.output, "action=DUNNO\n\n");
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen ret = mail_storage_service_lookup_next(storage_service, &input,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen } else if (ret > 0) {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen if ((ret = quota_check(user, client->size, &error)) > 0) {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen /* under quota */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen value = mail_user_plugin_getenv(user, "quota_status_success");
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen } else if (ret == 0) {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen /* over quota */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen value = mail_user_plugin_getenv(user, "quota_status_overquota");
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen value = t_strdup_printf("554 5.2.2 %s\n\n", error);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen value = t_strdup(value); /* user's pool is being freed */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen mail_storage_service_user_free(&service_user);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen /* temporary failure */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen o_stream_send_str(client->conn.output, t_strdup_printf(
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainenstatic int client_input_line(struct connection *conn, const char *line)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen struct quota_client *client = (struct quota_client *)conn;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenstatic void client_destroy(struct connection *conn)
172b6edea36e425b0d0c35a854721ae63f57c289Timo Sirainen struct quota_client *client = (struct quota_client *)conn;
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen master_service_client_connection_destroyed(master_service);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic struct connection_settings client_set = {
2a77044395c864cc791cecd34b03002094f4973bTimo Sirainenstatic const struct connection_vfuncs client_vfuncs = {
dbc6f14323a634ce39f15dd7fef9ee773551dcf0Timo Sirainenstatic void main_preinit(void)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainenstatic void main_init(void)
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen const struct setting_parser_context *set_parser;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen clients = connection_list_init(&client_set, &client_vfuncs);
1ac7c8e9040e0d0b7e9f849e45b94bfe919595a9Timo Sirainen storage_service = mail_storage_service_init(master_service, NULL,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen pool = pool_alloconly_create("service all settings", 4096);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen if (mail_storage_service_read_settings(storage_service, &input, pool,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen user_set = master_service_settings_parser_get_others(master_service,
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen value = mail_user_set_plugin_getenv(user_set, "quota_status_nouser");
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen nouser_reply = value != NULL ? i_strdup(value) :
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenstatic void main_deinit(void)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen mail_storage_service_deinit(&storage_service);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen master_service = master_service_init("quota-status", service_flags,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen while ((c = master_getopt(master_service)) > 0) {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen i_fatal("Unknown -p parameter: '%s'", optarg);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen master_service_init_log(master_service, "quota-status: ");