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 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 alias_create(domain_name): domain = models.Domain.query.get(domain_name) or flask.abort(404) if domain.max_aliases and len(domain.aliases) >= domain.max_aliases: flask.flash('Too many aliases for domain %s' % domain, 'error') return flask.redirect( flask.url_for('.alias_list', domain_name=domain.name)) form = forms.AliasForm() if form.validate_on_submit(): if domain.has_email(form.localpart.data): flask.flash('Email is already used', 'error') else: alias = models.Alias(domain=domain) form.populate_obj(alias) db.session.add(alias) db.session.commit() flask.flash('Alias %s created' % alias) return flask.redirect( flask.url_for('.alias_list', domain_name=domain.name)) return flask.render_template('alias/create.html', domain=domain, form=form)