# HG changeset patch # User Pascal Volk # Date 1637530533 0 # Node ID b678a1c430278b90cb4c1ca3f4ad791aa16354fc # Parent 659c4476c57ce41a673c9a7a98a5d33db5b345f0 Removed files -> Git: `git clone https://bitbucket.org/pvo/vmm.git` diff -r 659c4476c57c -r b678a1c43027 COPYING --- a/COPYING Mon Mar 24 19:22:04 2014 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -Copyright (c) 2007 - 2014, Pascal Volk -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - 3. Neither the names of the authors nor the names of its contributors may be - used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff -r 659c4476c57c -r b678a1c43027 ChangeLog --- a/ChangeLog Mon Mar 24 19:22:04 2014 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4168 +0,0 @@ -=== 0.6.2 === -2014-02-01 Pascal Volk - - * UPGRADE: - UPGRADE: Added a note about upgrading from 0.6.1. - [19184d1265e5] [tip] - - * doc/web/source/conf.py, doc/web/source/download.rst, - doc/web/source/features.rst, - doc/web/source/installation/install_vmm.rst, - doc/web/source/installation/postgresql_configuration.rst, - doc/web/source/pgsql_set_permissionspermissions.rst, - doc/web/source/release_history.rst, - doc/web/source/substitutions.rst, - doc/web/source/upgrade/0.5-0.6.rst: - doc/web: Updated documentation for vmm-0.6.2. - [6c369b680ab0] - - * update_config.py: - update_config: Updated to work with version 0.6.1. - [9149e0249c25] - -2014-01-29 Pascal Volk - - * VirtualMailManager/domain.py: - VMM/domain: RE_DOMAIN: Check Punycode TLDs more precise. - [ad15e89a93ec] - -2014-01-27 Pascal Volk - - * COPYING, VirtualMailManager/__init__.py, - VirtualMailManager/account.py, VirtualMailManager/alias.py, - VirtualMailManager/aliasdomain.py, VirtualMailManager/catchall.py, - VirtualMailManager/cli/__init__.py, - VirtualMailManager/cli/clihelp.py, VirtualMailManager/cli/config.py, - VirtualMailManager/cli/handler.py, VirtualMailManager/cli/main.py, - VirtualMailManager/cli/subcommands.py, VirtualMailManager/common.py, - VirtualMailManager/config.py, VirtualMailManager/constants.py, - VirtualMailManager/domain.py, VirtualMailManager/emailaddress.py, - VirtualMailManager/errors.py, VirtualMailManager/ext/__init__.py, - VirtualMailManager/ext/postconf.py, VirtualMailManager/handler.py, - VirtualMailManager/mailbox.py, VirtualMailManager/maillocation.py, - VirtualMailManager/network.py, VirtualMailManager/password.py, - VirtualMailManager/pycompat/__init__.py, - VirtualMailManager/pycompat/hashlib.py, - VirtualMailManager/quotalimit.py, VirtualMailManager/relocated.py, - VirtualMailManager/serviceset.py, VirtualMailManager/transport.py, - pgsql/set-permissions.py, setup.py, update_config.py, vmm: - Updated copyright notices to include the year 2014. - [58815c004a61] - - * VirtualMailManager/handler.py: - VMM/handler: Improved domaininfo subcommand. - - Check all labels for ASCII-compatible encoding, not only the first - one. If something is in ACE format, convert it to IDNA. - [01db2457bbed] - -2014-01-26 Pascal Volk - - * README, VirtualMailManager/domain.py: - VMM/domain: Accept also ccTLDs and 'new' gTLDs. - [110491a871a7] - -2013-08-27 Pascal Volk - - * doc/web/source/_templates/layout.html: - doc/web: Removed layout.html template. - [4c8e15c2f01b] - -2013-06-08 Pascal Volk - - * doc/web/source/ext_references.rst, - doc/web/source/howto/manage_domains.rst, - doc/web/source/installation/dovecot_configuration.rst, - doc/web/source/installation/postfix_configuration.rst: - doc/web: Added a note about using Dovecot's LMTP with Postfix. This - solves issue #1. - [61aaa7a98ec0] - -2013-01-05 Pascal Volk - - * COPYING, VirtualMailManager/__init__.py, - VirtualMailManager/account.py, VirtualMailManager/alias.py, - VirtualMailManager/aliasdomain.py, - VirtualMailManager/cli/__init__.py, - VirtualMailManager/cli/clihelp.py, VirtualMailManager/cli/config.py, - VirtualMailManager/cli/handler.py, VirtualMailManager/cli/main.py, - VirtualMailManager/cli/subcommands.py, VirtualMailManager/common.py, - VirtualMailManager/config.py, VirtualMailManager/constants.py, - VirtualMailManager/domain.py, VirtualMailManager/emailaddress.py, - VirtualMailManager/errors.py, VirtualMailManager/ext/__init__.py, - VirtualMailManager/ext/postconf.py, VirtualMailManager/handler.py, - VirtualMailManager/mailbox.py, VirtualMailManager/maillocation.py, - VirtualMailManager/network.py, VirtualMailManager/password.py, - VirtualMailManager/pycompat/__init__.py, - VirtualMailManager/pycompat/hashlib.py, - VirtualMailManager/quotalimit.py, VirtualMailManager/relocated.py, - VirtualMailManager/serviceset.py, VirtualMailManager/transport.py, - setup.py, update_config.py, vmm: - Updated copyright notices to include the year 2013. - [d24f094d1cb5] - -2012-12-09 Pascal Volk - - * VirtualMailManager/account.py: - VMM/account: Fixed a typo in Account.delete(). - - Due to a wrong placed comma `userdelete … force' ended in a - TypeError. - [29295afafa91] - -2012-11-21 Pascal Volk - - * po/fi.po: - po: Updated Finnish translation (translated by Jorma Karvonen). - [86c2ed36aba8] - -2012-11-03 Pascal Volk - - * doc/web/source/installation/prerequisites.rst: - doc/web: Updated OpenBSD's package names. - [54172669bbae] - -2012-10-31 Pascal Volk - - * doc/web/source/installation/postfix_configuration.rst: - doc/web: Fixed a typo. - [6f1aba75b693] - -2012-10-30 Pascal Volk - - * VirtualMailManager/password.py: - VMM/password: Added scheme SCRAM-SHA-1. - [8ea32fbfc9df] - -2012-10-28 Pascal Volk - - * Configure.Dovecot_2, doc/web/source/_static/local.conf, - doc/web/source/installation/dovecot_configuration.rst: - Documentation: Fixed dictionary quota URI. - [152ea3e3e955] - - * install.sh: - install.sh: Don't fail if $SYSCONFDIR doesn't exist. - [9b4d0e2c97d5] - -2012-10-24 Pascal Volk - - * doc/web/source/ext_references.rst: - doc/web/ext_references: Fixed URL of pg_hba.conf. - [c4c687668b6d] - -2012-10-19 Pascal Volk - - * README, doc/web/source/download.rst: - doc/web: Added links to the Debian package and the git repos. - - README: Added git-URL. - [8009e87c7a20] - -2012-10-03 Pascal Volk - - * .hgtags: - Added tag vmm-0.6.1 for changeset 682431c45b24 - [6463832d690e] - - * ChangeLog, NEWS, VirtualMailManager/constants.py, setup.py: - Released vmm-0.6.1 - [682431c45b24] [vmm-0.6.1] - -=== 0.6.1 === -2012-10-03 Pascal Volk - - * doc/web/source/conf.py, doc/web/source/download.rst, - doc/web/source/howto/manage_accounts.rst, - doc/web/source/installation/install_vmm.rst, - doc/web/source/installation/postgresql_configuration.rst, - doc/web/source/pgsql_set_permissionspermissions.rst, - doc/web/source/release_history.rst, - doc/web/source/substitutions.rst, - doc/web/source/upgrade/0.5-0.6.rst: - doc/web: Updated documentation for vmm-0.6.1. - [f151defe7078] [tip] - -2012-10-02 martin f. krafft - - * man/de/man1/vmm.1, man/man1/vmm.1: - Add list* commands to manpages - [ac27f89fad86] - -2012-10-01 Pascal Volk - - * UPGRADE: - UPGRADE: Added procedure for updating from v0.6.0. - [e1fc4a3075de] - -2012-09-30 Pascal Volk - - * update_config.py: - update_config: Updated to work with version 0.6.0. - - Fixed some PEP8 related issues. - [d7101e496795] - -2012-09-29 Pascal Volk - - * doc/web/source/howto/general_subcommands.rst, - doc/web/source/howto/manage_alias_addresses.rst, - doc/web/source/howto/manage_catch-all_addresses.rst: - doc/web: Updated and extended documentation. - - Updated description of subcommands aliasdelete and catchalldelete. - Added description of subcommands listaddresses, listaliases, - listrelocated and listusers. - [e60b8ed5fd35] - - * VirtualMailManager/cli/clihelp.py: - VMM/cli/clihelp: Added missing help messages. - - Added descriptions of subcommands listaddresses, listaliases, - listrelocated and listusers. - [d8b60e53334f] - -2012-09-27 Pascal Volk - - * po/nl.po: - po: Updated Dutch translation (translated by Erwin Poeze). - [ca882a1ff90b] - - * VirtualMailManager/alias.py: - VMM/alias: Load destination addresses sorted. - - This produces sorted output for the aliasinfo subcommand. - [4ec5c015b7aa] - - * VirtualMailManager/alias.py, VirtualMailManager/catchall.py, - VirtualMailManager/cli/clihelp.py, - VirtualMailManager/cli/subcommands.py, - VirtualMailManager/handler.py, man/de/man1/vmm.1, man/man1/vmm.1: - VMM: {alias,catchall}delete: Accept multiple destinations. - [d8736bb80bdc] - -2012-09-24 Pascal Volk - - * po/nl.po: - po: Updated Dutch translation (translated by Erwin Poeze). - [9eecf0160c39] - -2012-09-23 Pascal Volk - - * VirtualMailManager/cli/main.py: - VMM/cli/main: Check if we have warnings before exiting. - - If so, print them and exit afterwards. - [996bfcae49b0] - -2012-09-16 Pascal Volk - - * VirtualMailManager/domain.py: - VMM/domain: Enabled transport-validation. - - Validate the transport also in Domain.set_transport() and - Domain.update_transport(). - [5882bfdf83e8] - - * VirtualMailManager/account.py, VirtualMailManager/common.py: - VMM: Moved transport-validation to common. - [1ec3497a6733] - -2012-09-15 Pascal Volk - - * VirtualMailManager/account.py: - VMM/account: Fixed account's transport check. - - Make sure that 'virtual:' isn't used as transport when the mailbox- - format is set to mdbox or sdbox. - [7b3494f1a2ef] - -2012-09-12 Pascal Volk - - * po/nl.po: - po: Updated Dutch translation (translated by Erwin Poeze). - [924535664ecc] - -2012-09-05 Pascal Volk - - * VirtualMailManager/account.py, VirtualMailManager/catchall.py, - VirtualMailManager/cli/subcommands.py, VirtualMailManager/common.py, - VirtualMailManager/config.py, VirtualMailManager/domain.py, - VirtualMailManager/handler.py: - PEP8: Fixed all PEP8 related issues. - [8e9b0046bc8f] - -2012-09-03 Pascal Volk - - * po/vmm.pot: - po: Regenerated vmm.pot - [b6c4e77046b9] - - * VirtualMailManager/cli/clihelp.py, - VirtualMailManager/cli/subcommands.py, VirtualMailManager/common.py: - Added a few comments for the Translation Project. - [56ec275911f2] - - * VirtualMailManager/catchall.py, VirtualMailManager/cli/clihelp.py, - VirtualMailManager/cli/subcommands.py, - VirtualMailManager/ext/postconf.py: - VMM: Corrected/updated some msgids. - - Unified some messages and corrected a few typos. - [0ed93eb8b364] - -2012-09-02 Pascal Volk - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: Corrected username's usage string. - - username's name argument is optional. - [46454ff9d441] - - * VirtualMailManager/cli/clihelp.py, - VirtualMailManager/cli/subcommands.py: - VMM/cli: Activated help subcommand. - - Implemented Command.help_(), which reads the command's help message - from cli.clihelp. - [ab97727357a4] - - * VirtualMailManager/handler.py: - VMM/handler: Fixed user{quota,services,transport} subcommands. The - subcommands user{quota,services,transport} actually failed with the - arguments '
domain'. This is part II of changeset - a75923ce2842 - [b994444f7dee] - - * doc/web/source/howto/manage_accounts.rst: - doc/web: Added missing userservices description. Fixed order of - subcommand listing. - [7fdc4b2d4640] - - * man/man1/vmm.1: - man: Typo-fix. - [981f02b2d4c5] - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: Corrected two usage strings. domainnote's and - usernote's note argument is optional. - [af88f01e5bfa] - -2012-09-01 Pascal Volk - - * VirtualMailManager/cli/subcommands.py, VirtualMailManager/common.py: - VMM: Decode localized numbers to the current encoding. That avoids - UnicodeDecodeErrors since locale.format(%d) may return localized - numbers, which contain NO-BREAK SPACE as the thousands separator. - [463b10c258d9] - -2012-08-28 Pascal Volk - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: Don't mark empty strings as translatable. - gettext('') returns the header entry with meta information, not the - empty string. - [0571f45501da] - - * doc/web/source/upgrade/0.5-0.6.rst: - doc/web: Added description 'Upgrade to Dovecot ≧ v1.2.beta2'. - [82e722f35aab] - -2012-08-27 Pascal Volk - - * pgsql/dovecot_update_v1.2+.pgsql: - pgsql: Added dovecot_update_v1.2+.pgsql. Use this file when you are - upgrading your Dovecot installation to a version >= 1.2.beta2. - [bb23693e5fc9] - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: Reverted accidentally committed help() code. - [c79fdce49908] - - * VirtualMailManager/cli/subcommands.py, pgsql/create_tables.pgsql: - pgsql/create_tables.pgsql: Eliminated two unnecessary differences. - Yeah, cosmetic only. - [607aa5c2acc4] - - * pgsql/create_tables.pgsql, pgsql/update_tables_0.5.x-0.6.pgsql: - pgsql: Don't select service_set.ssid in dovecotpassword() - unconditional. This may cause an empty result, which will make - logins impossible. - [86b967c0f1a1] - - * VirtualMailManager/serviceset.py: - VMM/serviceset: Fixed a conditional ProgrammingError. Affects only - setups with Dovecot < v1.2.beta2. Actually the SQL query in method - ServiceSet._load_by_services wasn't updated. - - Removed unnecessary code, which would have also produced a - ProgrammingError, if it would have been correct. - [cdbe200c0ecc] - -2012-08-23 Pascal Volk - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: Added 'missing' newline below domain notes. - This patch contains also a small code cleanup and PEP8-fix. - [3dc1764c23d2] - -2012-08-19 Pascal Volk - - * doc/web/source/howto/manage_accounts.rst: - doc/web: Added the transport filed to the usertransport example. - [ef384bc8fde6] - -2012-08-12 Pascal Volk - - * doc/web/source/howto.rst, - doc/web/source/howto/general_subcommands.rst, - doc/web/source/howto/manage_accounts.rst, - doc/web/source/howto/manage_alias_addresses.rst, - doc/web/source/howto/manage_alias_domains.rst, doc/web/source/howto - /manage_catch-all_addresses.rst, - doc/web/source/howto/manage_domains.rst, - doc/web/source/howto/manage_relocated_users.rst, - doc/web/source/index.rst, - doc/web/source/installation/install_vmm.rst: - doc/web: Added the 'Howto'. The reStructuredText version of vmm.1, - in multiple parts. - [2b165e90e225] - - * man/de/man1/vmm.1, man/man1/vmm.1: - man/{de/}man1: A few more corrections. - [9d343514b832] - - * man/de/man1/vmm.1, man/man1/vmm.1: - man/{de/}man1: Small corrections for domaininfo's description. - [60907fc875f7] - - * man/de/man5/vmm.cfg.5, man/man5/vmm.cfg.5: - man/{de/}man5: s/Wiki/Homepage/g - [dcde0010cdf8] - -2012-08-11 Pascal Volk - - * man/de/man1/vmm.1, man/man1/vmm.1: - man/{de/}man1: s/Wiki/Homepage/g - [8767ec854084] - -2012-08-08 martin f. krafft - - * VirtualMailManager/common.py: - VMM/common: Improve search_address complexity Checking the - dictionary (a hash) for existence of a key is likely to be - O(log(n)), while checking a list is O(n). Therefore, to increase - performance, this patch changes the check accordingly. - [cd1200d06700] - -2012-08-07 Pascal Volk - - * doc/web/source/_static/vmm.cfg: - doc/web: Refreshed vmm.cfg - [ffd24974ed68] - - * vmm.cfg: - vmm.cfg: Updated/improved comments. - [f9a2327f57a6] - -2012-08-07 martin f. krafft - - * VirtualMailManager/common.py: - If an alias has multiple destinations, multiple records exist, due - to the nature of the database. address_list would then return the - same alias multiple times, which does not add any information, eats - screen space and is potentially confusing. - - Therefore, we SELECT DISTINCTly from the alias table. - - Signed-off-by: martin f. krafft - --- VirtualMailManager/common.py | 2 +- 1 file changed, 1 - insertion(+), 1 deletion(-) - [a479c38931c4] - - * VirtualMailManager/common.py: - Due to the UNION query in address_list, the assumption that the list - of gids received from the database would be continuous does not - hold. - - To prevent addresses for domains with multiple entry types from - being listed, it is necessary to check the list of domain gids for - every entry. - - Signed-off-by: martin f. krafft - --- VirtualMailManager/common.py | 4 +--- 1 file changed, 1 - insertion(+), 3 deletions(-) - [605f8c115711] - -2012-07-29 Pascal Volk - - * doc/web/source/installation/dovecot_configuration.rst, - doc/web/source/installation/postgresql_configuration.rst: - doc/web: Emphasized a few lines of Dovecot/PostgreSQL configuration - file excerpts. - [9c138471d569] - - * .hgignore: - .hgignore: "doc/build" is no longer required. - [b62210b96ea7] - - * doc/web/Makefile, doc/web/source/_static/local.conf, - doc/web/source/_static/vmm.cfg, doc/web/source/_static/vmm_logo.png, - doc/web/source/_templates/layout.html, doc/web/source/conf.py, - doc/web/source/download.rst, doc/web/source/ext_references.rst, - doc/web/source/features.rst, doc/web/source/index.rst, - doc/web/source/install.rst, - doc/web/source/installation/dovecot_configuration.rst, - doc/web/source/installation/install_vmm.rst, - doc/web/source/installation/postfix_configuration.rst, - doc/web/source/installation/postgresql_configuration.rst, - doc/web/source/installation/prerequisites.rst, - doc/web/source/installation/system_preparation.rst, - doc/web/source/pgsql_set_permissionspermissions.rst, - doc/web/source/release_history.rst, - doc/web/source/substitutions.rst, doc/web/source/upgrade.rst, - doc/web/source/upgrade/0.4.x-0.5.rst, - doc/web/source/upgrade/0.5-0.6.rst, doc/web/source/vmm.cfg.rst: - doc: Added source of http://vmm.localdomain.org/. - [be0906181a10] - - * doc/Makefile, doc/api/Makefile, doc/api/source/conf.py, - doc/api/source/index.rst, doc/api/source/vmm.rst, - doc/api/source/vmm_alias.rst, doc/api/source/vmm_config.rst, - doc/api/source/vmm_constants_error.rst, - doc/api/source/vmm_emailaddress.rst, doc/api/source/vmm_errors.rst, - doc/api/source/vmm_relocated.rst, doc/source/conf.py, - doc/source/index.rst, doc/source/vmm.rst, doc/source/vmm_alias.rst, - doc/source/vmm_config.rst, doc/source/vmm_constants_error.rst, - doc/source/vmm_emailaddress.rst, doc/source/vmm_errors.rst, - doc/source/vmm_relocated.rst: - doc: Moved API documentation to doc/api. - [20141b967c0b] - -2012-07-22 Pascal Volk - - * INSTALL: - INSTALL: Updated PostgreSQL configuration URL. Use ${sql} and - ${proxysql} expressions in the main.cf description. - [4f9079dd4b65] - -2012-07-01 Pascal Volk - - * README: - README: Substituted a few words. - [0be27a75776a] - -2012-06-30 Pascal Volk - - * README: - README: Updated URL of the hg repository@sf.net. - [f9e6e0a237f0] - - * man/man1/vmm.1: - man: Deleted erroneous placed backslash. - [9acf628bf0be] - -2012-06-28 Pascal Volk - - * .hgtags: - Added tag vmm-0.6.0 for changeset 3238c58d01ae - [0643c25121b5] - - * ChangeLog, NEWS, VirtualMailManager/constants.py, setup.py: - Released vmm-0.6.0 - [3238c58d01ae] [vmm-0.6.0] - -=== 0.6.0 === -2012-06-28 Pascal Volk - - * VirtualMailManager/Account.py, VirtualMailManager/Alias.py, - VirtualMailManager/AliasDomain.py, VirtualMailManager/Config.py, - VirtualMailManager/Domain.py, VirtualMailManager/EmailAddress.py, - VirtualMailManager/Exceptions.py, - VirtualMailManager/MailLocation.py, VirtualMailManager/Relocated.py, - VirtualMailManager/Transport.py, - VirtualMailManager/VirtualMailManager.py, - VirtualMailManager/constants/ERROR.py, - VirtualMailManager/constants/EXIT.py, - VirtualMailManager/constants/VERSION.py, - VirtualMailManager/constants/__init__.py, - VirtualMailManager/ext/Postconf.py, pgsql - /create_optional_types_and_functions-dovecot-1.2.x.pgsql, - pgsql/create_optional_types_and_functions.pgsql, - pgsql/update_tables_0.4.x-0.5.pgsql, - pgsql/update_tables_0.5.x_for_dovecot-1.2.x.pgsql, - pgsql/update_types_and_functions_0.5.x_for_dovecot-1.2.x.pgsql, - postfix/pgsql-transport.cf, update_config_0.4.x-0.5.py: - Merged changes from v0.6.x(28230a8230bf). - [a4aead244f75] [tip] - - * Close v0.6.x branch. - [28230a8230bf] - - * vmm: - vmm: Don't insert the module directory into sys.path by default. - Doesn't make much sense, if the code is installed inside sys.path. - [54a84a311654] - - * COPYING, VirtualMailManager/__init__.py, - VirtualMailManager/account.py, VirtualMailManager/alias.py, - VirtualMailManager/aliasdomain.py, - VirtualMailManager/cli/__init__.py, - VirtualMailManager/cli/config.py, VirtualMailManager/cli/handler.py, - VirtualMailManager/cli/main.py, - VirtualMailManager/cli/subcommands.py, VirtualMailManager/common.py, - VirtualMailManager/config.py, VirtualMailManager/constants.py, - VirtualMailManager/domain.py, VirtualMailManager/emailaddress.py, - VirtualMailManager/errors.py, VirtualMailManager/ext/__init__.py, - VirtualMailManager/ext/postconf.py, VirtualMailManager/handler.py, - VirtualMailManager/mailbox.py, VirtualMailManager/maillocation.py, - VirtualMailManager/network.py, VirtualMailManager/password.py, - VirtualMailManager/pycompat/__init__.py, - VirtualMailManager/pycompat/hashlib.py, - VirtualMailManager/quotalimit.py, VirtualMailManager/relocated.py, - VirtualMailManager/serviceset.py, VirtualMailManager/transport.py, - setup.py, update_config.py, vmm: - Updated copyright notices to include the year 2012. - [14abdd04ddf5] - - * TODO: - TODO: Removed "listpwschemes" entry. Was done with changeset - a64c1b5e08b4 - [11ed67ee7ebb] - - * UPGRADE: - UPGRADE: Updated documentation. - [007786e58fb7] - - * VirtualMailManager/cli/subcommands.py, man/de/man1/vmm.1, - man/man1/vmm.1: - VMM/cli/subcommands: Replaced the keyword `default' by `domain'. - Patch by Martin F. Krafft - [a75923ce2842] - -2012-06-27 Pascal Volk - - * Configure.Dovecot_2, INSTALL: - INSTALL: Added description how to create additional dove* - user/group. `doveauth' user and group for the authentication process - and the group `dovemail' for mail related Dovecot processes. - [55148bc6348e] - - * INSTALL: - INSTALL: Updated documentation. - [b17a9d7a59ae] - - * Configure.Dovecot_2, install.sh, upgrade.sh: - Configure.Dovecot_2: Added configuration documentation for Dovecot_2 - >= 2.0. - [b5bb7b34e831] - - * VirtualMailManager/account.py, - VirtualMailManager/cli/subcommands.py: - VMM: The Python 2.4.x compatibility commit - part III. - [b0165b7af7a3] - - * VirtualMailManager/account.py: - VMM/account: Check the account's transport only when we have a - transport. - [2662f4e17eb4] - - * VirtualMailManager/account.py, - VirtualMailManager/cli/subcommands.py, - VirtualMailManager/handler.py: - VMM: The Python 2.4.x compatibility commit. - [cc0f67f99780] - -2012-06-14 Pascal Volk - - * pgsql/set-permissions.py: - pgsql/set-permissions.py: Extended permissions. Postfix needs read - access on the postfix_gid view. Dovecot needs read permissions on - both mailboxformat columns. - [2fcf12fdecc2] - - * VirtualMailManager/handler.py: - VMM/handler: Restored method Handler.domain_transport(). It went - somehow lost with changeset 5806fb74130b. - [1498abbb6c91] - -2012-05-31 Pascal Volk - - * pgsql/set-permissions.py: - pgsql: Added helper script: set-permissions.py. - [fbbb16476c5b] - -2012-04-15 martin f. krafft - - * TODO, VirtualMailManager/cli/handler.py, - VirtualMailManager/cli/subcommands.py, VirtualMailManager/common.py, - VirtualMailManager/constants.py, VirtualMailManager/handler.py: - Provide list{addresses,aliases,users,relocated} subcommands - - The patch provides the list{addresses,aliases,users,relocated} - subcommands to the UI. All commands actually take the same path in - the code and only one query is run with different parameters for - each case. - - There are still two shortcomings: - - 1. With alias domains, the output order is not as one might want - it, e.g. - - foo@example.org bar@example.org - foo@example.com bar@example.com - - when it should really be foo@ twice and then bar@ twice. I have - not found a way to modify the SQL accordingly. - - 2. The SELECT queries for Accounts, Alias and Relocated are hard- - coded in common.py. - [499c63f52462] - - * man/de/man1/vmm.1, man/de/man5/vmm.cfg.5, man/man1/vmm.1, - man/man5/vmm.cfg.5: - man: escape hyphens - - Hyphens inside words must be spelt \- instead of just -. This patch - fixes up the manpages. - * * * . - [a93671970617] - - * man/de/man1/vmm.1, man/man1/vmm.1: - man: add 'catchall' to domaininfo - - Since the addition of catchall, the domaininfo subcommand can also - take 'catchall' as a [detail] to limit the output of details to the - catch-all aliases. - - Also, the number of catch-all destinations is now included in the - simple domaininfo output. - [6f2c41c3c7d6] - -2012-04-15 Pascal Volk - - * man/de/man1/vmm.1, man/man1/vmm.1: - man: vmm1: Use `fqdn' instead of `domain' in catchall* descriptions. - Fixed a typo s/cadd/cad/. Replaced double quotes by \(dq. - [107f7a3be9f5] - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: Use the `fqdn' argument placeholder also for - catch-all subcommands. - [62f2daff853e] - -2012-04-15 martin f. krafft - - * pgsql/create_tables-dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql, - pgsql/update_tables_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_tables_0.5.x-0.6.pgsql: - Fix transport_maps function for non-existent domains - - The postfix_transport_maps function had a bug causing - - 2012-04-15 17:40:22 CEST LOG: statement: SELECT transport FROM - postfix_transport_map('logcheck', 'domine.madduck.net'); - 2012-04-15 17:40:22 CEST ERROR: query returned no rows - - when the domain was not in the database. This would make did be NULL - and make the query fail. - - This patch moves the tid query until after a check for did. If the - latter is NULL, the function RETURNs (rather than fails). - [867d950ce7b7] - - * pgsql/create_tables-dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql, - pgsql/update_tables_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_tables_0.5.x-0.6.pgsql: - Revert caching of destination interpolation - - Since 'destination' comes from the table in the query, it cannot be - cached across queries! Doh! - [44a808af6cf4] - -2012-04-15 Pascal Volk - - * pgsql/update_tables_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_tables_0.5.x-0.6.pgsql: - pgsql: update_tables_*: Added missing `NOT' to `… tid DROP NOT - NULL;'. - [92ef34f07da3] - - * pgsql/create_tables-dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql: - pgsql: Create column `note' as text. - [5020c56f9388] - -2012-04-15 martin f. krafft - - * VirtualMailManager/common.py: - Add docstring for common.format_domain_default - [79f09cdd1a21] - -2012-04-14 martin f. krafft - - * man/de/man1/vmm.1, man/man1/vmm.1: - Document domainnote in manpages - - 5806fb74130b did not contain this, so I must have forgotten it. - Oops. - [47254b46c361] - - * TODO: - Remove domain/account notes from TODO - [ff805bd17817] - - * VirtualMailManager/account.py: - Include account note in getuser output - - Modify the getuser output to include an account note, if one is - present - [1b3bdce0bf87] - - * VirtualMailManager/cli/subcommands.py: - Display formatted notes in info output - - If the user/domain object has an attached note, this patch makes the - userinfo/domaininfo output print the note, wrapped to the terminal - size. - [c3b98364f03d] - - * .hgignore: - Ignore *.egg-status build directory created by setuptools - [a582f1452bc0] - - * man/de/man1/vmm.1, man/man1/vmm.1: - Add user/domainnote commands to manpages - [a8ee0328f908] - - * VirtualMailManager/account.py, - VirtualMailManager/cli/subcommands.py, VirtualMailManager/domain.py, - VirtualMailManager/handler.py: - Add note field to Account/Domain and CLI - [5806fb74130b] - - * pgsql/create_tables-dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql, - pgsql/update_tables_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_tables_0.5.x-0.6.pgsql: - Modify SQL to add note field to domain_data and users - [1f9ea5658627] - -2012-04-14 Pascal Volk - - * man/de/man1/vmm.1, man/man1/vmm.1: - man: vmm.1: subcommand's name argument is optional now. Based on - martin f. krafft's v2 of changeset c340ba4bd544. - [9a23043b0530] - -2012-04-14 martin f. krafft - - * VirtualMailManager/cli/subcommands.py, - VirtualMailManager/handler.py, man/de/man1/vmm.1, man/man1/vmm.1: - Allow username to take no argument to erase value - - Once a username has been set, it could not be removed via the UI. - Now, if no argument is passed to username, the value stored is - replaced with NULL. - [c340ba4bd544] - - * README: - Add inheritance as a feature to README - [e956ddc868c0] - - * VirtualMailManager/domain.py, man/de/man1/vmm.1, man/man1/vmm.1: - Change 'force' argument to reset user records for tid/ssid/qid - - If domain{quotalimit,transport,serviceset} are run with 'force' and - settings are inheritable from the domain, then rather than to copy - the ID to the user table, the affected field in the user records - should be set to NULL so that the domain default is used. - [6a27c7529cd7] - - * VirtualMailManager/cli/subcommands.py, - VirtualMailManager/handler.py, man/de/man1/vmm.1, man/man1/vmm.1: - Change UI to accept 'default' to restore inherited values - - Instead of explicit values for tid/ssid/qid, the UI now accepts - 'default', which removed user-pecific settings and hence causes - domain defaults to be used. - [2676dbf43e1c] - -2012-04-13 martin f. krafft - - * VirtualMailManager/account.py, - VirtualMailManager/cli/subcommands.py, VirtualMailManager/common.py: - Modify userinfo output to indicate when domain defaults are - displayed - - When Account instances reference NULL tid/qid/ssid, the data must - come from the associated domain, and this should be indicated. For - transport and services, this is easy to do as the string passed in - the info dict can simply be modified. For quotalimit, however, - another method must be used due to the CLI-side formatting. - - All approaches use a common formatter outsourced to the common.py - file. - [2bb40aaef94e] - - * VirtualMailManager/account.py: - Modify Account class to handle NULL references - - This patch modifies the Account class to defer to using the - associated domain's tid/ssid/qid fields if the per-instance fields - are None/NULL. - [cf3eb03c1c4f] - - * pgsql/create_tables-dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql, - pgsql/update_tables_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_tables_0.5.x-0.6.pgsql: - Modify SQL update script to accept NULL fields for users - - The value NULL in the qid/ssid/tid fields of the user table means - that the value from the associated domain record should be used - instead. - - This patch modifies the PL/pgSQL functions used by Dovecot and - Postfix accordingly. - [95dd123b552e] - - * man/de/man1/vmm.1, man/man1/vmm.1: - man: Add examples for userservices - [916b468cf994] - -2012-04-14 Pascal Volk - - * VirtualMailManager/account.py, - VirtualMailManager/cli/subcommands.py, VirtualMailManager/common.py, - pgsql/create_tables-dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql, - pgsql/update_tables_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_tables_0.5.x-0.6.pgsql: - Reverted previous three changesets (e09139525580, 85517c8fde36, - 3acbff727626) - [4b8c3f51d7da] - -2012-04-13 martin f. krafft - - * VirtualMailManager/account.py, - VirtualMailManager/cli/subcommands.py, VirtualMailManager/common.py: - Modify userinfo output to indicate when domain defaults are - displayed - - When Account instances reference NULL tid/qid/ssid, the data must - come from the associated domain, and this should be indicated. For - transport and services, this is easy to do as the string passed in - the info dict can simply be modified. For quotalimit, however, - another method must be used due to the CLI-side formatting. - - All approaches use a common formatter outsourced to the common.py - file. - [e09139525580] - - * VirtualMailManager/account.py: - Modify Account class to handle NULL references - - This patch modifies the Account class to defer to using the - associated domain's tid/ssid/qid fields if the per-instance fields - are None/NULL. - [85517c8fde36] - - * pgsql/create_tables-dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql, - pgsql/update_tables_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_tables_0.5.x-0.6.pgsql: - Modify SQL update script to accept NULL fields for users - - The value NULL in the qid/ssid/tid fields of the user table means - that the value from the associated domain record should be used - instead. - - This patch modifies the PL/pgSQL functions used by Dovecot and - Postfix accordingly. - [3acbff727626] - -2012-04-14 martin f. krafft - - * TODO: - Add list* subcommands to TODO - [3ffe4ee3740f] - - * TODO: - add domain/account notes to TODO - [f494a593c674] - -2012-04-13 martin f. krafft - - * TODO: - Add my WIP items to the TODO list - [dc66f66c51cf] - - * pgsql/create_tables-dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql, - pgsql/update_tables_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_tables_0.5.x-0.6.pgsql: - Cache interpolated destination - - Instead of running the string modification function for destination - interpolation twice, store the result once and use the stored result - subsequently. - [75d1c0d6bb8f] - -2012-04-12 Pascal Volk - - * man/man1/vmm.1: - man: Use example.com in catchallinfo example output. - [a0a27688e616] - - * README: - README: reStructuredText fix: ERROR/3 and WARNING/2. - [b1fd6f08f369] - -2012-04-11 martin f. krafft - - * README, man/de/man1/vmm.1, man/man1/vmm.1, pgsql/create_tables- - dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql, - pgsql/update_tables_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_tables_0.5.x-0.6.pgsql: - Enable interpolation of alias destinations - - This patch modifies the virtual_alias_maps function so that the - destination address is parsed for the place holders %n, %d and %=, - which are replaced with the localpart, the domain or the full - address with '@' replaced by '=' of the queried key. - - In combination with alias domains, this allows for domain-specific - recipients. - - E.g. given example.org and its alias domain example.com, defining an - alias - - postmaster@example.org → postmaster+%d@example.org - - will cause mail to postmaster@example.*com* to go to - postmaster+example.*com*@example.org. - [5ec2068d02af] - - * README: - Add catch-all aliases to README/features - [88466a6ba3ae] - -2012-04-10 martin f. krafft - - * man/de/man1/vmm.1, man/man1/vmm.1: - Add catchall subcommands to manpages - [b2084e7f6854] - - * VirtualMailManager/cli/subcommands.py, VirtualMailManager/domain.py, - pgsql/create_tables-dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql, - pgsql/update_tables_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_tables_0.5.x-0.6.pgsql: - Include catch-all count in domaininfo output - [09fa019bb330] - - * pgsql/create_tables-dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql, - pgsql/update_tables_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_tables_0.5.x-0.6.pgsql: - Make PL/pgSQL function feed back identity for mailboxes/relocated - when there are catchall destinations. - - Without catchall aliases, if no virtual_alias matches, the query can - just return NULL and Postfix will later check mailboxes/relocated - for the address to rewrite. - - However, since virtual aliases are handled long before - mailboxes/relocated, a catchall alias would also catch mail to - mailboxes and relocated addresses, which we do not want. - - The way to tell postfix to keep delivering is for the virtual alias - map to return the search key itself (identity function). - - This patch changes the postfix_virtual_alias_maps Pl/pgSQL function - to do exactly that, but only if there are catchall destinations - defined for the domain in question — otherwise it returns NULL when - no match is found. - [d863a44a6353] - - * VirtualMailManager/catchall.py: - Fix syntax errors - [557c4703986c] - - * pgsql/create_tables-dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql, - pgsql/update_tables_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_tables_0.5.x-0.6.pgsql: - Modify virtual_alias_maps function to check mailboxes/relocated - first - [821d3ffaaaca] - - * pgsql/create_tables-dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql, - pgsql/update_tables_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_tables_0.5.x-0.6.pgsql: - Make virtual_alias_maps function search catchall when no aliases are - found - [0244f1344b04] - - * VirtualMailManager/cli/subcommands.py, VirtualMailManager/domain.py, - VirtualMailManager/handler.py: - Add catchall info to domain_info output - [1fa354bbdb90] - - * VirtualMailManager/catchall.py: - Correct syntax errors - [1a9247e9763f] - -2012-04-09 martin f. krafft - - * VirtualMailManager/handler.py: - Fixup catchall_info to return iterator, not self - [18870919ec48] - - * VirtualMailManager/catchall.py: - Correct syntax errors - [2aae58cddfa9] - - * VirtualMailManager/cli/subcommands.py: - Teach CLI about catchall* commands - [fb0ffde628d6] - - * VirtualMailManager/handler.py: - Provide catchall_* methods to the Handler class - [3da8c919584f] - - * VirtualMailManager/catchall.py: - First version of a CatchallAlias class - - I based the CatchallAlias class in catchall.py heavily on the Alias - class, but by copy, not deriving. The two are functionally related, - but the implementations are too different because CatchallAliases - have no localpart. - [f180ead60568] - - * pgsql/create_tables-dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql, - pgsql/update_tables_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_tables_0.5.x-0.6.pgsql: - Add database table for catchall destinations - - Catch-all aliases are stored for a domain. Since there can be - multiple destinations per domain, this is done using a 1:n relation - on the gid. - - This commit extends the SQL schema definition and also provides - appropriate upgrade DDL. - [492c179094c9] - -2012-04-08 Pascal Volk - - * pgsql/create_optional_types_and_functions-dovecot-1.2.x.pgsql, - pgsql/create_optional_types_and_functions.pgsql, pgsql - /create_tables-dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql, - pgsql/update_tables_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_tables_0.5.x-0.6.pgsql, - pgsql/update_types_and_functions_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_types_and_functions_0.5.x-0.6.pgsql: - pgsql: Merged types and functions into the create_tables… files. - [e1b32377032f] - - * postfix/pgsql-relocated_maps.cf, postfix/pgsql-transport_maps.cf, - postfix/pgsql-virtual_alias_maps.cf, postfix/pgsql- - virtual_mailbox_maps.cf, postfix/pgsql-virtual_uid_maps.cf: - postfix: Removed VIEW-based comments from configuration files. - [f2387d60624b] - - * pgsql/create_tables-dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql, - pgsql/update_tables_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_tables_0.5.x-0.6.pgsql: - pgsql: Removed most of the VIEWs. - - There are only two views left for now: - - postfix_gid - - vmm_domain_info - - All other views have a faster replacement: plpgsql functions. - [5ccc9c6e5193] - -2012-04-08 martin f. krafft - - * .hgignore: - Ignore even more Debian-build-related files - [23d04d1f29e8] - - * .hgignore: - Ignore more Debian-build-related files - - Debian produces log and debhelper files in debian/* that do not need - to be known to mercurial. Hence, this patch adds the globs to - .hgignore. - [419c929739fd] - - * TODO: - Add non-root TODO - [5b9a03762813] - -2012-04-07 Pascal Volk - - * VirtualMailManager/config.py: - VMM/config: Fixed a typo: s/DB_MUDULES/DB_MODULES/g. - [17f2c5b5098e] - -2012-04-07 martin f. krafft - - * .hgignore: - Ignore build files related to Debian packaging - - During Debian packaging, the package is built in ./debian/vmm/, and - quilt is used (./.pc/). Both directories contain only generated - files and should hence be ignored from the perspective of Mercurial. - [612a60e9d558] - - * .hgignore: - Instruct mercurial to ignore build directory - - Python's distutil builds the package into ./build/, which can and - should be ignored with respect to the repository. This patch simply - adds the appropriate line to .hgignore. - [2c5e2613eca8] - -2012-04-06 Pascal Volk - - * VirtualMailManager/handler.py: - VMM/handler: Create domain directory with umask 0022. - [30365a87650d] - -2012-04-07 martin f. krafft - - * VirtualMailManager/domain.py: - Modify address check query to obtain well-defined result - - The way in which UNION does not yield the desired result, because - (a) UNION merges results and (b) the result order is undefined. This - patch changes the query to select the counts as columns and hence - provides a well-defined order. - [e5c2b3647971] - -2012-04-06 Pascal Volk - - * postfix/pgsql-smtpd_sender_login_maps.cf: - postfix: Uncommented the query in pgsql-smtpd_sender_login_maps.cf. - [320531aa1280] - - * postfix/pgsql-transport.cf, postfix/pgsql-transport_maps.cf: - postfix: Renamed pgsql-transport.cf to pgsql-transport_maps.cf. Now - it matches pgsql-${postfix-parameter}.cf. - [9cdc6ef83265] - -2012-03-29 Pascal Volk - - * po/fr.po: - po: Updated French translation (translated by Dimitri Duc). - [e0441b07bccc] - -2012-03-13 Pascal Volk - - * po/fi.po: - po: Updated Finnish translation (translated by Jorma Karvonen). - [b8d5564b4e42] - -2011-12-13 Pascal Volk - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: Fixed a TypeError in user_info(). - [fb0af82ab4af] - -2011-12-05 Pascal Volk - - * postfix/pgsql-relocated_maps.cf, postfix/pgsql-transport.cf, postfix - /pgsql-virtual_alias_maps.cf, postfix/pgsql-virtual_mailbox_maps.cf, - postfix/pgsql-virtual_uid_maps.cf: - postfix: Use pgsql functions in query templates where possible. - [ccdfbbb1bb01] - - * pgsql/create_optional_types_and_functions-dovecot-1.2.x.pgsql, - pgsql/create_optional_types_and_functions.pgsql: - pgsql: Updated required privileges for function dovecotpassword. - [10e9b4855173] - -2011-11-27 Pascal Volk - - * README: - README: Added section `Installation Prerequisites'. Reworked some - parts. - [35395b49bc44] - -2011-11-26 Pascal Volk - - * update_config.py, upgrade.sh: - update_config: Write the old package install dir to a tmp file. - - upgrade: Remove old CamelCase files. Removed some unused variables. - [fb210a116f18] - -2011-11-13 Pascal Volk - - * VirtualMailManager/serviceset.py: - VMM: The pyPgSQL compatibility commit. - [428ee9cdf1b2] - - * VirtualMailManager/cli/subcommands.py, VirtualMailManager/config.py: - VMM: The Python 2.4.x compatibility commit. - [90d69ae4f40d] - - * VirtualMailManager/relocated.py: - VMM/relocated: Don't accept something@localhost as destination. - [099de308fd98] - - * man/de/man1/vmm.1, man/man1/vmm.1: - man1: Updated configuration related descriptions/examples, - accordingly to commit 4ff0fa3ba0fa. - [b33bdc0c3669] - -2011-11-12 Pascal Volk - - * VirtualMailManager/constants.py, man/de/man1/vmm.1, - man/de/man5/vmm.cfg.5, man/man1/vmm.1, man/man5/vmm.cfg.5, setup.py: - Updated the author's e-mail address. - [6278a7a2a476] - -2011-11-12 Pascal Volk - - * man/de/man1/vmm.1, man/de/man5/vmm.cfg.5, man/man1/vmm.1, - man/man5/vmm.cfg.5: - man: Updated the URL of the bug tracker. - [86fa217cba11] - -2011-11-11 Pascal Volk - - * man/de/man5/vmm.cfg.5, man/man5/vmm.cfg.5: - man5: Updated the `usable password schemes' part. - [c30ce0e079b6] - -2011-11-10 Pascal Volk - - * man/de/man1/vmm.1, man/man1/vmm.1: - man1: Copied new formatted/translated command output into the - examples. - [e321b764268e] - -2011-11-09 Pascal Volk - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: Small improvement of domaininfo's output. - Pointed out that the displayed quota limit is valid per user. - [4353981e3a7f] - - * man/de/man1/vmm.1, man/man1/vmm.1: - man1: Removed obsolete commands and added new commands. - [9b9cccebccf0] - - * man/de/man1/vmm.1: - man/de/man1: Removed translated argument names. - [8f59a2f539e7] - -2011-11-08 Pascal Volk - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: Use the common output formatting in - list_pwschemes(). - [5d0114f7bb99] - - * VirtualMailManager/handler.py: - VMM/handler: Added a comment for the Translation Project. - [807ad4df0774] - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: Subcommand argument placeholders are no longer - translatable. - [1ebb6b88f589] - -2011-11-07 Pascal Volk - - * po/de.po: - po: Updated German translation (translated by Mario Blättermann). - [89bf9389d62f] - - * po/vmm.pot: - po: Updated address for message-id bug reports. Looks like as sf.net - would have horrible configured mail servers. :-/ - [b4d21e8bfa00] - - * merged changes from default(c0e1fb1b0145) - [863c691d7d14] - - * po/fi.po: - po: Added Finnish translation to the repository. Many thanks to - Jorma Karvonen from the Translation Project for the work. - [c0e1fb1b0145] - - * VirtualMailManager/password.py: - VMM/password: list_schemes(): report suffixes with a leading dot. - [7d4d79ff08d0] - - * po/de.po, po/vmm.pot: - po: Updated messages template and German translation. - [b175c9f62602] - -2011-11-06 Pascal Volk - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: Added new subcommand `listpwschemes' (lp). - Marked version()'s ctx argument as unused. - [a64c1b5e08b4] - - * VirtualMailManager/password.py: - VMM/password: Added function list_schemes(). - [cabdf94ec580] - - * man/de/man5/vmm.cfg.5, man/man5/vmm.cfg.5: - man5: Moved some option descriptions to section doamin, accordingly - to commit 4ff0fa3ba0fa. Added a brief explanation of which settings - will be applied in which situations. - [e57dd007d69a] - -2011-11-05 Pascal Volk - - * update_config.py: - update_config: Updated, so that the previous config modifications - will be applied to 0.5.2 configurations files. - [033a0436894f] - - * VirtualMailManager/cli/subcommands.py, VirtualMailManager/config.py, - VirtualMailManager/handler.py, vmm.cfg: - VMM/config: Moved some options to section `domain': - - old new - ------------------------------------------------------------ - account.imap -> domain.imap account.pop3 - -> domain.pop3 account.sieve -> domain.sieve - account.smtp -> domain.account - - misc.quota_bytes -> domain.quota_bytes - misc.quota_messages -> domain.quota_messages misc.transport - -> domain.transport - [4ff0fa3ba0fa] - - * VirtualMailManager/__init__.py: - VMM: Show a warning when a unsupported locale setting was detected. - [2019aa415dcd] - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: Small improvement in domain_add(). Inform the - admin, when the postmaster account will be auto-created. - [7847f949d0a2] - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: Fixed a small failure in alias_info(). - [b15960e9c53c] - - * TODO: - TODO: updated … - [7d27627c7fb0] - - * VirtualMailManager/domain.py: - VMM/domain: Extended Domain._chk_state() to support both states. - [f2934105181b] - -2011-11-04 Pascal Volk - - * VirtualMailManager/constants.py: - VMM/constants: Cleared out obsolete error codes. - [63ae77f05088] - - * VirtualMailManager/account.py: - VMM/account: Removed unused import. - [2408a3cd4bea] - - * VirtualMailManager/maillocation.py, - VirtualMailManager/quotalimit.py: - VMM/{maillocation,quotalimit}: Unified object initialization code. - Simply raise a ValueError for wrong values (unknown IDs). - [fd4aa073015f] - - * VirtualMailManager/errors.py, VirtualMailManager/transport.py: - VMM/transport: Reworked Transport initialization. Set the transport - id only if we could find a transport with that id. Raise a - ValueError instead of a translatable TransportError(VMMError). - VMM/errors: Deleted class TransportError, it is no longer needed. - [6826acb9b0a7] - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: domainservices: Don't fail when neither a - service nor the keyword force was provided. - [45c917e6a386] - - * VirtualMailManager/cli/subcommands.py, VirtualMailManager/domain.py, - VirtualMailManager/handler.py: - VMM/domain: Extended/updated Domain.get_info() in order to: - - include active service(s) || None - - use more understandable English terms - - VMM/cli/subcommands: Updated (order of) keys of `domaininfo' output. - .`userinfo' will always show `sieve', no longer `managesieve'. - [c31d604e26d3] - -2011-11-03 Pascal Volk - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: Small indent fix. - [18b75e6a39d5] - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: Added subcommand domainservices (ds). Replaced - subcommands userdisable and userenable by userservices (us). - [b8c94e06cd46] - -2011-11-02 Pascal Volk - - * VirtualMailManager/account.py, VirtualMailManager/handler.py: - VMM/account: Integrated class ServiceSet in class Account. Replaced - methods Account.enable() and Account.disable() by - Account.update_serviceset(). VMM/handler: Replaced methods - Handler.user_disable() and Handler.user_enable() by - Handler.user_services() - [95275b61ff8a] - -2011-11-01 Pascal Volk - - * VirtualMailManager/serviceset.py: - VMM/serviceset: Added @property ServiceSet.services -> dict. - [e2b9e3de2b51] - - * VirtualMailManager/account.py: - VMM/account: Sorted imports … - [abcd73f5e980] - - * VirtualMailManager/domain.py, VirtualMailManager/handler.py: - VMM/domain: Integrated class ServiceSet in class Domain. - VMM/handler: Extended Handler.domain_add() and added - Handler.domain_services(). Removed unused domain.get_gid import. - [1af5fe0683ce] - - * VirtualMailManager/serviceset.py: - VMM/serviceset: Use SERVICES inside of ServiceSet - avoid slicing. - [1a08fe35b496] - -2011-10-31 Pascal Volk - - * VirtualMailManager/serviceset.py: - VMM/serviceset: Added module constant SERVICES. - [39036f5e6387] - -2011-10-30 Pascal Volk - - * VirtualMailManager/serviceset.py: - VMM: Added new module serviceset - provides class ServiceSet. - [e35efe931af3] - -2011-10-28 Pascal Volk - - * pgsql/create_optional_types_and_functions-dovecot-1.2.x.pgsql, - pgsql/create_optional_types_and_functions.pgsql, pgsql - /create_tables-dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql, - pgsql/update_tables_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_tables_0.5.x-0.6.pgsql, - pgsql/update_types_and_functions_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_types_and_functions_0.5.x-0.6.pgsql: - pgsql: Added new table `service_set'. Moved columns `smtp', `pop3' - `imap' and `sieve' from the `users' table to the new `service_set' - table. - [9823548b2717] - -2011-10-26 Pascal Volk - - * update_config.py: - update_config: Set database.module to pyPgSQL only when psycopg2 is - unavailable. - [d296a020f440] - - * README: - README: Added contet. - [ee6f8ac06197] - - * man/de/man1/vmm.1.rst, man/de/man5/vmm.cfg.5.rst, - man/substitute_links.rst, man/substitute_links_1.rst, - man/substitute_links_5.rst: - man: Removed reStructuredText files. - [3ca31d080432] - - * man/de/man1/vmm.1, man/de/man5/vmm.cfg.5: - man: Reworked/updated German manual pages. - [c2543ddde9f5] - -2011-10-25 Pascal Volk - - * man/man1/vmm.1: - man: Added missing `.RE' macro to sub section userinfo (ui). - [ad7cfbfbc68d] - -2011-10-16 Pascal Volk - - * po/de.po: - po: Fixed 2 fatal msgfmt errors inde.po. - [fdd05a757f43] - - * po/de.po: - po: Updated German translation. - [c11edcfc6e5f] - - * VirtualMailManager/cli/subcommands.py, po/vmm.pot: - Messages: Replaced some 'Available' by 'Existing'. - [9842650569c2] - - * po/vmm.pot: - po: Regenerated vmm.pot - [0d8e7977ae63] - -2011-09-03 Pascal Volk - - * VirtualMailManager/emailaddress.py: - VMM/emailaddress: Class DestinationEmailAddress accepts also - something@localhost addresses now. - [8e41e77b84e6] - - * VirtualMailManager/handler.py: - VMM/handler: Handler.alias_delete() also use class - DestinationEmailAddress for the destination address, instead of - class EmailAddress. - [933b9debbec1] - - * VirtualMailManager/alias.py: - VMM/alias: Alias.del_destination() corrected the value assignment in - the error message's dictionary. - [8394e222aba3] - - * VirtualMailManager/alias.py: - VMM/alias: Alias._load_dests() use class DestinationEmailAddress for - destination addresses, instead of class EmailAddress. - [46c296c6e231] - -2011-07-31 Pascal Volk - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: user_add() show only generated passwords - not - the given. - [a43a2e20de71] - -2011-03-10 Pascal Volk - - * VirtualMailManager/cli/handler.py, - VirtualMailManager/ext/postconf.py, VirtualMailManager/handler.py, - VirtualMailManager/mailbox.py: - VMM: Deleted a few unused variables. - [33a45e4c80c4] - -2011-03-05 Pascal Volk - - * VirtualMailManager/network.py: - VMM/network: Added new module network. - [ff2a61e155db] - -2011-02-27 Pascal Volk - - * VirtualMailManager/cli/main.py, - VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: Added function update_cmd_map(). So the items - will be added to the cmd_map when gettext's _() has been installed - -> translatable subcommand descriptions. - [d4a341248500] - -2011-02-24 Pascal Volk - - * po/vmm.pot: - po: Regenerated vmm.pot - [241b192bfcc8] - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: The keyword 'force' is no longer translatable. - [542a4d23a9f0] - - * VirtualMailManager/account.py, VirtualMailManager/alias.py, - VirtualMailManager/aliasdomain.py, - VirtualMailManager/cli/__init__.py, - VirtualMailManager/cli/handler.py, VirtualMailManager/cli/main.py, - VirtualMailManager/cli/subcommands.py, VirtualMailManager/domain.py, - VirtualMailManager/emailaddress.py, - VirtualMailManager/ext/postconf.py, VirtualMailManager/handler.py, - VirtualMailManager/password.py, VirtualMailManager/relocated.py: - VMM: Updated some messages. (doesn't, isn't) -> (does not, is not) - Added missing dots at the end of some sentences. - [8209da83e256] - - * man/man1/vmm.1, man/man5/vmm.cfg.5: - man: Replaced unnecessary \(aq glyphs in man1/vmm.1. Updated COPYING - section in man1/vmm.1 and man5/vmm.cfg.5. - [f32b323fd347] - -2011-02-22 Pascal Volk - - * VirtualMailManager/mailbox.py: - VMM/mailbox: Use the correct mailbox hierarchy separator in - Mailbox.add_boxes() for mdbox and sdbox mailbox format. - [c7a963e6cf6e] - - * VirtualMailManager/cli/subcommands.py, VirtualMailManager/common.py: - VMM: Report quota usage/limit/percentage values formatted according - to the current LC_ALL setting. - [ae1a8428298c] - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: Improved legibility of domaininfo's "quota - limit" output a little bit. - [e5b3b225bd5b] - - * man/man5/vmm.cfg.5, man/man5/vmm.cfg.5.rst: - man/man5: Reworked/updated vmm.cfg.5. Removed vmm.cfg.5.rst. - [65687300ba19] - - * man/man1/vmm.1: - man/man1: Small syntax fixes in vmm.1. - [1ca025a5ce0c] - -2011-02-21 Pascal Volk - - * man/man1/vmm.1, man/man1/vmm.1.rst: - man/man1: Reworked/updated vmm.1. Removed vmm.1.rst. - reStructuredText was nice to edit but the generated output … - [2bc9c36c1387] - -2011-02-18 Pascal Volk - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: Update also the RunContext's subcommand if - 'plan A' in {,alias}domain_info() fails. - [54a89c19e534] - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: Fixed a msgid issue (format string with unnamed - arguments). - [f6e55b27fe07] - - * VirtualMailManager/handler.py, VirtualMailManager/quotalimit.py: - VMM: Solve the default "misc.quota_bytes = '0'" problem where it may - occur. - [3162ff959375] - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: Made argument names translatable. - [58e23bd7c97f] - -2011-02-14 Pascal Volk - - * man/de/man1/vmm.1.rst, man/man1/vmm.1.rst, - man/substitute_links_1.rst: - man1/vmm.1.rst: Added subcommands domainquota and userquota. Updated - description of subcommand aliasadd. - [da80de422b3c] - -2011-02-13 Pascal Volk - - * VirtualMailManager/account.py, VirtualMailManager/domain.py: - VMM/{account,domain}: Added a versions check to the - update_quotalimit methods of classes Account and Domain. - [0c52094447b0] - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: Implemented subcommands domainquota and - userquota. - [a4f5d4cd886d] - - * VirtualMailManager/domain.py: - VMM/domain: Execute the database updates of - Domain.update_{quotalimit,transport}() when argument force is True, - even when the 'new' setting is the same as the current one. - [8984b1f4e6e3] - -2011-02-12 Pascal Volk - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: Divided 'quota usage' from userinfo subcommand - into 'quota storage' and 'quota messages'. - [00a8c12a3da3] - - * VirtualMailManager/quotalimit.py: - VMM/quotalimit: Don't fail in QuotaLimit.__init__, if we get the - deafult misc.quota_bytes value: '0'. - [0512d940918f] - - * VirtualMailManager/common.py: - VMM/common: Reworked human_size() once more. Return bytes w/o - prefix. Use translatable $FOO_bibyte prefixes, e.g., MiB. - [fb22773f7a85] - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: Added quota limit/usage output to - {domain,user}info subcommands. - [3e5ed678d535] - -2011-02-11 Pascal Volk - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: config_get: Print configured misc.quota_bytes - in human readable format. - [cf661a40266d] - - * VirtualMailManager/common.py: - VMM/common: human_size() size argument can be also a string. Because - the default value of misc.quota_bytes is '0', a string in order to - accept also settings like '500M'. - [7f931c1ca059] - - * VirtualMailManager/common.py: - VMM/common: human_size accept also 0 as size. - [0a13849243f2] - - * VirtualMailManager/common.py: - VMM/common: Small code cleanup in human_size(). - [d3a3c6155879] - - * VirtualMailManager/common.py: - VMM/common: Added function human_size(). - [fb2ba1456bc5] - -2011-02-10 Pascal Volk - - * VirtualMailManager/domain.py: - VMM/domain: Adjusted Domain.get_info() to the updated - vmm_domain_info view. - [ffce67e3c6eb] - - * pgsql/create_tables-dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql, - pgsql/update_tables_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_tables_0.5.x-0.6.pgsql: - pgsql: Updated view vmm_domain_info. No longer select data we have - already. - [8217ddd5220d] - - * VirtualMailManager/account.py, VirtualMailManager/domain.py, - VirtualMailManager/handler.py: - VMM/{account,domain,handler}: Added quota limit support. A few small - modifications in class Account. - [660b42391c8e] - -2011-02-09 Pascal Volk - - * VirtualMailManager/account.py: - VMM/account: Removed unused method Account.set_transport(). - [5f7e9f778b29] - -2011-02-08 Pascal Volk - - * pgsql/create_tables-dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql, - pgsql/update_tables_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_tables_0.5.x-0.6.pgsql: - pgsql: Added quotalimit's bytes and messages to view - vmm_domain_info. - [dd95ed5bc9d2] - - * pgsql/create_tables-dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql, - pgsql/update_tables_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_tables_0.5.x-0.6.pgsql: - pgsql/{create,update}_tables*: Added the ON DELETE CASCADE clause to - table userquota{,_11}'s foreign-key constraint - fkey_userquota_uid_users. - [05dc4e1f8dff] - -2011-02-07 Pascal Volk - - * VirtualMailManager/mailbox.py: - VMM/mailbox: Added missing dummy translator (_) and comment for - method Mailbox._add_boxes. - [b7854259ad74] - - * VirtualMailManager/quotalimit.py: - VMM/quotalimit: Added new module quotalimit to the repository. - [0cae9989395b] - -2011-02-06 Pascal Volk - - * VirtualMailManager/config.py, man/de/man5/vmm.cfg.5.rst, - man/man5/vmm.cfg.5.rst, vmm.cfg: - VMM/config: Added quota_bytes and quota_messages settings. Updated - …/man5/vmm.cfg.5 and vmm.cfg. - [d3a97f7fb98a] - -2011-02-04 Pascal Volk - - * VirtualMailManager/common.py: - VMM/common: Added function size_in_bytes(). - [ac5ac03b58da] - - * pgsql/create_optional_types_and_functions-dovecot-1.2.x.pgsql, - pgsql/create_optional_types_and_functions.pgsql, pgsql - /create_tables-dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql, - pgsql/update_tables_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_tables_0.5.x-0.6.pgsql, - pgsql/update_types_and_functions_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_types_and_functions_0.5.x-0.6.pgsql: - pgsql/*: Added tables, triggers and functions for quota support. - [5e6bcb2e010e] - -2011-02-02 Pascal Volk - - * VirtualMailManager/handler.py: - VMM:/handler: Fixed typo introduced with the previous commit. - [98223e5c95e0] - - * VirtualMailManager/handler.py: - VMM/handler: Handler._make_domain_dir(): Check if the domain - directory exists before calling os.mkdir(). - [5aaf2dd6b146] - - * VirtualMailManager/alias.py, VirtualMailManager/aliasdomain.py, - VirtualMailManager/domain.py, VirtualMailManager/relocated.py, - VirtualMailManager/transport.py: - VMM/*: Use target column names in all INSERT statements. In order to - avoid trouble after the definition of a table was changed. - [7518d927d443] - -2011-02-01 Pascal Volk - - * INSTALL: - INSTALL: Updated "user_query". - [af56cee51e67] - -2011-01-28 Pascal Volk - - * VirtualMailManager/mailbox.py: - VMM/mailbox: Be more detailed if doveadm couldn't create mailboxes. - [920cb090eb09] - -2011-01-20 Pascal Volk - - * VirtualMailManager/cli/subcommands.py: - VMM/cli/subcommands: Update also the RunContext's subcommand if - 'plan A' in {alias,relocated,user}_info() fails. - [2af61bc06215] - - * VirtualMailManager/cli/handler.py, VirtualMailManager/handler.py: - VMM/{,cli/}handler: Moved the 'address-in-use check' (introduced - with changeset ef99be5b7ec0) to {alias,relocated,user}_add(). - [4cbaf8d229f9] - -2011-01-19 Pascal Volk - - * VirtualMailManager/account.py: - VMM/account: Account._count_aliases() cast the EmailAddress to str, - in order to avoid errors from the database. - [ecdba68c7a2c] - -2011-01-17 Pascal Volk - - * VirtualMailManager/handler.py: - VMM/handler: Handler.relocated_add() check if the target address' - domain is known, if so add a warning when the account/alias doesn't - exist. - [1016a17684c1] - - * VirtualMailManager/handler.py: - VMM/handler: Handler._get_{account,alias,relocated}() check if the - address is already in use. - [ef99be5b7ec0] - - * VirtualMailManager/handler.py: - VMM/handler: Handler.alias_add() and Handler.relocated_add() use - DestinationEmailAddress instances for target addresses. - [3b2fd0b4e51b] - -2011-01-17 Tobias Berling - - * VirtualMailManager/alias.py: - VMM/alias.py: Fixed TypeError when calling dbc.executemany() - [1b1f8f0cc687] - - * setup.py: - setup.py: Fixed syntax error - [4dfc5f3c1f2c] - - * pgsql/create_tables-dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql: - pgsql/create_tables{,-dovecot-1.2.x}.pgsql: Fixed syntax errors - [be4bd77dbe57] - -2011-01-17 Pascal Volk - - * VirtualMailManager/emailaddress.py: - VMM/emailaddress: Added class DestinationEmailAddress. - [a6ad9895989d] - -2011-01-14 Pascal Volk - - * COPYING, VirtualMailManager/__init__.py, - VirtualMailManager/account.py, VirtualMailManager/alias.py, - VirtualMailManager/aliasdomain.py, - VirtualMailManager/cli/__init__.py, - VirtualMailManager/cli/config.py, VirtualMailManager/cli/handler.py, - VirtualMailManager/cli/main.py, - VirtualMailManager/cli/subcommands.py, VirtualMailManager/common.py, - VirtualMailManager/config.py, VirtualMailManager/constants.py, - VirtualMailManager/domain.py, VirtualMailManager/emailaddress.py, - VirtualMailManager/errors.py, VirtualMailManager/ext/__init__.py, - VirtualMailManager/ext/postconf.py, VirtualMailManager/handler.py, - VirtualMailManager/mailbox.py, VirtualMailManager/maillocation.py, - VirtualMailManager/password.py, - VirtualMailManager/pycompat/__init__.py, - VirtualMailManager/pycompat/hashlib.py, - VirtualMailManager/relocated.py, VirtualMailManager/transport.py, - setup.py, update_config.py, vmm: - Updated copyright notices to include the year 2011. - [d6573da35b5f] - -2011-01-13 Pascal Volk - - * INSTALL: - merged changes from default(cfd29e65e4f2) - [61fdd77d2e65] - - * INSTALL: - INSTALL: Use the %L modifier for %u variable in password_query and - user_query. - [cfd29e65e4f2] - -2010-08-10 Pascal Volk - - * VirtualMailManager/domain.py: - VMM/domain: set_{directory,transport} make sure the domain is new. - Assertions could be optimized away. - [502d59f4bb34] - - * VirtualMailManager/cli/subcommands.py, man/de/man1/vmm.1.rst, - man/man1/vmm.1.rst, man/substitute_links_1.rst: - VMM/cli/subcommands: Added 'auto postmaster' to domain_add(). - [c2e8eab2616d] - - * VirtualMailManager/cli/handler.py, - VirtualMailManager/cli/subcommands.py, man/de/man1/vmm.1.rst, - man/man1/vmm.1.rst, man/substitute_links_1.rst: - VMM/cli/handler: Added support for random passwords in user_add(). - [971577b89d26] - -2010-08-09 Pascal Volk - - * VirtualMailManager/transport.py: - VMM/transport: Small error message 'improvement'. - [44283818f8db] - - * VirtualMailManager/config.py: - VMM/config: Added option mailbox.format to the configuration check. - [7fa919dab42c] - - * update_config.py: - update_config: Set pyPgSQL, maybe there is no psycopg2 installed. - [6fabb9cd212d] - - * man/de/man5/vmm.cfg.5.rst, man/man5/vmm.cfg.5.rst: - man5/vmm.cfg: Added description for new settings in section - database. - [095b43faaba5] - - * INSTALL, setup.py: - Updated INSTALL and setup.py. - [61e732e4cb3e] - - * VirtualMailManager/handler.py: - VMM/handler: Added support for psycopg2. - [48bf20b43f2e] - - * VirtualMailManager/cli/main.py: - VMM/cli/main: Adjusted _get_handler() to changes in config module. - [a653c43048b1] - - * VirtualMailManager/config.py: - VMM/config: Extended configuration check and raise only a - ConfigError. Added new settings 'module', 'port', and 'sslmode' to - the database section. - [2ae40cd0d213] - -2010-08-07 Pascal Volk - - * VirtualMailManager/account.py, VirtualMailManager/alias.py, - VirtualMailManager/aliasdomain.py, VirtualMailManager/domain.py, - VirtualMailManager/maillocation.py, VirtualMailManager/relocated.py, - VirtualMailManager/transport.py: - VMM/…: Provide parameters as tuple to cursor.execute(). - [22d115376e4d] - - * VirtualMailManager/handler.py: - VMM/handler: Small code cleanups. - [4bba5fb90b78] - - * VirtualMailManager/common.py: - VMM/common: Reformulated error message in exec_ok. - [b7a4d7828608] - - * VirtualMailManager/cli/config.py: - VMM/cli/config: Except the VMMError from exec_ok in configure(). - [d60ffbc0124b] - - * VirtualMailManager/config.py: - VMM/config: Use common.VERSION_RE, instead of defining the regexp - two times. - [ca7575401549] - - * VirtualMailManager/common.py: - VMM/common: Made the version re pattern object accessible as - VERSION_RE. Small 'global …' cleanups. - [586367ee042b] - -2010-08-06 Pascal Volk - - * VirtualMailManager/cli/handler.py: - VMM/cli/handler: Don't perform config and environment checks twice. - [95d45e4ec1a6] - - * VirtualMailManager/cli/subcommands.py, man/de/man1/vmm.1.rst, - man/man1/vmm.1.rst: - VMM/cli/subcommands: Added subcommands configget and configset. - [f8d5c8bb8bce] - - * VirtualMailManager/cli/config.py: - VMM/cli/config: CliConfig.set raise a ConfigError, if the new value - could not be set. - [0d2430dc6ef8] - - * VirtualMailManager/cli/main.py: - VMM/cli/main: Except more errors and handle them correct. - [9232ed7e4d85] - - * VirtualMailManager/config.py: - VMM/config: LazyConfig._get_section_option check for empty - section/option names. - [b0c971f943dc] - -2010-08-05 Pascal Volk - - * VirtualMailManager/account.py, VirtualMailManager/cli/config.py, - VirtualMailManager/cli/handler.py, - VirtualMailManager/cli/subcommands.py, - VirtualMailManager/emailaddress.py, VirtualMailManager/handler.py, - VirtualMailManager/relocated.py, po/vmm.pot: - VMM/…: Unified messages and removed non-ASCII quotes. VMM/account: - Added TP-comment back. Was accidentally removed in changeset - f9a6b6701cf9. Refreshed po/vmm.pot. - [6709d0faf2f5] - - * VirtualMailManager/cli/__init__.py, VirtualMailManager/cli/main.py, - VirtualMailManager/cli/subcommands.py, vmm: - vmm: Renamed to VirtualMailManager/cli/main.py. Splitted subcommands - out to VirtualMailManager/cli/subcommands.py. vmm: New created with - minimal code. - [4515afec62e5] - - * VirtualMailManager/cli/handler.py: - VMM/cli/handler: CliHandler.user_password: Only prompt for the - password if the Account exists. - [abff2de9eed0] - - * VirtualMailManager/account.py: - VMM/account: Made Account._services available as account.SERVICES. - [45834dcc280e] - -2010-08-04 Pascal Volk - - * VirtualMailManager/cli/handler.py, VirtualMailManager/handler.py: - VMM/{,cli/}handler: user_add: Check earlier if the account exists. - [150ddcc8b315] - -2010-08-03 Pascal Volk - - * VirtualMailManager/domain.py: - VMM/domain: Added missing comma in Domain.get_info's SELECT list. - [d24c2ea39710] - -2010-08-01 Pascal Volk - - * VirtualMailManager/handler.py, man/de/man1/vmm.1.rst, - man/man1/vmm.1.rst: - VMM/handler: Updated Handler.user_{disable,enable} methods to accept - a list of services. man/{,de/}man1/vmm.1.rst: Updated - userenable/userdisable part. - [7a471cace3ba] - - * VirtualMailManager/account.py: - VMM/account: Reworked methods enable/disable in order to accept - multiple services. - [3f550826b1cc] - -2010-07-30 Pascal Volk - - * VirtualMailManager/account.py, VirtualMailManager/handler.py, - man/de/man1/vmm.1.rst, man/man1/vmm.1.rst: - VMM/{account,handler}: Account delete, use the boolean keyword force - too. - [1ed85e696748] - - * man/de/man1/vmm.1.rst, man/man1/vmm.1.rst: - man/{,de/}man1/vmm.1.rst: Updated domaindelete part. - [352ca7f1b332] - - * VirtualMailManager/domain.py, VirtualMailManager/handler.py: - VMM/domain: Simplified Domain.delete() related methods and their - arguments, VMM/handler: Adjusted to the changes in the domain - module. - [270b57af85de] - - * VirtualMailManager/handler.py: - VMM/handler: _make_home() Create the domain directory if it doesn't - exist for some reason. - [3fe8d6cdbe3a] - - * VirtualMailManager/account.py, VirtualMailManager/handler.py: - VMM/account: Replaced property domain_directory by domain. - [41789df75339] - -2010-07-29 Pascal Volk - - * VirtualMailManager/common.py: - VMM/common: Removed unused import. - [85972d3ba936] - - * VirtualMailManager/handler.py: - VMM/handler: Use more common.lisdir() in Handler's methods _chkenv, - _delete_domain_dir, _delete_home, _get_disk_usage, _make_domain_dir, - and _make_home. Handler._make_home(): Also check if the domain - directory exists. - [bb9ff81928f1] - - * VirtualMailManager/common.py, VirtualMailManager/config.py, - VirtualMailManager/mailbox.py: - VMM/common: Replaced function is_dir() by lisdir(). - VMM/{config,mailbox}: Adjusted to the above change. - [8f8d9c4c8332] - - * VirtualMailManager/handler.py: - VMM/handler: Reworked methods _get_disk_usage, _delete_home and - _delete_domain_dir. Deleted method _isdir. - [06c0457036a0] - - * VirtualMailManager/constants.py: - VMM/constants: Added MIN_GID and MIN_UID. - [38e344ba3d0f] - -2010-07-28 Pascal Volk - - * VirtualMailManager/mailbox.py: - VMM/mailbox: Removed accidentally committed debug print statement. - [d58cc465dc61] - - * VirtualMailManager/alias.py, VirtualMailManager/cli/config.py, - VirtualMailManager/config.py, VirtualMailManager/emailaddress.py, - VirtualMailManager/mailbox.py, VirtualMailManager/relocated.py: - VMM/…: More PEP-8 fixes; eliminated __names. VMM/emailaddress: - Fixed™ methods __eq__ and __ne__. (I'm not pylint's nanny.) - [94bd10e237e5] - - * VirtualMailManager/transport.py: - VMM/transport: Converted _mixedCase method names to - _lower_case_with_underscores. Added missing docstrings. Fixed™ - methods __eq__ and __ne__. (I'm not pylint's nanny.) - [883d5cd66498] - - * VirtualMailManager/Account.py, VirtualMailManager/Alias.py, - VirtualMailManager/AliasDomain.py, VirtualMailManager/Config.py, - VirtualMailManager/Domain.py, VirtualMailManager/EmailAddress.py, - VirtualMailManager/Handler.py, VirtualMailManager/Relocated.py, - VirtualMailManager/Transport.py, VirtualMailManager/__init__.py, - VirtualMailManager/account.py, VirtualMailManager/alias.py, - VirtualMailManager/aliasdomain.py, VirtualMailManager/cli/Config.py, - VirtualMailManager/cli/Handler.py, - VirtualMailManager/cli/__init__.py, - VirtualMailManager/cli/config.py, VirtualMailManager/cli/handler.py, - VirtualMailManager/common.py, VirtualMailManager/config.py, - VirtualMailManager/domain.py, VirtualMailManager/emailaddress.py, - VirtualMailManager/errors.py, VirtualMailManager/ext/Postconf.py, - VirtualMailManager/ext/postconf.py, VirtualMailManager/handler.py, - VirtualMailManager/mailbox.py, VirtualMailManager/maillocation.py, - VirtualMailManager/password.py, VirtualMailManager/relocated.py, - VirtualMailManager/transport.py: - VMM/*: Made all modules names lowercase, adjusted imports. - [011066435e6f] - - * VirtualMailManager/Handler.py, VirtualMailManager/cli/Handler.py: - VMM//{,cli/}Handler: PEP-8-ified the Handler classes: - * converted CamelCase method names to lower_case_with_underscores - * eliminated __names - * added missing docstrings - [f4956b4ceba1] - -2010-07-27 Pascal Volk - - * VirtualMailManager/Handler.py, VirtualMailManager/cli/Handler.py: - VMM//{,cli/}Handler: Reworked configuration related parts. Renamed - attributes _Cfg -> _cfg; _cfgFileName -> _cfg_fname. Renamed methods - __chkCfgFile -> __check_cfg_file; __findCfgFile -> __find_cfg_file. - Added missing docstrings. - [4dc2edf02d11] - - * VirtualMailManager/constants.py: - VMM/constants: Added __copyright__. - [d619e97a8f18] - -2010-07-26 Pascal Volk - - * VirtualMailManager/Account.py, VirtualMailManager/Alias.py, - VirtualMailManager/AliasDomain.py, VirtualMailManager/Config.py, - VirtualMailManager/Domain.py, VirtualMailManager/EmailAddress.py, - VirtualMailManager/Handler.py, VirtualMailManager/Relocated.py, - VirtualMailManager/Transport.py, VirtualMailManager/__init__.py, - VirtualMailManager/cli/Config.py, VirtualMailManager/cli/Handler.py, - VirtualMailManager/cli/__init__.py, VirtualMailManager/common.py, - VirtualMailManager/constants.py, - VirtualMailManager/constants/ERROR.py, - VirtualMailManager/constants/EXIT.py, - VirtualMailManager/constants/__init__.py, - VirtualMailManager/constants/version.py, - VirtualMailManager/ext/Postconf.py, VirtualMailManager/mailbox.py, - VirtualMailManager/maillocation.py, VirtualMailManager/password.py: - VMM/constants: Replaced the constants subpackage by a module. - [31d8931dc535] - - * VirtualMailManager/cli/__init__.py: - VMM/cli: Forgot to remove string_io from __all__. - [81bccfd14355] - - * VirtualMailManager/cli/__init__.py: - VMM/cli: Removed misplaced function string_io. - [0b4a6e9d9f27] - - * VirtualMailManager/cli/Config.py: - VMM/cli/Config: Write warnings to stderr. Renamed method - __saveChanges to __save_changes. - [c17c46d9e440] - - * VirtualMailManager/cli/__init__.py: - VMM/cli: w_err() call os.sys.exit only if code != 0. read_pass() - write errors to stderr. And a few other small fixes. - [6f39a1e56f4a] - -2010-07-25 Pascal Volk - - * VirtualMailManager/ext/Postconf.py: - VMM/ext/Postconf: Reworked class Postconf. Added method edit(). - [a0a10100aee5] - -2010-07-23 Pascal Volk - - * VirtualMailManager/Handler.py: - VMM/Handler: Reworked __domDirMake and reamed to __make_domain_dir. - Removed the (now) unused method __makedir. - [644e2cc4a441] - - * VirtualMailManager/Handler.py, VirtualMailManager/mailbox.py: - VMM/mailbox: Added to the repository. VMM/Handler: Integrated - mailbox module. Code cleanups. - [d21423478803] - - * VirtualMailManager/Transport.py: - VMM/Transport: Small cosmetics. - [aa4a9fc31e1b] - - * VirtualMailManager/maillocation.py, man/de/man5/vmm.cfg.5.rst, - man/man5/vmm.cfg.5.rst, vmm.cfg: - VMM/maillocation: Dovecot >= 2.0.beta5 is required for `doveadm - mailbox create -s …` - [217b419d6561] - -2010-07-22 Pascal Volk - - * VirtualMailManager/Account.py: - VMM/Account: s/prefix/mbformat/ and pass the dbh to - MailLocation.__init__. - [504fd29b4712] - - * VirtualMailManager/maillocation.py: - VMM/maillocation: Renamed MailLocation's property prefix to - mbformat. - [3c62f581d17a] - - * VirtualMailManager/Config.py, man/de/man5/vmm.cfg.5.rst, - man/man5/vmm.cfg.5.rst, man/substitute_links_5.rst, vmm.cfg: - VMM/Config: Added boolean option mailbox.subscribe. - [df0f7b22540c] - - * VirtualMailManager/Config.py: - VMM/Config: Return mailbox.{folders,root} settings as Unicode. - [8dd3a107fd92] - -2010-07-21 Pascal Volk - - * VirtualMailManager/Account.py, VirtualMailManager/maillocation.py: - VMM/maillocation: Reworked class MailLocation to match the new - database structure. - [32b4a39b5640] - - * VirtualMailManager/Config.py: - VMM/Config: Added function check_mailbox_format(). - [e1d3f027dd64] - -2010-07-20 Pascal Volk - - * man/de/man5/vmm.cfg.5.rst: - man/de/man5/vmm.cfg.5.rst: Fixed a typo. - [efa001edc349] - - * man/de/man5/vmm.cfg.5.rst, man/man5/vmm.cfg.5.rst: - man/{,de/}man5/vmm.cfg.5.rst: Added mailbox.root, small updates. - [d15a27eaa9d2] - - * VirtualMailManager/Config.py, update_config.py, vmm.cfg: - VMM/Config: Added mailbox.root setting. - [ee89399346cb] - - * TODO, pgsql/create_optional_types_and_functions-dovecot-1.2.x.pgsql, - pgsql/create_optional_types_and_functions.pgsql, pgsql - /create_tables-dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql, - pgsql/update_tables_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_tables_0.5.x-0.6.pgsql, - pgsql/update_types_and_functions_0.5.x-0.6-dovecot-1.2.x.pgsql, - pgsql/update_types_and_functions_0.5.x-0.6.pgsql: - pgsql: Added support for different mailbox formats. - - users.passwd can store sha512-crypt.hex hashes now - - Added new update scripts. - [e21ceaabe871] - -2010-07-12 Pascal Volk - - * pgsql/update_tables_0.4.x-0.5.pgsql, - pgsql/update_tables_0.5.x_for_dovecot-1.2.x.pgsql, - pgsql/update_types_and_functions_0.5.x_for_dovecot-1.2.x.pgsql: - pgsql: Removed old update SQL scripts. - [62211b6a9b8e] - -2010-07-04 Pascal Volk - - * VirtualMailManager/Alias.py, VirtualMailManager/maillocation.py: - VMM/maillocation: Code cleanups. Fixed error introduced with - changeset 084300a00ee1. - [18086c6a2521] - -2010-05-18 Pascal Volk - - * VirtualMailManager/Domain.py, VirtualMailManager/Handler.py: - VMM/Domain: removed functions ace2idna() and idn2ascii(). - domainname.encode('idna')/domainname.decode('idna') works too. - [7d1bafc6fa30] - -2010-05-12 Pascal Volk - - * VirtualMailManager/Account.py, VirtualMailManager/Handler.py: - VMM/Account: replaced attribute _mid : int by _mail : MailLocation. - [a77b67673aa6] - -2010-05-11 Pascal Volk - - * TODO, VirtualMailManager/password.py: - VMM/password: added some CRYPT_* constants. Reverted modification - (284:ec1966828246) in _get_salt(). - [619dadc0fd25] - -2010-05-10 Pascal Volk - - * VirtualMailManager/Config.py, VirtualMailManager/password.py, - man/de/man5/vmm.cfg.5.rst, man/man5/vmm.cfg.5.rst: - VMM/password: adapted Blowfish/SHA-256/SHA-512 crypt() to recent - changes in the Dovecot-2.0 source tree. - - VMM/Config: Added default number of encryption rounds to the - configuration. - - man5: updated description of - misc.crypt_{blowfish,sha{256,512}}_rounds. - [7ef3f117a230] - -2010-05-09 Pascal Volk - - * VirtualMailManager/Account.py, VirtualMailManager/Alias.py, - VirtualMailManager/AliasDomain.py, VirtualMailManager/Config.py, - VirtualMailManager/Domain.py, VirtualMailManager/EmailAddress.py, - VirtualMailManager/Handler.py, VirtualMailManager/Relocated.py, - VirtualMailManager/cli/Config.py, - VirtualMailManager/ext/Postconf.py, VirtualMailManager/password.py: - VMM/…: re-indented long queries and error messages. - [e2785e04f92e] - -2010-05-05 Pascal Volk - - * VirtualMailManager/password.py: - VMM/password: generate all crypt() salts w/o trailing $ sign - [142f188f7552] - -2010-05-04 Pascal Volk - - * man/de/man5/vmm.cfg.5.rst, man/man5/vmm.cfg.5.rst: - man5: added misc.dovecot_version to the minimal config example. - [01cb71c1ae33] - - * VirtualMailManager/Config.py, VirtualMailManager/password.py: - VMM/password: moved the 'scheme check' code from pwhash() to the new - function verify_scheme(). VMM/Config: use verify_scheme() to check - the scheme when LazyConfig.set() is called. - [1e77dd639fa3] - -2010-05-03 Pascal Volk - - * VirtualMailManager/Config.py, man/de/man5/vmm.cfg.5.rst, - man/man5/vmm.cfg.5.rst: - VMM/Config: removed the default value of misc.dovecot_version. There - are too many different versions installed on different systems. So, - it doesn't make much sense to have a default value. - [e2046d47688b] - - * VirtualMailManager/Handler.py: - VMM/Handler: import the errors before raising them. Rephrased the - 'permission error' message. - [d30a94f5aef5] - - * TODO, VirtualMailManager/Config.py, VirtualMailManager/password.py, - man/de/man5/vmm.cfg.5.rst, man/man5/vmm.cfg.5.rst, - man/substitute_links_5.rst: - VMM/password: Added support Blowfish/SHA-256/SHA-512 crypt(). Also - updated Config and man section 5. - [ec1966828246] - -2010-04-30 Pascal Volk - - * VirtualMailManager/Handler.py: - VMM/Handler: code cleanups in the user/alias/relocated info methods. - [ea6d052de24a] - - * VirtualMailManager/Handler.py: - VMM/Handler: fixed destination check in Handler.aliasAdd(). - [28871c1be260] - - * VirtualMailManager/Alias.py, VirtualMailManager/Handler.py, - VirtualMailManager/cli/Handler.py: - VMM/Alias: moved the postconf stuff from the Handlers to Alias - class. - [59ff7c719697] - - * VirtualMailManager/Config.py, VirtualMailManager/Handler.py: - VMM/{Config,Handler}: moved Config.install() to - Handler.cfg_install(). Handler.cfg_install() must be called - explicitly. To avoid 'strange' problems. - [db35d2eec518] - -2010-04-29 Pascal Volk - - * VirtualMailManager/cli/Handler.py: - VMM/cli/Handler: fixed AttributeError in CliHandler.__init__(). - Attribute '_scheme' was removed in previous commit. - [74d94b867348] - - * VirtualMailManager/Handler.py: - VMM/Handler: removed password hashing related stuff. - [5d229a50b115] - - * VirtualMailManager/Handler.py, VirtualMailManager/cli/Handler.py: - VMM{,/cli}/Handler: adjusted user* methods to the changes in - Account. All user methods was renamed from userAction() to - user_action(). Added missing docstrings. - [e50ffc0b8468] - - * VirtualMailManager/Account.py: - VMM/Account: always pass the EmailAddress to the pwhash() call. - [f2ecfe0a0e09] - - * VirtualMailManager/Account.py, - VirtualMailManager/constants/ERROR.py: - VMM/Account: some modifications and small improvements in class - Account. - - replaced the tid by a Transport instance - - check mailbox format dependencies in _repare() - - reset all attributes when the Account was deleted - - don't select information, we have already, from the db - - added __nonzero__() method - [524f7ed5ad5b] - - * VirtualMailManager/password.py: - VMM/password: added small output check on _dovecotpw(). - [45ec5c3cfef4] - - * VirtualMailManager/common.py: - VMM/common: added a caching dict for version_hex()/version_str() - [77fc7138ef6a] - -2010-04-28 Pascal Volk - - * VirtualMailManager/Config.py, VirtualMailManager/Handler.py, - VirtualMailManager/__init__.py, VirtualMailManager/password.py: - VMM/Config: Added method Config.install() -> global cfg_dget(). - VirtualMailManager.Configuration removed -> some adjustments. - [446483386914] - - * INSTALL, UPGRADE: - INSTALL: dropped group mail related stuff. UPGRADE: be more details - about nobody's primary group. - [e915d4725706] - - * VirtualMailManager/Config.py, VirtualMailManager/Handler.py, - man/de/man5/vmm.cfg.5.rst, man/man5/vmm.cfg.5.rst, update_config.py, - vmm.cfg: - configuration: Dropped setting misc.gid_mail. That setting was never - useful, since none of the virtual users was a member of a system - group. - [d3389645a91d] - - * man/de/man5/vmm.cfg.5.rst, man/man5/vmm.cfg.5.rst, - man/substitute_links.rst: - man/{,de/}man5/vmm.cfg.5.rst: Updated descriptions of dovecotpw and - password_scheme settings. - [188ea8d6072f] - - * INSTALL, VirtualMailManager/password.py, - VirtualMailManager/pycompat/hashlib.py: - VMM: added new modules password and pycompat.hashlib. INSTALL: - updated - [beb8f4421f92] - - * VirtualMailManager/maillocation.py: - VMM/maillocation: Use the hex version, since we are able to convert - it to an string, in case of a failure. - [084300a00ee1] - -2010-04-27 Tobias Berling - - * VirtualMailManager/Account.py, VirtualMailManager/Handler.py, - VirtualMailManager/common.py: - VMM/{Account,common,Handler}: Improved version_hex(). - - common: version_hex() now supports 'serials' > 16. Added - version_str() as counterpart to version_hex(). - - Account, Handler: updated hardcoded Dovecot versions. - [e14c345b44a1] - -2010-04-26 Pascal Volk - - * VirtualMailManager/Account.py, VirtualMailManager/common.py, - VirtualMailManager/maillocation.py: - VMM/{Account,common,maillocation}: Dovecot version (check) fixes. - - Account: fixed versions dependencies. - - maillocation: use the version string, may be uses in a error - message. - - common: version_hex() raises a ValueError, instead of returning 0, - if the version string is invalid. - [3c0173418d5d] - -2010-04-25 Pascal Volk - - * VirtualMailManager/Account.py, VirtualMailManager/Config.py, - VirtualMailManager/Handler.py, VirtualMailManager/maillocation.py, - man/de/man5/vmm.cfg.5.rst, man/man5/vmm.cfg.5.rst, update_config.py, - upgrade.sh, vmm.cfg: - Use the complete Dovecot version, not only the concatenated major - and minor parts. (1.2.11 instead of 12). - [04fea4d8b900] - - * VirtualMailManager/common.py: - VMM/common: improved version_hex() in order to convert also alpha, - beta and release candidate versions. - [07fdc93dde9f] - -2010-04-24 Pascal Volk - - * VirtualMailManager/Config.py, VirtualMailManager/Handler.py, - VirtualMailManager/__init__.py, VirtualMailManager/common.py: - VMM: moved some non-init functions to the new common module. - Adjusted imports in the Config and Handler module. - [6eea85d8b91d] - -2010-04-23 Pascal Volk - - * setup.py: - setup.py: Added sub-package pycompat to the packages list. - [1c2241dde942] - -2010-04-22 Pascal Volk - - * VirtualMailManager/pycompat.py, - VirtualMailManager/pycompat/__init__.py: - VMM/pycompat: is now a sub-package. - [b052a2f0f5d4] - -2010-04-20 Pascal Volk - - * VirtualMailManager/Handler.py: - merged changes from default(9bf8d97ced88) - [6c699837b4d4] - - * VirtualMailManager/VirtualMailManager.py: - VMM/VMM: corrected name of password scheme PLAIN-MD4. - [9bf8d97ced88] - -2010-04-18 Tobias Berling - - * VirtualMailManager/Alias.py, VirtualMailManager/AliasDomain.py, - pgsql/create_tables-dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql: - VMM/Alias.py: Replaced some %r with '%s'. VMM/AliasDomain.py: - save(), switch(), delete(): Update AliasDomain._gid after database - change. Added dbc.close() to AliasDomain.delete(). - create_tables{,-dovecot-1.2.x}.pgsql: Fixed a typo. - [5b8fde01e4f0] - -2010-04-18 Pascal Volk - - * TODO, VirtualMailManager/Handler.py, VirtualMailManager/__init__.py: - VMM: added 'Configuration' variable and set_configuration(). - Handler.__init__() now exports its config via set_configuration(). - [ae80282301a3] - -2010-04-17 Pascal Volk - - * VirtualMailManager/Handler.py: - VMM/Handler: renamed some methods and added their missing - docstrings: - - cfgDget() -> cfg_dget() - - cfgPget() -> cfg_pget() - - userByID() -> user_by_uid() - [d2ddd4a6528d] - -2010-04-16 Pascal Volk - - * VirtualMailManager/AliasDomain.py, VirtualMailManager/Domain.py, - VirtualMailManager/EmailAddress.py, VirtualMailManager/Handler.py, - VirtualMailManager/__init__.py: - VMM: moved functions ace2idna(), check_domainname(), idn2ascii() and - relevant parts to the Domain module. Adjusted imports in modules - AliasDomain, EmailAddress and Handler. - [8aecc83a0d32] - - * VirtualMailManager/EmailAddress.py, VirtualMailManager/__init__.py: - VMM: moved check_localpart() to the EmailAddress module. - [58d1b6f41664] - -2010-04-15 Pascal Volk - - * VirtualMailManager/Account.py: - VMM/Account: renamed function getAccountByID -> get_account_by_uid. - Fixed AttributeError (tid) in Account._prepare(). Removed unused - imports. - [af555e6967c8] - - * VirtualMailManager/Handler.py: - VMM/Handler: Implemented Handler._chk_other_address_types(). Removed - the static methods accountExists(), aliasExists(), relocatedExists() - and _exists(). - [0963ad2f5fe2] - - * VirtualMailManager/Account.py, VirtualMailManager/Alias.py, - VirtualMailManager/Relocated.py: - VMM/{Account,Alias,Relocated}: added a address property to the - classes Account, Alias and Relocated. - [73cd082cd724] - - * VirtualMailManager/Relocated.py: - VMM/Relocated: implemented Relocated.__nonzero__() for truth value - testing. Use EmailAddress' __str__() method when raising - RelocatedErrors. - [bb7d9906c529] - - * INSTALL: - merged changes from default(dbcb29ac89fa) - [da241eacad4d] - - * INSTALL: - INSTALL: simplified the 'SETUID copy of deliver' part - [dbcb29ac89fa] - - * VirtualMailManager/Account.py: - VMM/Account: Account.get_info() use the domain's transport, if tid - matches. - [481280686789] - - * VirtualMailManager/Account.py, - VirtualMailManager/constants/ERROR.py: - VMM/Account: reworked class Account. - [f9a6b6701cf9] - -2010-04-13 Pascal Volk - - * VirtualMailManager/Handler.py: - VMM/Handler: adjusted Handler.aliasDomain*() methods to changes in - the AliasDomain class. Updated docstrings. - [698ba4208ddc] - - * VirtualMailManager/AliasDomain.py: - VMM/AliasDomain: some cleanups in class AliasDomain. Added missing - docstrings. - [30aaf2bc079c] - -2010-04-05 Pascal Volk - - * VirtualMailManager/Domain.py: - VMM/Domain: search() small code cleanups. - [496099847480] - - * VirtualMailManager/Handler.py: - VMM/Handler: small code cleanups and an improved import statement. - [2493453f2c10] - - * VirtualMailManager/Domain.py, VirtualMailManager/Handler.py: - merged changes from default(184970fd7486) - [fb6336b25b8f] - - * VirtualMailManager/Domain.py: - VMM/Domain: search() lists now all matching domains, also when the - result contains primary and alias names, but the found alias is not - an alias for any of the found primaries. - [184970fd7486] - - * VirtualMailManager/VirtualMailManager.py: - VMM/VMM: applied 'code compression' from v0.6.x(09b7e3fe29b3) to - VirtualMailManager.domainList(). - [8f56166a3283] - -2010-04-04 Tobias Berling - - * VirtualMailManager/Handler.py: - VMM/Handler: compressed Handler.domainList() and replaced “%s” with - '%s' in error message. - [09b7e3fe29b3] - -2010-04-04 Pascal Volk - - * VirtualMailManager/Account.py, VirtualMailManager/AliasDomain.py, - VirtualMailManager/Domain.py, VirtualMailManager/Handler.py: - VMM/Domain: reworked Domain class. Adjusted classes Account, - AliasDomain and Handler to changes in the Domain class. - [084331dd1e4c] - -2010-04-03 Pascal Volk - - * VirtualMailManager/Account.py, VirtualMailManager/Transport.py: - VMM/Transport: Renamed attribute/property {,_}id to {,_}tid. - [9d3405ed08e5] - -2010-04-02 Pascal Volk - - * VirtualMailManager/__init__.py: - VMM: check_localpart() use '%s' instead of %r in error messages. - [e88ba0fb1281] - -2010-03-21 Pascal Volk - - * VirtualMailManager/Handler.py: - merged changes from default(8c4df3dd2d2c) - [55503d63ba30] - - * vmm: - vmm: minimal cleanups. - [3c766114d0b9] - - * VirtualMailManager/VirtualMailManager.py: - VMM: VirtualMailManager.__pwhash() added support for 'doveadm pw'. - dovecotpw was replaced by `doveadm pw` in Dovecot v2.0. To use - doveadm instead of dovecotpw use the following settings in vmm.cfg: - [bin] dovecotpw = /path/to/doveadm [misc] dovecotvers = - 20 - [8c4df3dd2d2c] - -2010-03-03 Pascal Volk - - * man/de/man5/vmm.cfg.5.rst, man/man5/vmm.cfg.5.rst, - man/substitute_links_5.rst: - man: updated configuration manual pages (maildir.* -> mailbox.*). - [eefbe052a135] - - * VirtualMailManager/Config.py, update_config.py, vmm.cfg: - vmm.cfg: renamed maildir.folders to mailbox.folders. maildir.name - was removed. new: mailbox.format, in order to support all mailbox - formats from Dovecot. Maildir is the default format. - - Adjusted VirtualMailManager/Config and update_config.py to the - changes mentioned above. - [0fb2f12648a7] - - * VirtualMailManager/Account.py, VirtualMailManager/maillocation.py: - VMM/maillocation: MailLocation.__init__(): take a 'format' name, - instead of a 'directory' name. - - added function known_format() to the module. - - VMM/Account: Adjusted to above changes. - [a7b000ca4ac9] - -2010-03-02 Pascal Volk - - * VirtualMailManager/Account.py, - VirtualMailManager/constants/ERROR.py, - VirtualMailManager/maillocation.py, - doc/source/vmm_constants_error.rst: - VMM/Account: Adjusted to changes in maillocation.MailLocation. - VMM/maillocation: Class MailLocation added missing property `mid`. - - Added new error to VMM/constants/ERROR and - doc/source/vmm_constants_error - [87db9f1f95ea] - - * VirtualMailManager/MailLocation.py, - VirtualMailManager/maillocation.py, - doc/source/vmm_constants_error.rst: - VMM/maillocation: rewrote MailLocation class. Renamed - MailLocation.py to maillocation.py. - [311eee429f67] - -2010-03-01 Pascal Volk - - * VirtualMailManager/Account.py, VirtualMailManager/Domain.py, - VirtualMailManager/Transport.py: - VMM/Transport: reworked Transport class. Use assertions for argument - checks. Removed methods getID() and getTransport(). This values are - now accessible through the read-only attributes id and transport. - - VMM/{Account,Domain}: adjusted to modifications in Transport class. - A few code cleanups. - [a51809f7940b] - - * VirtualMailManager/pycompat.py: - VMM/pycompat: added function any() for Python 2.4 - [7e9874a50d92] - - * VirtualMailManager/Alias.py, VirtualMailManager/Handler.py, - VirtualMailManager/ext/Postconf.py: - replaced some "for x in list …" - [5c7b7cbb01cd] - -2010-02-28 Pascal Volk - - * VirtualMailManager/Alias.py, VirtualMailManager/Domain.py, - VirtualMailManager/Handler.py, VirtualMailManager/Relocated.py: - VMM/Domain: get_gid() return 0 instead of raising an Exception, if - the domain wasn't found in the database. - [d0c16e70a9fb] - -2010-02-27 Pascal Volk - - * VirtualMailManager/Alias.py, VirtualMailManager/Handler.py: - VMM/Alias: renamed Alias.add_destination() to add_destinations(). - Now it's possible to add one ore more destinations to the alias with - a single method call. - - VMM/Handler: adjusted Handler.aliasAdd() to the API changes of the - Alias class. Also use get_gid from the Domain module to get the gid - of a domain. We don't need complete Domain object, only the gid. - - Handler.getWarnings(): no longer return the __warnings list. Return - a copy instead and empty the Handler.__warnings list. - [371ae0b4443d] - - * doc/source/index.rst, doc/source/vmm_alias.rst, - doc/source/vmm_constants_error.rst, doc/source/vmm_relocated.rst: - doc: Added the alias documentation. - [8b8d632f0ef3] - - * VirtualMailManager/pycompat.py: - VMM/pycompat: added to the repository. Provides all() for Py24. - [0b6ce895e1dc] - - * VirtualMailManager/EmailAddress.py: - VMM/EmailAddress: implemented EmailAddress.__hash__(). So we can - have a set() of EmailAddress instances. - [84094c7fa28b] - - * VirtualMailManager/cli/__init__.py: - VMM/cli: small optimizations in the functions w_std() and w_err() - [eecd05e31517] - -2010-02-26 Pascal Volk - - * VirtualMailManager/Account.py, VirtualMailManager/Alias.py, - VirtualMailManager/AliasDomain.py, VirtualMailManager/Config.py, - VirtualMailManager/Domain.py, VirtualMailManager/EmailAddress.py, - VirtualMailManager/Exceptions.py, VirtualMailManager/Handler.py, - VirtualMailManager/MailLocation.py, VirtualMailManager/Relocated.py, - VirtualMailManager/Transport.py, VirtualMailManager/__init__.py, - VirtualMailManager/cli/Config.py, VirtualMailManager/cli/Handler.py, - VirtualMailManager/errors.py, VirtualMailManager/ext/Postconf.py, - doc/source/index.rst, doc/source/vmm.rst, doc/source/vmm_config.rst, - doc/source/vmm_constants_error.rst, doc/source/vmm_emailaddress.rst, - doc/source/vmm_errors.rst, doc/source/vmm_exceptions.rst, - doc/source/vmm_relocated.rst: - Moved VirtualMailManager/Exceptions to VirtualMailManager/errors. - Renamed VMM*Exception classes to *Error. No longer add the attribute - 'message' to VMMError if it doesn't exist, like in Python 2.4. It - has been deprecated as of Python 2.6. Also removed the methods - code() and msg(), the values are now accessible via the attributes - 'code' and 'msg'. - [0c8c053b451c] - -2010-02-25 Pascal Volk - - * VirtualMailManager/Alias.py, VirtualMailManager/Config.py, - VirtualMailManager/EmailAddress.py, VirtualMailManager/Handler.py, - VirtualMailManager/Relocated.py, VirtualMailManager/__init__.py, - VirtualMailManager/cli/Config.py, - VirtualMailManager/cli/__init__.py, - VirtualMailManager/constants/VERSION.py, - VirtualMailManager/constants/version.py, doc/source/vmm.rst, - doc/source/vmm_config.rst, doc/source/vmm_relocated.rst: - PEP-8-ified the work of the last days. - - Renamed methods in class Alias: addDestination() -> - add_destination() delDestination() -> del_destination() - getDestinations() -> get_destinations() - - Renamed methods in class Relocated: setDestination() -> - set_destination() getInfo() -> get_info() - - Renamed VMM/constants/VERSION.py -> VMM/constants/version.py - - Adjusted relevant parts of the documentation. - [33f727efa7c4] - -2010-02-24 Pascal Volk - - * VirtualMailManager/Exceptions.py: - VMM/Exceptions: use the inherited CTor in all VMM*Exception classes. - [84e6e898e6c5] - - * VirtualMailManager/Alias.py, VirtualMailManager/EmailAddress.py, - VirtualMailManager/Relocated.py: - VMM:/{Alias,EmailAddress,Relocated}: use assertions for argument - checks. - [1a9fee6b93bc] - - * doc/source/conf.py, doc/source/index.rst, doc/source/vmm.rst, - doc/source/vmm_constants_error.rst, doc/source/vmm_emailaddress.rst, - doc/source/vmm_exceptions.rst, doc/source/vmm_relocated.rst: - doc: extended documentation. - [77ac6f572855] - -2010-02-22 Pascal Volk - - * VirtualMailManager/Config.py: - VMM/Config: LazyConfig.getboolean(), convert the value in our - getboolean. So RawConfigParser hasn't to do the whole get() stuff - again. - [0b129678cfe1] - - * .hgignore: - Added 'doc/build' to the ignored files. - [3ddb735ec9d2] - - * VirtualMailManager/Config.py, VirtualMailManager/__init__.py, - doc/Makefile, doc/source/conf.py, doc/source/index.rst, - doc/source/vmm.rst, doc/source/vmm_config.rst: - VMM{/Config}: reduced docstrings. Added doc to the repository. - [c705a9e38962] - - * VirtualMailManager/EmailAddress.py, VirtualMailManager/Handler.py, - VirtualMailManager/__init__.py: - VMM: removed unneeded/duplicated regular expression definitions - [efa1327b721f] - - * VirtualMailManager/Config.py: - VMM/Config: moved Config.sections() to class LazyConfig. No longer - import the ENCODING from VirtualMailManager, it's no longer required - in the Config module. - [95be8f62bc0c] - -2010-02-20 Pascal Volk - - * VirtualMailManager/Config.py, VirtualMailManager/cli/Config.py: - VMM/Config: renamed LazyConfig's get_boolean() to getboolean(). - VMM/cli/Config: import required ConfigParser.RawConfigParser. - [da07dd944ad1] - -2010-02-13 Pascal Volk - - * VirtualMailManager/cli/__init__.py: - VMM/cli: added __init__.py to the repository. - [bc9726c9ad85] - - * VirtualMailManager/Config.py, VirtualMailManager/cli/Config.py: - VMM/{,cli/}Config: fixed imports. Small code cleanups and cosmetic. - [83938336c518] - -2010-02-12 Pascal Volk - - * VirtualMailManager/Alias.py: - VMM/Alias: small code cleanups and cosmetic. - [4d601240b7db] - - * VirtualMailManager/Relocated.py: - VMM/Relocated: small code cleanups and cosmetic. - [43e7c8b440da] - - * VirtualMailManager/Config.py: - VMM/Config: LazyConfigOption.__init__() cast 'default' to 'cls'. If - the default value is not None, make sure it has the proper type. - [dbb0f7ed7858] - -2010-02-11 Pascal Volk - - * VirtualMailManager/Config.py: - VMM/Config: attributes of class LazyConfigOption are read-only now. - Some small code cleanups. - [983cf98d5881] - - * VirtualMailManager/AliasDomain.py, VirtualMailManager/Domain.py, - VirtualMailManager/EmailAddress.py, VirtualMailManager/__init__.py: - VMM: renamed function chk_domainname() -> check_domainname(). Moved - EmailAddress.check_localpart() -> - VirtualMailManager.check_localpart(). Some small code cleanups in - class EmailAddress. - [0684790fff7c] - -2010-02-10 Pascal Volk - - * VirtualMailManager/Alias.py, VirtualMailManager/Domain.py, - VirtualMailManager/Relocated.py: - VMM/Domain: added function get_gid() to the Domain module. We don't - need to load all the domain related information from the database, - when we need only the GID of a domain. For example in the Alias or - Relocated classes. - [02d467e4fbab] - - * VirtualMailManager/Handler.py, VirtualMailManager/Relocated.py: - VMM/{Relocated,Handler}: reworked Relocated class, adjusted Handler. - [d2712e8c724e] - - * VirtualMailManager/Alias.py, VirtualMailManager/Handler.py: - VMM/{Alias,Handler}: reworked Alias class, adjusted Handler class. - Handler: - - attribute _dbh is no longer private, the VMM/cli/Handler uses it - also. - - adjusted to changes in Alias and EmailAddress classes. - [65a3163bd113] - -2010-02-09 Pascal Volk - - * VirtualMailManager/EmailAddress.py: - VMM/EmailAddress: reworked class EmailAddress again. The attributes - domainname and localpart are now read-only. - [05dd49fc3ea1] - - * VirtualMailManager/EmailAddress.py: - VMM/EmailAddress: reworked once more. - - moved EmailAddress.__chkLocalpart() -> __module__.check_localpart() - - renamed EmailAddress.__chkAddress() -> EmailAddress._chk_address() - - attributes domainname and localpart are no longer protected - - added missing doc strings. - [6c06edb5b2d2] - -2010-02-08 Pascal Volk - - * VirtualMailManager/EmailAddress.py: - VMM/EmailAddress: rework EmailAddress class. - [a259bdeaab5c] - -2010-02-07 Pascal Volk - - * VirtualMailManager/Handler.py: - VMM/Handler: fixed a SyntaxError. Oops - [0854fb9f3bc5] - - * VirtualMailManager/Handler.py: - VMM/Handler: __mailDirMake() add warning for skipped mailboxes. - - domainInfo() removed old deprecated warning. - - fixed PEP8 warnings. - [db77501aeaed] - - * VirtualMailManager/Handler.py, VirtualMailManager/cli/Handler.py: - VMM/{,cli/}Handler: reverted most of cs cf1b5f22dbd2 added a cli - handler. Moved the interactive stuff from VMM/Handler to the derived - VMM/cli/Handler. - [1903d4ce97d7] - -2010-02-06 Pascal Volk - - * VirtualMailManager/cli/CliConfig.py, - VirtualMailManager/cli/Config.py: - moved VMM/cli/CliConfig to VMM/cli/Config - [e63853509ad0] - - * VirtualMailManager/Config.py, VirtualMailManager/Handler.py, - VirtualMailManager/__init__.py, vmm: - VMM/Handler: __init__ accepts now a config_type ('default'||'cli'). - - fixed syntax errors, introduced with the last commit. VMM/Config: - added Config.configure() -> NotImplementedError. VMM/__init__: - install gettext global, everything depends on it. - [cf1b5f22dbd2] - - * VirtualMailManager/Config.py, VirtualMailManager/Handler.py, - VirtualMailManager/__init__.py, VirtualMailManager/cli/CliConfig.py: - VMM/{,cli/Cli}Config: Moved interactive stuff to new CliConfig - class. Renamed Config.getsections() to Config.sections(). Small - cosmetics. - [38b9a9859749] - -2010-02-05 Pascal Volk - - * VirtualMailManager/Handler.py, VirtualMailManager/cli/handler.py: - moved VMM/cli/handler to VMM/Handler - [18757fd45e60] - - * VirtualMailManager/Account.py, VirtualMailManager/Alias.py, - VirtualMailManager/AliasDomain.py, VirtualMailManager/Config.py, - VirtualMailManager/Domain.py, VirtualMailManager/EmailAddress.py, - VirtualMailManager/MailLocation.py, VirtualMailManager/Relocated.py, - VirtualMailManager/Transport.py, VirtualMailManager/__init__.py, - VirtualMailManager/cli/handler.py, - VirtualMailManager/ext/Postconf.py, vmm: - VMM/*: Moved some methods from classes to modules __init__. - - Adjusted many import statements. - - Small adjustments and whitespace cosmetics in Config.py - [6e1ef32fbd82] - -2010-02-04 Pascal Volk - - * VirtualMailManager/VirtualMailManager.py, - VirtualMailManager/cli/handler.py: - moved VMM/VMM to VMM/cli/handler - [d0425225ce52] - -2010-02-02 Pascal Volk - - * vmm: - vmm: reworked subcommand/arguments mapping. - [eb4c73d9d0a4] - -2010-02-01 Pascal Volk - - * VirtualMailManager/VirtualMailManager.py: - VMM/VMM: Allow version/help subcommands even with missing - configuration options. - [84811fcc3c69] - - * update_config.py: - update_config: do not add options w/ default values. remove - config.done - [866a6d679fce] - - * VirtualMailManager/Config.py, - VirtualMailManager/VirtualMailManager.py, man/de/man5/vmm.cfg.5.rst, - man/man5/vmm.cfg.5.rst, vmm: - VMM/Config: dropped option config.done - [f8279c90e99c] - -2010-01-30 Pascal Volk - - * man/de/man1/vmm.1.rst, man/de/man5/vmm.cfg.5.rst, - man/man1/vmm.1.rst, man/man5/vmm.cfg.5.rst, - man/substitute_links.rst, man/substitute_links_1.rst, - man/substitute_links_5.rst, po/de.po: - man: updated documentation … - [3d09c657e9e5] - -2010-01-29 Pascal Volk - - * VirtualMailManager/Config.py, po/de.po, po/vmm.pot: - po: Quick refresh - for documentation purpose. - [9480f2b15129] - -2010-01-26 Pascal Volk - - * man/de/man5/vmm.cfg.5.rst, man/man5/vmm.cfg.5.rst: - man/{,de/}man5: added a note about how to use default settings. - man/de/man5: s/Abschnitt*/Sektion*/g - [ec2e1df8bb10] - -2010-01-25 Pascal Volk - - * man/de/man5/vmm.cfg.5.rst, man/man5/vmm.cfg.5.rst, vmm.cfg: - man: Added used default values to manual. - [cc0d79842fdf] - -2010-01-24 Pascal Volk - - * VirtualMailManager/Config.py, - VirtualMailManager/VirtualMailManager.py, vmm: - VMM/VMM: allow configure subcommand also with missing settings. - Removed method VirtualMailManager.setupIsDone() - - VMM/Config: Config.load() added 'finally' clause. - [b241272eb1bd] - - * VirtualMailManager/Config.py, - VirtualMailManager/VirtualMailManager.py, - VirtualMailManager/__init__.py, vmm: - VMM/Config: reworked configuration handling. Implemented - LazyConfig(RawConfigParser) and LazyConfigOption(object) Rewrote - Config class: - * use default values and added some validation stuff - * removed attributes: __VMMsections and __changes - * replaced methods __chkSections() and __chkOptions() with __chkCfg - - VMM/VMM: Adjusted to reworked Config class. - * removed attribute __cfgSections - * removed methods: cfgGetBoolean(), cfgGetInt(), cfgGetString() - * added methods: cfgDget(), cfgPget(), cfgSet() - - VMM/__init__: added function get_unicode() - - vmm: Adjusted to replaced methods in VMM/VMM. - [974bafa59330] - -2010-01-22 Pascal Volk - - * VirtualMailManager/Config.py: - branch merge - [c0e2c7687dd3] - - * VirtualMailManager/Config.py: - VMM/Config: Fixed error handling of missing sections in vmm.cfg. - [6526072ec709] - - * VirtualMailManager/Config.py: - VMM/Config: Fixed error handling of missing sections in vmm.cfg. - [6f8ac86d1611] - -2010-01-18 Pascal Volk - - * TODO, man/de/man5/vmm.cfg.5, man/de/man5/vmm.cfg.5.rst, - man/man5/vmm.cfg.5, man/man5/vmm.cfg.5.rst: - man: reworded some parts. - [d9ca5c46c1fa] - - * man/de/man5/vmm.cfg.5, man/de/man5/vmm.cfg.5.rst, - man/man5/vmm.cfg.5, man/man5/vmm.cfg.5.rst: - man: updated man/{de/,}man5/vmm.cfg.5, using reStructuredText now - [a72908248153] - -2010-01-14 Pascal Volk - - * VirtualMailManager/Config.py, - VirtualMailManager/VirtualMailManager.py, update_config.py, vmm, - vmm.cfg: - vmm.cfg: a few re-renamed configuration options. - - old new - -------------------------------------------------- - account.password_len -> account.password_length domain.force_del - -> domain.force_deletion misc.base_dir -> misc.base_directory - misc.dovecot_vers -> misc.dovecot_version - [fd496561acc6] - -2010-01-13 Pascal Volk - - * install.sh, update_config.py, update_config_0.4.x-0.5.py, - upgrade.sh: - update_config.py: adjusted functions stuff to renamed settings. - Finally renamed update_config_0.4.x-0.5.py to update_config.py - no - more version information in the filename. - - *.sh: removed .svn directory exclusion from find command. - [bb58aedefa3a] - - * VirtualMailManager/Config.py, - VirtualMailManager/VirtualMailManager.py, vmm, vmm.cfg: - vmm.cfg: dealt with the most overdue section/option renaming. Added - new options. Details: - - old new - ------------------------------------------------------------ - domdir.mode -> domain.directory_mode domdir.delete - -> domain.delete_directory domdir.base -> - misc.base_dir domdir -> _section domdir - deleted_ - - maildir.mode -> account.directory_mode - maildir.diskusage -> account.disk_usage maildir.delete - -> account.delete_directory - - misc.forcedel -> domain.force_del misc.passwdscheme - -> misc.password_scheme misc.dovecotvers -> - misc.dovecot_vers - - services.smtp -> account.smtp services.pop3 - -> account.pop3 services.imap -> account.imap - services.sieve -> account.sieve services - -> _section services deleted_ - - _NEW_.random_password -> account.random_password - _NEW_.password_len -> account.password_len - _NEW_.auto_postmaster -> domain.auto_postmaster - [b152ad5c7071] - -2010-01-04 Pascal Volk - - * INSTALL: - INSTALL: Adapted pgsql configuration steps to that in the wiki. - (Closes: #2922030) - [7e50e4c49ed7] - -2010-01-02 Pascal Volk - - * install.sh, upgrade.sh: - *.sh: Added --force option to python setup.py install call. - upgrade.sh: Removed old cleanup code. - [67dc18294de6] - - * setup.py: - setup.py: Fixed a UserWarning that may occur with older Python. - [1981f285f0c0] - - * COPYING, VirtualMailManager/Account.py, VirtualMailManager/Alias.py, - VirtualMailManager/AliasDomain.py, VirtualMailManager/Config.py, - VirtualMailManager/Domain.py, VirtualMailManager/EmailAddress.py, - VirtualMailManager/Exceptions.py, - VirtualMailManager/MailLocation.py, VirtualMailManager/Relocated.py, - VirtualMailManager/Transport.py, - VirtualMailManager/VirtualMailManager.py, - VirtualMailManager/__init__.py, - VirtualMailManager/constants/ERROR.py, - VirtualMailManager/constants/EXIT.py, - VirtualMailManager/constants/VERSION.py, - VirtualMailManager/constants/__init__.py, - VirtualMailManager/ext/Postconf.py, - VirtualMailManager/ext/__init__.py, man/de/man1/vmm.1, - man/de/man5/vmm.cfg.5, man/man1/vmm.1, man/man5/vmm.cfg.5, po/de.po, - setup.py, update_config_0.4.x-0.5.py, vmm: - Updated copyright notices to include the year 2010. Also corrected - the name of the copyright holder and updated the e-mail address. - [0ac9ef587769] - -2009-12-27 Pascal Volk - - * .hgtags: - Removed the svn-ish tag trunk - [b62aa4aabcd0] - -2009-10-23 Pascal Volk - - * create_optional_types_and_functions-dovecot-1.2.x.pgsql, - create_optional_types_and_functions.pgsql, create_tables- - dovecot-1.2.x.pgsql, create_tables.pgsql, pgsql - /create_optional_types_and_functions-dovecot-1.2.x.pgsql, - pgsql/create_optional_types_and_functions.pgsql, pgsql - /create_tables-dovecot-1.2.x.pgsql, pgsql/create_tables.pgsql, - pgsql/update_tables_0.4.x-0.5.pgsql, - pgsql/update_tables_0.5.x_for_dovecot-1.2.x.pgsql, - pgsql/update_types_and_functions_0.5.x_for_dovecot-1.2.x.pgsql, - update_tables_0.4.x-0.5.pgsql, - update_tables_0.5.x_for_dovecot-1.2.x.pgsql, - update_types_and_functions_0.5.x_for_dovecot-1.2.x.pgsql: - *.pgsql: moved to pgsql/ - [639cf4003965] - -2009-10-22 Pascal Volk - - * install.sh, pgsql-relocated_maps.cf, pgsql- - smtpd_sender_login_maps.cf, pgsql-transport.cf, pgsql- - virtual_alias_maps.cf, pgsql-virtual_gid_maps.cf, pgsql- - virtual_mailbox_domains.cf, pgsql-virtual_mailbox_maps.cf, pgsql- - virtual_uid_maps.cf, postfix/pgsql-relocated_maps.cf, postfix/pgsql- - smtpd_sender_login_maps.cf, postfix/pgsql-transport.cf, postfix - /pgsql-virtual_alias_maps.cf, postfix/pgsql-virtual_gid_maps.cf, - postfix/pgsql-virtual_mailbox_domains.cf, postfix/pgsql- - virtual_mailbox_maps.cf, postfix/pgsql-virtual_uid_maps.cf, - upgrade.sh: - Moved Postfix PostgreSQL client configuration files into the postfix - directory. - [78b6b06188d3] - - * VirtualMailManager/VirtualMailManager.py, - VirtualMailManager/constants/ERROR.py: - VMM: Don't prompt endless for a password. Stop after 3rd failure. - [6949f6eaf26e] - -2009-10-20 Pascal Volk - - * po/vmm.pot, vmm: - vmm: plan_a_b s/address/object/ - [eb3ccf9484b3] - - * VirtualMailManager/Account.py, - VirtualMailManager/VirtualMailManager.py, po/vmm.pot, vmm: - Added comments for the Translation Project. Updated PO template. - [a849843115e9] - -2009-10-19 Pascal Volk - - * VirtualMailManager/Account.py, VirtualMailManager/Alias.py, - VirtualMailManager/AliasDomain.py, VirtualMailManager/Domain.py, - VirtualMailManager/EmailAddress.py, VirtualMailManager/Relocated.py, - VirtualMailManager/VirtualMailManager.py, - VirtualMailManager/ext/Postconf.py, vmm: - Fixed some grammar errors and typos. (Reported by Clytie Siddall) - [eb866ebb9f2e] - -2009-10-11 Pascal Volk - - * po/vi.po: - Added the Vietnamese translation to the repository. Many thanks to - Clytie Siddall from the Translation Project for the work. - [6e6488722807] - -2009-09-29 Pascal Volk - - * po/nl.po: - Updated Dutch translation (translated by Erwin Poeze). - [f0386ee0c7e8] - -2009-09-10 Pascal Volk - - * VirtualMailManager/__init__.py: - Ignore unsupported locale setting and silently fall back to 'C'. - [3dbee02711cd] - -2009-09-09 Pascal Volk - - * .hgtags: - Added tag vmm-0.5.2 for changeset 3e972996da7f - [350488efe67d] - - * ChangeLog, NEWS, VirtualMailManager/constants/VERSION.py, setup.py: - Released vmm-0.5.2 - [3e972996da7f] [vmm-0.5.2] - -=== 0.5.2 === -2009-09-09 Pascal Volk - - * vmm: - Improved error handling in vmm's {alias}domaininfo. - [581a5680d0ef] [tip] - -2009-09-08 Pascal Volk - - * po/nl.po, setup.py: - Added the Dutch translation to the repository. Many thanks to Erwin - Poeze from the Translation Project for the work. - [e574f5dedb60] - - * VirtualMailManager/Alias.py, vmm: - Improved error handling in vmm's {user,alias,relocated}info. Removed - some comparisons of string and Unicode. - [e3fd0b67ae50] - -2009-09-07 Pascal Volk - - * VirtualMailManager/Alias.py: - Alias.__init__(): Check really if the given address is not used. - [a08d78344706] - - * VirtualMailManager/Account.py: - Sort alias addresses in Account.getAliases() / vmm userinfo. - [ead2a7e9f8be] - -2009-09-05 Pascal Volk - - * VirtualMailManager/Account.py, VirtualMailManager/Alias.py: - Small optimizations in Account.getAliases() and Alias.getInfo(). - [4c6aa6c29dd7] - - * VirtualMailManager/VirtualMailManager.py: - Code cleanup/optimization in VMM's idn2ascii() and ace2idna(). - [16542519a5a8] - -2009-09-04 Pascal Volk - - * VirtualMailManager/Domain.py, vmm: - Reduced the mixing/concatenating of str and unicode objects. - Optimized list generation in Domain class. - [28f26f7f3d8f] - - * VirtualMailManager/__init__.py: - Small optimization in w_std()/w_err() 'avoid the dot'. - [ecd6a379e523] - -2009-09-03 Pascal Volk - - * VirtualMailManager/VirtualMailManager.py: - Code cleanup/optimization in VirtualMailManager's __getSalt(). - [ffac064bd728] - -2009-09-02 Pascal Volk - - * po/fr.po, setup.py: - Added the French translation to the repository. Many thanks to - Dimitri Duc from the Translation Project for the work. - [7f6911bd11cd] - - * VirtualMailManager/Account.py, VirtualMailManager/Alias.py, - VirtualMailManager/AliasDomain.py, VirtualMailManager/Config.py, - VirtualMailManager/Domain.py, VirtualMailManager/EmailAddress.py, - VirtualMailManager/Exceptions.py, - VirtualMailManager/MailLocation.py, VirtualMailManager/Relocated.py, - VirtualMailManager/Transport.py, - VirtualMailManager/VirtualMailManager.py, - VirtualMailManager/__init__.py, VirtualMailManager/ext/Postconf.py, - vmm: - Reorganized module import. Dropped the import of constants.VERSION, - when it wasn't really needed. Centralized the import of os, re and - locale in VirtualMailManager/__init__.py. Also moved w_std() and - w_err() from vmm to the __init__.py. - [617f27715b01] - -2009-09-01 Pascal Volk - - * vmm: - Don't crash if the date format not only consists of ASCII signs. - Added also the u stringprefix to translatable strings where it was - missing. - [fc09f657082d] - -2009-08-31 Pascal Volk - - * VirtualMailManager/Config.py, - VirtualMailManager/VirtualMailManager.py, vmm: - Reorganized imports, eliminated a potential UnicodeEncodeError. - Removed double definition of function w_std() in Config class. - [fb61f64e6351] - -2009-08-25 Pascal Volk - - * INSTALL, UPGRADE: - Updated documentation - [32ad0c79a6ef] - - * VirtualMailManager/Account.py: - Fixed a Python2.4.4 SyntaxError - [6ca3d22e5dd0] - - * VirtualMailManager/Account.py, VirtualMailManager/Alias.py, - VirtualMailManager/AliasDomain.py, VirtualMailManager/Config.py, - VirtualMailManager/Domain.py, VirtualMailManager/EmailAddress.py, - VirtualMailManager/MailLocation.py, VirtualMailManager/Relocated.py, - VirtualMailManager/VirtualMailManager.py, - VirtualMailManager/ext/Postconf.py, man/de/man1/vmm.1, - man/man1/vmm.1, po/de.po, po/vmm.pot, vmm: - Replaced angle quotes by quotation marks. - [2d5c4745efec] - -2009-08-23 Pascal Volk - - * VirtualMailManager/VirtualMailManager.py, po/de.po, po/vmm.pot: - Added a deprecated warning for managesieve. Updated translation. - [fa22bd13b4d1] - -2009-08-22 Pascal Volk - - * INSTALL, UPGRADE: - Updated documentation - [2b8154cc7ebe] - - * update_config_0.4.x-0.5.py: - avoid error message if used with version 0.5.2 - [9dca3e898ddb] - -2009-08-21 Pascal Volk - - * .hgignore, VirtualMailManager/Alias.py, po/de.po, po/vmm.pot: - Updated translation. - [4ffb50de00d5] - - * INSTALL, UPGRADE, VirtualMailManager/Account.py, - VirtualMailManager/Config.py, VirtualMailManager/Transport.py, - VirtualMailManager/VirtualMailManager.py, - VirtualMailManager/constants/ERROR.py, - VirtualMailManager/ext/Postconf.py: - Converted VirtualMailManager and Postconf to new-style classes. A - few small cleanups. - [cf8116625866] - - * INSTALL, UPGRADE: - Updated documentation - [97a9f6dd954b] - - * update_tables_0.5.x_for_dovecot-1.2.x.pgsql: - removed GRANT statement. It's mentioned in UPGRADE - [3643a0777e77] - - * update_tables_0.5.x_for_dovecot-1.2.x.pgsql: - Removed the currently not needed WHERE clause from the VIEW. - [988b9a719929] - - * create_optional_types_and_functions-dovecot-1.2.x.pgsql, - create_tables-dovecot-1.2.x.pgsql: - Added create SQL scripts for Dovecot v1.2.x - [68af38212ff5] - - * update_tables_0.5.x_for_dovecot-1.2.x.pgsql, - update_types_and_functions_0.5.x_for_dovecot-1.2.x.pgsql: - Added update SQL scripts for Dovecot v1.2.x - [626c008a4a04] - -2009-08-20 Pascal Volk - - * VirtualMailManager/Alias.py, VirtualMailManager/AliasDomain.py, - VirtualMailManager/Domain.py, VirtualMailManager/MailLocation.py, - VirtualMailManager/Relocated.py: - Converted to new-style class, added __slots__. - [30abf0abf8f8] - - * VirtualMailManager/Account.py: - Converted to new-style class, added __slots__, updated queries. Use - the _uid attribute in queries whenever it is possible. - [7ccc05774118] - - * VirtualMailManager/Config.py: - Comments updated. - [928659c8ee9f] - - * VirtualMailManager/VirtualMailManager.py, - update_config_0.4.x-0.5.py: - Small code cleanups (replaced dir+'/'+file by os.path.join()). - [014335f38962] - -2009-08-19 Pascal Volk - - * update_config_0.4.x-0.5.py, upgrade.sh: - Rewrote upgrade script and config update script - [cf85d78486ce] - - * setup.py: - Updated long_description, download_url and platforms. Dropped - VirtualMailManager.constants.VERSION import - error-prone. - [c96b5768c76d] - -2009-08-18 Pascal Volk - - * VirtualMailManager/EmailAddress.py: - Fixed a logical mistake in EmailAddress.__ne__() (not used), small - code cleanups. - [949c5db6447a] - - * VirtualMailManager/Account.py, - VirtualMailManager/VirtualMailManager.py, vmm: - Added sieve/managesieve switching stuff, depending on the used - Dovecot version. - [21f264a88ab2] - - * VirtualMailManager/Account.py: - Fixed a libpq.OperationalError in Account.delete() Passing only the - object's address string to the 'alias delete' query, not the whole - EmailAddress object. - [e671210b04b8] - -2009-08-17 Pascal Volk - - * VirtualMailManager/Account.py, VirtualMailManager/Config.py, - VirtualMailManager/VirtualMailManager.py, man/de/man1/vmm.1, - man/de/man5/vmm.cfg.5, man/man1/vmm.1, man/man5/vmm.cfg.5, vmm, - vmm.cfg: - Config: renamed services.managesieve to services.sieve, added - misc.dovecotvers - [e35755191ff3] - - * VirtualMailManager/Config.py: - Hopefully the final UnicodeDecodeError fix for the Config class - - Added a global w_std() function and replaced all print statements. - [d1f345f91e1c] - -2009-08-16 Pascal Volk - - * ChangeLog: - Added the essential changes since vmm-0.4. Partly reformatted. - [50ff50f5055e] - -2009-08-14 Pascal Volk - - * VirtualMailManager/Domain.py, VirtualMailManager/Transport.py: - Transport: converted to new-style class; Domain: query reduction - - VirtualMailManager/Transport.py: - * added: __slots__ - * implemented: __eq__(), __ne__() and __str__() - - VirtualMailManager/Domain.py (updateTransport()): - * reduced db lookups/update - [cb8b2f6a5fca] - - * VirtualMailManager/VirtualMailManager.py: - VMM: Fixed an AttributeError, caused by the last commit. Class - EmailAddress has no __dict__ anymore. - [766299a8639d] - -2009-08-13 Pascal Volk - - * VirtualMailManager/EmailAddress.py: - VMM.EmailAddress: Added __slots__ aka post-sf.net-hg-update-commit - [fb88585f17fe] - -=== 0.5.1 === -2009-08-12 Pascal Volk - - * .hgtags: - Added tag vmm-0.5.1 for changeset dc98cc162c66 - [e98a0fdf1266] - - * NEWS, UPGRADE, VirtualMailManager/constants/VERSION.py: - Released vmm-0.5.1 - [dc98cc162c66] [vmm-0.5.1] - - * pgsql-relocated_maps.cf, pgsql-smtpd_sender_login_maps.cf, - pgsql-transport.cf, pgsql-virtual_alias_maps.cf, - pgsql-virtual_gid_maps.cf, pgsql-virtual_mailbox_domains.cf, - pgsql-virtual_mailbox_maps.cf, pgsql-virtual_uid_maps.cf: - Set default value of hosts to localhost - Updated comments - -2009-08-09 Pascal Volk - - * VirtualMailManager/Config.py: - Replaced the last non encoded print statement. - * install.sh, upgrade.sh: - Do now strict POSIX compliant string comparison in expressions. - Fixed a typo in upgrade.sh. - * nearly all files: - Removed the subversion keywords $Date$, $Id$ and $Rev$ from all files. - -2008-12-27 Pascal Volk - - * VirtualMailManager/Config.py: - Config.configure(): Eliminated another UnicodeEncodeError. - * vmm.cfg: removed single quotes around bin.postconf - Thanks to samfisch for reporting both bugs - -2008-12-23 Pascal Volk - - * VirtualMailManager/Config.py: - fixed parenthesis in Config.configure() - - * setup.py: adjusted long_description - updated url to http://vmm.localdomain.org/ - - * vmm: fixed UnicodeDecodeError, that could occur with German locale - -2008-12-08 Pascal Volk - - * VirtualMailManager/VirtualMailManager.py,VirtualMailManager/Config.py: - Added support for variable "vmm.cfg" location in - /root:/usr/local/etc:/etc - -=== 0.5 === -2008-11-26 Pascal Volk - * NEWS: - Added to repository. News (enhancements, bug fixes) for non programmers - - * VirtualMailManager/constants/VERSION.py: - Updated version from 0.5-dev to 0.5 - -2008-09-16 Pascal Volk - - * VirtualMailManager/ext/Postconf.py: - Added to repository to read some Postfix settings - -2008-09-09 Pascal Volk - - * VirtualMailManager/Domain.py, vmm, - VirtualMailManager/VirtualMailManager.py: - Added relocated stuff - -2008-09-08 Pascal Volk - - * VirtualMailManager/EmailAddress.py: - Added to repository, to simplify/reduce address validation - -2008-09-01 Pascal Volk - - * create_optional_types_and_functions.pgsql: - Added to repository, for faster database lookups - -2008-08-29 Pascal Volk - - * VirtualMailManager/VirtualMailManager.py: - Fixed DIGEST-MD5 hash generation. - -2008-08-23 Pascal Volk - - * VirtualMailManager/Exceptions.py: - Fixed AttributeError in class VMMException on older Python - installations. (VMMException instance has no attribute 'message') - -2008-08-22 Pascal Volk - - * VirtualMailManager/Domain.py, VirtualMailManager/AliasDomain.py - VirtualMailManager/VirtualMailManager.py: - did some alias domain modifications/enhancements - - * vmm: Implemented w_std() to write encoded output to stdout - -2008-08-19 Pascal Volk - - * VirtualMailManager/Config.py. - VirtualMailManager/VirtualMailManager.py, vmm: - Renamed class VMMConfig -> Config - Adjusted Config import - -2008-08-16 Pascal Volk - - * VirtualMailManager/VirtualMailManager.py, - VirtualMailManager/Domain.py: - Added alias domain stuff - -2008-08-14 Pascal Volk - - * VirtualMailManager/Account.py, VirtualMailManager/Domain.py: - adjusted to modified database layout - - * create_tables.pgsql, update_tables_0.4.x-0.5.pgsql: - modified database layout - -2008-08-07 Pascal Volk - - * VirtualMailManager/Account.py: Account.getInfo() added i18n stuff - -2008-08-06 Pascal Volk - - * vmm (_getOrder): - Respect vmm.cfg/maildir/diskusage settings - - * VirtualMailManager/VirtualMailManager.py: - Adds a warning if a directory not exists: - VirtualMailManager.__getDiskUsage() - VirtualMailManager.__maildirdelete() - VirtualMailManager.__domdirdelete() - Implemented: - VirtualMailManager.__isdir() - VirtualMailManager.cfgGetBoolean() - VirtualMailManager.cfgGetInt() - VirtualMailManager.cfgGetString() - * po/vmm.pot, po/de.po: Updated - -2008-06-17 Pascal Volk - - * install.sh, upgrade.sh: fixed $MANDIR - * vmm: removed BEL escape sequences - -2008-06-11 Pascal Volk - - * install.sh: - removed verbose stuff - fixed (multilingual) man pages installation stuff - * man/man1/vmm1, man/man5/vmm.cfg.5: - moved to sub folders - -2008-05-25 Pascal Volk - - * VirtualMailManager/VirtualMailManager.py (VirtualMailManager): - Renamed: __idn2ascii() -> idn2ascii() - __ace2idna() -> ace2idna() - Implemented domain_list() - some small code cleanups - * vmm: - Implemented domain_list() - some small code cleanups - * VirtualMailManager/Domain.py: - Implemented search() - -2008-05-18 Pascal Volk - - * VirtualMailManager/Account.py, VirtualMailManager/Alias.py, - VirtualMailManager/Config.py, VirtualMailManager/Domain.py, - VirtualMailManager/MailLocation.py, VirtualMailManager/Transport.py, - VirtualMailManager/VirtualMailManager.py, po/de.po, po/vmm.pot, vmm: - completed gettext support - -2008-05-15 Pascal Volk - - * vmm.cfg: now vmm.cfg conforms to example in INSTALL. - -2008-05-13 Pascal Volk - - * VirtualMailManager/Alias.py, VirtualMailManager/MailLocation.py, - VirtualMailManager/Account.py, VirtualMailManager/Transport.py, - VirtualMailManager/VirtualMailManager.py, VirtualMailManager/Config.py, - VirtualMailManager/Domain.py, vmm: - Added i18n (gettext) support - * install.sh: Install message objects - -2008-05-10 Pascal Volk - - * install.sh: Should now also work on all *BSDs - -2008-05-01 Pascal Volk - - * VirtualMailManager/VirtualMailManager.py - (VirtualMailManager.__chkenv()): - Create the base directory with correct access mode and gid, ifit does - not exist yet. - * update_config_0.3.x-0.4.py, update_tables_0.3.x-0.4.py, UPGRADE, - upgrade.sh: - removed because vmm 0.4 was released - -=== 0.4-r41 === -2008-05-01 Pascal Volk - - * create_tables.pgsql: - fixed typo in CREATE TABLE users - * install.sh, upgrade.sh: - Added again $PF_GID (was removed with r19) - -2008-04-30 Pascal Volk - - * UPGRADE: added hint for virtual_mailbox_domains in UPGRADE - -=== 0.4 === -2008-04-30 Pascal Volk - - * vmm.1, vmm.cfg.5: - Reworded some parts. - * vmm: - Added function _getOrder() for a (hopefully) better structured output - from the domaininfo, userinfo and getuser subcommands. - -2008-04-28 Pascal Volk - - * vmm.cfg: - * update_config_0.3.x-0.4.py: - * VirtualMailManager/VirtualMailManager.py: - * VirtualMailManager/Config.py: - Moved option 'base' from section 'maildir' to section 'domdir' - * VirtualMailManager/Account.py (Account._setAddr()): - Removed parameter 'address' - * VirtualMailManager/Domain.py (Domain.getAccounts(), - Domain.getAliases()): Added 'ORDER BY' clause in queries. - + setup.py: Adjusted trove classifiers. - -2008-04-21 Pascal Volk - - * create_tables.pgsql (table users): - Replaced column 'disabled' with columns smpt, pop3, imap and managesieve - * create_tables.pgsql (view dovecot_password): - updated view, added service columns smpt, pop3, imap and managesieve - * update_tables_0.3.x-0.4.py: - Updated to consider the points above mentioned - * vmm.cfg: - Added section »services« with options: smtp, pop3, imap and managesieve - * update_config_0.3.x-0.4.py, VirtualMailManager/Config.py: - Updated, to add new section »services« - * VirtualMailManager/Account.py (Account._switchState(), - Account.enable(), Account.disable(), Account.save(), Account.getInfo()), - VirtualMailManager/VirtualMailManager.py (VirtualMailManager.user_add(), - VirtualMailManager.user_disable(), VirtualMailManager.user_enable()), - vmm (usage(), user_disable(), user_enable()): - Modified, to fit new database structure - * UPGRADE, INSTALL: - Updated information - * update_tables_0.4-dev_r24.py: - Added temporary to the repository - -2008-04-18 Pascal Volk - - * VirtualMailManager/Account.py: Implemented getAccountByID() - * VirtualMailManager/VirtualMailManager.py (VirtualMailManager): - * vmm: Implemented user_byID() - -2008-04-15 Pascal Volk - - * VirtualMailManager/Account.py (Account.modify()): - * vmm (main): Added code for modify user's transport - * VirtualMailManager/VirtualMailManager.py: Implemented - VirtualMailManager.user_transport() - * VirtualMailManager/VirtualMailManager.py - (VirtualMailManager.domain_transport()): - * vmm: - * VirtualMailManager/Domain.py (Domain.updateTransport()): Added code to - optional force new transport for all existing accounts. - -2008-04-14 Pascal Volk - - * VirtualMailManager/VirtualMailManager.py: Implemented: - VirtualMailManager.__getSalt(), VirtualMailManager.__pwCrypt(), - VirtualMailManager.__pwSHA1(), VirtualMailManager.__pwMD5() and - VirtualMailManager.__pwMD4() - updated VirtualMailManager.__pwhash() - * VirtualMailManager/constants/VERSION.py: Set Version to 0.4-dev - * INSTALL: Added hint for python-crypto, fixed user_query - -2008-04-10 Pascal Volk - - * update_tables_0.3.x-0.4.py: Replaced view dovecot_user - * create_tables.pgsql (VIEW: dovecot_user): Added extra field mail - * UPGRADE: fixed filename, hint for view permissions and user_query - * INSTALL: Replaced mail_extra_groups with mail_privileged_group, updated - user_query - -2008-04-06 Pascal Volk - - * install.sh: Removed $PF_GID - * INSTALL: Added hints for pyPgSQL and smtpd_recipient_restrictions - * update_config_0.3.x-0.4.py: - * upgrade.sh: - * UPGRADE: Added to repository - * VirtualMailManager/VirtualMailManager.py (VirtualMailManager.__init__): - Don't call VirtualMailManager.__chkenv() if vmm is started with - option configure. - * VirtualMailManager/VirtualMailManager.py (VirtualMailManager.__chkenv): - Added value for placeholder in error message. - -2008-03-05 Pascal Volk - - * create_tables.pgsql: Removed unneeded newlines from views dovecot_user and - postfix_uid - * update_tables_0.2.x-0.3.pgsql: Removed from repository - * update_tables_0.3.x-0.4.py: Added to repository - -2008-03-04 Pascal Volk - - * VirtualMailManager/Alias.py: - * VirtualMailManager/VirtualMailManager.py: - * vmm: Now it's possible to delete an alias with a specific destination - -2008-03-03 Pascal Volk - - * pgsql-virtual_mailbox_domains.cf: Added to repository - * INSTALL: fixed postfix docu - -2008-03-02 Pascal Volk - - * create_tables.pgsql: Added view vmm_domain_info - * VirtualMailManager/Alias.py: Removed attribute Alias._aid - Removed parameter basedir from Alias.__init__() and Alias._setAddr() - * VirtualMailManager/MailLocation.py: Fixed typo in MailLocation.__init__() - * VirtualMailManager/Account.py: Integrated Transport- and - MailLocation-stuff - Removed attributes: Account._base and Account._home - * VirtualMailManager/VirtualMailManager.py: some small fixes - * VirtualMailManager/Domain.py: Added Transport-stuff - * vmm.cfg: Added option transport in section misc - * pgsql-transport.cf: changed query for new table layout - * pgsql-smtpd_sender_login_maps.cf: added missing single quote in query - -2008-02-02 Pascal Volk - - * create_tables: Renamed table maildir to maillocation - Added transport id to table domains, for default transport - * VirtualMailManager/Transport.py: - * VirtualMailManager/MailLocation.py: Added to repository - * VirtualMailManager/constants/ERROR.py: Added error codes for MailLocation - and Transport classes - * VirtualMailManager/Exceptions.py: Added exception classes for MailLocation - and Transport - -2008-01-18 Pascal Volk - - * create_tables.pgsql: Removed unneeded sequences 'alias_id' and - 'relocated_id'. - Removed unneeded column 'id' from table 'alias' and 'relocated'. - -2008-01-15 Pascal Volk - - * create_tables.pgsql: Redesign of table layout, create separate tables for - maildir-folder and transport. Also assign transport to users not to domains - -2008-01-11 Pascal Volk - - * vmm (usage): Fixed a syntax error. - -2008-01-09 Pascal Volk - - * install.sh: Also install docs - - * VirtualMailManager/Account.py: - * VirtualMailManager/Alias.py: - * VirtualMailManager/Config.py: - * VirtualMailManager/Domain.py: - * VirtualMailManager/Exceptions.py: - * VirtualMailManager/VirtualMailManager.py: - * setup.py: - * vmm: Included global version number. - - * VirtualMailManager/constants/VERSION.py: Added to repository. - -2008-01-09 Pascal Volk - - * VirtualMailManager/Account.py: - * VirtualMailManager/Alias.py: - * VirtualMailManager/Domain.py: - * VirtualMailManager/VirtualMailManager.py: - * vmm: Replaced email with e-mail. - Corrected opening/closing quotation marks («word» -> »word«). - - * VirtualMailManager/VirtualMailManager.py: Renamed - VirtualMailManager.__chkEmailadress to - VirtualMailManager.__chkEmailAddress. - - * ChangeLog: Added to repository. - -=== 0.3.1 === -2008-01-08 Pascal Volk - - * vmm (getVMM): Fixed names names of excepted errors. - - * VirtualMailManager/VirtualMailManager.py (VirtualMailManager.__init__): - activated check for missing sections/options - - * vmm-0.3.1.tar.bz2: It's really bzip2 compressed. ;-) - diff -r 659c4476c57c -r b678a1c43027 Configure.Dovecot_2 --- a/Configure.Dovecot_2 Mon Mar 24 19:22:04 2014 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,208 +0,0 @@ -# This document contains a minimal configuration for a vmm setup with -# Dovecot v2.x. -# -# You could save this file as local.conf in the dovecot configuration directory -# (commonly /etc/dovecot or /usr/local/etc/dovecot). -# When you want to use this file as your configuration file for Dovecot, make -# sure you have commented out the line "!include conf.d/*.conf". The last line -# "!include_try local.conf" is sufficient. -# -# Otherwise you have to apply the following settings to the configuration files -# in the conf.d directory. - -### -# dovecot.conf -### -protocols = imap lmtp -# uncomment if your users should be able to manage their sieve scripts -#protocols = imap lmtp sieve - -# uncomment if you want to use the quota plugin -#dict { -# quota = pgsql:/usr/local/etc/dovecot/dovecot-dict-sql.conf.ext -#} - -### -# conf.d/10-auth.conf -### -# When you set another misc.password_scheme than PLAIN or CRAM-MD5 in -# your vmm.cfg, you have to remove cram-md5 from the auth_mechanisms -# setting. -auth_mechanisms = plain login cram-md5 -passdb { - driver = sql - args = /usr/local/etc/dovecot/dovecot-sql.conf.ext -} -userdb { - driver = sql - args = /usr/local/etc/dovecot/dovecot-sql.conf.ext -} -#!include auth-system.conf.ext - -### -# conf.d/10-mail.conf -### -first_valid_gid = 70000 -first_valid_uid = 70000 -mail_access_groups = dovemail -mail_location = maildir:~/Maildir - -# uncomment if you want to use the quota plugin -#mail_plugins = quota - -### -# conf.d/10-master.conf -### - -# if you don't want to use secure imap, you have to disable the imaps listener -##service imap-login { -## inet_listener imaps { -## port = 0 -## } -##} - -service lmtp { - unix_listener /var/spool/postfix/private/dovecot-lmtp { - user = postfix - group = postfix - mode = 0600 - } -} - -service auth { - user = doveauth - unix_listener auth-userdb { - } - unix_listener /var/spool/postfix/private/dovecot-auth { - user = postfix - group = postfix - mode = 0600 - } -} - -service auth-worker { - unix_listener auth-worker { - user = doveauth - group = $default_internal_user - mode = 0660 - } - user = doveauth -} - -service dict { - unix_listener dict { - group = dovemail - mode = 0660 - } -} - -### -# conf.d/10-ssl.conf -### -# SSL/TLS support: yes, no, required. -#ssl = yes - -ssl_cert = = 2.4.0) - - Psycopg 2¹ or pyPgSQL² - -If you are using Python <= 2.5.0: - - if you want to store your users' passwords as PLAIN-MD4 digest in - the database, vmm will try to use Crypto.Hash.MD4 from PyCrypto³. - - if you are using Dovecot >= v1.1.0 and you want to store your users' - passwords as SHA256 or SSHA256 hashes, vmm will try to use - Crypto.Hash.SHA256 from PyCrypto². For SHA256/SSHA256 you should have - at least use PyCrypto in version 2.1.0alpha1. - - When the Crypto.Hash module couldn't be imported, vmm will use - dovecotpw/doveadm, if the misc.password_scheme setting in the vmm.cfg - is set to PLAIN-MD4, SHA256 or SSHA256 - -[1] Psycopg: (Debian: python-psycopg2) -[2] pyPgSQL: (Debian: python-pgsql) -[3] PyCrypto: (Debian: python-crypto) - - -Create additionally a user and groups for improved security - We will create the system user `doveauth'. This user is used in the - authentication process. On a Debian GNU/Linux System use this command: - - adduser --system --home /nonexistent --no-create-home --group \ - --disabled-login --gecos "Dovecot IMAP/POP3 authentication user" \ - doveauth - - This will create the doveauth user and group. - For Dovecot >= 2.0 we create also the group `dovemail'. Dovecot will assign - this group to all Dovecot processes. - On a Debian GNU/Linux bases system run: - - addgroup --system dovemail - - -Configuring PostgreSQL -(for more details see: - http://vmm.localdomain.org/installation/postgresql_configuration.html) - -* /etc/postgresql/8.4/main/pg_hba.conf - [ if you prefer to connect via TCP/IP ] - # IPv4 local connections: - host mailsys +mailsys 127.0.0.1/32 md5 - [ if you want to connect through a local Unix-domain socket ] - # "local" is for Unix domain socket connections only - local mailsys +mailsys md5 - - # reload configuration - /etc/init.d/postgresql-8.4 force-reload - -* Create a database superuser if necessary: - # as root run: su - postgres - # if you have sudo privileges run: sudo su - postgres - # create your superuser, which will be able to create users and databases - createuser -s -d -r -E -e -P $USERNAME - -* As superuser create the database and db users for vmm, Postfix and Dovecot - connecting to PostgreSQL: - psql template1 - - # create users, group and the database - CREATE ROLE vmm LOGIN ENCRYPTED PASSWORD 'DB PASSWORD for vmm'; - CREATE ROLE dovecot LOGIN ENCRYPTED password 'DB PASSWORD for Dovecot'; - CREATE ROLE postfix LOGIN ENCRYPTED password 'DB PASSWORD for Postfix'; - CREATE ROLE mailsys WITH USER postfix, dovecot, vmm; - CREATE DATABASE mailsys WITH OWNER vmm ENCODING 'UTF8'; - \q - - # connect to the new database - psql mailsys vmm -W -h 127.0.0.1 - # either import the database structure for Dovecot v1.0.x/v1.1.x - \i vmm-y.x.z/pgsql/create_tables.pgsql - # or import the database structure for Dovecot v1.2.x/v2.x - \i vmm-x.y.z/pgsql/create_tables-dovecot-1.2.x.pgsql - # leave psql - \q - - # set permissions for your Dovecot and Postfix users - # see python set-permissions.py -h for details - python vmm-x.y.z/pgsql/set-permissions.py -a -H 127.0.0.1 -U vmm - -Create directory for your mails - mkdir /srv/mail - cd /srv/mail/ - mkdir 0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z - chmod 771 /srv/mail - chmod 751 /srv/mail/* - - -For Dovecot >= 2.0 read the file Configure.Dovecot_2 -Configuring Dovecot v1.x - -* /etc/dovecot/dovecot.conf - # all your other settings - #disable_plaintext_auth = no - mail_location = maildir:~/Maildir - first_valid_uid = 70000 - first_valid_gid = 70000 - protocol lda { - postmaster_address = postmaster@YOUR-DOMAIN.TLD - } - auth default { - mechanisms = cram-md5 login plain - passdb sql { - args = /etc/dovecot/dovecot-sql.conf - } - userdb sql { - args = /etc/dovecot/dovecot-sql.conf - } - user = doveauth - socket listen { - master { - path = /var/run/dovecot/auth-master - mode = 0600 - } - client { - path = /var/spool/postfix/private/dovecot-auth - mode = 0660 - user = postfix - group = postfix - } - } - } - -* /etc/dovecot/dovecot-sql.conf - driver = pgsql - connect = host=localhost dbname=mailsys user=dovecot password=$Dovecot_PASS - default_pass_scheme = CRAM-MD5 - password_query = SELECT userid AS "user", password FROM dovecotpassword('%Ln', '%Ld') WHERE %Ls - user_query = SELECT home, uid, gid, mail FROM dovecotuser('%Ln', '%Ld') - -Provide a root SETUID copy of Dovecot's deliver agent for Postfix - -/!\ Only required with Dovecot v.1.x. - With Dovecot >= v2.0 use Dovecot's lmtp! - - mkdir -p /usr/local/lib/dovecot - chmod 700 /usr/local/lib/dovecot - chown nobody /usr/local/lib/dovecot - cp /usr/lib/dovecot/deliver /usr/local/lib/dovecot/ - chown root:`id -g nobody` /usr/local/lib/dovecot/deliver - chmod u+s,o-rwx /usr/local/lib/dovecot/deliver - - - -Start or restart Dovecot - - -Configuring Postfix's master.cf - -/!\ Only required with Dovecot v.1.x. - # Add Dovecot's deliver agent - dovecot unix - n n - - pipe - flags=DORhu user=nobody argv=/usr/local/lib/dovecot/deliver -f ${sender} - -d ${user}@${nexthop} -n -m ${extension} - - - -Configuring Postfix's main.cf - sql = pgsql:${config_directory}/ - proxysql = proxy:${sql} - - # relocated users from the database - #relocated_maps = ${proxysql}pgsql-relocated_maps.cf - - # transport settings from our database - transport_maps = ${proxysql}pgsql-transport_maps.cf - - # virtual domains - virtual_mailbox_domains = ${proxysql}pgsql-virtual_mailbox_domains.cf - virtual_alias_maps = ${proxysql}pgsql-virtual_alias_maps.cf - virtual_minimum_uid = 70000 - virtual_uid_maps = ${sql}pgsql-virtual_uid_maps.cf - virtual_gid_maps = ${sql}pgsql-virtual_gid_maps.cf - virtual_mailbox_base = / - virtual_mailbox_maps = ${proxysql}pgsql-virtual_mailbox_maps.cf - - # dovecot LDA (only recommended with Dovecot v1.x) - #dovecot_destination_recipient_limit = 1 - #virtual_transport = dovecot: - - # dovecot lmtp - virtual_transport = lmtp:unix:private/dovecot-lmtp - - # dovecot SASL - smtpd_sasl_type = dovecot - smtpd_sasl_path = private/dovecot-auth - smtpd_sasl_auth_enable = yes - # Keep smtpd_sasl_local_domain identical to Dovecot's auth_default_realm: - # empty. Both are empty by default. Let it commented out. - # Read more at: http://wiki.dovecot.org/Authentication/Mechanisms/DigestMD5 - #smtpd_sasl_local_domain = - smtpd_sasl_security_options = noplaintext, noanonymous - #smtpd_sasl_security_options = noanonymous - #broken_sasl_auth_clients = yes - - smtpd_recipient_restrictions = - permit_mynetworks - permit_sasl_authenticated - reject_unauth_destination - - -Installing the Virtual Mail Manager and configure the rest - - Installing from Mercurial or vmm-x.y.z.tar.gz - after cloning from the hg repo or extracting the archive change into the - new directory and type: - ./install.sh - edit all the pgsql-*.cf files in /etc/postfix - - reload postfix - - # configure the Virtual Mail Manager - # vmm.cfg(5) - configuration file for vmm - # - # For Dovecot v1.x use 'dovecot:' as domain.transport - # When using Dovecot v2.x use 'lmtp:unix:private/dovecot-lmtp' as - # domain.transport - vmm configure - - # for help type - # vmm(1) - command line tool to manage email domains/accounts/aliases - vmm help - diff -r 659c4476c57c -r b678a1c43027 NEWS --- a/NEWS Mon Mar 24 19:22:04 2014 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,100 +0,0 @@ -v0.6.2 2014-02-01 Pascal Volk - - * Added support for ccTLDs and 'new' gTLDs - * Added support for SCRAM-SHA-1 password hashes (Dovecot ≧ v2.2.0) - * Updated translations: Finnish - - Fixed a TypeError in `userdelete … force` - - Fixed an error in the install.sh script - -v0.6.1 2012-10-03 Pascal Volk - - * Added help messages for `vmm help ` - * Updated translations: Dutch - + aliasinfo: Print list of destinations sorted. - + aliasdelete, catchalldelete: Accept multiple destinations. - + Improved 'address searching' (by Martin F. Krafft). - + Added file pgsql/dovecot_update_v1.2+.pgsql. Use this if you are - upgrading your old Dovecot installation to v1.2.0 or newer. - - Fixed UnicodeDecodeErrors which may occur with some locales. - - `user{quota,services,transport} … domain` didn't work as expected. - - Fixed pgsql FUNCTION dovecotpassword() for Dovecot < v1.2.0. - (see UPGRADE for instructions how to fix the last both problems) - -v0.6.0 2012-06-28 Pascal Volk - - * Now vmm supports Dovecot v.2.0.x and v2.1.x - * Added support for Psycopg 2 - * Added support for Blowfish-, SHA-256- and SHA-512-crypt password - hashes. Works also with Dovecot < v2.0.x. - New subcommand: listpwschemes - * Added support for PostgreSQL-based dictionary quota limits per user. - Configurable globally and per domain. New commands: domainquota and - userquota. (Requires Dovecot >= v1.1.2) - * Command aliasadd accepts multiple destinations. - * Command domainadd can automatically create a postmaster account. - * Command useradd can generate random passwords. - * Notes can be assigned to domains and accounts (by Martin F. Krafft). - New subcommands domainnote and usernote. - * The subcommands userenable and userdisable have been replaced by - userservices. It is now also possible to enable/disable services per - domain with the additional subcommand domainservices. - * New translation: Vietnamese - + Catch-all support (by Martin F. Krafft) New subcommands: catchalladd, - catchalldelete and catchallinfo. - + Interpolated alias destinations (by Martin F. Krafft). For example: - The alias postmaster@example.org → postmaster+%d@admin.example.org - will forward mails addressed to postmaster@example.org to - postmaster+example.org@admin.example.org. - + New subcommands: configget and configset. - + New subcommands by Martin F. Krafft: listaddresses, listaliases, - listrelocated and listusers - + Added support for Dovecot's own high-performance mailbox formats - single- and multi-dbox. - - Fixed Python 2.6 DeprecationWarnings - - Command domaindelete replaced keywords 'delalias', 'deluser' and - 'delall' by the keyword 'force'. - - Command listdomains lists now all matching domains, also when the - result contains primary and alias names, but the found alias is not - alias for any of the found primaries. - - Commands userenable/userdisable accept multiple service names. The - keyword 'all' has been removed. - - Command userdelete replaced keyword 'delalias' by 'force'. - -v0.5.2 2009-09-09 Pascal Volk - - * Now vmm supports Dovecot v1.2.x. - * vmm.cfg: renamed services.managesieve to services.sieve, added - misc.dovecotvers. - * New translations: Dutch and French. - + Improved error handling for the domaininfo, aliasdomaininfo, userinfo, - aliasinfo and relocatedinfo subcommands. - + Sorted alias listing in userinfo output. - + Reduction of useless database lookups/updates. - + Partly improved database lookups. - - Fixed a libpq.OperationalError in Account.delete(). - - Eliminated hopefully finally all (potential) UnicodeDecodeErrors. - -v0.5.1 2009-08-12 Pascal Volk - - + Added support for a variable "vmm.cfg" location in - /root, /usr/local/etc or /etc (see vmm.cfg(5)) - - fixed a few UnicodeDecodeErrors - - fixed a quoting mistake in vmm.cfg - -v0.5 2008-11-26 Pascal Volk - - + gettext i18n support (German translation) - + support for alias domains (add/info/switch/delete). - + support for relocated users (add/info/delete). - + base layout of the users Maildir is now configurable. Also a according - "subscriptions" file will be created. - + subcommand »listdomains«: lists all configured domains or domains that - matches the specified search pattern. - + subcommand »userinfo« can additional display assigned alias addresses. - + subcommand »aliasadd« checks Postfix's "virtual_alias_recursion_limit" - before adding an additional destination address. - + optional SQL functions (see create_optional_types_and_functions.pgsql) - - »useradd«/»userpassword«: fixed behavior of interactive password - prompt. - - fixed some encoding problems (UnicodeEncodeErrors). - - fixed bug in generation of DIGEST-MD5 hashes. diff -r 659c4476c57c -r b678a1c43027 README --- a/README Mon Mar 24 19:22:04 2014 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,155 +0,0 @@ -.. -*- restructuredtext -*- - -============================ -vmm - a virtual mail manager -============================ - -Welcome to vmm! - -**vmm** is the easy to use and configurable command line tool for -administrators and postmasters, to manage domains, alias-domains, accounts and -relocated mail users. It allows the fast and easy management of mail servers. - -vmm is written in Python_. It's designed for installations using Dovecot_ and -Postfix_ with a PostgreSQL_ backend. - -Features -======== -• General features - - ‣ Unicode/UTF-8 capable (input/storage/output) - ‣ supports IDN_ (also ccTLDs/ccIDNs and 'new' gTLDs) - ‣ supports the mailbox format Maildir_ and Dovecot's own high-performance - mailbox formats single- and multi-\ dbox_ - ‣ configurable basic mailbox structure, including sub-mailboxes - ‣ multilingual — currently: - - * Dutch - * English - * Finnish - * French - * German - * Vietnamese - -• Domain features - - ‣ configurable transport_ setting per domain - ‣ unique group identifier (GID) per domain - ‣ each domain may have one or more alias domain names - ‣ activate or deactivate services (SMTP, POP3, IMAP and ManageSieve) for new - or all accounts of a domain - ‣ configurable quota limits (size and/or number of messages) for the - domain's accounts - ‣ supports relocated_ users - ‣ the postmaster account can be created automatically when a new domain is - created - ‣ supports per-domain catch-all aliases - -• Alias domain features - - ‣ alias domain names can be switched between domains - -• Account features - - ‣ configurable transport per account - ‣ activate or deactivate one/more/all services (SMTP, POP3, IMAP and - ManageSieve) per account - ‣ configurable quota limit (size and/or number of messages) per user - ‣ per-account configuration overrides defaults defined by the domain, - otherwise the setting is inherited - ‣ unique user identifier (UID) per user - -• Alias features - - ‣ supports multiple destinations per e-mail alias - ‣ destinations can be deleted separately - ‣ destinations can be interpolated using the original address' local-part - and domain, allowing aliases to have different meaning in alias domains, - e.g. with the following defined in example.org:: - - postmaster@example.org → postmaster+%d@admin.example.org - - If example.com is an alias domain of example.org, the alias will become:: - - postmaster@example.org → postmaster+example.org@admin.example.org - postmaster@example.com → postmaster+example.com@admin.example.org - -Installation Prerequisites -========================== -You already should have installed and configured Postfix and Dovecot with -PostgreSQL support. You also need access to a local or remote PostgreSQL -server. - -To verify that your Dovecot and Postfix installation has support for -PostgreSQL use the ``postconf`` and ``dovecot`` commands as shown below:: - - hostname ~ # postconf -m | grep pgsql - pgsql - hostname ~ # postconf -a | grep dovecot - dovecot - hostname ~ # dovecot --build-options | grep postgresql - SQL drivers: mysql postgresql sqlite - -vmm depends on Python (≥ 2.4.0) and Psycopg_ (≥ 2.0) or pyPgSQL_ (≥ 2.5.1). -Psycopg and pyPgSQL are depending on parts of the *eGenix.com mx Base -Distribution* (mxDateTime_ and mxTools_). - -If you are using Python ≤ 2.5.0: - - • if you want to store your users' passwords as ``PLAIN-MD4`` digest in the - database, vmm will try to use ``Crypto.Hash.MD4`` from PyCrypto_ - • if you are using Dovecot ≥ v1.1.0 and you want to store your users' - passwords as ``SHA256`` or ``SSHA256`` hashes, vmm will try to use - ``Crypto.Hash.SHA256`` from PyCrypto. For ``SHA256``/``SSHA256`` you - should have installed PyCrypto, at least in version 2.1.0alpha1. - - When the Crypto.Hash module couldn't be imported, vmm will use - dovecotpw/doveadm, if the *misc.password_scheme* setting in your *vmm.cfg* - is set to ``PLAIN-MD4``, ``SHA256`` or ``SSHA256``. - -Source code -=========== -vmm's source code is available from the Mercurial_ repositories: - -• main repository - - ‣ ``http://hg.localdomain.org/vmm`` - -• mirror repositories - - ‣ ``https://bitbucket.org/pvo/vmm`` - ‣ ``http://hg.code.sf.net/p/vmm/code`` - -The Debian project is hosting the Git repository of vmm: - -• ``git://anonscm.debian.org/collab-maint/vmm.git`` - -Released versions are also available as gzip compressed tar archives at: -https://sourceforge.net/projects/vmm/files/vmm/ - -Installation/Upgrade -==================== -For installation or upgrading instructions read the `INSTALL` or `UPGRADE` -file. - -License -======= -In short: "**New BSD License**" aka "3-clause license". For a few more -details see the `COPYING` file. - -.. External references -.. _dbox: http://wiki2.dovecot.org/MailboxFormat/dbox -.. _Dovecot: http://dovecot.org/ -.. _IDN: http://en.wikipedia.org/wiki/Internationalized_domain_name -.. _Maildir: http://wiki2.dovecot.org/MailboxFormat/Maildir -.. _Mercurial: http://mercurial.selenic.com/ -.. _mxDateTime: http://www.egenix.com/products/python/mxBase/mxDateTime/ -.. _mxTools: http://www.egenix.com/products/python/mxBase/mxTools/ -.. _Postfix: http://www.postfix.org/ -.. _PostgreSQL: http://www.postgresql.org/ -.. _Psycopg: http://initd.org/psycopg/ -.. _PyCrypto: http://www.pycrypto.org/ -.. _pyPgSQL: http://pypgsql.sourceforge.net/ -.. _Python: http://www.python.org/ -.. _relocated: http://www.postfix.org/relocated.5.html -.. _transport: http://www.postfix.org/transport.5.html diff -r 659c4476c57c -r b678a1c43027 TODO --- a/TODO Mon Mar 24 19:22:04 2014 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -- Aliases - - avoid looping aliases - -- Domain - - optional limits for number of: - + accounts - + aliases - + destinations/alias - + alias domains - -Database: - public.users.digestmd5: add "character varying(48)" - Outlook will love it. (`doveadm pw -s DIGEST-MD5.hex -p 1 -u 0`) - -- Non-root usage [madduck@madduck.net]: - - Provide /usr/share/vmm/vmm-{mkdirs,rmdirs,du} setuid wrappers that do - precisely what they have to and no more. The should probably even call - /usr/share/vmm/vmm-wrapper-helper as unprivileged user to parse the - arguments, match them with the database and obtain the actual data to - process, e.g. email@add.ress → home directory mapping from the DB, or - obtaining the set of precreatable maildirs from the config. - - - configset and configure need root, it is questionable whether these - can/should be wrapped, as they will be disabled anyway for Debian, and - they are root-like activities (unlike day-to-day postmaster work). - - - Pascal suggested to use hooks: - 07 23:36 zwei config settings handle_dir in domain und account - 07 23:37 und dann post-{domain,user}add scripte, die den wrapper aufrufen - -- relay_domains management [madduck@madduck.net]: - - should be in a separate table - -- default aliases [madduck@madduck.net] - - it should be possible to define a set of default aliases and their - destinations for a domain, e.g. postmaster@ and abuse@. For most - flexibility, there ought to be a m:n table connecting domains to sets of - default aliases. These aliases then get treated like normal aliases - unless they are overridden by a real alias. diff -r 659c4476c57c -r b678a1c43027 UPGRADE --- a/UPGRADE Mon Mar 24 19:22:04 2014 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,108 +0,0 @@ -If you still have installed vmm 0.4.x you have to proceed this step first: - - * upgrade your vmm installation to version 0.5.2 - - -If you have installed vmm 0.5.2 you have to proceed this steps: - - * stop Postfix and Dovecot - * backup/dump your database. - * backup/dump your database! - - * start psql and connect to the appropriate database - (ex. psql mailsys vmm -W -h 127.0.0.1) - * update the database, - - Dovecot < 1.2.0 - \i vmm-x.y.z/pgsql/update_tables_0.5.x-0.6.pgsql - - Dovecot >= 1.2.0, 2.0.0 and 2.1.0 - \i vmm-x.y.z/pgsql/update_tables_0.5.x-0.6-dovecot-1.2.x.pgsql - * Set database permissions. - (see python set-permissions.py -h for details) - python vmm-x.y.z/pgsql/set-permissions.py -a -H 127.0.0.1 -U vmm - - - /!\ Important note /!\ - - All the views (dovecot_* and postfix_*) have been replaced by database - functions. So you have to adjust all your postfix/pgsql-*.cf files and - also your /etc/dovecot/dovecot-sql.conf or - /etc/dovecot/dovecot-sql.conf.ext. - (See the vmm-x.y.z postfix/pgsql-*.cf files and INSTALL/Configure.Dovecot_2 - files for the new query.) - - - * execute upgrade.sh - This will also upgrade your vmm.cfg and apply the following modifications: - - old new - ------------------------------------------------------------ - domdir.mode -> domain.directory_mode - domdir.delete -> domain.delete_directory - domdir.base -> misc.base_directory - domdir -> _section domdir deleted_ - - maildir.mode -> account.directory_mode - maildir.diskusage -> account.disk_usage - maildir.delete -> account.delete_directory - maildir.folders -> mailbox.folders - maildir.name -> mailbox.root - maildir -> _section maildir deleted_ - - misc.forcedel -> domain.force_deletion - misc.transport -> domain.transport - misc.passwdscheme -> misc.password_scheme - misc.dovecotvers -> misc.dovecot_version (12 -> 1.2.11) - misc.gid_mail -> /dev/null - - services.smtp -> domain.smtp - services.pop3 -> domain.pop3 - services.imap -> domain.imap - services.sieve -> domain.sieve - services -> _section services deleted_ - - _NEW_.random_password -> account.random_password - _NEW_.password_length -> account.password_length - _NEW_.auto_postmaster -> domain.auto_postmaster - _NEW_.quota_bytes -> domain.quota_bytes - _NEW_.quota_messages -> domain.quota_messages - _NEW_.module -> database.module - _NEW_.port -> database.port - _NEW_.sslmode -> database.sslmode - _NEW_.format -> mailbox.format - _NEW_.crypt_blowfish_rounds -> misc.crypt_blowfish_rounds - _NEW_.crypt_sha256_rounds -> misc.crypt_sha256_rounds - _NEW_.crypt_sha512_rounds -> misc.crypt_sha512_rounds - - config.done -> /dev/null - config -> _section config deleted_ - - - * start Dovecot and Postfix again - - -If you have installed vmm 0.6.0 you have to proceed this steps: - - * Database fixes: - - Due to an error in usertransport's argument parsing, it is - possible that some users' transport-ID points to the erroneous - transport 'domain'. To fix that error in your database, execute - the following SQL statement: - - UPDATE users SET tid = NULL - WHERE tid = (SELECT tid FROM transport WHERE transport = 'domain'); - - - If you are using Dovecot < v1.2.0: - You have to replace the database FUNCTION dovecotpassword(). - (see file: pgsql/create_tables.pgsql) - The service_set.ssid was selected unconditionally. This may cause - an empty result, which will make logins impossible. - - * execute upgrade.sh - - -If you have installed vmm 0.6.1 you simply have to: - - * execute upgrade.sh - -else - * read INSTALL diff -r 659c4476c57c -r b678a1c43027 VirtualMailManager/__init__.py --- a/VirtualMailManager/__init__.py Mon Mar 24 19:22:04 2014 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -# -*- coding: UTF-8 -*- -# Copyright (c) 2007 - 2014, Pascal Volk -# See COPYING for distribution information. -""" - VirtualMailManager - ~~~~~~~~~~~~~~~~~~ - - VirtualMailManager package initialization code -""" - -import gettext -import locale -import sys - -from VirtualMailManager.constants import __author__, __date__, __version__ - -__all__ = [ - # version information from VERSION - '__author__', '__date__', '__version__', - # defined stuff - 'ENCODING', -] - - -# Try to set all of the locales according to the current -# environment variables and get the character encoding. -try: - locale.setlocale(locale.LC_ALL, '') -except locale.Error: - sys.stderr.write('warning: unsupported locale setting - ' - 'that may cause encoding problems.\n\n') - locale.setlocale(locale.LC_ALL, 'C') -ENCODING = locale.nl_langinfo(locale.CODESET) - -gettext.install('vmm', '/usr/local/share/locale', unicode=1) diff -r 659c4476c57c -r b678a1c43027 VirtualMailManager/account.py --- a/VirtualMailManager/account.py Mon Mar 24 19:22:04 2014 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,498 +0,0 @@ -# -*- coding: UTF-8 -*- -# Copyright (c) 2007 - 2014, Pascal Volk -# See COPYING for distribution information. -""" - VirtualMailManager.account - ~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Virtual Mail Manager's Account class to manage e-mail accounts. -""" - -from VirtualMailManager.common import version_str, \ - format_domain_default -from VirtualMailManager.constants import \ - ACCOUNT_EXISTS, ACCOUNT_MISSING_PASSWORD, ALIAS_PRESENT, \ - INVALID_ARGUMENT, INVALID_MAIL_LOCATION, NO_SUCH_ACCOUNT, \ - NO_SUCH_DOMAIN, VMM_ERROR -from VirtualMailManager.common import validate_transport -from VirtualMailManager.domain import Domain -from VirtualMailManager.emailaddress import EmailAddress -from VirtualMailManager.errors import VMMError, AccountError as AErr -from VirtualMailManager.maillocation import MailLocation -from VirtualMailManager.password import pwhash -from VirtualMailManager.quotalimit import QuotaLimit -from VirtualMailManager.transport import Transport -from VirtualMailManager.serviceset import ServiceSet - -__all__ = ('Account', 'get_account_by_uid') - -_ = lambda msg: msg -cfg_dget = lambda option: None - - -class Account(object): - """Class to manage e-mail accounts.""" - __slots__ = ('_addr', '_dbh', '_domain', '_mail', '_new', '_passwd', - '_qlimit', '_services', '_transport', '_note', '_uid') - - def __init__(self, dbh, address): - """Creates a new Account instance. - - When an account with the given *address* could be found in the - database all relevant data will be loaded. - - Arguments: - - `dbh` : pyPgSQL.PgSQL.Connection - A database connection for the database access. - `address` : VirtualMailManager.EmailAddress.EmailAddress - The e-mail address of the (new) Account. - """ - if not isinstance(address, EmailAddress): - raise TypeError("Argument 'address' is not an EmailAddress") - self._addr = address - self._dbh = dbh - self._domain = Domain(self._dbh, self._addr.domainname) - if not self._domain.gid: - # TP: Hm, what “quotation marks” should be used? - # If you are unsure have a look at: - # http://en.wikipedia.org/wiki/Quotation_mark,_non-English_usage - raise AErr(_(u"The domain '%s' does not exist.") % - self._addr.domainname, NO_SUCH_DOMAIN) - self._uid = 0 - self._mail = None - self._qlimit = None - self._services = None - self._transport = None - self._note = None - self._passwd = None - self._new = True - self._load() - - def __nonzero__(self): - """Returns `True` if the Account is known, `False` if it's new.""" - return not self._new - - def _load(self): - """Load 'uid', 'mid', 'qid', 'ssid', 'tid' and 'note' from the - database and set _new to `False` - if the user could be found. """ - dbc = self._dbh.cursor() - dbc.execute('SELECT uid, mid, qid, ssid, tid, note FROM users ' - 'WHERE gid = %s AND local_part = %s', - (self._domain.gid, self._addr.localpart)) - result = dbc.fetchone() - dbc.close() - if result: - self._uid, _mid, _qid, _ssid, _tid, _note = result - - def load_helper(ctor, own, field, dbresult): - # Py25: cur = None if own is None else getattr(own, field) - if own is None: - cur = None - else: - cur = getattr(own, field) - if cur != dbresult: - kwargs = {field: dbresult} - if dbresult is None: - return dbresult - else: - return ctor(self._dbh, **kwargs) - - self._qlimit = load_helper(QuotaLimit, self._qlimit, 'qid', _qid) - self._services = load_helper(ServiceSet, self._services, 'ssid', - _ssid) - self._transport = load_helper(Transport, self._transport, 'tid', - _tid) - self._mail = MailLocation(self._dbh, mid=_mid) - self._note = _note - self._new = False - - def _set_uid(self): - """Set the unique ID for the new Account.""" - assert self._uid == 0 - dbc = self._dbh.cursor() - dbc.execute("SELECT nextval('users_uid')") - self._uid = dbc.fetchone()[0] - dbc.close() - - def _prepare(self, maillocation): - """Check and set different attributes - before we store the - information in the database. - """ - if maillocation.dovecot_version > cfg_dget('misc.dovecot_version'): - raise AErr(_(u"The mailbox format '%(mbfmt)s' requires Dovecot " - u">= v%(version)s.") % { - 'mbfmt': maillocation.mbformat, - 'version': version_str(maillocation.dovecot_version)}, - INVALID_MAIL_LOCATION) - transport = self._transport or self._domain.transport - validate_transport(transport, maillocation) - self._mail = maillocation - self._set_uid() - - def _update_tables(self, column, value): - """Update various columns in the users table. - - Arguments: - - `column` : basestring - Name of the table column. Currently: qid, ssid and tid - `value` : long - The referenced key - """ - if column not in ('qid', 'ssid', 'tid'): - raise ValueError('Unknown column: %r' % column) - dbc = self._dbh.cursor() - dbc.execute('UPDATE users SET %s = %%s WHERE uid = %%s' % column, - (value, self._uid)) - if dbc.rowcount > 0: - self._dbh.commit() - dbc.close() - - def _count_aliases(self): - """Count all alias addresses where the destination address is the - address of the Account.""" - dbc = self._dbh.cursor() - dbc.execute('SELECT COUNT(destination) FROM alias WHERE destination ' - '= %s', (str(self._addr),)) - a_count = dbc.fetchone()[0] - dbc.close() - return a_count - - def _chk_state(self): - """Raise an AccountError if the Account is new - not yet saved in the - database.""" - if self._new: - raise AErr(_(u"The account '%s' does not exist.") % self._addr, - NO_SUCH_ACCOUNT) - - @property - def address(self): - """The Account's EmailAddress instance.""" - return self._addr - - @property - def domain(self): - """The Domain to which the Account belongs to.""" - if self._domain: - return self._domain - return None - - @property - def gid(self): - """The Account's group ID.""" - if self._domain: - return self._domain.gid - return None - - @property - def home(self): - """The Account's home directory.""" - if not self._new: - return '%s/%s' % (self._domain.directory, self._uid) - return None - - @property - def mail_location(self): - """The Account's MailLocation.""" - return self._mail - - @property - def note(self): - """The Account's note.""" - return self._note - - @property - def uid(self): - """The Account's unique ID.""" - return self._uid - - def set_password(self, password): - """Set a password for the new Account. - - If you want to update the password of an existing Account use - Account.modify(). - - Argument: - - `password` : basestring - The password for the new Account. - """ - if not self._new: - raise AErr(_(u"The account '%s' already exists.") % self._addr, - ACCOUNT_EXISTS) - if not isinstance(password, basestring) or not password: - raise AErr(_(u"Could not accept password: '%s'") % password, - ACCOUNT_MISSING_PASSWORD) - self._passwd = password - - def set_note(self, note): - """Set the account's (optional) note. - - Argument: - - `note` : basestring or None - The note, or None to remove - """ - assert note is None or isinstance(note, basestring) - self._note = note - - def save(self): - """Save the new Account in the database.""" - if not self._new: - raise AErr(_(u"The account '%s' already exists.") % self._addr, - ACCOUNT_EXISTS) - if not self._passwd: - raise AErr(_(u"No password set for account: '%s'") % self._addr, - ACCOUNT_MISSING_PASSWORD) - self._prepare(MailLocation(self._dbh, mbfmt=cfg_dget('mailbox.format'), - directory=cfg_dget('mailbox.root'))) - dbc = self._dbh.cursor() - qid = ssid = tid = None - if self._qlimit: - qid = self._qlimit.qid - if self._services: - ssid = self._services.ssid - if self._transport: - tid = self._transport.tid - dbc.execute('INSERT INTO users (local_part, passwd, uid, gid, mid, ' - 'qid, ssid, tid, note) ' - 'VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)', - (self._addr.localpart, - pwhash(self._passwd, user=self._addr), self._uid, - self._domain.gid, self._mail.mid, qid, ssid, tid, -# self._qlimit.qid if self._qlimit else None, -# self._services.ssid if self._services else None, -# self._transport.tid if self._transport else None, - self._note)) - self._dbh.commit() - dbc.close() - self._new = False - - def modify(self, field, value): - """Update the Account's *field* to the new *value*. - - Possible values for *field* are: 'name', 'password', 'note'. - - Arguments: - - `field` : basestring - The attribute name: 'name', 'password' or 'note' - `value` : basestring - The new value of the attribute. - """ - if field not in ('name', 'password', 'note'): - raise AErr(_(u"Unknown field: '%s'") % field, INVALID_ARGUMENT) - self._chk_state() - dbc = self._dbh.cursor() - if field == 'password': - dbc.execute('UPDATE users SET passwd = %s WHERE uid = %s', - (pwhash(value, user=self._addr), self._uid)) - else: - dbc.execute('UPDATE users SET %s = %%s WHERE uid = %%s' % field, - (value, self._uid)) - if dbc.rowcount > 0: - self._dbh.commit() - dbc.close() - - def update_quotalimit(self, quotalimit): - """Update the user's quota limit. - - Arguments: - - `quotalimit` : VirtualMailManager.quotalimit.QuotaLimit - the new quota limit of the domain. - """ - if cfg_dget('misc.dovecot_version') < 0x10102f00: - raise VMMError(_(u'PostgreSQL-based dictionary quota requires ' - u'Dovecot >= v1.1.2.'), VMM_ERROR) - self._chk_state() - if quotalimit == self._qlimit: - return - self._qlimit = quotalimit - if quotalimit is not None: - assert isinstance(quotalimit, QuotaLimit) - quotalimit = quotalimit.qid - self._update_tables('qid', quotalimit) - - def update_serviceset(self, serviceset): - """Assign a different set of services to the Account. - - Argument: - - `serviceset` : VirtualMailManager.serviceset.ServiceSet - the new service set. - """ - self._chk_state() - if serviceset == self._services: - return - self._services = serviceset - if serviceset is not None: - assert isinstance(serviceset, ServiceSet) - serviceset = serviceset.ssid - self._update_tables('ssid', serviceset) - - def update_transport(self, transport): - """Sets a new transport for the Account. - - Arguments: - - `transport` : VirtualMailManager.transport.Transport - the new transport - """ - self._chk_state() - if transport == self._transport: - return - self._transport = transport - if transport is not None: - assert isinstance(transport, Transport) - validate_transport(transport, self._mail) - transport = transport.tid - self._update_tables('tid', transport) - - def _get_info_transport(self): - if self._transport: - return self._transport.transport - return format_domain_default(self._domain.transport.transport) - - def _get_info_serviceset(self): - if self._services: - services = self._services.services - fmt = lambda s: s - else: - services = self._domain.serviceset.services - fmt = format_domain_default - - ret = {} - for service, state in services.iteritems(): - # TP: A service (e.g. pop3 or imap) may be enabled/usable or - # disabled/unusable for a user. - ret[service] = fmt((_('disabled'), _('enabled'))[state]) - return ret - - def get_info(self): - """Returns a dict with some information about the Account. - - The keys of the dict are: 'address', 'gid', 'home', 'imap' - 'mail_location', 'name', 'pop3', 'sieve', 'smtp', transport', 'uid', - 'uq_bytes', 'uq_messages', 'ql_bytes', 'ql_messages', and - 'ql_domaindefault'. - """ - self._chk_state() - dbc = self._dbh.cursor() - dbc.execute('SELECT name, CASE WHEN bytes IS NULL THEN 0 ELSE bytes ' - 'END, CASE WHEN messages IS NULL THEN 0 ELSE messages END ' - 'FROM users LEFT JOIN userquota USING (uid) WHERE ' - 'users.uid = %s', (self._uid,)) - info = dbc.fetchone() - dbc.close() - if info: - info = dict(zip(('name', 'uq_bytes', 'uq_messages'), info)) - info.update(self._get_info_serviceset()) - info['address'] = self._addr - info['gid'] = self._domain.gid - info['home'] = '%s/%s' % (self._domain.directory, self._uid) - info['mail_location'] = self._mail.mail_location - if self._qlimit: - info['ql_bytes'] = self._qlimit.bytes - info['ql_messages'] = self._qlimit.messages - info['ql_domaindefault'] = False - else: - info['ql_bytes'] = self._domain.quotalimit.bytes - info['ql_messages'] = self._domain.quotalimit.messages - info['ql_domaindefault'] = True - info['transport'] = self._get_info_transport() - info['note'] = self._note - info['uid'] = self._uid - return info - # nearly impossible‽ - raise AErr(_(u"Could not fetch information for account: '%s'") % - self._addr, NO_SUCH_ACCOUNT) - - def get_aliases(self): - """Return a list with all alias e-mail addresses, whose destination - is the address of the Account.""" - self._chk_state() - dbc = self._dbh.cursor() - dbc.execute("SELECT address ||'@'|| domainname FROM alias, " - "domain_name WHERE destination = %s AND domain_name.gid = " - "alias.gid AND domain_name.is_primary ORDER BY address", - (str(self._addr),)) - addresses = dbc.fetchall() - dbc.close() - aliases = [] - if addresses: - aliases = [alias[0] for alias in addresses] - return aliases - - def delete(self, force=False): - """Delete the Account from the database. - - Argument: - - `force` : bool - if *force* is `True`, all aliases, which points to the Account, - will be also deleted. If there are aliases and *force* is - `False`, an AccountError will be raised. - """ - if not isinstance(force, bool): - raise TypeError('force must be a bool') - self._chk_state() - dbc = self._dbh.cursor() - if force: - dbc.execute('DELETE FROM users WHERE uid = %s', (self._uid,)) - # delete also all aliases where the destination address is the same - # as for this account. - dbc.execute("DELETE FROM alias WHERE destination = %s", - (str(self._addr),)) - self._dbh.commit() - else: # check first for aliases - a_count = self._count_aliases() - if a_count > 0: - dbc.close() - raise AErr(_(u"There are %(count)d aliases with the " - u"destination address '%(address)s'.") % - {'count': a_count, 'address': self._addr}, - ALIAS_PRESENT) - dbc.execute('DELETE FROM users WHERE uid = %s', (self._uid,)) - self._dbh.commit() - dbc.close() - self._new = True - self._uid = 0 - self._addr = self._dbh = self._domain = self._passwd = None - self._mail = self._qlimit = self._services = self._transport = None - - -def get_account_by_uid(uid, dbh): - """Search an Account by its UID. - - This function returns a dict (keys: 'address', 'gid' and 'uid'), if an - Account with the given *uid* exists. - - Argument: - - `uid` : long - The Account unique ID. - `dbh` : pyPgSQL.PgSQL.Connection - a database connection for the database access. - """ - try: - uid = long(uid) - except ValueError: - raise AErr(_(u'UID must be an int/long.'), INVALID_ARGUMENT) - if uid < 1: - raise AErr(_(u'UID must be greater than 0.'), INVALID_ARGUMENT) - dbc = dbh.cursor() - dbc.execute("SELECT local_part||'@'|| domain_name.domainname AS address, " - "uid, users.gid, note FROM users LEFT JOIN domain_name ON " - "(domain_name.gid = users.gid AND is_primary) WHERE uid = %s", - (uid,)) - info = dbc.fetchone() - dbc.close() - if not info: - raise AErr(_(u"There is no account with the UID: '%d'") % uid, - NO_SUCH_ACCOUNT) - info = dict(zip(('address', 'uid', 'gid', 'note'), info)) - return info - -del _, cfg_dget diff -r 659c4476c57c -r b678a1c43027 VirtualMailManager/alias.py --- a/VirtualMailManager/alias.py Mon Mar 24 19:22:04 2014 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,184 +0,0 @@ -# -*- coding: UTF-8 -*- -# Copyright (c) 2007 - 2014, Pascal Volk -# See COPYING for distribution information. -""" - VirtualMailManager.alias - ~~~~~~~~~~~~~~~~~~~~~~~~ - - Virtual Mail Manager's Alias class to manage e-mail aliases. -""" - -from VirtualMailManager.domain import get_gid -from VirtualMailManager.emailaddress import \ - EmailAddress, DestinationEmailAddress as DestAddr -from VirtualMailManager.errors import AliasError as AErr -from VirtualMailManager.ext.postconf import Postconf -from VirtualMailManager.pycompat import all -from VirtualMailManager.constants import \ - ALIAS_EXCEEDS_EXPANSION_LIMIT, NO_SUCH_ALIAS, NO_SUCH_DOMAIN - - -_ = lambda msg: msg -cfg_dget = lambda option: None - - -class Alias(object): - """Class to manage e-mail aliases.""" - __slots__ = ('_addr', '_dests', '_gid', '_dbh') - - def __init__(self, dbh, address): - assert isinstance(address, EmailAddress) - self._addr = address - self._dbh = dbh - self._gid = get_gid(self._dbh, self._addr.domainname) - if not self._gid: - raise AErr(_(u"The domain '%s' does not exist.") % - self._addr.domainname, NO_SUCH_DOMAIN) - self._dests = [] - - self._load_dests() - - def _load_dests(self): - """Loads all known destination addresses into the _dests list.""" - dbc = self._dbh.cursor() - dbc.execute('SELECT destination FROM alias WHERE gid = %s AND ' - 'address = %s ORDER BY destination', - (self._gid, self._addr.localpart)) - dests = dbc.fetchall() - if dbc.rowcount > 0: - self._dests.extend(DestAddr(dest[0], self._dbh) for dest in dests) - dbc.close() - - def _check_expansion(self, count_new): - """Checks the current expansion limit of the alias.""" - postconf = Postconf(cfg_dget('bin.postconf')) - limit = long(postconf.read('virtual_alias_expansion_limit')) - dcount = len(self._dests) - failed = False - if dcount == limit or dcount + count_new > limit: - failed = True - errmsg = _( -u"""Cannot add %(count_new)i new destination(s) to alias '%(address)s'. -Currently this alias expands into %(count)i/%(limit)i recipients. -%(count_new)i additional destination(s) will render this alias unusable. -Hint: Increase Postfix' virtual_alias_expansion_limit""") - elif dcount > limit: - failed = True - errmsg = _( -u"""Cannot add %(count_new)i new destination(s) to alias '%(address)s'. -This alias already exceeds its expansion limit (%(count)i/%(limit)i). -So its unusable, all messages addressed to this alias will be bounced. -Hint: Delete some destination addresses.""") - if failed: - raise AErr(errmsg % {'address': self._addr, 'count': dcount, - 'limit': limit, 'count_new': count_new}, - ALIAS_EXCEEDS_EXPANSION_LIMIT) - - def _delete(self, destinations=None): - """Deletes the *destinations* from the alias, if ``destinations`` - is not ``None``. If ``destinations`` is None, the alias with all - its destination addresses will be deleted. - - """ - dbc = self._dbh.cursor() - if not destinations: - dbc.execute('DELETE FROM alias WHERE gid = %s AND address = %s', - (self._gid, self._addr.localpart)) - else: - dbc.executemany("DELETE FROM alias WHERE gid = %d AND address = " - "'%s' AND destination = %%s" % (self._gid, - self._addr.localpart), - ((str(dest),) for dest in destinations)) - if dbc.rowcount > 0: - self._dbh.commit() - dbc.close() - - def __len__(self): - """Returns the number of destinations of the alias.""" - return len(self._dests) - - @property - def address(self): - """The Alias' EmailAddress instance.""" - return self._addr - - def add_destinations(self, destinations, warnings=None): - """Adds the `EmailAddress`es from *destinations* list to the - destinations of the alias. - - Destinations, that are already assigned to the alias, will be - removed from *destinations*. When done, this method will return - a set with all destinations, that were saved in the database. - """ - destinations = set(destinations) - assert destinations and \ - all(isinstance(dest, EmailAddress) for dest in destinations) - if not warnings is None: - assert isinstance(warnings, list) - if self._addr in destinations: - destinations.remove(self._addr) - if not warnings is None: - warnings.append(self._addr) - duplicates = destinations.intersection(set(self._dests)) - if duplicates: - destinations.difference_update(set(self._dests)) - if not warnings is None: - warnings.extend(duplicates) - if not destinations: - return destinations - self._check_expansion(len(destinations)) - dbc = self._dbh.cursor() - dbc.executemany("INSERT INTO alias (gid, address, destination) " - "VALUES (%d, '%s', %%s)" % (self._gid, - self._addr.localpart), - ((str(destination),) for destination in destinations)) - self._dbh.commit() - dbc.close() - self._dests.extend(destinations) - return destinations - - def del_destinations(self, destinations, warnings=None): - """Delete the specified `EmailAddress`es of *destinations* from - the alias's destinations. - - """ - destinations = set(destinations) - assert destinations and \ - all(isinstance(dest, EmailAddress) for dest in destinations) - if not warnings is None: - assert isinstance(warnings, list) - if self._addr in destinations: - destinations.remove(self._addr) - if not warnings is None: - warnings.append(self._addr) - if not self._dests: - raise AErr(_(u"The alias '%s' does not exist.") % self._addr, - NO_SUCH_ALIAS) - unknown = destinations.difference(set(self._dests)) - if unknown: - destinations.intersection_update(set(self._dests)) - if not warnings is None: - warnings.extend(unknown) - if not destinations: - raise AErr(_(u"No suitable destinations left to remove from alias " - u"'%s'.") % self._addr, NO_SUCH_ALIAS) - self._delete(destinations) - for destination in destinations: - self._dests.remove(destination) - - def get_destinations(self): - """Returns an iterator for all destinations of the alias.""" - if not self._dests: - raise AErr(_(u"The alias '%s' does not exist.") % self._addr, - NO_SUCH_ALIAS) - return iter(self._dests) - - def delete(self): - """Deletes the alias with all its destinations.""" - if not self._dests: - raise AErr(_(u"The alias '%s' does not exist.") % self._addr, - NO_SUCH_ALIAS) - self._delete() - del self._dests[:] - -del _, cfg_dget diff -r 659c4476c57c -r b678a1c43027 VirtualMailManager/aliasdomain.py --- a/VirtualMailManager/aliasdomain.py Mon Mar 24 19:22:04 2014 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,143 +0,0 @@ -# -*- coding: UTF-8 -*- -# Copyright (c) 2008 - 2014, Pascal Volk -# See COPYING for distribution information. -""" - VirtualMailManager.aliasdomain - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Virtual Mail Manager's AliasDomain class to manage alias domains. -""" - -from VirtualMailManager.domain import Domain, check_domainname -from VirtualMailManager.constants import \ - ALIASDOMAIN_EXISTS, ALIASDOMAIN_ISDOMAIN, ALIASDOMAIN_NO_DOMDEST, \ - NO_SUCH_ALIASDOMAIN, NO_SUCH_DOMAIN -from VirtualMailManager.errors import AliasDomainError as ADErr - - -_ = lambda msg: msg - - -class AliasDomain(object): - """Class to manage e-mail alias domains.""" - __slots__ = ('_gid', '_name', '_domain', '_dbh') - - def __init__(self, dbh, domainname): - """Creates a new AliasDomain instance. - - Arguments: - - `dbh` : pyPgSQL.PgSQL.Connection - a database connection for the database access - `domainname` : basestring - the name of the AliasDomain""" - self._dbh = dbh - self._name = check_domainname(domainname) - self._gid = 0 - self._domain = None - self._load() - - def _load(self): - """Loads the AliasDomain's GID from the database and checks if the - domain name is marked as primary.""" - dbc = self._dbh.cursor() - dbc.execute('SELECT gid, is_primary FROM domain_name WHERE ' - 'domainname = %s', (self._name,)) - result = dbc.fetchone() - dbc.close() - if result: - if result[1]: - raise ADErr(_(u"The domain '%s' is a primary domain.") % - self._name, ALIASDOMAIN_ISDOMAIN) - self._gid = result[0] - - def set_destination(self, dest_domain): - """Set the destination of a new AliasDomain or updates the - destination of an existing AliasDomain. - - Argument: - - `dest_domain` : VirtualMailManager.Domain.Domain - the AliasDomain's destination domain - """ - assert isinstance(dest_domain, Domain) - self._domain = dest_domain - - def save(self): - """Stores information about the new AliasDomain in the database.""" - if self._gid > 0: - raise ADErr(_(u"The alias domain '%s' already exists.") % - self._name, ALIASDOMAIN_EXISTS) - if not self._domain: - raise ADErr(_(u'No destination domain set for the alias domain.'), - ALIASDOMAIN_NO_DOMDEST) - if self._domain.gid < 1: - raise ADErr(_(u"The target domain '%s' does not exist.") % - self._domain.name, NO_SUCH_DOMAIN) - dbc = self._dbh.cursor() - dbc.execute('INSERT INTO domain_name (domainname, gid, is_primary) ' - 'VALUES (%s, %s, FALSE)', (self._name, self._domain.gid)) - self._dbh.commit() - dbc.close() - self._gid = self._domain.gid - - def info(self): - """Returns a dict (keys: "alias" and "domain") with the names of the - AliasDomain and its primary domain.""" - if self._gid < 1: - raise ADErr(_(u"The alias domain '%s' does not exist.") % - self._name, NO_SUCH_ALIASDOMAIN) - dbc = self._dbh.cursor() - dbc.execute('SELECT domainname FROM domain_name WHERE gid = %s AND ' - 'is_primary', (self._gid,)) - domain = dbc.fetchone() - dbc.close() - if domain: - return {'alias': self._name, 'domain': domain[0]} - else: # an almost unlikely case, isn't it? - raise ADErr(_(u'There is no primary domain for the alias domain ' - u"'%s'.") % self._name, NO_SUCH_DOMAIN) - - def switch(self): - """Switch the destination of the AliasDomain to the new destination, - set with the method `set_destination()`. - """ - if not self._domain: - raise ADErr(_(u'No destination domain set for the alias domain.'), - ALIASDOMAIN_NO_DOMDEST) - if self._domain.gid < 1: - raise ADErr(_(u"The target domain '%s' does not exist.") % - self._domain.name, NO_SUCH_DOMAIN) - if self._gid < 1: - raise ADErr(_(u"The alias domain '%s' does not exist.") % - self._name, NO_SUCH_ALIASDOMAIN) - if self._gid == self._domain.gid: - raise ADErr(_(u"The alias domain '%(alias)s' is already assigned " - u"to the domain '%(domain)s'.") % - {'alias': self._name, 'domain': self._domain.name}, - ALIASDOMAIN_EXISTS) - dbc = self._dbh.cursor() - dbc.execute('UPDATE domain_name SET gid = %s WHERE gid = %s AND ' - 'domainname = %s AND NOT is_primary', (self._domain.gid, - self._gid, self._name)) - self._dbh.commit() - dbc.close() - self._gid = self._domain.gid - - def delete(self): - """Delete the AliasDomain's record form the database. - - Raises an AliasDomainError if the AliasDomain doesn't exist. - """ - if self._gid < 1: - raise ADErr(_(u"The alias domain '%s' does not exist.") % - self._name, NO_SUCH_ALIASDOMAIN) - dbc = self._dbh.cursor() - dbc.execute('DELETE FROM domain_name WHERE domainname = %s AND NOT ' - 'is_primary', (self._name,)) - if dbc.rowcount > 0: - self._dbh.commit() - self._gid = 0 - dbc.close() - -del _ diff -r 659c4476c57c -r b678a1c43027 VirtualMailManager/catchall.py --- a/VirtualMailManager/catchall.py Mon Mar 24 19:22:04 2014 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,181 +0,0 @@ -# -*- coding: UTF-8 -*- -# Copyright (c) 2012 - 2014, martin f. krafft -# See COPYING for distribution information. -""" - VirtualMailManager.catchall - ~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Virtual Mail Manager's CatchallAlias class to manage domain catch-all - aliases. - - This is heavily based on (more or less a copy of) the Alias class, because - fundamentally, catchall aliases are aliases, but without a localpart. - While Alias could potentially derive from CatchallAlias to reuse some of - the functionality, it's probably not worth it. I found no sensible way to - derive CatchallAlias from Alias, or at least none that would harness the - powers of polymorphism. - - Yet, we reuse the AliasError exception class, which makes sense. -""" - -from VirtualMailManager.domain import get_gid -from VirtualMailManager.emailaddress import \ - EmailAddress, DestinationEmailAddress as DestAddr -from VirtualMailManager.errors import AliasError as AErr -from VirtualMailManager.ext.postconf import Postconf -from VirtualMailManager.pycompat import all -from VirtualMailManager.constants import \ - ALIAS_EXCEEDS_EXPANSION_LIMIT, NO_SUCH_ALIAS, NO_SUCH_DOMAIN - - -_ = lambda msg: msg -cfg_dget = lambda option: None - - -class CatchallAlias(object): - """Class to manage domain catch-all aliases.""" - __slots__ = ('_domain', '_dests', '_gid', '_dbh') - - def __init__(self, dbh, domain): - self._domain = domain - self._dbh = dbh - self._gid = get_gid(self._dbh, self.domain) - if not self._gid: - raise AErr(_(u"The domain '%s' does not exist.") % - self.domain, NO_SUCH_DOMAIN) - self._dests = [] - - self._load_dests() - - def _load_dests(self): - """Loads all known destination addresses into the _dests list.""" - dbc = self._dbh.cursor() - dbc.execute('SELECT destination FROM catchall WHERE gid = %s', - (self._gid,)) - dests = dbc.fetchall() - if dbc.rowcount > 0: - self._dests.extend(DestAddr(dest[0], self._dbh) for dest in dests) - dbc.close() - - def _check_expansion(self, count_new): - """Checks the current expansion limit of the alias.""" - postconf = Postconf(cfg_dget('bin.postconf')) - limit = long(postconf.read('virtual_alias_expansion_limit')) - dcount = len(self._dests) - failed = False - if dcount == limit or dcount + count_new > limit: - failed = True - errmsg = _( -u"""Cannot add %(count_new)i new destination(s) to catch-all alias for -domain '%(domain)s'. Currently this alias expands into %(count)i/%(limit)i -recipients. %(count_new)i additional destination(s) will render this alias -unusable. -Hint: Increase Postfix' virtual_alias_expansion_limit""") - elif dcount > limit: - failed = True - errmsg = _( -u"""Cannot add %(count_new)i new destination(s) to catch-all alias for domain -'%(domain)s'. This alias already exceeds its expansion limit \ -(%(count)i/%(limit)i). -So its unusable, all messages addressed to this alias will be bounced. -Hint: Delete some destination addresses.""") - if failed: - raise AErr(errmsg % {'domain': self._domain, 'count': dcount, - 'limit': limit, 'count_new': count_new}, - ALIAS_EXCEEDS_EXPANSION_LIMIT) - - def _delete(self, destinations=None): - """Delete one ore multiple destinations from the catchall alias, if - ``destinations`` is not ``None``. If ``destinations`` is None, the - catchall alias with all its destination addresses will be deleted. - - """ - dbc = self._dbh.cursor() - if not destinations: - dbc.execute('DELETE FROM catchall WHERE gid = %s', (self._gid,)) - else: - dbc.executemany('DELETE FROM catchall WHERE gid = %d AND ' - 'destination = %%s' % self._gid, - ((str(dest),) for dest in destinations)) - if dbc.rowcount > 0: - self._dbh.commit() - dbc.close() - - def __len__(self): - """Returns the number of destinations of the catchall alias.""" - return len(self._dests) - - @property - def domain(self): - """The Alias' domain.""" - return self._domain - - def add_destinations(self, destinations, warnings=None): - """Adds the `EmailAddress`es from *destinations* list to the - destinations of the catchall alias. - - Destinations, that are already assigned to the alias, will be - removed from *destinations*. When done, this method will return - a set with all destinations, that were saved in the database. - """ - destinations = set(destinations) - assert destinations and \ - all(isinstance(dest, EmailAddress) for dest in destinations) - if not warnings is None: - assert isinstance(warnings, list) - duplicates = destinations.intersection(set(self._dests)) - if duplicates: - destinations.difference_update(set(self._dests)) - if not warnings is None: - warnings.extend(duplicates) - if not destinations: - return destinations - self._check_expansion(len(destinations)) - dbc = self._dbh.cursor() - dbc.executemany("INSERT INTO catchall (gid, destination) " - "VALUES (%d, %%s)" % self._gid, - ((str(destination),) for destination in destinations)) - self._dbh.commit() - dbc.close() - self._dests.extend(destinations) - return destinations - - def del_destinations(self, destinations, warnings=None): - """Deletes the specified ``destinations`` from the catchall alias.""" - destinations = set(destinations) - assert destinations and \ - all(isinstance(dest, EmailAddress) for dest in destinations) - if not warnings is None: - assert isinstance(warnings, list) - if not self._dests: - raise AErr(_(u"There are no catch-all aliases defined for " - u"domain '%s'.") % self._domain, NO_SUCH_ALIAS) - unknown = destinations.difference(set(self._dests)) - if unknown: - destinations.intersection_update(set(self._dests)) - if not warnings is None: - warnings.extend(unknown) - if not destinations: - raise AErr(_(u"No suitable destinations left to remove from the " - u"catch-all alias of domain '%s'.") % self._domain, - NO_SUCH_ALIAS) - self._delete(destinations) - for destination in destinations: - self._dests.remove(destination) - - def get_destinations(self): - """Returns an iterator for all destinations of the catchall alias.""" - if not self._dests: - raise AErr(_(u"There are no catch-all aliases defined for " - u"domain '%s'.") % self._domain, NO_SUCH_ALIAS) - return iter(self._dests) - - def delete(self): - """Deletes all catchall destinations for the domain.""" - if not self._dests: - raise AErr(_(u"There are no catch-all aliases defined for " - u"domain '%s'.") % self._domain, NO_SUCH_ALIAS) - self._delete() - del self._dests[:] - -del _, cfg_dget diff -r 659c4476c57c -r b678a1c43027 VirtualMailManager/cli/__init__.py --- a/VirtualMailManager/cli/__init__.py Mon Mar 24 19:22:04 2014 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,100 +0,0 @@ -# -*- coding: UTF-8 -*- -# Copyright (c) 2010 - 2014, Pascal Volk -# See COPYING for distribution information. -""" - VirtualMailManager.cli - ~~~~~~~~~~~~~~~~~~~~~~ - - VirtualMailManager's command line interface. -""" - -import os -from array import array -from fcntl import ioctl -from getpass import getpass -from termios import TIOCGWINSZ - -from VirtualMailManager import ENCODING -from VirtualMailManager.constants import VMM_TOO_MANY_FAILURES -from VirtualMailManager.errors import VMMError - - -__all__ = ('prog', 'get_winsize', 'read_pass', 'w_err', 'w_std') - -_ = lambda msg: msg -_std_write = os.sys.stdout.write -_err_write = os.sys.stderr.write -prog = os.path.basename(os.sys.argv[0]) - - -def w_std(*args): - """Writes a line for each arg of *args*, encoded in the current - ENCODING, to stdout. - """ - _std_write('\n'.join(a.encode(ENCODING, 'replace') for a in args) + '\n') - - -def w_err(code, *args): - """Writes a line for each arg of *args*, encoded in the current - ENCODING, to stderr. - This function optionally interrupts the program execution if *code* - does not equal to 0. *code* will be used as the system exit status. - """ - _err_write('\n'.join(a.encode(ENCODING, 'replace') for a in args) + '\n') - if code: - os.sys.exit(code) - - -def get_winsize(): - """Returns a tuple of integers ``(ws_row, ws_col)`` with the height and - width of the terminal.""" - fd = None - for dev in (os.sys.stdout, os.sys.stderr, os.sys.stdin): - if hasattr(dev, 'fileno') and os.isatty(dev.fileno()): - fd = dev.fileno() - break - if fd is None: # everything seems to be redirected - # fall back to environment or assume some common defaults - ws_row, ws_col = 24, 80 - try: - ws_col = int(os.environ.get('COLUMNS', 80)) - ws_row = int(os.environ.get('LINES', 24)) - except ValueError: - pass - return ws_row, ws_col - #"struct winsize" with the ``unsigned short int``s ws_{row,col,{x,y}pixel} - ws = array('H', (0, 0, 0, 0)) - ioctl(fd, TIOCGWINSZ, ws, True) - ws_row, ws_col = ws[:2] - return ws_row, ws_col - - -def read_pass(): - """Interactive 'password chat', returns the password in plain format. - - Throws a VMMError after the third failure. - """ - # TP: Please preserve the trailing space. - readp_msg0 = _(u'Enter new password: ').encode(ENCODING, 'replace') - # TP: Please preserve the trailing space. - readp_msg1 = _(u'Retype new password: ').encode(ENCODING, 'replace') - mismatched = True - failures = 0 - while mismatched: - if failures > 2: - raise VMMError(_(u'Too many failures - try again later.'), - VMM_TOO_MANY_FAILURES) - clear0 = getpass(prompt=readp_msg0) - clear1 = getpass(prompt=readp_msg1) - if clear0 != clear1: - failures += 1 - w_err(0, _(u'Sorry, passwords do not match.')) - continue - if not clear0: - failures += 1 - w_err(0, _(u'Sorry, empty passwords are not permitted.')) - continue - mismatched = False - return clear0 - -del _ diff -r 659c4476c57c -r b678a1c43027 VirtualMailManager/cli/clihelp.py --- a/VirtualMailManager/cli/clihelp.py Mon Mar 24 19:22:04 2014 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,262 +0,0 @@ -# -*- coding: UTF-8 -*- -# Copyright (c) 2012 - 2014, Pascal Volk -# See COPYING for distribution information. -""" - VirtualMailManager.cli.vmmhelp - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Virtual Mail Manager's command line help. -""" - -_ = lambda msg: msg - -help_msgs = { -# TP: There are some words enclosed within angle brackets '<'word'>'. They -# are used to indicate replaceable arguments. Please do not translate them. -# -# The descriptions of subcommands may contain the both keywords 'domain' -# and 'force', enclosed within single quotes. Please keep them as they are. -# - # TP: description of subcommand configget - 'configget': (_(u"""This subcommand is used to display the actual value -of the given configuration