Force recalculation of a user's quota after setting a new value

This commit is contained in:
John Supplee 2019-02-05 01:47:09 +02:00
parent 937ef47c2a
commit 686a074fab
1 changed files with 27 additions and 10 deletions

View File

@ -361,6 +361,8 @@ def add_mail_user(email, pw, privs, quota, env):
# write databasebefore next step # write databasebefore next step
conn.commit() conn.commit()
dovecot_quota_recalc(email)
# Update things in case any new domains are added. # Update things in case any new domains are added.
return kick(env, "mail user added") return kick(env, "mail user added")
@ -385,6 +387,7 @@ def hash_password(pw):
# http://wiki2.dovecot.org/Authentication/PasswordSchemes # http://wiki2.dovecot.org/Authentication/PasswordSchemes
return utils.shell('check_output', ["/usr/bin/doveadm", "pw", "-s", "SHA512-CRYPT", "-p", pw]).strip() return utils.shell('check_output', ["/usr/bin/doveadm", "pw", "-s", "SHA512-CRYPT", "-p", pw]).strip()
def get_mail_quota(email, env): def get_mail_quota(email, env):
conn, c = open_database(env, with_connection=True) conn, c = open_database(env, with_connection=True)
c.execute("SELECT quota FROM users WHERE email=?", (email,)) c.execute("SELECT quota FROM users WHERE email=?", (email,))
@ -394,6 +397,7 @@ def get_mail_quota(email, env):
return rows[0][0] return rows[0][0]
def set_mail_quota(email, quota, env): def set_mail_quota(email, quota, env):
# validate that password is acceptable # validate that password is acceptable
quota = validate_quota(quota) quota = validate_quota(quota)
@ -404,8 +408,21 @@ def set_mail_quota(email, quota, env):
if c.rowcount != 1: if c.rowcount != 1:
return ("That's not a user (%s)." % email, 400) return ("That's not a user (%s)." % email, 400)
conn.commit() conn.commit()
dovecot_quota_recalc(email)
return "OK" return "OK"
def dovecot_quota_recalc(email):
# dovecot processes running for the user will not recognize the new quota setting
# a reload is necessary to reread the quota setting, but it will also shut down
# running dovecot processes. Email clients generally log back in when they lose
# a connection.
subprocess.call(['doveadm', 'reload'])
# force dovecot to recalculate the quota info for the user.
subprocess.call(["doveadm", "quota", "recalc" "-u", "%s" % email])
def get_default_quota(env): def get_default_quota(env):
config = utils.load_settings(env) config = utils.load_settings(env)
return config.get("default-quota", '0') return config.get("default-quota", '0')