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()
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()
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()
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)
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()
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()
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()