Пример #1
0
def profile(domain, conn=None):
    domain = str(domain).lower()

    if not iredutils.is_domain(domain):
        return (False, 'INVALID_DOMAIN_NAME')

    if not conn:
        _wrap = SQLWrap()
        conn = _wrap.conn

    try:
        # Get domain profile first.
        _qr = simple_profile(domain=domain, conn=conn)
        if _qr[0]:
            _profile = _qr[1]
        else:
            return _qr

        # num_existing_users
        _profile[
            'num_existing_users'] = sql_lib_general.num_users_under_domain(
                domain=domain, conn=conn)

        return (True, _profile)
    except Exception as e:
        return (False, repr(e))
Пример #2
0
def revoke_admin_privilege_if_no_managed_domains(admin=None, conn=None):
    """If given admin doesn't manage any domain, revoke the admin privilege.

    @admin -- email address of domain admin
    @conn -- sql connection cursor
    """
    if not admin:
        return (True, )

    if not conn:
        _wrap = SQLWrap()
        conn = _wrap.conn

    # Return immediately if it's a global admin
    if sql_lib_general.is_global_admin(admin=admin, conn=conn):
        return (True, )

    if not num_managed_domains(admin=admin, conn=conn):
        try:
            conn.update('mailbox',
                        vars={'admin': admin},
                        isadmin=0,
                        where='username=$admin')
        except Exception as e:
            log_traceback()
            return (False, repr(e))

    return (True, )
Пример #3
0
def simple_profile(mail, columns=None, conn=None):
    """Return value of sql column `mailbox.settings`.

    @columns -- a list or tuple which contains SQL column names
    """
    if not conn:
        _wrap = SQLWrap()
        conn = _wrap.conn

    sql_what = '*'
    if columns:
        sql_what = ','.join(columns)

    try:
        qr = conn.select('mailbox',
                         vars={'username': mail},
                         what=sql_what,
                         where='username=$username',
                         limit=1)

        if qr:
            return (True, list(qr)[0])
        else:
            return (False, 'NO_SUCH_ACCOUNT')
    except Exception as e:
        return (False, repr(e))
Пример #4
0
def is_email_exists(mail, conn=None) -> bool:
    # Return True if account is invalid or exist.
    if not iredutils.is_email(mail):
        return True

    mail = iredutils.strip_mail_ext_address(mail)

    if not conn:
        _wrap = SQLWrap()
        conn = _wrap.conn

    try:
        # `forwardings` table has email addr of mail user account and alias account.
        qr = conn.select('forwardings',
                         vars={'mail': mail},
                         what='address',
                         where='address=$mail',
                         limit=1)

        if qr:
            return True

        # Check `alias` for alias account which doesn't have any member.
        qr = conn.select('alias',
                         vars={'mail': mail},
                         what='address',
                         where='address=$mail',
                         limit=1)
        if qr:
            return True

        return False
    except Exception:
        return True
Пример #5
0
def delete_admins(mails, revoke_admin_privilege_from_user=True, conn=None):
    mails = [str(v) for v in mails if iredutils.is_email(v)]

    if not mails:
        return (True, )

    sql_vars = {'mails': mails}

    try:
        if not conn:
            _wrap = SQLWrap()
            conn = _wrap.conn

        # Standalone mail admins
        conn.delete('admin', vars=sql_vars, where='username IN $mails')

        conn.delete('domain_admins', vars=sql_vars, where='username IN $mails')

        # Unmark globa/domain admin which is mail user
        if revoke_admin_privilege_from_user:
            conn.update(
                'mailbox',
                vars=sql_vars,
                where='username IN $mails AND (isadmin=1 OR isglobaladmin=1)',
                isadmin=0,
                isglobaladmin=0)

        log_activity(event='delete',
                     msg="Delete admin(s): %s." % ', '.join(mails))

        return (True, )
    except Exception as e:
        log_traceback()
        return (False, repr(e))
