Esempio n. 1
0
def sync():
    ldap_connector = ldap.initialize(f"{config['LDAP_URI']}")
    ldap_connector.set_option(ldap.OPT_REFERRALS, 0)
    ldap_connector.simple_bind_s(config['LDAP_BIND_DN'],
                                 config['LDAP_BIND_DN_PASSWORD'])

    ldap_results = ldap_connector.search_s(
        config['LDAP_BASE_DN'], ldap.SCOPE_SUBTREE, config['LDAP_FILTER'],
        [config['USER_ATTR'], 'cn', 'userAccountControl'])

    ldap_results = map(
        lambda x:
        (x[1][config['USER_ATTR']][0].decode(), x[1]['cn'][0].decode(), False
         if int(x[1]['userAccountControl'][0].decode()) & 0b10 else True),
        ldap_results)

    filedb.session_time = datetime.datetime.now()

    if 'REPLACE_DOMAIN' in config:
        replaceDomain = config['REPLACE_DOMAIN']
    else:
        replaceDomain = None

    for (email, ldap_name, ldap_active) in ldap_results:
        (db_user_exists, db_user_active) = filedb.check_user(email)
        (api_user_exists, api_user_active,
         api_name) = api.check_user(email, replaceDomain)

        unchanged = True

        if not db_user_exists:
            filedb.add_user(email, ldap_active)
            (db_user_exists, db_user_active) = (True, ldap_active)
            logging.info(f"Added filedb user: {email} (Active: {ldap_active})")
            unchanged = False

        if not api_user_exists:
            api.add_user(email, ldap_name, ldap_active, replaceDomain)
            (api_user_exists, api_user_active, api_name) = (True, ldap_active,
                                                            ldap_name)
            logging.info(
                f"Added Mailcow user: {email} (Active: {ldap_active})")
            unchanged = False

        if db_user_active != ldap_active:
            filedb.user_set_active_to(email, ldap_active)
            logging.info(
                f"{'Activated' if ldap_active else 'Deactived'} {email} in filedb"
            )
            unchanged = False

        if api_user_active != ldap_active:
            api.edit_user(email, replaceDomain, active=ldap_active)
            logging.info(
                f"{'Activated' if ldap_active else 'Deactived'} {email} in Mailcow"
            )
            unchanged = False

        if api_name != ldap_name:
            api.edit_user(email, replaceDomain, name=ldap_name)
            logging.info(f"Changed name of {email} in Mailcow to {ldap_name}")
            unchanged = False

        if unchanged:
            logging.info(f"Checked user {email}, unchanged")

    for email in filedb.get_unchecked_active_users():
        (api_user_exists, api_user_active,
         _) = api.check_user(email, replaceDomain)

        if (api_user_active and api_user_active):
            api.edit_user(email, replaceDomain, active=False)
            logging.info(
                f"Deactivated user {email} in Mailcow, not found in LDAP")

        filedb.user_set_active_to(email, False)
        logging.info(f"Deactivated user {email} in filedb, not found in LDAP")
