def restoreConfigDefaults(self, parm_map): d = OptionsClass() d.load_defaults(defaults) for section, option in parm_map: if option is not None: if not options.no_restore(section, option): options.set(section, option, d.get(section, option)) options.update_file(optionsPathname)
def configure_outlook_express(unused): """Configure OE to use the SpamBayes POP3 and SMTP proxies, and configure SpamBayes to proxy the servers that OE was connecting to.""" # Requires win32all to be available (or for someone to write a # Mac version <wink>) if win32api is None: raise ImportError("win32 extensions required") accounts = oe_mailbox.OEAccountKeys() translate = { ("POP3 Server", "POP3 Port"): "pop3proxy", ("SMTP Server", "SMTP Port"): "smtpproxy", } pop_proxy = pop_proxy_port smtp_proxy = smtp_proxy_port results = [] for proto, subkey, account in accounts: if proto == "POP3": for (server_key, port_key), sect in translate.items(): if sect[:4] == "pop3": default_port = 110 pop_proxy = move_to_next_free_port(pop_proxy) proxy = pop_proxy else: default_port = 25 smtp_proxy = move_to_next_free_port(smtp_proxy) proxy = smtp_proxy if account.has_key(port_key): port = account[port_key][0] else: port = default_port server = "%s:%s" % (account[server_key][0], port) options[sect, "remote_servers"] += (server, ) options[sect, "listen_ports"] += (proxy, ) win32api.RegSetValueEx(subkey, server_key, 0, win32con.REG_SZ, "127.0.0.1") win32api.RegSetValueEx(subkey, port_key, 0, win32con.REG_SZ, str(proxy)) results.append("[%s] Proxy %s on localhost:%s" % \ (account["Account Name"][0], server, proxy)) elif proto == "IMAP4": # Setup imapfilter instead. pass options.update_file(optionsPathname) # Outlook Express rules are done in much the same way. Should one # be set up to work with notate_to or notate_subject? (and set that # option, obviously) return results
def configure_outlook_express(unused): """Configure OE to use the SpamBayes POP3 and SMTP proxies, and configure SpamBayes to proxy the servers that OE was connecting to.""" # Requires win32all to be available (or for someone to write a # Mac version <wink>) if win32api is None: raise ImportError("win32 extensions required") accounts = oe_mailbox.OEAccountKeys() translate = {("POP3 Server", "POP3 Port") : "pop3proxy", ("SMTP Server", "SMTP Port") : "smtpproxy", } pop_proxy = pop_proxy_port smtp_proxy = smtp_proxy_port results = [] for proto, subkey, account in accounts: if proto == "POP3": for (server_key, port_key), sect in translate.items(): if sect[:4] == "pop3": default_port = 110 pop_proxy = move_to_next_free_port(pop_proxy) proxy = pop_proxy else: default_port = 25 smtp_proxy = move_to_next_free_port(smtp_proxy) proxy = smtp_proxy if account.has_key(port_key): port = account[port_key][0] else: port = default_port server = "%s:%s" % (account[server_key][0], port) options[sect, "remote_servers"] += (server,) options[sect, "listen_ports"] += (proxy,) win32api.RegSetValueEx(subkey, server_key, 0, win32con.REG_SZ, "127.0.0.1") win32api.RegSetValueEx(subkey, port_key, 0, win32con.REG_SZ, str(proxy)) results.append("[%s] Proxy %s on localhost:%s" % \ (account["Account Name"][0], server, proxy)) elif proto == "IMAP4": # Setup imapfilter instead. pass options.update_file(optionsPathname) # Outlook Express rules are done in much the same way. Should one # be set up to work with notate_to or notate_subject? (and set that # option, obviously) return results
def configure_m2(config_location): """Configure M2 (Opera's mailer) to use the SpamBayes POP3 and SMTP proxies, and configure SpamBayes to proxy the servers that M2 was connecting to.""" ini_filename = os.path.join(config_location, "Mail", "accounts.ini") ini_file = file(ini_filename, "r") faked_up = StringIO.StringIO() faked_up.write(";") # Missing at the start faked_up.write(ini_file.read()) faked_up.seek(0) ini_file.close() c = ConfigParser.ConfigParser() c.readfp(faked_up) translate = {("Incoming Servername", "Incoming Port") : "pop3proxy", ("Outgoing Servername", "Outgoing Port") : "smtpproxy", } pop_proxy = pop_proxy_port smtp_proxy = smtp_proxy_port results = [] for sect in c.sections(): if sect.startswith("Account") and sect != "Accounts": if c.get(sect, "Incoming Protocol") == "POP": for (m2_name, m2_port), us_name in translate.items(): try: port = c.get(sect, m2_port) except ConfigParser.NoOptionError: port = None if us_name.lower()[:4] == "pop3": if port is None: port = 110 pop_proxy = move_to_next_free_port(pop_proxy) proxy_port = pop_proxy else: if port is None: port = 25 smtp_proxy = move_to_next_free_port(smtp_proxy) proxy_port = smtp_proxy server = "%s:%s" % (c.get(sect, m2_name), port) options[us_name, "remote_servers"] += (server,) options[us_name, "listen_ports"] += (proxy_port,) results.append("[%s] Proxy %s on localhost:%s" % \ (sect, server, proxy_port)) c.set(sect, m2_name, "localhost") c.set(sect, m2_port, proxy_port) elif c.get(sect, "Incoming Protocol") == "IMAP": pass out = file(ini_filename, "w") c.write(out) out.close() options.update_file(optionsPathname) return results
def configure_outlook_express(unused): """Configure OE to use the SpamBayes POP3 and SMTP proxies, and configure SpamBayes to proxy the servers that OE was connecting to.""" if win32api is None: raise ImportError("win32 extensions required") accounts = oe_mailbox.OEAccountKeys() translate = {("POP3 Server", "POP3 Port") : "pop3proxy", ("SMTP Server", "SMTP Port") : "smtpproxy", } pop_proxy = pop_proxy_port smtp_proxy = smtp_proxy_port results = [] for proto, subkey, account in accounts: if proto == "POP3": for (server_key, port_key), sect in translate.items(): if sect[:4] == "pop3": default_port = 110 pop_proxy = move_to_next_free_port(pop_proxy) proxy = pop_proxy else: default_port = 25 smtp_proxy = move_to_next_free_port(smtp_proxy) proxy = smtp_proxy if account.has_key(port_key): port = account[port_key][0] else: port = default_port server = "%s:%s" % (account[server_key][0], port) options[sect, "remote_servers"] += (server,) options[sect, "listen_ports"] += (proxy,) win32api.RegSetValueEx(subkey, server_key, 0, win32con.REG_SZ, "127.0.0.1") win32api.RegSetValueEx(subkey, port_key, 0, win32con.REG_SZ, str(proxy)) results.append("[%s] Proxy %s on localhost:%s" % \ (account["Account Name"][0], server, proxy)) elif proto == "IMAP4": pass options.update_file(optionsPathname) return results
def configure_pocomail(pocomail_accounts_file): if os.path.exists(pocomail_accounts_file): f = open(pocomail_accounts_file, "r") accountName = "" pocomail_accounts = { } # Builds the dictionary with all the existing accounts. for line in f.readlines(): line = line.rstrip('\n\r') if line == '': continue if line[0] == '[' and line[-1] == ']': accountName = line[1:-1] pocomail_accounts[accountName] = { } else: separator = line.find('=') optionName = line[:separator] optionValue = line[separator + 1:] if optionName == "POPServer": pop3 = optionValue.split(':') if len(pop3) == 1: pop3.append(110) server = "%s:%s" % tuple(pop3) proxy = pop_proxy pop_proxy = move_to_next_free_port(pop_proxy) if not server in options["pop3proxy", "remote_servers"]: options["pop3proxy", "remote_servers"] += (server,) options["pop3proxy", "listen_ports"] += (proxy,) else: serverIndex = 0 for remoteServer in options["pop3proxy", "remote_servers"]: if remoteServer == server: break serverIndex += 1 proxy = options["pop3proxy", "listen_ports"][serverIndex] optionValue = "%s:%s" % ('localhost', proxy) pocomail_accounts[accountName][optionName] = optionValue f.close() f = open(pocomail_accounts_file, "w") for accountName in pocomail_accounts.keys(): f.write('[' + accountName + ']\n') for optionName, optionValue in pocomail_accounts[accountName].items(): f.write("%s=%s\n" % (optionName, optionValue)) f.write('\n') f.close() options.update_file(optionsPathname) # Add a filter to pocomail pocomail_filters_file = os.path.join(pocomail_path, "filters.ini") if os.path.exists(pocomail_filters_file): f = open(pocomail_filters_file, "r") pocomail_filters = { } filterName = "" for line in f.readlines(): line = line.rstrip('\n\r') if line == '': continue if line[0] == '[' and line[-1] == ']': filterName = line[1:-1] pocomail_filters[filterName] = [] elif line[0] != '{': pocomail_filters[filterName].append(line) f.close() spamBayesFilter = 'spam,X-Spambayes-Classification,move,' \ '"Junk Mail",0,0,,,0,,,move,In,0,0,,0,,,' \ 'move,In,0,0,,0,,,move,In,0,0,,0,,,move,' \ 'In,0,0,,0,,,move,In,0,0,1,0' if pocomail_filters.has_key("Incoming") and \ spamBayesFilter not in pocomail_filters["Incoming"]: pocomail_filters["Incoming"].append(spamBayesFilter) f = open(pocomail_filters_file, "w") f.write('{ Filter list generated by PocoMail 3.01 (1661)' \ '- Licensed Version}\n') for filterName in pocomail_filters.keys(): f.write('\n[' + filterName + ']\n') for filter in pocomail_filters[filterName]: f.write(filter + '\n') f.close() return []
def configure_mozilla(config_location): """Configure Mozilla to use the SpamBayes POP3 and SMTP proxies, and configure SpamBayes to proxy the servers that Mozilla was connecting to.""" prefs_file = file("%s%sprefs.js" % (config_location, os.sep), "r") prefs = prefs_file.read() prefs_file.close() save_prefs = prefs pop_accounts = {} smtp_accounts = {} r = re.compile(r"user_pref\(\"mail.server.server(\d+).(real)?hostname\", \"([^\"]*)\"\);") current_pos = 0 results = [] while True: m = r.search(prefs[current_pos:]) if not m: break server_num = m.group(1) real = m.group(2) or '' server = m.group(3) current_pos += m.end() old_pref = 'user_pref("mail.server.server%s.%shostname", "%s");' % \ (server_num, real, server) # Find the port, if there is one port_string = 'user_pref("mail.server.server%s.port", ' % \ (server_num,) port_loc = prefs.find(port_string) if port_loc == -1: port = "110" old_port = None else: loc_plus_len = port_loc + len(port_string) end_of_number = loc_plus_len + prefs[loc_plus_len:].index(')') port = prefs[loc_plus_len : end_of_number] old_port = "%s%s);" % (port_string, port) # Find the type of connection type_string = 'user_pref("mail.server.server%s.type", "' % \ (server_num,) type_loc = prefs.find(type_string) if type_loc == -1: # no type, so ignore this one continue type_loc += len(type_string) account_type = prefs[type_loc : \ type_loc + prefs[type_loc:].index('"')] if account_type == "pop3": new_pref = 'user_pref("mail.server.server%s.%shostname", ' \ '"127.0.0.1");' % (server_num, real) if not pop_accounts.has_key(server_num) or real: pop_accounts[server_num] = (new_pref, old_pref, old_port, server, port) elif account_type == "imap": # Setup imapfilter instead pass proxy_port = pop_proxy_port for num, (pref, old_pref, old_port, server, port) in pop_accounts.items(): server = "%s:%s" % (server, port) proxy_port = move_to_next_free_port(proxy_port) port_pref = 'user_pref("mail.server.server%s.port", %s);' % \ (num, proxy_port) options["pop3proxy", "remote_servers"] += (server,) options["pop3proxy", "listen_ports"] += (proxy_port,) if old_port is None: pref = "%s\n%s" % (pref, port_pref) else: save_prefs = save_prefs.replace(old_port, port_pref) save_prefs = save_prefs.replace(old_pref, pref) results.append("[%s] Proxy %s on localhost:%s" % \ (num, server, proxy_port)) # Do the SMTP server. # Mozilla recommends that only advanced users setup more than one, # so we'll just set that one up. Advanced users can setup SpamBayes # themselves <wink>. prefs = save_prefs r = re.compile(r"user_pref\(\"mail.smtpserver.smtp(\d+).hostname\", \"([^\"]*)\"\);") current_pos = 0 while True: m = r.search(prefs[current_pos:]) if not m: break current_pos += m.end() server_num = m.group(1) server = m.group(2) old_pref = 'user_pref("mail.smtpserver.smtp%s.hostname", ' \ '"%s");' % (server_num, server) new_pref = 'user_pref("mail.smtpserver.smtp%s.hostname", ' \ '"127.0.0.1");' % (server_num,) # Find the port port_string = 'user_pref("mail.smtpserver.smtp%d.port", ' \ % (server_num,) port_loc = prefs.find(port_string) if port_loc == -1: port = "25" old_port = None else: loc_plus_len = port_loc + len(port_string) end_of_number = loc_plus_len + prefs[loc_plus_len:].index(')') port = prefs[loc_plus_len : end_of_number] old_port = 'user_pref("mail.smtpserver.smtp%s.port", %s);' % \ (server_num, port) smtp_accounts[server_num] = (new_pref, old_pref, old_port, server, port) proxy_port = smtp_proxy_port for num, (pref, old_pref, old_port, server, port) in smtp_accounts.items(): server = "%s:%s" % (server, port) proxy_port = move_to_next_free_port(proxy_port) port_pref = 'user_pref("mail.smtpserver.smtp%s.port", %s);' % \ (num, proxy_port) options["smtpproxy", "remote_servers"] += (server,) options["smtpproxy", "listen_ports"] += (proxy_port,) if old_port is None: pref = "%s\n%s" % (pref, port_pref) else: save_prefs = save_prefs.replace(old_port, port_pref) save_prefs = save_prefs.replace(old_pref, pref) results.append("[%s] Proxy %s on localhost:%s" % \ (num, server, proxy_port)) prefs_file = file("%s%sprefs.js" % (config_location, os.sep), "w") prefs_file.write(save_prefs) prefs_file.close() options.update_file(optionsPathname) # Setup filtering rules. # Assumes that the folders already exist! I don't know how difficult # it would be to create new Mozilla mail folders. filter_filename = "%s%smsgFilterRules.dat" % (config_location, os.sep) store_name = "" # how do we get this? spam_folder_url = "mailbox:////%s//Junk%%20Mail" % (store_name,) unsure_folder_url = "mailbox:////%s//Possible%%20Junk" % (store_name,) header_name = options["Headers", "classification_header_name"] spam_tag = options["Headers", "header_spam_string"] unsure_tag = options["Headers", "header_unsure_string"] rule = 'name="SpamBayes-Spam"\n' \ 'enabled="yes"\n' \ 'type="1"\n' \ 'action="Move to folder"\n' \ 'actionValue="%s"\n' \ 'condition="OR (\"%s\",contains,%s)"\n' \ 'name="SpamBayes-Unsure"\n' \ 'enabled="yes"\n' \ 'type="1"\n' \ 'action="Move to folder"\n' \ 'actionValue="%s"\n' \ 'condition="OR (\"%s\",contains,%s)"\n' % \ (spam_folder_url, header_name, spam_tag, unsure_folder_url, header_name, unsure_tag) # This should now be written to the file, but I'm not sure how we # determine which subdirectory it goes into - does it have to go # into them all? # We are assuming that a rules file already exists, otherwise there # is a bit more to go at the top. return results
def configure_eudora(config_location): """Configure Eudora to use the SpamBayes POP3 and SMTP proxies, and configure SpamBayes to proxy the servers that Eudora was connecting to. """ ini_filename = "%s%seudora.ini" % (config_location, os.sep) c = ConfigParser.ConfigParser() c.read(ini_filename) translate = {("PopServer", "POPPort") : "pop3proxy", ("SMTPServer", "SMTPPort") : "smtpproxy", } pop_proxy = pop_proxy_port smtp_proxy = smtp_proxy_port results = [] for sect in c.sections(): if sect.startswith("Persona-") or sect == "Settings": if c.get(sect, "UsesIMAP") == "0": # Eudora stores the POP3 server name in two places. # Why? Who cares. We do the popaccount one # separately, because it also has the username. p = c.get(sect, "popaccount") c.set(sect, "popaccount", "%s@localhost" % \ (p[:p.index('@')],)) for (eud_name, eud_port), us_name in translate.items(): try: port = c.get(sect, eud_port) except ConfigParser.NoOptionError: port = None if us_name.lower()[:4] == "pop3": if port is None: port = 110 pop_proxy = move_to_next_free_port(pop_proxy) proxy_port = pop_proxy else: if port is None: port = 25 smtp_proxy = move_to_next_free_port(smtp_proxy) proxy_port = smtp_proxy server = "%s:%s" % (c.get(sect, eud_name), port) options[us_name, "remote_servers"] += (server,) options[us_name, "listen_ports"] += (proxy_port,) results.append("[%s] Proxy %s on localhost:%s" % \ (sect, server, proxy_port)) c.set(sect, eud_name, "localhost") c.set(sect, eud_port, proxy_port) else: # Setup imapfilter instead pass out = file(ini_filename, "w") c.write(out) out.close() options.update_file(optionsPathname) # Setup filtering rule # This assumes that the spam and unsure folders already exist! # (Creating them shouldn't be that difficult - it's just a mbox file, # and I think the .toc file is automatically created). Left for # another day, however. filter_filename = "%s%sFilters.pce" % (config_location, os.sep) spam_folder_name = "Junk" unsure_folder_name = "Possible Junk" header_name = options["Headers", "classification_header_name"] spam_tag = options["Headers", "header_spam_string"] unsure_tag = options["Headers", "header_unsure_string"] # We are assuming that a rules file already exists, otherwise there # is a bit more to go at the top. filter_rules = "rule SpamBayes-Spam\n" \ "transfer %s.mbx\n" \ "incoming\n" \ "header %s\n" \ "verb contains\n" \ "value %s\n" \ "conjunction ignore\n" \ "header \n" \ "verb contains\n" \ "value \n" \ "rule SpamBayes-Unsure\n" \ "transfer %s.mbx\n" \ "incoming\n" \ "header %s\n" \ "verb contains\n" \ "value %s\n" \ "conjunction ignore\n" \ "header \n" \ "verb contains\n" \ "value \n" % (spam_folder_name, header_name, spam_tag, unsure_folder_name, header_name, unsure_tag) filter_file = file(filter_filename, "a") filter_file.write(filter_rules) filter_file.close() return results
def configure_pocomail(pocomail_accounts_file): if os.path.exists(pocomail_accounts_file): f = open(pocomail_accounts_file, "r") accountName = "" pocomail_accounts = {} # Builds the dictionary with all the existing accounts. for line in f.readlines(): line = line.rstrip('\n\r') if line == '': continue if line[0] == '[' and line[-1] == ']': accountName = line[1:-1] pocomail_accounts[accountName] = {} else: separator = line.find('=') optionName = line[:separator] optionValue = line[separator + 1:] if optionName == "POPServer": pop3 = optionValue.split(':') if len(pop3) == 1: pop3.append(110) server = "%s:%s" % tuple(pop3) proxy = pop_proxy pop_proxy = move_to_next_free_port(pop_proxy) if not server in options["pop3proxy", "remote_servers"]: options["pop3proxy", "remote_servers"] += (server, ) options["pop3proxy", "listen_ports"] += (proxy, ) else: serverIndex = 0 for remoteServer in options["pop3proxy", "remote_servers"]: if remoteServer == server: break serverIndex += 1 proxy = options["pop3proxy", "listen_ports"][serverIndex] optionValue = "%s:%s" % ('localhost', proxy) pocomail_accounts[accountName][optionName] = optionValue f.close() f = open(pocomail_accounts_file, "w") for accountName in pocomail_accounts.keys(): f.write('[' + accountName + ']\n') for optionName, optionValue in pocomail_accounts[ accountName].items(): f.write("%s=%s\n" % (optionName, optionValue)) f.write('\n') f.close() options.update_file(optionsPathname) # Add a filter to pocomail pocomail_filters_file = os.path.join(pocomail_path, "filters.ini") if os.path.exists(pocomail_filters_file): f = open(pocomail_filters_file, "r") pocomail_filters = {} filterName = "" for line in f.readlines(): line = line.rstrip('\n\r') if line == '': continue if line[0] == '[' and line[-1] == ']': filterName = line[1:-1] pocomail_filters[filterName] = [] elif line[0] != '{': pocomail_filters[filterName].append(line) f.close() spamBayesFilter = 'spam,X-Spambayes-Classification,move,' \ '"Junk Mail",0,0,,,0,,,move,In,0,0,,0,,,' \ 'move,In,0,0,,0,,,move,In,0,0,,0,,,move,' \ 'In,0,0,,0,,,move,In,0,0,1,0' if pocomail_filters.has_key("Incoming") and \ spamBayesFilter not in pocomail_filters["Incoming"]: pocomail_filters["Incoming"].append(spamBayesFilter) f = open(pocomail_filters_file, "w") f.write('{ Filter list generated by PocoMail 3.01 (1661)' \ '- Licensed Version}\n') for filterName in pocomail_filters.keys(): f.write('\n[' + filterName + ']\n') for filter in pocomail_filters[filterName]: f.write(filter + '\n') f.close() return []
def configure_m2(config_location): """Configure M2 (Opera's mailer) to use the SpamBayes POP3 and SMTP proxies, and configure SpamBayes to proxy the servers that M2 was connecting to.""" ini_filename = os.path.join(config_location, "Mail", "accounts.ini") ini_file = file(ini_filename, "r") faked_up = StringIO.StringIO() faked_up.write(";") # Missing at the start faked_up.write(ini_file.read()) faked_up.seek(0) ini_file.close() c = ConfigParser.ConfigParser() c.readfp(faked_up) translate = { ("Incoming Servername", "Incoming Port"): "pop3proxy", ("Outgoing Servername", "Outgoing Port"): "smtpproxy", } pop_proxy = pop_proxy_port smtp_proxy = smtp_proxy_port results = [] for sect in c.sections(): if sect.startswith("Account") and sect != "Accounts": if c.get(sect, "Incoming Protocol") == "POP": for (m2_name, m2_port), us_name in translate.items(): try: port = c.get(sect, m2_port) except ConfigParser.NoOptionError: port = None if us_name.lower()[:4] == "pop3": if port is None: port = 110 pop_proxy = move_to_next_free_port(pop_proxy) proxy_port = pop_proxy else: if port is None: port = 25 smtp_proxy = move_to_next_free_port(smtp_proxy) proxy_port = smtp_proxy server = "%s:%s" % (c.get(sect, m2_name), port) options[us_name, "remote_servers"] += (server, ) options[us_name, "listen_ports"] += (proxy_port, ) results.append("[%s] Proxy %s on localhost:%s" % \ (sect, server, proxy_port)) c.set(sect, m2_name, "localhost") c.set(sect, m2_port, proxy_port) elif c.get(sect, "Incoming Protocol") == "IMAP": # Setup imapfilter instead pass out = file(ini_filename, "w") c.write(out) out.close() options.update_file(optionsPathname) # Setting up a filter in M2 is very simple, but I'm not sure what the # right rule is - M2 doesn't move mail, it just displays a subset. # If someone can describe the best all-purpose rule, I'll pop it in # here. return results
def configure_mozilla(config_location): """Configure Mozilla to use the SpamBayes POP3 and SMTP proxies, and configure SpamBayes to proxy the servers that Mozilla was connecting to.""" prefs_file = file("%s%sprefs.js" % (config_location, os.sep), "r") prefs = prefs_file.read() prefs_file.close() save_prefs = prefs pop_accounts = {} smtp_accounts = {} r = re.compile( r"user_pref\(\"mail.server.server(\d+).(real)?hostname\", \"([^\"]*)\"\);" ) current_pos = 0 results = [] while True: m = r.search(prefs[current_pos:]) if not m: break server_num = m.group(1) real = m.group(2) or '' server = m.group(3) current_pos += m.end() old_pref = 'user_pref("mail.server.server%s.%shostname", "%s");' % \ (server_num, real, server) # Find the port, if there is one port_string = 'user_pref("mail.server.server%s.port", ' % \ (server_num,) port_loc = prefs.find(port_string) if port_loc == -1: port = "110" old_port = None else: loc_plus_len = port_loc + len(port_string) end_of_number = loc_plus_len + prefs[loc_plus_len:].index(')') port = prefs[loc_plus_len:end_of_number] old_port = "%s%s);" % (port_string, port) # Find the type of connection type_string = 'user_pref("mail.server.server%s.type", "' % \ (server_num,) type_loc = prefs.find(type_string) if type_loc == -1: # no type, so ignore this one continue type_loc += len(type_string) account_type = prefs[type_loc : \ type_loc + prefs[type_loc:].index('"')] if account_type == "pop3": new_pref = 'user_pref("mail.server.server%s.%shostname", ' \ '"127.0.0.1");' % (server_num, real) if not pop_accounts.has_key(server_num) or real: pop_accounts[server_num] = (new_pref, old_pref, old_port, server, port) elif account_type == "imap": # Setup imapfilter instead pass proxy_port = pop_proxy_port for num, (pref, old_pref, old_port, server, port) in pop_accounts.items(): server = "%s:%s" % (server, port) proxy_port = move_to_next_free_port(proxy_port) port_pref = 'user_pref("mail.server.server%s.port", %s);' % \ (num, proxy_port) options["pop3proxy", "remote_servers"] += (server, ) options["pop3proxy", "listen_ports"] += (proxy_port, ) if old_port is None: pref = "%s\n%s" % (pref, port_pref) else: save_prefs = save_prefs.replace(old_port, port_pref) save_prefs = save_prefs.replace(old_pref, pref) results.append("[%s] Proxy %s on localhost:%s" % \ (num, server, proxy_port)) # Do the SMTP server. # Mozilla recommends that only advanced users setup more than one, # so we'll just set that one up. Advanced users can setup SpamBayes # themselves <wink>. prefs = save_prefs r = re.compile( r"user_pref\(\"mail.smtpserver.smtp(\d+).hostname\", \"([^\"]*)\"\);") current_pos = 0 while True: m = r.search(prefs[current_pos:]) if not m: break current_pos += m.end() server_num = m.group(1) server = m.group(2) old_pref = 'user_pref("mail.smtpserver.smtp%s.hostname", ' \ '"%s");' % (server_num, server) new_pref = 'user_pref("mail.smtpserver.smtp%s.hostname", ' \ '"127.0.0.1");' % (server_num,) # Find the port port_string = 'user_pref("mail.smtpserver.smtp%d.port", ' \ % (server_num,) port_loc = prefs.find(port_string) if port_loc == -1: port = "25" old_port = None else: loc_plus_len = port_loc + len(port_string) end_of_number = loc_plus_len + prefs[loc_plus_len:].index(')') port = prefs[loc_plus_len:end_of_number] old_port = 'user_pref("mail.smtpserver.smtp%s.port", %s);' % \ (server_num, port) smtp_accounts[server_num] = (new_pref, old_pref, old_port, server, port) proxy_port = smtp_proxy_port for num, (pref, old_pref, old_port, server, port) in smtp_accounts.items(): server = "%s:%s" % (server, port) proxy_port = move_to_next_free_port(proxy_port) port_pref = 'user_pref("mail.smtpserver.smtp%s.port", %s);' % \ (num, proxy_port) options["smtpproxy", "remote_servers"] += (server, ) options["smtpproxy", "listen_ports"] += (proxy_port, ) if old_port is None: pref = "%s\n%s" % (pref, port_pref) else: save_prefs = save_prefs.replace(old_port, port_pref) save_prefs = save_prefs.replace(old_pref, pref) results.append("[%s] Proxy %s on localhost:%s" % \ (num, server, proxy_port)) prefs_file = file("%s%sprefs.js" % (config_location, os.sep), "w") prefs_file.write(save_prefs) prefs_file.close() options.update_file(optionsPathname) # Setup filtering rules. # Assumes that the folders already exist! I don't know how difficult # it would be to create new Mozilla mail folders. filter_filename = "%s%smsgFilterRules.dat" % (config_location, os.sep) store_name = "" # how do we get this? spam_folder_url = "mailbox:////%s//Junk%%20Mail" % (store_name, ) unsure_folder_url = "mailbox:////%s//Possible%%20Junk" % (store_name, ) header_name = options["Headers", "classification_header_name"] spam_tag = options["Headers", "header_spam_string"] unsure_tag = options["Headers", "header_unsure_string"] rule = 'name="SpamBayes-Spam"\n' \ 'enabled="yes"\n' \ 'type="1"\n' \ 'action="Move to folder"\n' \ 'actionValue="%s"\n' \ 'condition="OR (\"%s\",contains,%s)"\n' \ 'name="SpamBayes-Unsure"\n' \ 'enabled="yes"\n' \ 'type="1"\n' \ 'action="Move to folder"\n' \ 'actionValue="%s"\n' \ 'condition="OR (\"%s\",contains,%s)"\n' % \ (spam_folder_url, header_name, spam_tag, unsure_folder_url, header_name, unsure_tag) # This should now be written to the file, but I'm not sure how we # determine which subdirectory it goes into - does it have to go # into them all? # We are assuming that a rules file already exists, otherwise there # is a bit more to go at the top. return results
def configure_eudora(config_location): """Configure Eudora to use the SpamBayes POP3 and SMTP proxies, and configure SpamBayes to proxy the servers that Eudora was connecting to. """ ini_filename = "%s%seudora.ini" % (config_location, os.sep) c = ConfigParser.ConfigParser() c.read(ini_filename) translate = { ("PopServer", "POPPort"): "pop3proxy", ("SMTPServer", "SMTPPort"): "smtpproxy", } pop_proxy = pop_proxy_port smtp_proxy = smtp_proxy_port results = [] for sect in c.sections(): if sect.startswith("Persona-") or sect == "Settings": if c.get(sect, "UsesIMAP") == "0": # Eudora stores the POP3 server name in two places. # Why? Who cares. We do the popaccount one # separately, because it also has the username. p = c.get(sect, "popaccount") c.set(sect, "popaccount", "%s@localhost" % \ (p[:p.index('@')],)) for (eud_name, eud_port), us_name in translate.items(): try: port = c.get(sect, eud_port) except ConfigParser.NoOptionError: port = None if us_name.lower()[:4] == "pop3": if port is None: port = 110 pop_proxy = move_to_next_free_port(pop_proxy) proxy_port = pop_proxy else: if port is None: port = 25 smtp_proxy = move_to_next_free_port(smtp_proxy) proxy_port = smtp_proxy server = "%s:%s" % (c.get(sect, eud_name), port) options[us_name, "remote_servers"] += (server, ) options[us_name, "listen_ports"] += (proxy_port, ) results.append("[%s] Proxy %s on localhost:%s" % \ (sect, server, proxy_port)) c.set(sect, eud_name, "localhost") c.set(sect, eud_port, proxy_port) else: # Setup imapfilter instead pass out = file(ini_filename, "w") c.write(out) out.close() options.update_file(optionsPathname) # Setup filtering rule # This assumes that the spam and unsure folders already exist! # (Creating them shouldn't be that difficult - it's just a mbox file, # and I think the .toc file is automatically created). Left for # another day, however. filter_filename = "%s%sFilters.pce" % (config_location, os.sep) spam_folder_name = "Junk" unsure_folder_name = "Possible Junk" header_name = options["Headers", "classification_header_name"] spam_tag = options["Headers", "header_spam_string"] unsure_tag = options["Headers", "header_unsure_string"] # We are assuming that a rules file already exists, otherwise there # is a bit more to go at the top. filter_rules = "rule SpamBayes-Spam\n" \ "transfer %s.mbx\n" \ "incoming\n" \ "header %s\n" \ "verb contains\n" \ "value %s\n" \ "conjunction ignore\n" \ "header \n" \ "verb contains\n" \ "value \n" \ "rule SpamBayes-Unsure\n" \ "transfer %s.mbx\n" \ "incoming\n" \ "header %s\n" \ "verb contains\n" \ "value %s\n" \ "conjunction ignore\n" \ "header \n" \ "verb contains\n" \ "value \n" % (spam_folder_name, header_name, spam_tag, unsure_folder_name, header_name, unsure_tag) filter_file = file(filter_filename, "a") filter_file.write(filter_rules) filter_file.close() return results
def onChangeopts(self, **parms): pmap = self.parm_ini_map if parms.has_key("how"): if parms["how"] == _("Save advanced options"): pmap = self.advanced_options_map elif parms["how"] == _("Save experimental options"): pmap = experimental_ini_map elif parms["how"] == _("Save plugin options"): pmap = self.plugin_ini_map del parms["how"] html = self._getHTMLClone() html.shutdownTableCell = " " html.mainContent = self.html.headedBox.clone() errmsg = self.verifyInput(parms, pmap) if errmsg != "": html.mainContent.heading = _("Errors Detected") html.mainContent.boxContent = errmsg html.title = _("Home > Error") html.pagename = _("> Error") self.writeOKHeaders("text/html") self.write(html) return old_database_type = options["Storage", "persistent_use_database"] old_name = options["Storage", "persistent_storage_file"] for name, value in parms.items(): sect, opt = name.split("_", 1) if (sect, opt) in pmap: options.set(sect, opt, value) else: sect2, opt = opt.split("_", 1) sect += "_" + sect2 options.set(sect, opt, value) options.update_file(optionsPathname) if options["Storage", "persistent_use_database"] != old_database_type and os.path.exists(old_name): new_name = options["Storage", "persistent_storage_file"] new_type = options["Storage", "persistent_use_database"] self.close_database() try: os.remove(new_name + ".tmp") except OSError: pass storage.convert(old_name, old_database_type, new_name + ".tmp", new_type) if os.path.exists(new_name): try: os.remove(new_name + ".old") except OSError: pass os.rename(new_name, new_name + ".old") os.rename(new_name + ".tmp", new_name) if os.path.exists(options["Storage", "messageinfo_storage_file"]): try: os.remove(options["Storage", "messageinfo_storage_file"] + ".old") except OSError: pass os.rename( options["Storage", "messageinfo_storage_file"], options["Storage", "messageinfo_storage_file"] + ".old", ) self.reReadOptions() html.mainContent.heading = _("Options Changed") html.mainContent.boxContent = _("Options changed. Return " "<a href='home'>Home</a>.") html.title = _("Home > Options Changed") html.pagename = _("> Options Changed") self.writeOKHeaders("text/html") self.write(html)
def configure_mozilla(config_location): """Configure Mozilla to use the SpamBayes POP3 and SMTP proxies, and configure SpamBayes to proxy the servers that Mozilla was connecting to.""" prefs_file = file("%s%sprefs.js" % (config_location, os.sep), "r") prefs = prefs_file.read() prefs_file.close() save_prefs = prefs pop_accounts = {} smtp_accounts = {} r = re.compile(r"user_pref\(\"mail.server.server(\d+).(real)?hostname\", \"([^\"]*)\"\);") current_pos = 0 results = [] while True: m = r.search(prefs[current_pos:]) if not m: break server_num = m.group(1) real = m.group(2) or '' server = m.group(3) current_pos += m.end() old_pref = 'user_pref("mail.server.server%s.%shostname", "%s");' % \ (server_num, real, server) port_string = 'user_pref("mail.server.server%s.port", ' % \ (server_num,) port_loc = prefs.find(port_string) if port_loc == -1: port = "110" old_port = None else: loc_plus_len = port_loc + len(port_string) end_of_number = loc_plus_len + prefs[loc_plus_len:].index(')') port = prefs[loc_plus_len : end_of_number] old_port = "%s%s);" % (port_string, port) type_string = 'user_pref("mail.server.server%s.type", "' % \ (server_num,) type_loc = prefs.find(type_string) if type_loc == -1: continue type_loc += len(type_string) account_type = prefs[type_loc : \ type_loc + prefs[type_loc:].index('"')] if account_type == "pop3": new_pref = 'user_pref("mail.server.server%s.%shostname", ' \ '"127.0.0.1");' % (server_num, real) if server_num not in pop_accounts or real: pop_accounts[server_num] = (new_pref, old_pref, old_port, server, port) elif account_type == "imap": pass proxy_port = pop_proxy_port for num, (pref, old_pref, old_port, server, port) in list(pop_accounts.items()): server = "%s:%s" % (server, port) proxy_port = move_to_next_free_port(proxy_port) port_pref = 'user_pref("mail.server.server%s.port", %s);' % \ (num, proxy_port) options["pop3proxy", "remote_servers"] += (server,) options["pop3proxy", "listen_ports"] += (proxy_port,) if old_port is None: pref = "%s\n%s" % (pref, port_pref) else: save_prefs = save_prefs.replace(old_port, port_pref) save_prefs = save_prefs.replace(old_pref, pref) results.append("[%s] Proxy %s on localhost:%s" % \ (num, server, proxy_port)) prefs = save_prefs r = re.compile(r"user_pref\(\"mail.smtpserver.smtp(\d+).hostname\", \"([^\"]*)\"\);") current_pos = 0 while True: m = r.search(prefs[current_pos:]) if not m: break current_pos += m.end() server_num = m.group(1) server = m.group(2) old_pref = 'user_pref("mail.smtpserver.smtp%s.hostname", ' \ '"%s");' % (server_num, server) new_pref = 'user_pref("mail.smtpserver.smtp%s.hostname", ' \ '"127.0.0.1");' % (server_num,) port_string = 'user_pref("mail.smtpserver.smtp%d.port", ' \ % (server_num,) port_loc = prefs.find(port_string) if port_loc == -1: port = "25" old_port = None else: loc_plus_len = port_loc + len(port_string) end_of_number = loc_plus_len + prefs[loc_plus_len:].index(')') port = prefs[loc_plus_len : end_of_number] old_port = 'user_pref("mail.smtpserver.smtp%s.port", %s);' % \ (server_num, port) smtp_accounts[server_num] = (new_pref, old_pref, old_port, server, port) proxy_port = smtp_proxy_port for num, (pref, old_pref, old_port, server, port) in list(smtp_accounts.items()): server = "%s:%s" % (server, port) proxy_port = move_to_next_free_port(proxy_port) port_pref = 'user_pref("mail.smtpserver.smtp%s.port", %s);' % \ (num, proxy_port) options["smtpproxy", "remote_servers"] += (server,) options["smtpproxy", "listen_ports"] += (proxy_port,) if old_port is None: pref = "%s\n%s" % (pref, port_pref) else: save_prefs = save_prefs.replace(old_port, port_pref) save_prefs = save_prefs.replace(old_pref, pref) results.append("[%s] Proxy %s on localhost:%s" % \ (num, server, proxy_port)) prefs_file = file("%s%sprefs.js" % (config_location, os.sep), "w") prefs_file.write(save_prefs) prefs_file.close() options.update_file(optionsPathname) filter_filename = "%s%smsgFilterRules.dat" % (config_location, os.sep) store_name = "" spam_folder_url = "mailbox:////%s//Junk%%20Mail" % (store_name,) unsure_folder_url = "mailbox:////%s//Possible%%20Junk" % (store_name,) header_name = options["Headers", "classification_header_name"] spam_tag = options["Headers", "header_spam_string"] unsure_tag = options["Headers", "header_unsure_string"] rule = 'name="SpamBayes-Spam"\n' \ 'enabled="yes"\n' \ 'type="1"\n' \ 'action="Move to folder"\n' \ 'actionValue="%s"\n' \ 'condition="OR (\"%s\",contains,%s)"\n' \ 'name="SpamBayes-Unsure"\n' \ 'enabled="yes"\n' \ 'type="1"\n' \ 'action="Move to folder"\n' \ 'actionValue="%s"\n' \ 'condition="OR (\"%s\",contains,%s)"\n' % \ (spam_folder_url, header_name, spam_tag, unsure_folder_url, header_name, unsure_tag) return results
def configure_eudora(config_location): """Configure Eudora to use the SpamBayes POP3 and SMTP proxies, and configure SpamBayes to proxy the servers that Eudora was connecting to. """ ini_filename = "%s%seudora.ini" % (config_location, os.sep) c = configparser.ConfigParser() c.read(ini_filename) translate = {("PopServer", "POPPort") : "pop3proxy", ("SMTPServer", "SMTPPort") : "smtpproxy", } pop_proxy = pop_proxy_port smtp_proxy = smtp_proxy_port results = [] for sect in c.sections(): if sect.startswith("Persona-") or sect == "Settings": if c.get(sect, "UsesIMAP") == "0": p = c.get(sect, "popaccount") c.set(sect, "popaccount", "%s@localhost" % \ (p[:p.index('@')],)) for (eud_name, eud_port), us_name in list(translate.items()): try: port = c.get(sect, eud_port) except configparser.NoOptionError: port = None if us_name.lower()[:4] == "pop3": if port is None: port = 110 pop_proxy = move_to_next_free_port(pop_proxy) proxy_port = pop_proxy else: if port is None: port = 25 smtp_proxy = move_to_next_free_port(smtp_proxy) proxy_port = smtp_proxy server = "%s:%s" % (c.get(sect, eud_name), port) options[us_name, "remote_servers"] += (server,) options[us_name, "listen_ports"] += (proxy_port,) results.append("[%s] Proxy %s on localhost:%s" % \ (sect, server, proxy_port)) c.set(sect, eud_name, "localhost") c.set(sect, eud_port, proxy_port) else: pass out = file(ini_filename, "w") c.write(out) out.close() options.update_file(optionsPathname) filter_filename = "%s%sFilters.pce" % (config_location, os.sep) spam_folder_name = "Junk" unsure_folder_name = "Possible Junk" header_name = options["Headers", "classification_header_name"] spam_tag = options["Headers", "header_spam_string"] unsure_tag = options["Headers", "header_unsure_string"] filter_rules = "rule SpamBayes-Spam\n" \ "transfer %s.mbx\n" \ "incoming\n" \ "header %s\n" \ "verb contains\n" \ "value %s\n" \ "conjunction ignore\n" \ "header \n" \ "verb contains\n" \ "value \n" \ "rule SpamBayes-Unsure\n" \ "transfer %s.mbx\n" \ "incoming\n" \ "header %s\n" \ "verb contains\n" \ "value %s\n" \ "conjunction ignore\n" \ "header \n" \ "verb contains\n" \ "value \n" % (spam_folder_name, header_name, spam_tag, unsure_folder_name, header_name, unsure_tag) filter_file = file(filter_filename, "a") filter_file.write(filter_rules) filter_file.close() return results