Пример #6
0
def __num_accounts_under_domain(domain, account_type, conn=None) -> int:
    num = 0

    if not iredutils.is_domain(domain):
        return num

    if not conn:
        _wrap = SQLWrap()
        conn = _wrap.conn

    # mapping of account types and sql table names
    mapping = {'user': '******', 'alias': 'alias', 'maillist': 'maillists'}
    sql_table = mapping[account_type]

    try:
        qr = conn.select(sql_table,
                         vars={'domain': domain},
                         what='COUNT(domain) AS total',
                         where='domain=$domain')

        if qr:
            num = qr[0].total
    except Exception as e:
        logger.error(e)

    return num
Пример #7
0
def profile(mail, with_used_quota=True, conn=None):
    """Get full user profile.

    @with_alias -- get per-user alias addresses.
    @with_forwardings -- get mail forwarding addresses
    """
    mail = str(mail).lower()

    try:
        if not conn:
            _wrap = SQLWrap()
            conn = _wrap.conn

        qr = conn.select("mailbox",
                         vars={'mail': mail},
                         where="username=$mail",
                         limit=1)

        if qr:
            p = qr[0]
            p['stored_bytes'] = 0
            p['stored_messages'] = 0

            if with_used_quota:
                _used_quota = sql_lib_general.get_account_used_quota(
                    accounts=[mail], conn=conn)
                if mail in _used_quota:
                    p['stored_bytes'] = _used_quota[mail]['bytes']
                    p['stored_messages'] = _used_quota[mail]['messages']

            return (True, p)
        else:
            return (False, 'NO_SUCH_ACCOUNT')
    except Exception as e:
        return (False, repr(e))
Пример #8
0
    def GET(self, cur_page=1, disabled_only=False):
        """List paged mail domains."""
        form = web.input(_unicode=False)
        cur_page = int(cur_page) or 1

        all_domain_profiles = []
        domain_used_quota = {}
        all_first_chars = []

        first_char = None
        if 'starts_with' in form:
            first_char = form.get('starts_with')[:1].upper()
            if not iredutils.is_valid_account_first_char(first_char):
                first_char = None

        _wrap = SQLWrap()
        conn = _wrap.conn

        # Get first characters of all domains
        _qr = sql_lib_domain.get_first_char_of_all_domains(conn=conn)
        if _qr[0]:
            all_first_chars = _qr[1]

        total = sql_lib_admin.num_managed_domains(conn=conn,
                                                  disabled_only=disabled_only,
                                                  first_char=first_char)

        if total:
            qr = sql_lib_domain.get_paged_domains(cur_page=cur_page,
                                                  first_char=first_char,
                                                  disabled_only=disabled_only,
                                                  conn=conn)
            if qr[0]:
                all_domain_profiles = qr[1]

            if settings.SHOW_USED_QUOTA:
                domains = []
                for i in all_domain_profiles:
                    domains.append(str(i.domain))

                domain_used_quota = sql_lib_domain.get_domain_used_quota(
                    conn=conn, domains=domains)

        if session.get('is_global_admin'):
            days_to_keep_removed_mailbox = settings.DAYS_TO_KEEP_REMOVED_MAILBOX_FOR_GLOBAL_ADMIN
        else:
            days_to_keep_removed_mailbox = settings.DAYS_TO_KEEP_REMOVED_MAILBOX

        return web.render(
            'sql/domain/list.html',
            cur_page=cur_page,
            total=total,
            all_domain_profiles=all_domain_profiles,
            domain_used_quota=domain_used_quota,
            local_transports=settings.LOCAL_TRANSPORTS,
            first_char=first_char,
            all_first_chars=all_first_chars,
            disabled_only=disabled_only,
            days_to_keep_removed_mailbox=days_to_keep_removed_mailbox,
            msg=form.get('msg', None))
Пример #9
0
def get_profile(mail, columns=None, conn=None):
    if not iredutils.is_email(mail):
        return (False, 'INVALID_MAIL')

    if isinstance(columns, (list, tuple, set)):
        columns = ','.join(columns)
    else:
        columns = '*'

    if not conn:
        _wrap = SQLWrap()
        conn = _wrap.conn

    try:
        qr = conn.select('admin',
                         vars={'username': mail},
                         what=columns,
                         where='username=$username',
                         limit=1)

        if qr:
            return (True, list(qr)[0])
        else:
            return (False, 'NO_SUCH_ACCOUNT')
    except Exception as e:
        log_traceback()
        return (False, repr(e))