Esempio n. 2
0
def sync():
    logging.info(config_file.keys())
    ldap_connector = ldap.initialize(f"{config_file['HostName']}")
    ldap_connector.set_option(ldap.OPT_REFERRALS, 0)
    ldap_connector.simple_bind_s(config_file['BindUser'],
                                 config_file['BindPassword'])

    ldap_results = ldap_connector.search_s(
        config_file['BaseDN'], ldap.SCOPE_SUBTREE,
        '(objectClass=gosaMailAccount)', [
            config_file['Username'], config_file['Fullname'],
            config_file['Active User']
        ])

    logging.info(ldap_results)

    ldap_results = map(
        lambda x: (x[1][config_file['Username']][0].decode(), x[1][config_file[
            'Fullname']][0].decode(), False if int(x[1][config_file[
                'Active User']][0].decode()) & 0b10 else True), ldap_results)

    filedb.session_time = datetime.datetime.now()

    for (email, ldap_name, ldap_active) in ldap_results:
        (db_user_exists, db_user_active) = filedb.check_user(email)
        (api_user_exists, api_user_active, api_name) = api.check_user(email)

        unchanged = True

        if not db_user_exists:
            filedb.add_user(email, ldap_active)
            (db_user_exists, db_user_active) = (True, ldap_active)
            logging.info(f"Added filedb user: {email} (Active: {ldap_active})")
            unchanged = False

        if not api_user_exists:
            api.add_user(email, ldap_name, ldap_active)
            (api_user_exists, api_user_active, api_name) = (True, ldap_active,
                                                            ldap_name)
            logging.info(
                f"Added Mailcow user: {email} (Active: {ldap_active})")
            unchanged = False

        if db_user_active != ldap_active:
            filedb.user_set_active_to(email, ldap_active)
            logging.info(
                f"{'Activated' if ldap_active else 'Deactived'} {email} in filedb"
            )
            unchanged = False

        if api_user_active != ldap_active:
            api.edit_user(email, active=ldap_active)
            logging.info(
                f"{'Activated' if ldap_active else 'Deactived'} {email} in Mailcow"
            )
            unchanged = False

        if api_name != ldap_name:
            api.edit_user(email, name=ldap_name)
            logging.info(f"Changed name of {email} in Mailcow to {ldap_name}")
            unchanged = False

        if unchanged:
            logging.info(f"Checked user {email}, unchanged")

    for email in filedb.get_unchecked_active_users():
        (api_user_exists, api_user_active, _) = api.check_user(email)

        if (api_user_active and api_user_active):
            api.edit_user(email, active=False)
            logging.info(
                f"Deactivated user {email} in Mailcow, not found in LDAP")

        filedb.user_set_active_to(email, False)
        logging.info(f"Deactivated user {email} in filedb, not found in LDAP")
Esempio n. 3
0
def sync():
    ldap_connector = ldap.initialize(f"{config['LDAP_URI']}")
    ldap_connector.set_option(ldap.OPT_REFERRALS, 0)
    ldap_connector.simple_bind_s(config['LDAP_BIND_DN'],
                                 config['LDAP_BIND_DN_PASSWORD'])

    ldap_results = ldap_connector.search_s(
        config['LDAP_BASE_DN'], ldap.SCOPE_SUBTREE, config['LDAP_FILTER'],
        ['mail', 'displayName', 'userAccountControl'])

    filedb.session_time = datetime.datetime.now()

    for x in ldap_results:
        try:
            logging.info("Working on " + x[1]['sAMAccountName'])
            email = x[1]['mail'][0].decode()
            ldap_name = x[1]['displayName'][0].decode()
            ldap_active = False if int(
                x[1]['userAccountControl'][0].decode()) & 0b10 else True

            (db_user_exists, db_user_active) = filedb.check_user(email)
            (api_user_exists, api_user_active,
             api_name) = api.check_user(email)

            unchanged = True

            if not db_user_exists:
                filedb.add_user(email, ldap_active)
                (db_user_exists, db_user_active) = (True, ldap_active)
                logging.info(
                    f"Added filedb user: {email} (Active: {ldap_active})")
                unchanged = False

            if not api_user_exists:
                api.add_user(email, ldap_name, ldap_active, 256)
                (api_user_exists, api_user_active,
                 api_name) = (True, ldap_active, ldap_name)
                logging.info(
                    f"Added Mailcow user: {email} (Active: {ldap_active})")
                unchanged = False

            if db_user_active != ldap_active:
                filedb.user_set_active_to(email, ldap_active)
                logging.info(
                    f"{'Activated' if ldap_active else 'Deactived'} {email} in filedb"
                )
                unchanged = False

            if api_user_active != ldap_active:
                api.edit_user(email, active=ldap_active)
                logging.info(
                    f"{'Activated' if ldap_active else 'Deactived'} {email} in Mailcow"
                )
                unchanged = False

            if api_name != ldap_name:
                api.edit_user(email, name=ldap_name)
                logging.info(
                    f"Changed name of {email} in Mailcow to {ldap_name}")
                unchanged = False

            if unchanged:
                logging.info(f"Checked user {email}, unchanged")
        except Exception:
            logging.info(f"Exception during something. See above")
            pass

    for email in filedb.get_unchecked_active_users():
        (api_user_exists, api_user_active, _) = api.check_user(email)

        if (api_user_active and api_user_active):
            api.edit_user(email, active=False)
            logging.info(
                f"Deactivated user {email} in Mailcow, not found in LDAP")

        filedb.user_set_active_to(email, False)
        logging.info(f"Deactivated user {email} in filedb, not found in LDAP")
