Ejemplo n.º 1
0
class OofManagesieveBackend(object):
    """Store the sieve script using ManageSieve protocol"""

    def __init__(self, server, ssl, secret):
        try:
            from sievelib.managesieve import Client
        except ImportError:
            log.error("Cannot use managesieve backend. Install sievelib python library "
                      "or use file backend instead")
            raise Exception('Cannot contact server')
        self.client = Client(server)
        self.ssl = ssl
        self.passwd = secret

    def user_script(self, mailbox):
        """Return the user active sieve script if it is different from out of
        office.

        :param str mailbox: the mailbox user
        """
        self.client.connect(mailbox, self.passwd, starttls=self.ssl)
        (active_script, scripts) = self.client.listscripts()
        user_script = None
        if active_script is not None and active_script != SIEVE_SCRIPT_NAME:
            user_script = active_script
        self.client.logout()
        return user_script

    def store(self, mailbox, script):
        """Store the OOF sieve script.

        :param str mailbox: the mailbox user
        :param str script: the sieve script
        """
        self.client.connect(mailbox, self.passwd, starttls=self.ssl)
        self.client.putscript(SIEVE_SCRIPT_NAME, script)
        self.client.setactive(SIEVE_SCRIPT_NAME)
        self.client.logout()

    def load(self, mailbox):
        """Load the OOF sieve script.

        :param str mailbox: the mailbox user
        """
        self.client.connect(mailbox, self.passwd, starttls=self.ssl)
        script = self.client.getscript(SIEVE_SCRIPT_NAME)
        self.client.logout()
        return script
Ejemplo n.º 2
0
class OofManagesieveBackend(object):
    """Store the sieve script using ManageSieve protocol"""
    def __init__(self, server, ssl, secret):
        try:
            from sievelib.managesieve import Client
        except ImportError:
            log.error(
                "Cannot use managesieve backend. Install sievelib python library "
                "or use file backend instead")
            raise Exception('Cannot contact server')
        self.client = Client(server)
        self.ssl = ssl
        self.passwd = secret

    def user_script(self, mailbox):
        """Return the user active sieve script if it is different from out of
        office.

        :param str mailbox: the mailbox user
        """
        self.client.connect(mailbox, self.passwd, starttls=self.ssl)
        (active_script, scripts) = self.client.listscripts()
        user_script = None
        if active_script is not None and active_script != SIEVE_SCRIPT_NAME:
            user_script = active_script
        self.client.logout()
        return user_script

    def store(self, mailbox, script):
        """Store the OOF sieve script.

        :param str mailbox: the mailbox user
        :param str script: the sieve script
        """
        self.client.connect(mailbox, self.passwd, starttls=self.ssl)
        self.client.putscript(SIEVE_SCRIPT_NAME, script)
        self.client.setactive(SIEVE_SCRIPT_NAME)
        self.client.logout()

    def load(self, mailbox):
        """Load the OOF sieve script.

        :param str mailbox: the mailbox user
        """
        self.client.connect(mailbox, self.passwd, starttls=self.ssl)
        script = self.client.getscript(SIEVE_SCRIPT_NAME)
        self.client.logout()
        return script