Пример #10
0
def is_global_admin(admin, conn=None) -> bool:
    if not admin:
        return False

    if admin == session.get('username'):
        if session.get('is_global_admin'):
            return True
        else:
            return False

    # Not logged admin.
    try:
        if not conn:
            _wrap = SQLWrap()
            conn = _wrap.conn

        qr = conn.select('domain_admins',
                         vars={
                             'username': admin,
                             'domain': 'ALL'
                         },
                         what='username',
                         where='username=$username AND domain=$domain',
                         limit=1)
        if qr:
            return True
        else:
            return False
    except:
        return False
Пример #11
0
    def POST(self):
        form = web.input(_unicode=False, mail=[])

        accounts = form.get('mail', [])
        action = form.get('action', None)
        msg = form.get('msg', None)

        _wrap = SQLWrap()
        conn = _wrap.conn

        if action == 'delete':
            result = sql_lib_admin.delete_admins(
                mails=accounts,
                revoke_admin_privilege_from_user=True,
                conn=conn)
            msg = 'DELETED'
        elif action == 'disable':
            result = sql_lib_utils.set_account_status(conn=conn,
                                                      accounts=accounts,
                                                      account_type='admin',
                                                      enable_account=False)
            msg = 'DISABLED'
        elif action == 'enable':
            result = sql_lib_utils.set_account_status(conn=conn,
                                                      accounts=accounts,
                                                      account_type='admin',
                                                      enable_account=True)
            msg = 'ENABLED'
        else:
            result = (False, 'INVALID_ACTION')

        if result[0] is True:
            raise web.seeother('/admins?msg=%s' % msg)
        else:
            raise web.seeother('/admins?msg=' + web.urlquote(result[1]))
Пример #12
0
    def POST(self, profile_type, mail):
        mail = str(mail).lower()
        form = web.input(domainName=[], managed_domains=[])

        if not (session.get('is_global_admin')
                or session.get('username') == mail):
            # Don't allow to view/update others' profile.
            raise web.seeother(
                '/profile/admin/general/%s?msg=PERMISSION_DENIED' %
                session.get('username'))

        _wrap = SQLWrap()
        conn = _wrap.conn

        result = sql_lib_admin.update(mail=mail,
                                      profile_type=profile_type,
                                      form=form,
                                      conn=conn)

        if result[0]:
            raise web.seeother('/profile/admin/{}/{}?msg=UPDATED'.format(
                profile_type, mail))
        else:
            raise web.seeother('/profile/admin/{}/{}?msg={}'.format(
                profile_type, mail, web.urlquote(result[1])))
Пример #13
0
    def GET(self, cur_page=1):
        form = web.input()
        cur_page = int(cur_page)

        if cur_page == 0:
            cur_page = 1

        _wrap = SQLWrap()
        conn = _wrap.conn

        result = sql_lib_admin.get_paged_admins(conn=conn, cur_page=cur_page)

        if result[0] is True:
            (total, records) = (result[1]['total'], result[1]['records'])

            # Get list of global admins.
            all_global_admins = []
            qr = sql_lib_admin.get_all_global_admins(conn=conn)
            if qr[0]:
                all_global_admins = qr[1]

            return web.render(
                'sql/admin/list.html',
                cur_page=cur_page,
                total=total,
                admins=records,
                allGlobalAdmins=all_global_admins,
                msg=form.get('msg', None),
            )
        else:
            raise web.seeother('/domains?msg=%s' % web.urlquote(result[1]))
