Merge branch 'aliases' of github.com:YunoHost/yunohost into aliases

This commit is contained in:
Julien Malik 2016-11-17 14:42:38 +01:00
commit 176ee5aa33

View file

@ -29,6 +29,7 @@ import errno
from moulinette.core import MoulinetteError from moulinette.core import MoulinetteError
from yunohost.domain import domain_list from yunohost.domain import domain_list
def alias_list(auth): def alias_list(auth):
""" """
List aliases List aliases
@ -36,9 +37,9 @@ def alias_list(auth):
""" """
_ensure_ldap_ou_is_created(auth) _ensure_ldap_ou_is_created(auth)
ldap_filter = '(&(objectclass=mailAccount)(objectclass=mailAlias))' ldap_filter = '(&(objectclass=mailAccount)(objectclass=mailAlias))'
ldap_attrs = [ 'mail', 'maildrop' ] ldap_attrs = ['mail', 'maildrop']
result = auth.search('ou=aliases,dc=yunohost,dc=org', ldap_filter, ldap_attrs) result = auth.search('ou=aliases,dc=yunohost,dc=org', ldap_filter, ldap_attrs)
return { 'alias' : result } return {'alias': result}
def alias_create(auth, alias, mailforward): def alias_create(auth, alias, mailforward):
@ -54,11 +55,11 @@ def alias_create(auth, alias, mailforward):
# Validate uniqueness of alias and mail in LDAP # Validate uniqueness of alias and mail in LDAP
auth.validate_uniqueness({ auth.validate_uniqueness({
'mail' : alias 'mail': alias,
}) })
# Check that the mail domain exists # Check that the mail domain exists
alias_domain = alias[alias.find('@')+1:] alias_domain = alias[alias.find('@') + 1:]
if alias_domain not in domain_list(auth)['domains']: if alias_domain not in domain_list(auth)['domains']:
raise MoulinetteError(errno.EINVAL, raise MoulinetteError(errno.EINVAL,
m18n.n('mail_domain_unknown', m18n.n('mail_domain_unknown',
@ -67,16 +68,18 @@ def alias_create(auth, alias, mailforward):
# Adapt values for LDAP # Adapt values for LDAP
rdn = 'mail=%s,ou=aliases' % alias rdn = 'mail=%s,ou=aliases' % alias
attr_dict = { attr_dict = {
'objectClass' : ['mailAccount', 'mailAlias'], 'objectClass': ['mailAccount', 'mailAlias'],
'mail' : alias, 'mail': alias,
'maildrop' : mailforward.split(",") 'maildrop': mailforward.split(",")
} }
if not auth.add(rdn, attr_dict): success = auth.add(rdn, attr_dict)
if not success:
raise MoulinetteError(169, m18n.n('alias_creation_failed')) raise MoulinetteError(169, m18n.n('alias_creation_failed'))
msignals.display(m18n.n('alias_created'), 'success') msignals.display(m18n.n('alias_created'), 'success')
return { 'alias' : alias, 'maildrop' : attr_dict['maildrop'] } return {'alias': alias, 'maildrop': attr_dict['maildrop']}
def alias_update(auth, alias, add_mailforward=None, remove_mailforward=None): def alias_update(auth, alias, add_mailforward=None, remove_mailforward=None):
""" """
@ -88,17 +91,24 @@ def alias_update(auth, alias, add_mailforward=None, remove_mailforward=None):
""" """
_ensure_ldap_ou_is_created(auth) _ensure_ldap_ou_is_created(auth)
# normalize input
if not isinstance(add_mailforward, list):
add_mailforward = [add_mailforward]
if not isinstance(add_mailforward, list):
add_mailforward = [add_mailforward]
alias_attrs = [ alias_attrs = [
'mail', 'maildrop' 'mail', 'maildrop'
] ]
if len(alias.split('@')) is 2: if len(alias.split('@')) == 2:
filter = 'mail=' + alias ldap_filter = 'mail=%s' % alias
else: else:
# TODO better error message # TODO better error message
raise MoulinetteError(167, m18n.n('alias_info_failed')) raise MoulinetteError(167, m18n.n('alias_info_failed'))
result = auth.search('ou=aliases,dc=yunohost,dc=org', filter, alias_attrs) result = auth.search('ou=aliases,dc=yunohost,dc=org', ldap_filter, alias_attrs)
if not result: if not result:
raise MoulinetteError(errno.EINVAL, m18n.n('alias_unknown')) raise MoulinetteError(errno.EINVAL, m18n.n('alias_unknown'))
@ -107,24 +117,22 @@ def alias_update(auth, alias, add_mailforward=None, remove_mailforward=None):
# Get modifications from arguments # Get modifications from arguments
if add_mailforward: if add_mailforward:
if not isinstance(add_mailforward, list):
add_mailforward = [ add_mailforward ]
for mail in add_mailforward: for mail in add_mailforward:
if mail not in current_alias_info['maildrop']: if mail not in current_alias_info['maildrop']:
current_alias_info['maildrop'].append(mail) current_alias_info['maildrop'].append(mail)
if remove_mailforward: if remove_mailforward:
if not isinstance(add_mailforward, list):
add_mailforward = [ add_mailforward ]
for mail in remove_mailforward: for mail in remove_mailforward:
if mail in current_alias_info['maildrop'][1:]: if mail in current_alias_info['maildrop'][1:]:
current_alias_info['maildrop'].remove(mail) current_alias_info['maildrop'].remove(mail)
if auth.update('mail=%s,ou=aliases' % alias, current_alias_info): success = auth.update('mail=%s,ou=aliases' % alias, current_alias_info)
if not success:
raise MoulinetteError(169, m18n.n('alias_update_failed'))
msignals.display(m18n.n('alias_updated'), 'success') msignals.display(m18n.n('alias_updated'), 'success')
return alias_info(auth, alias) return alias_info(auth, alias)
else:
raise MoulinetteError(169, m18n.n('alias_update_failed'))
def alias_delete(auth, alias): def alias_delete(auth, alias):
""" """
@ -136,7 +144,8 @@ def alias_delete(auth, alias):
""" """
_ensure_ldap_ou_is_created(auth) _ensure_ldap_ou_is_created(auth)
if not auth.remove('mail=%s,ou=aliases' % alias): success = auth.remove('mail=%s,ou=aliases' % alias)
if not success:
raise MoulinetteError(169, m18n.n('alias_deletion_failed')) raise MoulinetteError(169, m18n.n('alias_deletion_failed'))
msignals.display(m18n.n('alias_deleted'), 'success') msignals.display(m18n.n('alias_deleted'), 'success')
@ -169,6 +178,7 @@ def alias_info(auth, alias):
return result[0] return result[0]
def _ensure_ldap_ou_is_created(auth): def _ensure_ldap_ou_is_created(auth):
""" """
Make sure the 'ou=aliases' tree is created, for holding aliases entries. Make sure the 'ou=aliases' tree is created, for holding aliases entries.
@ -179,8 +189,11 @@ def _ensure_ldap_ou_is_created(auth):
""" """
rdn = 'ou=aliases' rdn = 'ou=aliases'
attr_dict = { attr_dict = {
'objectClass' : ['organizationalUnit', 'top'], 'objectClass': ['organizationalUnit', 'top'],
} }
if not auth.search('dc=yunohost,dc=org', rdn, attr_dict['objectClass']) :
result = auth.search('dc=yunohost,dc=org', rdn, attr_dict['objectClass'])
if not result:
if auth.add(rdn, attr_dict): if auth.add(rdn, attr_dict):
msignals.display(m18n.n('alias_init'), 'success') msignals.display(m18n.n('alias_init'), 'success')