Ejemplo n.º 3
0
class SieveClient(object):
    __metaclass__ = ConnectionsManager

    def __init__(self, user=None, password=None):
        try:
            ret, msg = self.login(user, password)
        except Error as e:
            raise ConnectionError(str(e))
        if not ret:
            raise ConnectionError(msg)

    def login(self, user, password):
        self.msc = Client(parameters.get_admin("SERVER"),
                          int(parameters.get_admin("PORT")),
                          debug=False)
        use_starttls = True if parameters.get_admin("STARTTLS") == "yes" \
            else False
        authmech = parameters.get_admin("AUTHENTICATION_MECH")
        if authmech == "AUTO":
            authmech = None
        try:
            ret = self.msc.connect(user, password, use_starttls, authmech)
        except Error:
            ret = False
        if not ret:
            return False, _(
                "Connection to MANAGESIEVE server failed, check your "
                "configuration")
        return True, None

    def logout(self):
        self.msc.logout()
        self.msc = None

    def refresh(self, user, password):
        import ssl

        if self.msc is not None:
            try:
                self.msc.capability()
            except Error as e:
                pass
            else:
                return
        try:
            ret, msg = self.login(user, password)
        except (Error, ssl.SSLError) as e:
            raise ConnectionError(e)
        if not ret:
            raise ConnectionError(msg)

    def listscripts(self):
        return self.msc.listscripts()

    def getscript(self, name, format="raw"):
        content = self.msc.getscript(name)
        if content is None:
            raise SieveClientError(self.msc.errmsg)
        if format == "raw":
            return content
        p = Parser()
        if not p.parse(content):
            print "Parse error????"
            return None
        fs = FiltersSet(name)
        fs.from_parser_result(p)
        return fs

    def pushscript(self, name, content, active=False):
        if isinstance(content, unicode):
            content = content.encode("utf-8")
        if not self.msc.havespace(name, len(content)):
            error = "%s (%s)" % (_("Not enough space on server"),
                                 self.msc.errmsg)
            raise SieveClientError(error)
        if not self.msc.putscript(name, content):
            raise SieveClientError(self.msc.errmsg)
        if active and not self.msc.setactive(name):
            raise SieveClientError(self.msc.errmsg)

    def deletescript(self, name):
        if not self.msc.deletescript(name):
            raise SieveClientError(self.msc.errmsg)

    def activatescript(self, name):
        if not self.msc.setactive(name):
            raise SieveClientError(self.msc.errmsg)
Ejemplo n.º 4
0
def create_sieve_script():

    main_user = session.get('main_user', None)

    if not main_user:
        raise False

    username = main_user['email']
    password = main_user['password']

    user = User.query.filter(User.username == username).first()

    # Get user vacation Settings
    vacation_settings = (Settings.query.filter(
        Settings.user_id == user.id).filter(Settings.enabled == True).filter(
            Settings.section == "email").filter(
                Settings.setting_type == "email-vacation").first()) or False

    # Get user filter settings
    filter_settings = (Settings.query.filter(
        Settings.user_id == user.id).filter(
            Settings.section == "email").filter(
                Settings.setting_type == "email-filters").first()) or False

    # Get user forwarding settings
    forward_settings = (Settings.query.filter(
        Settings.user_id == user.id).filter(Settings.enabled == True).filter(
            Settings.section == "email").filter(
                Settings.setting_type == "email-forward").first()) or False

    sieve_payload = {}
    sieve_reqs = []

    if vacation_settings:
        vs = get_vacation_vars(vacation_settings)
        sieve_payload["vacation_settings"] = vs[0]
        sieve_reqs = sieve_reqs + vs[1]
    else:
        sieve_payload["vacation_settings"] = False

    if filter_settings:
        fs = get_filter_vars(filter_settings)
        sieve_payload["filter_settings"] = fs[0]
        sieve_reqs = sieve_reqs + fs[1]
    else:
        sieve_payload["filter_settings"] = False

    if forward_settings:
        fs = get_forward_vars(forward_settings)
        sieve_payload["forward_settings"] = fs[0]
        sieve_reqs = sieve_reqs + fs[1]
    else:
        sieve_payload["forward_settings"] = False

    sieve_payload["requirements"] = ', '.join('"{0}"'.format(req)
                                              for req in sieve_reqs)
    # connect to the managesieve host
    client = Client(app.config['IMAP_HOST'])
    client.connect(username, password, starttls=True, authmech="PLAIN")
    script = Template("cowui.sieve", sieve_payload).render()

    client.setactive("")
    client.deletescript("cowui")
    client.putscript("cowui", script)
    client.setactive("cowui")
    client.logout()