Пример #14
0
def assign_admins_to_domain(domain, admins, conn=None):
    """Assign list of NEW admins to specified mail domain.

    It doesn't remove existing admins."""
    if not iredutils.is_domain(domain):
        return (False, 'INVALID_DOMAIN_NAME')

    if not isinstance(admins, (list, tuple, set)):
        return (False, 'NO_ADMINS')
    else:
        admins = [str(i).lower() for i in admins if iredutils.is_email(i)]
        if not admins:
            return (False, 'NO_ADMINS')

    if not conn:
        _wrap = SQLWrap()
        conn = _wrap.conn

    for adm in admins:
        try:
            conn.insert('domain_admins', domain=domain, username=adm)
        except Exception as e:
            if e.__class__.__name__ == 'IntegrityError':
                pass
            else:
                return (False, repr(e))

    return (True, )
Пример #15
0
def get_first_char_of_all_domains(conn=None):
    """Get first character of all domains."""
    if not conn:
        _wrap = SQLWrap()
        conn = _wrap.conn

    admin = session.get('username')
    chars = []
    try:
        if sql_lib_general.is_global_admin(admin=admin, conn=conn):
            qr = conn.select(
                'domain',
                what='SUBSTRING(domain FROM 1 FOR 1) AS first_char',
                group='first_char')
        else:
            qr = conn.query(
                """SELECT SUBSTRING(domain.domain FROM 1 FOR 1) AS first_char
                                 FROM domain
                            LEFT JOIN domain_admins ON (domain.domain=domain_admins.domain)
                                WHERE domain_admins.username=$admin
                             GROUP BY first_char""",
                vars={'admin': admin})

        if qr:
            chars = [i.first_char.upper() for i in qr]
            chars.sort()

        return (True, chars)
    except Exception as e:
        logger.error(e)
        return (False, repr(e))
Пример #16
0
def is_domain_admin(domain, admin=None, conn=None) -> bool:
    if (not iredutils.is_domain(domain)) or (not iredutils.is_email(admin)):
        return False

    if not admin:
        admin = session.get('username')

    if admin == session.get('username') and session.get('is_global_admin'):
        return True

    try:
        if not conn:
            _wrap = SQLWrap()
            conn = _wrap.conn

        qr = conn.select(
            'domain_admins',
            vars={
                'domain': domain,
                'username': admin
            },
            what='username',
            where='domain=$domain AND username=$username AND active=1',
            limit=1,
        )

        if qr:
            return True
        else:
            return False
    except:
        return False
Пример #17
0
def get_domain_admin_addresses(domain, conn=None):
    """List email addresses of all domain admins (exclude global admins).

    >>> get_domain_admin_addresses(domain='abc.com')
    (True, ['user1@<domain>.com', 'user2@<domain>.com', ...])

    >>> get_domain_admin_addresses(domain='xyz.com')
    (False, '<reason>')
    """
    all_admins = set()
    sql_vars = {'domain': domain}
    try:
        if not conn:
            _wrap = SQLWrap()
            conn = _wrap.conn

        qr = conn.select('domain_admins',
                         vars=sql_vars,
                         what='username',
                         where='domain=$domain')

        for i in qr:
            all_admins.add(str(i.username).lower())

        return (True, list(all_admins))
    except Exception as e:
        return (False, repr(e))
Пример #18
0
def simple_profile(domain, columns=None, conn=None):
    if not iredutils.is_domain(domain):
        return (False, 'INVALID_DOMAIN_NAME')

    sql_what = '*'
    if columns:
        sql_what = ','.join(columns)

    try:
        if not conn:
            _wrap = SQLWrap()
            conn = _wrap.conn

        qr = conn.select('domain',
                         vars={'domain': domain},
                         what=sql_what,
                         where='domain=$domain',
                         limit=1)
        if qr:
            p = list(qr)[0]
            return (True, p)
        else:
            return (False, 'INVALID_DOMAIN_NAME')
    except Exception as e:
        return (False, repr(e))
Пример #19
0
def get_domain_settings(domain, domain_profile=None, conn=None):
    domain = str(domain).lower()

    try:
        if not domain_profile:
            if not conn:
                _wrap = SQLWrap()
                conn = _wrap.conn

            qr = conn.select('domain',
                             vars={'domain': domain},
                             what='settings',
                             where='domain=$domain',
                             limit=1)

            if qr:
                domain_profile = list(qr)[0]
            else:
                return (False, 'INVALID_DOMAIN_NAME')

        ps = domain_profile.get('settings', '')
        ds = sqlutils.account_settings_string_to_dict(ps)

        return (True, ds)
    except Exception as e:
        return (False, repr(e))
