Thibault HUTTIN-PASSERON
2020-May-14 19:28 UTC
[Dovecot v2.3.9.3] HTTP API Endpoint for mailbox cryptokey operations
Hello everyone, I successfully set up the mail_crypt plugin using folder keys, and require user's key to be encrypted with a password using mail_crypt_require_encrypted_user_key = yes. As I'm trying to streamline the process of creating a user, and want to develop an application in PHP to help me in that process, I'm very interested in the doveadm HTTP API. Although the mail_crypt plugin is not referenced in the API, I discovered that it could be accessed all the same, provided some camelCase changes. So far I've been able to generate the following json for the mailbox cryptokey generate command: curl -X POST -H "Authorization: X-Dovecot-API <base64-api-token>" -H "Content-Type: application/json" -d '[["mailboxCryptokeyGenerate",{"user":"<username>","userKeyOnly":true},"tag1"]]' http://localhost:8081/doveadm/v1 which is able to give me the same output as the related command: doveadm mailbox cryptokey generate -u <username> -U. This only works if a keypair has already been generated for the user, which is kind of counter-productive in my use case. I would like to know if there was a way to adapt the following command into a json API call : doveadm -o plugin/mail_crypt_private_password=<password> mailbox cryptokey generate -u <username> -U Especially the -o plugin/mail_crypt_private_password=<password> part, since it seems I've figured out the other part partly tinkering partly looking through the source code. Thanks everyone for your input. Thibault PASSERON PS : excerpts from my configuration : doveconf -n ========== # 2.3.9.3 (9f41b88fa): /etc/dovecot/dovecot.conf # Pigeonhole version 0.5.9 (db4e9a2f) # OS: Linux 5.6.7-300.fc32.x86_64 x86_64 Fedora release 32 (Thirty Two) # Hostname: <hostname> auth_mechanisms = plain login dict { sqldict = mysql:/etc/dovecot/dovecot-sql-dict.conf.ext } doveadm_api_key = # hidden, use -P to show it mail_attribute_dict = proxy:dict:sqldict mail_plugins = quota mail_crypt passdb { args = /etc/dovecot/dovecot-sql.conf.ext driver = sql } plugin { mail_crypt_curve = secp521r1 mail_crypt_require_encrypted_user_key = yes mail_crypt_save_version = 2 } service dict { unix_listener dict { group = vmail mode = 0600 user = vmail } } service doveadm { inet_listener http { port = 8081 } unix_listener doveadm-server { } } userdb { args = /etc/dovecot/dovecot-sql.conf.ext driver = sql } protocol lmtp { mail_plugins = quota mail_crypt sieve } dovecot-sql.conf.ext =================== driver = mysql connect = "host=/var/lib/mysql/mysql.sock user=<user> password=<pass> dbname=<db>" #SQL Query used to fetch the user from the DB user_query = SELECT email as user, \ CONCAT('*:bytes=',quota) AS quota_rule, \ '/var/spool/mail/virtual_mailboxes/%d/%n' as home, \ 5000 AS uid, \ 5000 AS gid, \ crypt AS mail_crypt_save_version \ FROM virtual_users WHERE email='%u'; #SQL Query used to fetch the user's password from the DB password_query = SELECT password, \ crypt AS userdb_mail_crypt_save_version, \ '%w' AS userdb_mail_crypt_private_password \ FROM virtual_users WHERE email='%u'; #SQL Query to iterate over all users iterate_query = SELECT email AS user FROM virtual_users; dovecot-sql-dict.conf.ext ======================== #driver = mysql connect = "host=/var/lib/mysql/mysql.sock user=<user> password=<pass> dbname=<db>" # User's private keys map { pattern = priv/$mailboxid/vendor/vendor.dovecot/pvt/crypt/privkeys/$digest table = virtual_users_cryptokeys_priv_dict username_field = email value_field = key_contents fields { mailbox_id = $mailboxid key_digest = $digest } } map { pattern = priv/$mailboxid/vendor/vendor.dovecot/pvt/server/vendor/vendor.dovecot/pvt/crypt/privkeys/$digest table = virtual_users_cryptokeys_priv_server_dict username_field = email value_field = key_contents fields { mailbox_id = $mailboxid key_digest = $digest } } #User's active private key map { pattern = priv/$mailboxid/vendor/vendor.dovecot/pvt/crypt/active table = virtual_users_cryptokeys_priv_active_dict username_field = email value_field = key_digest fields { mailbox_id = $mailboxid } } map { pattern = priv/$mailboxid/vendor/vendor.dovecot/pvt/server/vendor/vendor.dovecot/pvt/crypt/active table = virtual_users_cryptokeys_priv_active_server_dict username_field = email value_field = key_digest fields { mailbox_id = $mailboxid } } #Public keys map { pattern = shared/$mailboxid/vendor/vendor.dovecot/pvt/crypt/pubkeys/$digest table = virtual_users_cryptokeys_shared_dict value_field = key_contents fields { mailbox_id = $mailboxid key_digest = $digest } } map { pattern = shared/$mailboxid/vendor/vendor.dovecot/pvt/server/vendor/vendor.dovecot/pvt/crypt/pubkeys/$digest table = virtual_users_cryptokeys_shared_server_dict value_field = key_contents fields { mailbox_id = $mailboxid key_digest = $digest } } #Active public keys map { pattern = shared/$mailboxid/vendor/vendor.dovecot/pvt/server/vendor/vendor.dovecot/pvt/crypt/active table = virtual_users_cryptokeys_shared_active_server_dict value_field = key_digest fields { mailbox_id = $mailboxid } } map { pattern = shared/$mailboxid/vendor/vendor.dovecot/pvt/crypt/active table = virtual_users_cryptokeys_shared_active_dict value_field = key_digest fields { mailbox_id = $mailboxid } }