Esempio n. 4
0
def sync():
    ldap_connector = ldap.initialize(f"{config['LDAP_HOST']}")
    ldap_connector.set_option(ldap.OPT_REFERRALS, 0)
    ldap_connector.simple_bind_s(config['LDAP_BIND_DN'],
                                 config['LDAP_BIND_DN_PASSWORD'])

    #ldap_results = ldap_connector.search_s(config['LDAP_BASE_DN'], ldap.SCOPE_SUBTREE,
    #            '(&(objectClass=user)(objectCategory=person))',
    #            ['userPrincipalName', 'cn', 'userAccountControl'])

    ldap_results = ldap_connector.search_s(
        config['LDAP_BASE_DN'], ldap.SCOPE_SUBTREE, config['LDAP_FILTER'],
        [config['LDAP_FIELDS_MAIL'], config['LDAP_FIELDS_NAME'], 'True'])

    ldap_results = map(
        lambda x: (
            [i.decode() for i in x[1][config['LDAP_FIELDS_MAIL']]],
            x[1][config['LDAP_FIELDS_NAME']][0].decode(),
            #False if int(x[1]['userAccountControl'][0].decode()) & 0b10 else True), ldap_results)
            True),
        ldap_results)

    filedb.session_time = datetime.datetime.now()

    for (ldap_email, ldap_name, ldap_active) in ldap_results:
        for email in ldap_email:
            if email.split('@')[1] not in config['EMAIL_DOMAINS']:
                continue
            (db_user_exists, db_user_active) = filedb.check_user(email)
            (api_user_exists, api_user_active,
             api_name) = api.check_user(email)

            unchanged = True

            if not db_user_exists:
                filedb.add_user(email, ldap_active)
                (db_user_exists, db_user_active) = (True, ldap_active)
                logging.info(
                    f"Added filedb user: {email} (Active: {ldap_active})")
                unchanged = False

            if not api_user_exists:
                api.add_user(email, ldap_name, ldap_active)
                (api_user_exists, api_user_active,
                 api_name) = (True, ldap_active, ldap_name)
                logging.info(
                    f"Added Mailcow user: {email} (Active: {ldap_active})")
                unchanged = False

            if db_user_active != ldap_active:
                filedb.user_set_active_to(email, ldap_active)
                logging.info(
                    f"{'Activated' if ldap_active else 'Deactived'} {email} in filedb"
                )
                unchanged = False

            if api_user_active != ldap_active:
                api.edit_user(email, active=ldap_active)
                logging.info(
                    f"{'Activated' if ldap_active else 'Deactived'} {email} in Mailcow"
                )
                unchanged = False

            if api_name != ldap_name:
                api.edit_user(email, name=ldap_name)
                logging.info(
                    f"Changed name of {email} in Mailcow to {ldap_name}")
                unchanged = False

            if unchanged:
                logging.info(f"Checked user {email}, unchanged")

    for email in filedb.get_unchecked_active_users():
        (api_user_exists, api_user_active, _) = api.check_user(email)

        if (api_user_active and api_user_active):
            api.edit_user(email, active=False)
            logging.info(
                f"Deactivated user {email} in Mailcow, not found in LDAP")

        filedb.user_set_active_to(email, False)
        logging.info(f"Deactivated user {email} in filedb, not found in LDAP")