quota-status.c revision f6008a666d9c3df66fd8a437369133e8519b4e24
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2013-2016 Dovecot authors, see the included COPYING file */
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainenstatic struct mail_storage_service_ctx *storage_service;
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainenstatic void client_connected(struct master_service_connection *conn)
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen connection_init_server(clients, &client->conn,
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen master_service_client_connection_accept(conn);
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainenstatic void client_reset(struct quota_client *client)
d28a4f3578da61ac734981d87d7077dd4747417dTimo Sirainenquota_check(struct mail_user *user, uoff_t mail_size,
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen struct quota_user *quser = QUOTA_USER_CONTEXT(user);
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen /* no quota for user */
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen ns = mail_namespace_find_inbox(user->namespaces);
e66cd209fcab4817d2234d0121b404925dc60034Timo Sirainen box = mailbox_alloc(ns->list, "INBOX", MAILBOX_FLAG_POST_SESSION);
d28a4f3578da61ac734981d87d7077dd4747417dTimo Sirainen ret = quota_test_alloc(ctx, I_MAX(1, mail_size), too_large_r);
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen *error_r = "Internal quota calculation error";
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen else if (ret == 0)
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen *error_r = quser->quota->set->quota_exceeded_msg;
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainenstatic void client_handle_request(struct quota_client *client)
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen struct mail_storage_service_user *service_user;
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen o_stream_send_str(client->conn.output, "action=DUNNO\n\n");
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen ret = mail_storage_service_lookup_next(storage_service, &input,
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen } else if (ret > 0) {
d28a4f3578da61ac734981d87d7077dd4747417dTimo Sirainen if ((ret = quota_check(user, client->size, &error, &too_large)) > 0) {
dc03cb97c682a9d6b6e606008fd5ae884d01ff53Timo Sirainen /* under quota */
dc03cb97c682a9d6b6e606008fd5ae884d01ff53Timo Sirainen value = mail_user_plugin_getenv(user, "quota_status_success");
dc03cb97c682a9d6b6e606008fd5ae884d01ff53Timo Sirainen } else if (ret == 0) {
d28a4f3578da61ac734981d87d7077dd4747417dTimo Sirainen /* even over maximum quota */
d28a4f3578da61ac734981d87d7077dd4747417dTimo Sirainen value = mail_user_plugin_getenv(user, "quota_status_toolarge");
d28a4f3578da61ac734981d87d7077dd4747417dTimo Sirainen value = mail_user_plugin_getenv(user, "quota_status_overquota");
cf0184bf140bec4262fb0434bbdc10cf2c3efc1aTimo Sirainen value = t_strdup_printf("554 5.2.2 %s", error);
b8164b588348c124acc469841ec7a5ca93a8efcdTimo Sirainen value = t_strdup(value); /* user's pool is being freed */
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen mail_storage_service_user_free(&service_user);
f6008a666d9c3df66fd8a437369133e8519b4e24Timo Sirainen i_error("Failed to lookup user %s: %s", input.username, error);
dc03cb97c682a9d6b6e606008fd5ae884d01ff53Timo Sirainen /* temporary failure */
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen o_stream_send_str(client->conn.output, t_strdup_printf(
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainenstatic int client_input_line(struct connection *conn, const char *line)
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen struct quota_client *client = (struct quota_client *)conn;
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainenstatic void client_destroy(struct connection *conn)
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen struct quota_client *client = (struct quota_client *)conn;
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen master_service_client_connection_destroyed(master_service);
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainenstatic struct connection_settings client_set = {
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainenstatic const struct connection_vfuncs client_vfuncs = {
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainenstatic void main_preinit(void)
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainenstatic void main_init(void)
2a80aa687a48d3d3d00f8405fbff2b09fab4cbf3Timo Sirainen const struct setting_parser_context *set_parser;
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen clients = connection_list_init(&client_set, &client_vfuncs);
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen storage_service = mail_storage_service_init(master_service, NULL,
2a80aa687a48d3d3d00f8405fbff2b09fab4cbf3Timo Sirainen pool = pool_alloconly_create("service all settings", 4096);
2a80aa687a48d3d3d00f8405fbff2b09fab4cbf3Timo Sirainen if (mail_storage_service_read_settings(storage_service, &input, pool,
2a80aa687a48d3d3d00f8405fbff2b09fab4cbf3Timo Sirainen user_set = master_service_settings_parser_get_others(master_service,
2a80aa687a48d3d3d00f8405fbff2b09fab4cbf3Timo Sirainen value = mail_user_set_plugin_getenv(user_set, "quota_status_nouser");
2a80aa687a48d3d3d00f8405fbff2b09fab4cbf3Timo Sirainen nouser_reply = value != NULL ? i_strdup(value) :
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainenstatic void main_deinit(void)
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen mail_storage_service_deinit(&storage_service);
c5acac1fd44571aabefc1b4db291488b87f822a0Timo Sirainen master_service = master_service_init("quota-status", service_flags,
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen while ((c = master_getopt(master_service)) > 0) {
c0699d9e0842a53c047fcbd695fa93ce435baa8fTimo Sirainen i_fatal("Unknown -p parameter: '%s'", optarg);
c8fff8f35c459f8577694b585183228ba1631fe2Timo Sirainen master_service_init_log(master_service, "quota-status: ");