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
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
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)
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()
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)
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)