Ejemplo n.º 5
0
class SieveClient(object, metaclass=ConnectionsManager):
    def __init__(self, user=None, password=None):
        try:
            ret, msg = self.login(user, password)
        except Error as e:
            raise ConnectionError(str(e))
        if not ret:
            raise ConnectionError(msg)

    def login(self, user, password):
        conf = dict(param_tools.get_global_parameters("modoboa_sievefilters"))
        self.msc = Client(conf["server"], conf["port"], debug=False)
        authmech = conf["authentication_mech"]
        if authmech == "AUTO":
            authmech = None
        try:
            ret = self.msc.connect(user,
                                   password,
                                   starttls=conf["starttls"],
                                   authmech=authmech)
        except Error:
            ret = False
        if not ret:
            return False, _(
                "Connection to MANAGESIEVE server failed, check your "
                "configuration")
        return True, None

    def logout(self):
        self.msc.logout()
        self.msc = None

    def refresh(self, user, password):
        import ssl

        if self.msc is not None:
            try:
                self.msc.capability()
            except Error as e:
                pass
            else:
                return
        try:
            ret, msg = self.login(user, password)
        except (Error, ssl.SSLError) as e:
            raise ConnectionError(e)
        if not ret:
            raise ConnectionError(msg)

    def listscripts(self):
        return self.msc.listscripts()

    def getscript(self, name, format="raw"):
        content = self.msc.getscript(name)
        if content is None:
            raise SieveClientError(self.msc.errmsg)
        if format == "raw":
            return content
        p = Parser()
        if not p.parse(content):
            print("Parse error????")
            return None
        fs = FiltersSet(name)
        fs.from_parser_result(p)
        return fs

    def pushscript(self, name, content, active=False):
        if isinstance(content, str):
            content = content.encode("utf-8")
        if not self.msc.havespace(name, len(content)):
            error = "%s (%s)" % (_("Not enough space on server"),
                                 self.msc.errmsg)
            raise SieveClientError(error)
        if not self.msc.putscript(name, content):
            raise SieveClientError(self.msc.errmsg)
        if active and not self.msc.setactive(name):
            raise SieveClientError(self.msc.errmsg)

    def deletescript(self, name):
        if not self.msc.deletescript(name):
            raise SieveClientError(self.msc.errmsg)

    def activatescript(self, name):
        if not self.msc.setactive(name):
            raise SieveClientError(self.msc.errmsg)
Ejemplo n.º 6
0
class SieveClient(object):
    __metaclass__ = ConnectionsManager

    def __init__(self, user=None, password=None):
        try:
            ret, msg = self.login(user, password)
        except Error as e:
            raise ConnectionError(str(e))
        if not ret:
            raise ConnectionError(msg)

    def login(self, user, password):
        self.msc = Client(parameters.get_admin("SERVER"),
                          int(parameters.get_admin("PORT")),
                          debug=False)
        use_starttls = True if parameters.get_admin("STARTTLS") == "yes" \
            else False
        authmech = parameters.get_admin("AUTHENTICATION_MECH")
        if authmech == "AUTO":
            authmech = None
        try:
            ret = self.msc.connect(user, password, use_starttls, authmech)
        except Error:
            ret = False
        if not ret:
            return False, _(
                "Connection to MANAGESIEVE server failed, check your "
                "configuration"
            )
        return True, None

    def logout(self):
        self.msc.logout()
        self.msc = None

    def refresh(self, user, password):
        import ssl

        if self.msc is not None:
            try:
                self.msc.capability()
            except Error as e:
                pass
            else:
                return
        try:
            ret, msg = self.login(user, password)
        except (Error, ssl.SSLError) as e:
            raise ConnectionError(e)
        if not ret:
            raise ConnectionError(msg)

    def listscripts(self):
        return self.msc.listscripts()

    def getscript(self, name, format="raw"):
        content = self.msc.getscript(name)
        if content is None:
            raise SieveClientError(self.msc.errmsg)
        if format == "raw":
            return content
        p = Parser()
        if not p.parse(content):
            print "Parse error????"
            return None
        fs = FiltersSet(name)
        fs.from_parser_result(p)
        return fs

    def pushscript(self, name, content, active=False):
        if isinstance(content, unicode):
            content = content.encode("utf-8")
        if not self.msc.havespace(name, len(content)):
            error = "%s (%s)" % (
                _("Not enough space on server"), self.msc.errmsg)
            raise SieveClientError(error)
        if not self.msc.putscript(name, content):
            raise SieveClientError(self.msc.errmsg)
        if active and not self.msc.setactive(name):
            raise SieveClientError(self.msc.errmsg)

    def deletescript(self, name):
        if not self.msc.deletescript(name):
            raise SieveClientError(self.msc.errmsg)

    def activatescript(self, name):
        if not self.msc.setactive(name):
            raise SieveClientError(self.msc.errmsg)