Esempio n. 1
0
def admin(localpart, domain_name, password, mode='create'):
  """ Create an admin user
      'mode' can be:
          - 'create' (default) Will try to create user and will raise an exception if present
          - 'ifmissing': if user exists, nothing happens, else it will be created
          - 'update': user is created or, if it exists, its password gets updated
  """

  domain = models.Domain.query.get(domain_name)
  if not domain:
    domain = models.Domain(name=domain_name)
    db.session.add(domain)

  user = None
  if mode == 'ifmissing' or mode == 'update':
    email = '{}@{}'.format(localpart, domain_name)
    user = models.User.query.get(email)

    if user and mode == 'ifmissing':
      print('user %s exists, not updating' % email)
      return

  if not user:
    user = models.User(
      localpart=localpart,
      domain=domain,
      global_admin=True
    )
    user.set_password(password)
      db.session.add(user)
      db.session.commit()
      print("created admin user")
Esempio n. 2
0
def config_update(verbose=False, delete_objects=False):
  """ sync configuration with data from YAML-formatted stdin
  """

  import yaml
  import sys
  new_config = yaml.safe_load(sys.stdin)
  # print new_config
  domains = new_config.get('domains', [])
  tracked_domains = set()
  for domain_config in domains:
    if verbose:
      print(str(domain_config))
    domain_name = domain_config['name']
    max_users = domain_config.get('max_users', -1)
    max_aliases = domain_config.get('max_aliases', -1)
    max_quota_bytes = domain_config.get('max_quota_bytes', 0)
    tracked_domains.add(domain_name)
    domain = models.Domain.query.get(domain_name)
    if not domain:
      domain = models.Domain(name=domain_name,
               max_users=max_users,
               max_aliases=max_aliases,
               max_quota_bytes=max_quota_bytes)
      db.session.add(domain)
      print("Added " + str(domain_config))
    else:
      domain.max_users = max_users
      domain.max_aliases = max_aliases
      domain.max_quota_bytes = max_quota_bytes
        db.session.add(domain)
        print("Updated " + str(domain_config))
Esempio n. 3
0
def domain(domain_name, max_users=-1, max_aliases=-1, max_quota_bytes=0):
  """ Create a domain
  """

  domain = models.Domain.query.get(domain_name)
  if not domain:
    domain = models.Domain(name=domain_name, max_users=max_users,
      max_aliases=max_aliases, max_quota_bytes=max_quota_bytes)
    db.session.add(domain)
    db.session.commit()
Esempio n. 4
0
def domain_create():
    form = forms.DomainForm()
    if form.validate_on_submit():
        conflicting_domain = models.Domain.query.get(form.name.data)
        conflicting_alternative = models.Alternative.query.get(form.name.data)
        conflicting_relay = models.Relay.query.get(form.name.data)
        if conflicting_domain or conflicting_alternative or conflicting_relay:
            flask.flash('Domain %s is already used' % form.name.data, 'error')
        else:
            domain = models.Domain()
            form.populate_obj(domain)
            models.db.session.add(domain)
            models.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)
Esempio n. 5
0
def alias(localpart, domain_name, destination, wildcard=False):
  """ 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,
    wildcard=wildcard,
    destination=destination.split(','),
    email="%s@%s" % (localpart, domain_name)
  )
  db.session.add(alias)
  db.session.commit()
Esempio n. 6
0
def user(localpart, domain_name, password, hash_scheme=None):
  """ Create a user
  """

  if hash_scheme is None:
    hash_scheme = app.configApp['APP_PASSWORD_SCHEME']
  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()
Esempio n. 7
0
def user_import(localpart, domain_name, password_hash, hash_scheme = None):
  """ Import a user along with password hash.
  """

  if hash_scheme is None:
    hash_scheme = app.configApp['APP_PASSWORD_SCHEME']
  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()
Esempio n. 8
0
def domain_signup(domain_name=None):
    if not app.configApp['DOMAIN_REGISTRATION']:
        flask.abort(403)
    form = forms.DomainSignupForm()
    if flask_login.current_user.is_authenticated:
        del form.localpart
        del form.pw
        del form.pw2
    if form.validate_on_submit():
        conflicting_domain = models.Domain.query.get(form.name.data)
        conflicting_alternative = models.Alternative.query.get(form.name.data)
        conflicting_relay = models.Relay.query.get(form.name.data)
        if conflicting_domain or conflicting_alternative or conflicting_relay:
            flask.flash('Domain %s is already used' % form.name.data, 'error')
        else:
            domain = models.Domain()
            form.populate_obj(domain)
            domain.max_quota_bytes = app.configMail['MAIL_DEFAULT_QUOTA']
            domain.max_users = app.configMail['MAIL_DEFAULT_USERS']
            domain.max_aliases = app.configMail['MAIL_DEFAULT_ALIASES']
            if domain.check_mx():
                models.db.session.add(domain)
                if flask_login.current_user.is_authenticated:
                    user = models.User.query.get(
                        flask_login.current_user.email)
                else:
                    user = models.User()
                    user.domain = domain
                    form.populate_obj(user)
                    user.set_password(form.pw.data)
                    user.quota_bytes = domain.max_quota_bytes
                models.db.session.add(user)
                domain.managers.append(user)
                models.db.session.commit()
                flask.flash('Domain %s created' % domain)
                return flask.redirect(flask.url_for('.domain_list'))
            else:
                flask.flash('The MX record was not properly set', 'error')
    return flask.render_template('domain/signup.html', form=form)
Esempio n. 9
0
 )
 for user_config in users:
   if verbose:
       print(str(user_config))
   localpart = user_config['localpart']
   domain_name = user_config['domain']
   password_hash = user_config.get('password_hash', None)
   hash_scheme = user_config.get('hash_scheme', None)
   domain = models.Domain.query.get(domain_name)
   email = '{0}@{1}'.format(localpart, domain_name)
   optional_params = {}
   for k in user_optional_params:
     if k in user_config:
       optional_params[k] = user_config[k]
   if not domain:
     domain = models.Domain(name=domain_name)
     db.session.add(domain)
   user = models.User.query.get(email)
   tracked_users.add(email)
   tracked_domains.add(domain_name)
   if not user:
     user = models.User(
       localpart=localpart,
       domain=domain,
       **optional_params
     )
   else:
     for k in optional_params:
       setattr(user, k, optional_params[k])
   user.set_password(password_hash, hash_scheme=hash_scheme, raw=True)
   db.session.add(user)