Пример #20
0
def delete_accounts(accounts,
                    account_type,
                    keep_mailbox_days=0,
                    conn=None):
    # accounts must be a list/tuple.
    # account_type in ['domain', 'user', 'admin', 'alias']
    if not accounts:
        return (True, )

    if not conn:
        _wrap = SQLWrap()
        conn = _wrap.conn

    if account_type == 'domain':
        qr = sql_lib_domain.delete_domains(domains=accounts,
                                           keep_mailbox_days=keep_mailbox_days,
                                           conn=conn)
        return qr
    elif account_type == 'user':
        sql_lib_user.delete_users(accounts=accounts,
                                  keep_mailbox_days=keep_mailbox_days,
                                  conn=conn)
    elif account_type == 'admin':
        sql_lib_admin.delete_admins(mails=accounts, conn=conn)

    return (True, )
Пример #21
0
    def GET(self, domain):
        domain = str(domain).lower()

        form = web.input()

        # Get all managed domains.
        _wrap = SQLWrap()
        conn = _wrap.conn

        if session.get('is_global_admin'):
            qr = sql_lib_domain.get_all_domains(conn=conn, name_only=True)
        else:
            qr = sql_lib_admin.get_managed_domains(
                conn=conn,
                admin=session.get('username'),
                domain_name_only=True)

        if qr[0] is True:
            all_domains = qr[1]
        else:
            raise web.seeother('/api?msg=' + web.urlquote(qr[1]))

        # Get domain profile.
        qr_profile = sql_lib_domain.simple_profile(domain=domain, conn=conn)
        if qr_profile[0] is True:
            domain_profile = qr_profile[1]
            domain_settings = sqlutils.account_settings_string_to_dict(
                domain_profile['settings'])
        else:
            raise web.seeother('/api?msg=%s' % web.urlquote(qr_profile[1]))

        # Cet total number and allocated quota size of existing users under domain.
        num_users_under_domain = sql_lib_general.num_users_under_domain(
            domain=domain, conn=conn)

        min_passwd_length = domain_settings.get('min_passwd_length',
                                                settings.min_passwd_length)
        max_passwd_length = domain_settings.get('max_passwd_length',
                                                settings.max_passwd_length)

        return web.render(
            'api/msg/msg.html',
            content_type="application/json",
            msg={
                #"cur_domain":domain,
                #"allDomains":all_domains,
                #"profile":domain_profile,
                #"domain_settings":domain_settings,
                #"min_passwd_length":min_passwd_length,
                #"max_passwd_length":max_passwd_length,
                #"store_password_in_plain_text":settings.STORE_PASSWORD_IN_PLAIN_TEXT,
                #"num_existing_users":num_users_under_domain,
                #"languagemaps":iredutils.get_language_maps(),
                #"password_policies":iredutils.get_password_policies(),
                #"msg":form.get('msg')
                "msg": "Create User API's GET method!"
            })
Пример #22
0
def num_managed_users(admin=None, domains=None, conn=None, listed_only=False):
    """Count users of all managed domains."""
    num = 0

    if not admin:
        admin = session.get('username')

    if not conn:
        _wrap = SQLWrap()
        conn = _wrap.conn

    if domains:
        domains = [str(d).lower() for d in domains if iredutils.is_domain(d)]
    else:
        qr = get_managed_domains(conn=conn,
                                 admin=admin,
                                 domain_name_only=True,
                                 listed_only=listed_only)
        if qr[0]:
            domains = qr[1]

    if not domains:
        return num

    sql_vars = {'admin': admin, 'domains': domains}

    try:
        if sql_lib_general.is_global_admin(admin=admin, conn=conn):
            if domains:
                qr = conn.select('mailbox',
                                 vars=sql_vars,
                                 what='COUNT(username) AS total',
                                 where='domain IN $domains')
            else:
                qr = conn.select('mailbox', what='COUNT(username) AS total')
        else:
            sql_append_where = ''
            if domains:
                sql_append_where = 'AND mailbox.domain IN %s' % web.sqlquote(
                    domains)

            qr = conn.query(
                """
                SELECT COUNT(mailbox.username) AS total
                FROM mailbox
                LEFT JOIN domain_admins ON (mailbox.domain = domain_admins.domain)
                WHERE domain_admins.username=$admin %s
                """ % (sql_append_where),
                vars=sql_vars,
            )

        num = qr[0].total or 0
    except:
        log_traceback()

    return num
