quota-private.h revision 2615df45a8027948a474abe5e817b34b0499c171
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen#ifndef QUOTA_PRIVATE_H
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen#define QUOTA_PRIVATE_H
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen#include "mail-storage-private.h"
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen#include "mail-namespace.h"
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen#include "quota.h"
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen/* Modules should use do "my_id = quota_module_id++" and
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen use quota_module_contexts[id] for their own purposes. */
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainenextern unsigned int quota_module_id;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainenstruct quota {
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen struct mail_user *user;
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen struct quota_settings *set;
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen ARRAY_DEFINE(roots, struct quota_root *);
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen ARRAY_DEFINE(namespaces, struct mail_namespace *);
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen};
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainenstruct quota_settings {
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen pool_t pool;
3fe44a0df5a0bdd80c495f79cbf0e384441d6fccTimo Sirainen
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen ARRAY_DEFINE(root_sets, struct quota_root_settings *);
3fe44a0df5a0bdd80c495f79cbf0e384441d6fccTimo Sirainen int (*test_alloc)(struct quota_transaction_context *ctx,
3fe44a0df5a0bdd80c495f79cbf0e384441d6fccTimo Sirainen uoff_t size, bool *too_large_r);
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen
b87436ebb957a9eb182be72ba00e2c8eae59a2e4Timo Sirainen const char *quota_exceeded_msg;
fc84f8af4794f4bb6caf6e5ec3fb1f8cebd0462aTimo Sirainen unsigned int debug:1;
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen};
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
12dc81583d1958cb301a617e19fbd40e8d376397Timo Sirainenstruct quota_rule {
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen const char *mailbox_name;
12dc81583d1958cb301a617e19fbd40e8d376397Timo Sirainen
12dc81583d1958cb301a617e19fbd40e8d376397Timo Sirainen int64_t bytes_limit, count_limit;
3851ad9fcb25635f02b46d44586742ef1081876bTimo Sirainen /* relative to default_rule */
3851ad9fcb25635f02b46d44586742ef1081876bTimo Sirainen unsigned int bytes_percent, count_percent;
2b682d8d3661800f16aceaa45fa4de9b6b140a59Timo Sirainen
2b682d8d3661800f16aceaa45fa4de9b6b140a59Timo Sirainen /* Don't include this mailbox in quota */
2b682d8d3661800f16aceaa45fa4de9b6b140a59Timo Sirainen unsigned int ignore:1;
12dc81583d1958cb301a617e19fbd40e8d376397Timo Sirainen};
12dc81583d1958cb301a617e19fbd40e8d376397Timo Sirainen
503e5ef896c7b4a51cf73efb0d132860a8c747e6Timo Sirainenstruct quota_warning_rule {
3851ad9fcb25635f02b46d44586742ef1081876bTimo Sirainen struct quota_rule rule;
503e5ef896c7b4a51cf73efb0d132860a8c747e6Timo Sirainen
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen const char *command;
503e5ef896c7b4a51cf73efb0d132860a8c747e6Timo Sirainen};
503e5ef896c7b4a51cf73efb0d132860a8c747e6Timo Sirainen
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainenstruct quota_backend_vfuncs {
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen struct quota_root *(*alloc)(void);
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen int (*init)(struct quota_root *root, const char *args);
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen void (*deinit)(struct quota_root *root);
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen bool (*parse_rule)(struct quota_root_settings *root_set,
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen struct quota_rule *rule,
12dc81583d1958cb301a617e19fbd40e8d376397Timo Sirainen const char *str, const char **error_r);
12dc81583d1958cb301a617e19fbd40e8d376397Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen /* called once for each namespace */
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen void (*namespace_added)(struct quota *quota,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen struct mail_namespace *ns);
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen const char *const *(*get_resources)(struct quota_root *root);
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen int (*get_resource)(struct quota_root *root,
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen const char *name, uint64_t *value_r);
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen int (*update)(struct quota_root *root,
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen struct quota_transaction_context *ctx);
6d6bbe8787354bbb69d0c03187adfe0f497d70b8Timo Sirainen bool (*match_box)(struct quota_root *root, struct mailbox *box);
6d6bbe8787354bbb69d0c03187adfe0f497d70b8Timo Sirainen
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen};
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainenstruct quota_backend {
3fe44a0df5a0bdd80c495f79cbf0e384441d6fccTimo Sirainen /* quota backends equal if backend1.name == backend2.name */
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen const char *name;
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen struct quota_backend_vfuncs v;
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen};
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainenstruct quota_root_settings {
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen /* Unique quota root name. */
73583cff4f0ca9ee87204256ca1994adf17cb94cTimo Sirainen const char *name;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen struct quota_settings *set;
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen const char *args;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen const struct quota_backend *backend;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen struct quota_rule default_rule;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen ARRAY_DEFINE(rules, struct quota_rule);
503e5ef896c7b4a51cf73efb0d132860a8c747e6Timo Sirainen ARRAY_DEFINE(warning_rules, struct quota_warning_rule);
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen /* Limits in default_rule override backend's quota limits */
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen unsigned int force_default_rule:1;
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen};
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainenstruct quota_root {
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen pool_t pool;
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen struct quota_root_settings *set;
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen struct quota *quota;
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen struct quota_backend backend;
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen
2d8b23805db6f06b8b38174fb6e135386694f429Timo Sirainen /* this quota root applies only to this namespace. it may also be
2d8b23805db6f06b8b38174fb6e135386694f429Timo Sirainen a public namespace without an owner. */
2d8b23805db6f06b8b38174fb6e135386694f429Timo Sirainen struct mail_namespace *ns;
2d8b23805db6f06b8b38174fb6e135386694f429Timo Sirainen /* this is set in quota init(), because namespaces aren't known yet */
2d8b23805db6f06b8b38174fb6e135386694f429Timo Sirainen const char *ns_prefix;
2d8b23805db6f06b8b38174fb6e135386694f429Timo Sirainen
b1678954f83e1059b981e2def52a70054fa71399Timo Sirainen /* initially the same as set->default_rule.*_limit, but some backends
b1678954f83e1059b981e2def52a70054fa71399Timo Sirainen may change these by reading the limits elsewhere (e.g. Maildir++,
b1678954f83e1059b981e2def52a70054fa71399Timo Sirainen FS quota) */
b1678954f83e1059b981e2def52a70054fa71399Timo Sirainen int64_t bytes_limit, count_limit;
0e5819a061034f1636b124c03a89f67d37c852b1Timo Sirainen /* 1 = quota root has resources and should be returned when iterating
0e5819a061034f1636b124c03a89f67d37c852b1Timo Sirainen quota roots, 0 = not, -1 = unknown. */
0e5819a061034f1636b124c03a89f67d37c852b1Timo Sirainen int resource_ret;
b1678954f83e1059b981e2def52a70054fa71399Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen /* Module-specific contexts. See quota_module_id. */
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen ARRAY_DEFINE(quota_module_contexts, void);
d5d23d5ff8b7a06d2ead489ddcf55ee8fb5ca7b6Timo Sirainen
d5d23d5ff8b7a06d2ead489ddcf55ee8fb5ca7b6Timo Sirainen /* don't enforce quota when saving */
d5d23d5ff8b7a06d2ead489ddcf55ee8fb5ca7b6Timo Sirainen unsigned int no_enforcing:1;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen};
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainenstruct quota_transaction_context {
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen union mailbox_transaction_module_context module_ctx;
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen struct quota *quota;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen struct mailbox *box;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen int64_t bytes_used, count_used;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen uint64_t bytes_left, count_left;
fbdd091ef000e3ec4db34c054736c91ef9bc48ceTimo Sirainen
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen struct mail *tmp_mail;
6800c6607013d4fdef5a4f764bae407301c6cce8Timo Sirainen
b2e181e33889f0a4a3ba9dc23d676cbfe1bf7782Timo Sirainen unsigned int limits_set:1;
3ccfcf0856958cb9208a9fc51c3bdf13c58ad52aTimo Sirainen unsigned int failed:1;
bd7b1a9000b12349e2a99bb43b3ce8b96a18e92bTimo Sirainen unsigned int recalculate:1;
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen};
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen/* Register storage to all user's quota roots. */
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenvoid quota_add_user_namespace(struct quota *quota, struct mail_namespace *ns);
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenvoid quota_remove_user_namespace(struct mail_namespace *ns);
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainen
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainenstruct quota *quota_get_mail_user_quota(struct mail_user *user);
82995cc154a929f37aa486a72a6485e9f8d34a30Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenbool quota_root_is_namespace_visible(struct quota_root *root,
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen struct mail_namespace *ns);
2b682d8d3661800f16aceaa45fa4de9b6b140a59Timo Sirainenstruct quota_rule *
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainenquota_root_rule_find(struct quota_root_settings *root_set, const char *name);
2b682d8d3661800f16aceaa45fa4de9b6b140a59Timo Sirainen
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainenvoid quota_root_recalculate_relative_rules(struct quota_root_settings *root_set);
2b682d8d3661800f16aceaa45fa4de9b6b140a59Timo Sirainenint quota_count(struct quota_root *root, uint64_t *bytes_r, uint64_t *count_r);
62300a38f91227b9de043a9a8ec1d4f1978e1138Timo Sirainen
1795e934ebcd58175d3b5bbdd811b13c7889efa3Timo Sirainen#endif