Ejemplo n.º 1
0
def config_update(delete_objects=False):
    """sync configuration with data from YAML-formatted stdin"""
    import yaml, sys
    new_config = yaml.load(sys.stdin)
    # print new_config
    users = new_config['users']
    tracked_users = set()
    for user_config in users:
        localpart = user_config['localpart']
        domain_name = user_config['domain']
        password_hash = user_config['password_hash']
        hash_scheme = user_config['hash_scheme']
        domain = models.Domain.query.get(domain_name)
        email = '{0}@{1}'.format(localpart, domain_name)
        if not domain:
            domain = models.Domain(name=domain_name)
            db.session.add(domain)
        user = models.User.query.get(email)
        tracked_users.add(email)
        if not user:
            user = models.User(localpart=localpart,
                               domain=domain,
                               global_admin=False)
        user.set_password(password_hash, hash_scheme=hash_scheme, raw=True)
        db.session.add(user)

    aliases = new_config['aliases']
    tracked_aliases = set()
    for alias_config in aliases:
        localpart = alias_config['localpart']
        domain_name = alias_config['domain']
        destination = alias_config['destination']
        domain = models.Domain.query.get(domain_name)
        email = '{0}@{1}'.format(localpart, domain_name)
        if not domain:
            domain = models.Domain(name=domain_name)
            db.session.add(domain)
        alias = models.Alias.query.get(email)
        tracked_aliases.add(email)
        if not alias:
            alias = models.Alias(localpart=localpart,
                                 domain=domain,
                                 destination=destination.split(','),
                                 email=email)
        else:
            alias.destination = destination.split(',')
        db.session.add(alias)

    if delete_objects:
        for user in db.session.query(models.User).all():
            if not (user.email in tracked_users):
                db.session.delete(user)
        for alias in db.session.query(models.Alias).all():
            if not (alias.email in tracked_aliases):
                db.session.delete(alias)
    db.session.commit()
Ejemplo n.º 2
0
def user(localpart, domain_name, password, hash_scheme='SHA512-CRYPT'):
    """ Create a user
    """
    domain = models.Domain.query.get(domain_name)
    if not domain:
        domain = models.Domain(name=domain_name)
        db.session.add(domain)
    user = models.User(localpart=localpart, domain=domain, global_admin=False)
    user.set_password(password, hash_scheme=hash_scheme)
    db.session.add(user)
    db.session.commit()
Ejemplo n.º 3
0
def admin(localpart, domain_name, password):
    """ Create an admin user
    """
    domain = models.Domain.query.get(domain_name)
    if not domain:
        domain = models.Domain(name=domain_name)
        db.session.add(domain)
    user = models.User(localpart=localpart, domain=domain, global_admin=True)
    user.set_password(password)
    db.session.add(user)
    db.session.commit()
Ejemplo n.º 4
0
def domain_create():
    form = forms.DomainForm()
    if form.validate_on_submit():
        if models.Domain.query.get(form.name.data):
            flask.flash('Domain %s is already used' % form.name.data, 'error')
        else:
            domain = models.Domain()
            form.populate_obj(domain)
            db.session.add(domain)
            db.session.commit()
            flask.flash('Domain %s created' % domain)
            return flask.redirect(flask.url_for('.domain_list'))
    return flask.render_template('domain/create.html', form=form)
Ejemplo n.º 5
0
def alias(localpart, domain_name, destination):
    """ Create an alias
    """
    domain = models.Domain.query.get(domain_name)
    if not domain:
        domain = models.Domain(name=domain_name)
        db.session.add(domain)
    alias = models.Alias(localpart=localpart,
                         domain=domain,
                         destination=destination.split(','),
                         email="%s@%s" % (localpart, domain_name))
    db.session.add(alias)
    db.session.commit()
Ejemplo n.º 6
0
def user(localpart, domain_name, password):
    """ Create an user
    """
    domain = models.Domain.query.get(domain_name)
    if not domain:
        domain = models.Domain(name=domain_name)
        db.session.add(domain)
    user = models.User(localpart=localpart,
                       domain=domain,
                       global_admin=False,
                       password=hash.sha512_crypt.encrypt(password))
    db.session.add(user)
    db.session.commit()
Ejemplo n.º 7
0
def user_import(localpart,
                domain_name,
                password_hash,
                hash_scheme='SHA512-CRYPT'):
    """ Import a user along with password hash. Available hashes:
                   'SHA512-CRYPT'
                   'SHA256-CRYPT'
                   'MD5-CRYPT'
                   'CRYPT'
    """
    domain = models.Domain.query.get(domain_name)
    if not domain:
        domain = models.Domain(name=domain_name)
        db.session.add(domain)
    user = models.User(localpart=localpart, domain=domain, global_admin=False)
    user.set_password(password_hash, hash_scheme=hash_scheme, raw=True)
    db.session.add(user)
    db.session.commit()