Пример #23
0
    def GET(self, domain):
        domain = str(domain).lower()

        form = web.input()

        # Get all managed domains.
        _wrap = SQLWrap()
        conn = _wrap.conn

        if session.get('is_global_admin'):
            qr = sql_lib_domain.get_all_domains(conn=conn, name_only=True)
        else:
            qr = sql_lib_admin.get_managed_domains(
                conn=conn,
                admin=session.get('username'),
                domain_name_only=True)

        if qr[0] is True:
            all_domains = qr[1]
        else:
            raise web.seeother('/domains?msg=' + web.urlquote(qr[1]))

        # Get domain profile.
        qr_profile = sql_lib_domain.simple_profile(domain=domain, conn=conn)

        if qr_profile[0] is True:
            domain_profile = qr_profile[1]
            domain_settings = sqlutils.account_settings_string_to_dict(
                domain_profile['settings'])
        else:
            raise web.seeother('/domains?msg=%s' % web.urlquote(qr_profile[1]))

        # Cet total number and allocated quota size of existing users under domain.
        num_users_under_domain = sql_lib_general.num_users_under_domain(
            domain=domain, conn=conn)

        min_passwd_length = domain_settings.get('min_passwd_length',
                                                settings.min_passwd_length)
        max_passwd_length = domain_settings.get('max_passwd_length',
                                                settings.max_passwd_length)

        return web.render(
            'sql/user/create.html',
            cur_domain=domain,
            allDomains=all_domains,
            profile=domain_profile,
            domain_settings=domain_settings,
            min_passwd_length=min_passwd_length,
            max_passwd_length=max_passwd_length,
            store_password_in_plain_text=settings.STORE_PASSWORD_IN_PLAIN_TEXT,
            num_existing_users=num_users_under_domain,
            languagemaps=iredutils.get_language_maps(),
            password_policies=iredutils.get_password_policies(),
            msg=form.get('msg'),
        )
Пример #24
0
def get_managed_domains(admin,
                        domain_name_only=False,
                        listed_only=False,
                        conn=None):
    admin = str(admin).lower()

    if not iredutils.is_email(admin):
        return (False, 'INCORRECT_USERNAME')

    if not conn:
        _wrap = SQLWrap()
        conn = _wrap.conn

    try:
        if sql_lib_general.is_global_admin(admin=admin, conn=conn):
            if listed_only:
                result = conn.query("""
                    SELECT domain.domain
                      FROM domain
                 LEFT JOIN domain_admins ON (domain.domain=domain_admins.domain)
                     WHERE domain_admins.username=$admin
                     ORDER BY domain_admins.domain
                    """,
                                    vars={'admin': admin})
            else:
                result = conn.select('domain', what='domain', order='domain')
        else:
            sql_left_join = ''
            if not listed_only:
                sql_left_join = """OR domain_admins.domain='ALL'"""

            result = conn.query("""
                SELECT domain.domain
                  FROM domain
             LEFT JOIN domain_admins ON (domain.domain=domain_admins.domain %s)
                 WHERE domain_admins.username=$admin
              ORDER BY domain_admins.domain
                """ % (sql_left_join),
                                vars={'admin': admin})

        if domain_name_only:
            domains = []
            for i in result:
                _domain = str(i['domain']).lower()
                if iredutils.is_domain(_domain):
                    domains.append(_domain)

            return (True, domains)
        else:
            return (True, list(result))
    except Exception as e:
        log_traceback()
        return (False, repr(e))
Пример #25
0
    def GET(self):
        form = web.input(_unicode=False)
        _check_new_version = ('checknew' in form)

        # Check new version.
        if session.get('is_global_admin') and _check_new_version:
            (_status, _info) = sysinfo.check_new_version()
            session['new_version_available'] = _status
            if _status:
                session['new_version'] = _info
            else:
                session['new_version_check_error'] = _info

        # Get numbers of domains, users, aliases.
        num_existing_domains = 0
        num_existing_users = 0

        _wrap = SQLWrap()
        conn = _wrap.conn

        try:
            num_existing_domains = sql_lib_admin.num_managed_domains(conn=conn)
            num_existing_users = sql_lib_admin.num_managed_users(conn=conn)
        except:
            pass

        # Get numbers of existing messages and quota bytes.
        # Set None as default, so that it's easy to detect them in Jinja2 template.
        total_messages = None
        total_bytes = None
        if session.get('is_global_admin'):
            if settings.SHOW_USED_QUOTA:
                try:
                    qr = sql_lib_admin.sum_all_used_quota(conn=conn)
                    total_messages = qr['messages']
                    total_bytes = qr['bytes']
                except:
                    pass

        return web.render(
            'dashboard.html',
            version=__version__,
            iredmail_version=sysinfo.get_iredmail_version(),
            hostname=sysinfo.get_hostname(),
            uptime=sysinfo.get_server_uptime(),
            loadavg=sysinfo.get_system_load_average(),
            netif_data=sysinfo.get_nic_info(),
            # number of existing accounts
            num_existing_domains=num_existing_domains,
            num_existing_users=num_existing_users,
            total_messages=total_messages,
            total_bytes=total_bytes,
        )
Пример #26
0
def get_all_managed_domains(conn=None,
                            columns=None,
                            name_only=False,
                            disabled_only=False):
    """Get all managed domains.

    Returned values:

    - (True, [records])
    - (True, [<domain_name>, <domain_name>, ...])
    - (False, <error>)
    """
    if columns:
        sql_what = ','.join(columns)
    else:
        if name_only:
            sql_what = 'domain.domain'
        else:
            sql_what = 'domain.*'

    sql_where = None
    if disabled_only:
        sql_where = 'domain.active=0'

    try:
        if not conn:
            _wrap = SQLWrap()
            conn = _wrap.conn

        if session.get('is_global_admin'):
            qr = conn.select('domain',
                             what=sql_what,
                             where=sql_where,
                             order='domain ASC')
        else:
            if sql_where:
                sql_where = ' AND ' + sql_where
            qr = conn.select(
                ['domain', 'domain_admins'],
                vars={'admin': session.username},
                what=sql_what,
                where=
                'domain_admins.username=$admin AND domain_admins.domain=domain.domain %s'
                % sql_where,
                order='domain.domain ASC')

        if name_only:
            domain_names = [str(r.domain).lower() for r in qr]
            return (True, domain_names)
        else:
            return (True, list(qr))
    except Exception as e:
        return (False, repr(e))
Пример #27
0
def update(mail, profile_type, form, conn=None):
    mail = str(mail).lower()

    # Don't allow to view/update other admins' profile.
    if mail != session.get('username') and not session.get('is_global_admin'):
        return (False, 'PERMISSION_DENIED')

    sql_vars = {'username': mail}

    if not conn:
        _wrap = SQLWrap()
        conn = _wrap.conn

    params = {}
    if profile_type == 'general':
        # Name, preferred language
        params['name'] = form.get('cn', '')
        params['language'] = form_utils.get_language(form)

        # Update account status
        params['active'] = 0
        if 'accountStatus' in form:
            params['active'] = 1
    elif profile_type == 'password':
        newpw = web.safestr(form.get('newpw', ''))
        confirmpw = web.safestr(form.get('confirmpw', ''))

        # Verify new passwords.
        qr = iredpwd.verify_new_password(newpw=newpw, confirmpw=confirmpw)
        if qr[0] is True:
            passwd = iredpwd.generate_password_hash(qr[1])

            params['password'] = passwd
            params['passwordlastchange'] = iredutils.get_gmttime()
        else:
            return qr

    if params:
        try:
            conn.update('admin',
                        vars=sql_vars,
                        where='username=$username',
                        **params)
        except Exception as e:
            log_traceback()
            if 'password' in params:
                raise web.seeother('/profile/admin/password/{}?msg={}'.format(
                    mail, web.urlquote(e)))
            else:
                raise web.seeother('/profile/admin/general/{}?msg={}'.format(
                    mail, web.urlquote(e)))

    return (True, )
Пример #28
0
def get_admin_settings(admin=None, existing_settings=None, conn=None) -> Tuple:
    """Return a dict of per-admin settings.

    :param admin: mail address of domain admin
    :param existing_settings: original value of sql column `settings`
    :param conn: SQL connection cursor
    """
    if not admin:
        admin = session.get('username')

    if not iredutils.is_email(admin):
        return (False, 'INVALID_ADMIN')

    if not conn:
        _wrap = SQLWrap()
        conn = _wrap.conn

    account_settings = {}

    # Get settings stored in sql column `mailbox.settings`
    if existing_settings:
        orig_settings = existing_settings
    else:
        try:
            qr = conn.select(
                'mailbox',
                vars={'username': admin},
                what='settings',
                where='username=$username AND (isadmin=1 OR isglobaladmin=1)',
                limit=1)

            if not qr:
                # Not a mail user
                qr = conn.select('admin',
                                 vars={'username': admin},
                                 what='settings',
                                 where='username=$username',
                                 limit=1)
                if not qr:
                    return (False, 'INVALID_ADMIN')

            orig_settings = qr[0]['settings']
        except Exception as e:
            return (False, repr(e))

    if orig_settings:
        account_settings = sqlutils.account_settings_string_to_dict(
            orig_settings)

    return (True, account_settings)
Пример #29
0
def get_first_char_of_all_accounts(domain, account_type, conn=None):
    """Get first character of accounts under given domain.

    @domain - must be a valid domain name.
    @account_type - could be one of: user, ml, alias.
    @conn - SQL connection cursor
    """
    if not conn:
        _wrap = SQLWrap()
        conn = _wrap.conn

    type_map = {
        'user': {
            'table': 'mailbox',
            'column': 'username'
        },
        'alias': {
            'table': 'alias',
            'column': 'address'
        },
        'ml': {
            'table': 'maillists',
            'column': 'address'
        }
    }

    _table = type_map[account_type]['table']
    _column = type_map[account_type]['column']

    chars = []
    try:
        qr = conn.select(
            _table,
            vars={
                'domain': domain,
                'column': _column
            },
            what="SUBSTRING({} FROM 1 FOR 1) AS first_char".format(_column),
            where='domain=$domain',
            group='first_char')

        if qr:
            chars = [str(i.first_char).upper() for i in qr]
            chars.sort()

        return (True, chars)
    except Exception as e:
        log_traceback()
        return (False, repr(e))
Пример #30
0
def num_managed_domains(admin=None,
                        disabled_only=False,
                        first_char=None,
                        conn=None):
    num = 0

    if not admin:
        admin = session.get('username')

    if not conn:
        _wrap = SQLWrap()
        conn = _wrap.conn

    sql_where = ''
    if disabled_only is True:
        sql_where += 'domain.active=0'

    if first_char:
        first_char = first_char[0].lower()

        if sql_where:
            sql_where += ' AND domain.domain LIKE %s' % web.sqlquote(
                first_char + '%')
        else:
            sql_where += 'domain.domain LIKE %s' % web.sqlquote(first_char +
                                                                '%')

    try:
        if sql_lib_general.is_global_admin(admin=admin, conn=conn):
            qr = conn.select('domain',
                             what='COUNT(domain) AS total',
                             where=sql_where or None)
        else:
            if sql_where:
                sql_where = 'AND ' + sql_where

            qr = conn.query("""
                SELECT COUNT(domain.domain) AS total
                FROM domain
                LEFT JOIN domain_admins ON (domain.domain=domain_admins.domain)
                WHERE domain_admins.username=$admin %s
                """ % (sql_where),
                            vars={'admin': admin})

        num = qr[0].total or 0
    except:
        log_traceback()

    return num