diff --git a/fetchmail-6.3.26.tar.xz b/fetchmail-6.3.26.tar.xz deleted file mode 100644 index 95e826b..0000000 --- a/fetchmail-6.3.26.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79b4c54cdbaf02c1a9a691d9948fcb1a77a1591a813e904283a8b614b757e850 -size 1283816 diff --git a/fetchmail-6.3.26.tar.xz.asc b/fetchmail-6.3.26.tar.xz.asc deleted file mode 100644 index 0f01f0f..0000000 --- a/fetchmail-6.3.26.tar.xz.asc +++ /dev/null @@ -1,7 +0,0 @@ ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.11 (GNU/Linux) - -iEYEABECAAYFAlF2/zAACgkQvmGDOQUufZU65ACgsCpaBSklzY/wF9lYX8xLeOPZ -KFAAniIj07N3WeMmWtOHUcmqbJjbl0QU -=3T6y ------END PGP SIGNATURE----- diff --git a/fetchmail-6.3.8-smtp_errors.patch b/fetchmail-6.3.8-smtp_errors.patch index 3985dcb..6f1dad7 100644 --- a/fetchmail-6.3.8-smtp_errors.patch +++ b/fetchmail-6.3.8-smtp_errors.patch @@ -6,11 +6,11 @@ # be considered that important. # 2) use the 501 error code to mark spam - in such a case # the 'antispam' option should be used -Index: fetchmail-6.3.10-beta1/sink.c +Index: fetchmail-6.4.1/sink.c =================================================================== ---- fetchmail-6.3.10-beta1.orig/sink.c 2009-05-25 17:55:07.000000000 +0200 -+++ fetchmail-6.3.10-beta1/sink.c 2009-06-01 14:37:12.000000000 +0200 -@@ -553,6 +553,19 @@ static int handle_smtp_report(struct que +--- fetchmail-6.4.1.orig/sink.c ++++ fetchmail-6.4.1/sink.c +@@ -536,6 +536,19 @@ static int handle_smtp_report(struct que free(responses[0]); return(PS_TRANSIENT); @@ -30,8 +30,8 @@ Index: fetchmail-6.3.10-beta1/sink.c default: /* bounce non-transient errors back to the sender */ if (smtperr >= 500 && smtperr <= 599) -@@ -622,7 +635,7 @@ static int handle_smtp_report_without_bo - #endif /* __DONT_FEED_THE_SPAMMERS__ */ +@@ -601,7 +614,7 @@ static int handle_smtp_report_without_bo + case 553: /* invalid sending domain */ return(PS_REFUSED); - default: diff --git a/fetchmail-6.4.1.tar.xz b/fetchmail-6.4.1.tar.xz new file mode 100644 index 0000000..fdba8ec --- /dev/null +++ b/fetchmail-6.4.1.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f33f11dd08c3e8cc3e9d18eec686b1626d4818f4d5a72791507bbc4dce6a9a0 +size 1257488 diff --git a/fetchmail-fetchmailconf-python3-1of3.patch b/fetchmail-fetchmailconf-python3-1of3.patch deleted file mode 100644 index c9f53a0..0000000 --- a/fetchmail-fetchmailconf-python3-1of3.patch +++ /dev/null @@ -1,3074 +0,0 @@ -From 2a23b1b8f3f8d73ba65f2109b0b496bc3d13f59a Mon Sep 17 00:00:00 2001 -From: Samuel Martin -Date: Wed, 8 Jun 2016 21:36:28 +0200 -Subject: [PATCH] fetchmailconf.py: fix tabs/spaces mixup preventing from compiling the pyc module - -This whitespace-only change substitutes all leading tabulations with -the right number of spaces to get the standard 4-space indentation. - -This bug was triggered by the Buildroot farms: - http://autobuild.buildroot.org/results/700/7009445dd116a1c02db82a351d38db44db8dad16/build-end.log - -Signed-off-by: Samuel Martin -Signed-off-by: Matthias Andree ---- - fetchmailconf.py | 2532 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - 1 file changed, 1266 insertions(+), 1266 deletions(-) - -diff --git a/fetchmailconf.py b/fetchmailconf.py -index 2dc02d8..d64556e 100755 ---- a/fetchmailconf.py -+++ b/fetchmailconf.py -@@ -16,416 +16,416 @@ import sys, time, os, string, socket, getopt, tempfile - # - class Configuration: - def __init__(self): -- self.poll_interval = 0 # Normally, run in foreground -- self.logfile = None # No logfile, initially -- self.idfile = os.environ["HOME"] + "/.fetchids" # Default idfile, initially -- self.postmaster = None # No last-resort address, initially -- self.bouncemail = TRUE # Bounce errors to users -- self.spambounce = FALSE # Bounce spam errors -- self.softbounce = TRUE # Treat permanent error as temporary -- self.properties = None # No exiguous properties -- self.invisible = FALSE # Suppress Received line & spoof? -- self.syslog = FALSE # Use syslogd for logging? -- self.servers = [] # List of included sites -- Configuration.typemap = ( -- ('poll_interval', 'Int'), -- ('logfile', 'String'), -- ('idfile', 'String'), -- ('postmaster', 'String'), -- ('bouncemail', 'Boolean'), -- ('spambounce', 'Boolean'), -- ('softbounce', 'Boolean'), -- ('properties', 'String'), -- ('syslog', 'Boolean'), -- ('invisible', 'Boolean')) -+ self.poll_interval = 0 # Normally, run in foreground -+ self.logfile = None # No logfile, initially -+ self.idfile = os.environ["HOME"] + "/.fetchids" # Default idfile, initially -+ self.postmaster = None # No last-resort address, initially -+ self.bouncemail = TRUE # Bounce errors to users -+ self.spambounce = FALSE # Bounce spam errors -+ self.softbounce = TRUE # Treat permanent error as temporary -+ self.properties = None # No exiguous properties -+ self.invisible = FALSE # Suppress Received line & spoof? -+ self.syslog = FALSE # Use syslogd for logging? -+ self.servers = [] # List of included sites -+ Configuration.typemap = ( -+ ('poll_interval', 'Int'), -+ ('logfile', 'String'), -+ ('idfile', 'String'), -+ ('postmaster', 'String'), -+ ('bouncemail', 'Boolean'), -+ ('spambounce', 'Boolean'), -+ ('softbounce', 'Boolean'), -+ ('properties', 'String'), -+ ('syslog', 'Boolean'), -+ ('invisible', 'Boolean')) - - def __repr__(self): -- str = ""; -- if self.syslog != ConfigurationDefaults.syslog: -- str = str + ("set syslog\n") -- elif self.logfile: -- str = str + ("set logfile \"%s\"\n" % (self.logfile,)); -- if self.idfile != ConfigurationDefaults.idfile: -- str = str + ("set idfile \"%s\"\n" % (self.idfile,)); -- if self.postmaster != ConfigurationDefaults.postmaster: -- str = str + ("set postmaster \"%s\"\n" % (self.postmaster,)); -- if self.bouncemail: -- str = str + ("set bouncemail\n") -- else: -- str = str + ("set nobouncemail\n") -- if self.spambounce: -- str = str + ("set spambounce\n") -- else: -- str = str + ("set no spambounce\n") -- if self.softbounce: -- str = str + ("set softbounce\n") -- else: -- str = str + ("set no softbounce\n") -- if self.properties != ConfigurationDefaults.properties: -- str = str + ("set properties \"%s\"\n" % (self.properties,)); -- if self.poll_interval > 0: -- str = str + "set daemon " + `self.poll_interval` + "\n" -- if self.invisible: -- str = str + ("set invisible\n") -- for site in self.servers: -- str = str + repr(site) -- return str -+ str = ""; -+ if self.syslog != ConfigurationDefaults.syslog: -+ str = str + ("set syslog\n") -+ elif self.logfile: -+ str = str + ("set logfile \"%s\"\n" % (self.logfile,)); -+ if self.idfile != ConfigurationDefaults.idfile: -+ str = str + ("set idfile \"%s\"\n" % (self.idfile,)); -+ if self.postmaster != ConfigurationDefaults.postmaster: -+ str = str + ("set postmaster \"%s\"\n" % (self.postmaster,)); -+ if self.bouncemail: -+ str = str + ("set bouncemail\n") -+ else: -+ str = str + ("set nobouncemail\n") -+ if self.spambounce: -+ str = str + ("set spambounce\n") -+ else: -+ str = str + ("set no spambounce\n") -+ if self.softbounce: -+ str = str + ("set softbounce\n") -+ else: -+ str = str + ("set no softbounce\n") -+ if self.properties != ConfigurationDefaults.properties: -+ str = str + ("set properties \"%s\"\n" % (self.properties,)); -+ if self.poll_interval > 0: -+ str = str + "set daemon " + `self.poll_interval` + "\n" -+ if self.invisible: -+ str = str + ("set invisible\n") -+ for site in self.servers: -+ str = str + repr(site) -+ return str - - def __delitem__(self, name): -- for si in range(len(self.servers)): -- if self.servers[si].pollname == name: -- del self.servers[si] -- break -+ for si in range(len(self.servers)): -+ if self.servers[si].pollname == name: -+ del self.servers[si] -+ break - - def __str__(self): -- return "[Configuration: " + repr(self) + "]" -+ return "[Configuration: " + repr(self) + "]" - - class Server: - def __init__(self): -- self.pollname = None # Poll label -- self.via = None # True name of host -- self.active = TRUE # Poll status -- self.interval = 0 # Skip interval -- self.protocol = 'auto' # Default to auto protocol -- self.service = None # Service name to use -- self.uidl = FALSE # Don't use RFC1725 UIDLs by default -- self.auth = 'any' # Default to password authentication -- self.timeout = 300 # 5-minute timeout -- self.envelope = 'Received' # Envelope-address header -- self.envskip = 0 # Number of envelope headers to skip -- self.qvirtual = None # Name prefix to strip -- self.aka = [] # List of DNS aka names -- self.dns = TRUE # Enable DNS lookup on multidrop -- self.localdomains = [] # Domains to be considered local -- self.interface = None # IP address and range -- self.monitor = None # IP address and range -- self.plugin = None # Plugin command for going to server -- self.plugout = None # Plugin command for going to listener -- self.principal = None # Kerberos principal -- self.esmtpname = None # ESMTP 2554 name -- self.esmtppassword = None # ESMTP 2554 password -- self.tracepolls = FALSE # Add trace-poll info to headers -- self.badheader = FALSE # Pass messages with bad headers on? -- self.users = [] # List of user entries for site -- Server.typemap = ( -- ('pollname', 'String'), -- ('via', 'String'), -- ('active', 'Boolean'), -- ('interval', 'Int'), -- ('protocol', 'String'), -- ('service', 'String'), -- ('uidl', 'Boolean'), -- ('auth', 'String'), -- ('timeout', 'Int'), -- ('envelope', 'String'), -- ('envskip', 'Int'), -- ('qvirtual', 'String'), -- # leave aka out -- ('dns', 'Boolean'), -- # leave localdomains out -- ('interface', 'String'), -- ('monitor', 'String'), -- ('plugin', 'String'), -- ('plugout', 'String'), -- ('esmtpname', 'String'), -- ('esmtppassword', 'String'), -- ('principal', 'String'), -- ('tracepolls','Boolean'), -- ('badheader', 'Boolean')) -+ self.pollname = None # Poll label -+ self.via = None # True name of host -+ self.active = TRUE # Poll status -+ self.interval = 0 # Skip interval -+ self.protocol = 'auto' # Default to auto protocol -+ self.service = None # Service name to use -+ self.uidl = FALSE # Don't use RFC1725 UIDLs by default -+ self.auth = 'any' # Default to password authentication -+ self.timeout = 300 # 5-minute timeout -+ self.envelope = 'Received' # Envelope-address header -+ self.envskip = 0 # Number of envelope headers to skip -+ self.qvirtual = None # Name prefix to strip -+ self.aka = [] # List of DNS aka names -+ self.dns = TRUE # Enable DNS lookup on multidrop -+ self.localdomains = [] # Domains to be considered local -+ self.interface = None # IP address and range -+ self.monitor = None # IP address and range -+ self.plugin = None # Plugin command for going to server -+ self.plugout = None # Plugin command for going to listener -+ self.principal = None # Kerberos principal -+ self.esmtpname = None # ESMTP 2554 name -+ self.esmtppassword = None # ESMTP 2554 password -+ self.tracepolls = FALSE # Add trace-poll info to headers -+ self.badheader = FALSE # Pass messages with bad headers on? -+ self.users = [] # List of user entries for site -+ Server.typemap = ( -+ ('pollname', 'String'), -+ ('via', 'String'), -+ ('active', 'Boolean'), -+ ('interval', 'Int'), -+ ('protocol', 'String'), -+ ('service', 'String'), -+ ('uidl', 'Boolean'), -+ ('auth', 'String'), -+ ('timeout', 'Int'), -+ ('envelope', 'String'), -+ ('envskip', 'Int'), -+ ('qvirtual', 'String'), -+ # leave aka out -+ ('dns', 'Boolean'), -+ # leave localdomains out -+ ('interface', 'String'), -+ ('monitor', 'String'), -+ ('plugin', 'String'), -+ ('plugout', 'String'), -+ ('esmtpname', 'String'), -+ ('esmtppassword', 'String'), -+ ('principal', 'String'), -+ ('tracepolls','Boolean'), -+ ('badheader', 'Boolean')) - - def dump(self, folded): -- res = "" -- if self.active: res = res + "poll" -- else: res = res + "skip" -- res = res + (" " + self.pollname) -- if self.via: -- res = res + (" via " + str(self.via) + "\n"); -- if self.protocol != ServerDefaults.protocol: -- res = res + " with proto " + self.protocol -- if self.service and self.protocol and self.service != defaultports[self.protocol] and defaultports[self.protocol] and self.service != ianaservices[defaultports[self.protocol]]: -- res = res + " service " + self.service -- if self.timeout != ServerDefaults.timeout: -- res = res + " timeout " + `self.timeout` -- if self.interval != ServerDefaults.interval: -- res = res + " interval " + `self.interval` -- if self.envelope != ServerDefaults.envelope or self.envskip != ServerDefaults.envskip: -- if self.envskip: -- res = res + " envelope " + `self.envskip` + " " + self.envelope -- else: -- res = res + " envelope " + self.envelope -- if self.qvirtual: -- res = res + (" qvirtual " + str(self.qvirtual) + "\n"); -- if self.auth != ServerDefaults.auth: -- res = res + " auth " + self.auth -- if self.dns != ServerDefaults.dns or self.uidl != ServerDefaults.uidl: -- res = res + " and options" -- if self.dns != ServerDefaults.dns: -- res = res + flag2str(self.dns, 'dns') -- if self.uidl != ServerDefaults.uidl: -- res = res + flag2str(self.uidl, 'uidl') -- if folded: res = res + "\n " -- else: res = res + " " -- -- if self.aka: -- res = res + "aka" -- for x in self.aka: -- res = res + " " + x -- if self.aka and self.localdomains: res = res + " " -- if self.localdomains: -- res = res + ("localdomains") -- for x in self.localdomains: -- res = res + " " + x -- if (self.aka or self.localdomains): -- if folded: -- res = res + "\n " -- else: -- res = res + " " -- -- if self.tracepolls: -- res = res + "tracepolls\n" -- -- if self.interface: -- res = res + " interface " + str(self.interface) -- if self.monitor: -- res = res + " monitor " + str(self.monitor) -- if self.plugin: -- res = res + " plugin " + `self.plugin` -- if self.plugout: -- res = res + " plugout " + `self.plugout` -- if self.principal: -- res = res + " principal " + `self.principal` -- if self.esmtpname: -- res = res + " esmtpname " + `self.esmtpname` -- if self.esmtppassword: -- res = res + " esmtppassword " + `self.esmtppassword` -- if self.interface or self.monitor or self.principal or self.plugin or self.plugout: -- if folded: -- res = res + "\n" -- if self.badheader: -- res = res + "bad-header accept " -- -- if res[-1] == " ": res = res[0:-1] -- -- for user in self.users: -- res = res + repr(user) -- res = res + "\n" -- return res; -+ res = "" -+ if self.active: res = res + "poll" -+ else: res = res + "skip" -+ res = res + (" " + self.pollname) -+ if self.via: -+ res = res + (" via " + str(self.via) + "\n"); -+ if self.protocol != ServerDefaults.protocol: -+ res = res + " with proto " + self.protocol -+ if self.service and self.protocol and self.service != defaultports[self.protocol] and defaultports[self.protocol] and self.service != ianaservices[defaultports[self.protocol]]: -+ res = res + " service " + self.service -+ if self.timeout != ServerDefaults.timeout: -+ res = res + " timeout " + `self.timeout` -+ if self.interval != ServerDefaults.interval: -+ res = res + " interval " + `self.interval` -+ if self.envelope != ServerDefaults.envelope or self.envskip != ServerDefaults.envskip: -+ if self.envskip: -+ res = res + " envelope " + `self.envskip` + " " + self.envelope -+ else: -+ res = res + " envelope " + self.envelope -+ if self.qvirtual: -+ res = res + (" qvirtual " + str(self.qvirtual) + "\n"); -+ if self.auth != ServerDefaults.auth: -+ res = res + " auth " + self.auth -+ if self.dns != ServerDefaults.dns or self.uidl != ServerDefaults.uidl: -+ res = res + " and options" -+ if self.dns != ServerDefaults.dns: -+ res = res + flag2str(self.dns, 'dns') -+ if self.uidl != ServerDefaults.uidl: -+ res = res + flag2str(self.uidl, 'uidl') -+ if folded: res = res + "\n " -+ else: res = res + " " -+ -+ if self.aka: -+ res = res + "aka" -+ for x in self.aka: -+ res = res + " " + x -+ if self.aka and self.localdomains: res = res + " " -+ if self.localdomains: -+ res = res + ("localdomains") -+ for x in self.localdomains: -+ res = res + " " + x -+ if (self.aka or self.localdomains): -+ if folded: -+ res = res + "\n " -+ else: -+ res = res + " " -+ -+ if self.tracepolls: -+ res = res + "tracepolls\n" -+ -+ if self.interface: -+ res = res + " interface " + str(self.interface) -+ if self.monitor: -+ res = res + " monitor " + str(self.monitor) -+ if self.plugin: -+ res = res + " plugin " + `self.plugin` -+ if self.plugout: -+ res = res + " plugout " + `self.plugout` -+ if self.principal: -+ res = res + " principal " + `self.principal` -+ if self.esmtpname: -+ res = res + " esmtpname " + `self.esmtpname` -+ if self.esmtppassword: -+ res = res + " esmtppassword " + `self.esmtppassword` -+ if self.interface or self.monitor or self.principal or self.plugin or self.plugout: -+ if folded: -+ res = res + "\n" -+ if self.badheader: -+ res = res + "bad-header accept " -+ -+ if res[-1] == " ": res = res[0:-1] -+ -+ for user in self.users: -+ res = res + repr(user) -+ res = res + "\n" -+ return res; - - def __delitem__(self, name): -- for ui in range(len(self.users)): -- if self.users[ui].remote == name: -- del self.users[ui] -- break -+ for ui in range(len(self.users)): -+ if self.users[ui].remote == name: -+ del self.users[ui] -+ break - - def __repr__(self): -- return self.dump(TRUE) -+ return self.dump(TRUE) - - def __str__(self): -- return "[Server: " + self.dump(FALSE) + "]" -+ return "[Server: " + self.dump(FALSE) + "]" - - class User: - def __init__(self): -- if os.environ.has_key("USER"): -- self.remote = os.environ["USER"] # Remote username -- elif os.environ.has_key("LOGNAME"): -- self.remote = os.environ["LOGNAME"] -- else: -- print "Can't get your username!" -- sys.exit(1) -- self.localnames = [self.remote,]# Local names -- self.password = None # Password for mail account access -- self.mailboxes = [] # Remote folders to retrieve from -- self.smtphunt = [] # Hosts to forward to -- self.fetchdomains = [] # Domains to fetch from -- self.smtpaddress = None # Append this to MAIL FROM line -- self.smtpname = None # Use this for RCPT TO -- self.preconnect = None # Connection setup -- self.postconnect = None # Connection wrapup -- self.mda = None # Mail Delivery Agent -- self.bsmtp = None # BSMTP output file -- self.lmtp = FALSE # Use LMTP rather than SMTP? -- self.antispam = "" # Listener's spam-block code -- self.keep = FALSE # Keep messages -- self.flush = FALSE # Flush messages -- self.limitflush = FALSE # Flush oversized messages -- self.fetchall = FALSE # Fetch old messages -- self.rewrite = TRUE # Rewrite message headers -- self.forcecr = FALSE # Force LF -> CR/LF -- self.stripcr = FALSE # Strip CR -- self.pass8bits = FALSE # Force BODY=7BIT -- self.mimedecode = FALSE # Undo MIME armoring -- self.dropstatus = FALSE # Drop incoming Status lines -- self.dropdelivered = FALSE # Drop incoming Delivered-To lines -- self.idle = FALSE # IDLE after poll -- self.limit = 0 # Message size limit -- self.warnings = 3600 # Size warning interval (see tunable.h) -- self.fetchlimit = 0 # Max messages fetched per batch -- self.fetchsizelimit = 100 # Max message sizes fetched per transaction -- self.fastuidl = 4 # Do fast uidl 3 out of 4 times -- self.batchlimit = 0 # Max message forwarded per batch -- self.expunge = 0 # Interval between expunges (IMAP) -- self.ssl = 0 # Enable Seccure Socket Layer -- self.sslkey = None # SSL key filename -- self.sslcert = None # SSL certificate filename -- self.sslproto = None # Force SSL? -- self.sslcertck = 0 # Enable strict SSL cert checking -- self.sslcertpath = None # Path to trusted certificates -- self.sslcommonname = None # SSL CommonName to expect -- self.sslfingerprint = None # SSL key fingerprint to check -- self.properties = None # Extension properties -- User.typemap = ( -- ('remote', 'String'), -- # leave out mailboxes and localnames -- ('password', 'String'), -- # Leave out smtphunt, fetchdomains -- ('smtpaddress', 'String'), -- ('smtpname', 'String'), -- ('preconnect', 'String'), -- ('postconnect', 'String'), -- ('mda', 'String'), -- ('bsmtp', 'String'), -- ('lmtp', 'Boolean'), -- ('antispam', 'String'), -- ('keep', 'Boolean'), -- ('flush', 'Boolean'), -- ('limitflush', 'Boolean'), -- ('fetchall', 'Boolean'), -- ('rewrite', 'Boolean'), -- ('forcecr', 'Boolean'), -- ('stripcr', 'Boolean'), -- ('pass8bits', 'Boolean'), -- ('mimedecode', 'Boolean'), -- ('dropstatus', 'Boolean'), -- ('dropdelivered', 'Boolean'), -- ('idle', 'Boolean'), -- ('limit', 'Int'), -- ('warnings', 'Int'), -- ('fetchlimit', 'Int'), -- ('fetchsizelimit', 'Int'), -- ('fastuidl', 'Int'), -- ('batchlimit', 'Int'), -- ('expunge', 'Int'), -- ('ssl', 'Boolean'), -- ('sslkey', 'String'), -- ('sslcert', 'String'), -- ('sslcertck', 'Boolean'), -- ('sslcertpath', 'String'), -- ('sslcommonname', 'String'), -- ('sslfingerprint', 'String'), -- ('properties', 'String')) -+ if os.environ.has_key("USER"): -+ self.remote = os.environ["USER"] # Remote username -+ elif os.environ.has_key("LOGNAME"): -+ self.remote = os.environ["LOGNAME"] -+ else: -+ print "Can't get your username!" -+ sys.exit(1) -+ self.localnames = [self.remote,]# Local names -+ self.password = None # Password for mail account access -+ self.mailboxes = [] # Remote folders to retrieve from -+ self.smtphunt = [] # Hosts to forward to -+ self.fetchdomains = [] # Domains to fetch from -+ self.smtpaddress = None # Append this to MAIL FROM line -+ self.smtpname = None # Use this for RCPT TO -+ self.preconnect = None # Connection setup -+ self.postconnect = None # Connection wrapup -+ self.mda = None # Mail Delivery Agent -+ self.bsmtp = None # BSMTP output file -+ self.lmtp = FALSE # Use LMTP rather than SMTP? -+ self.antispam = "" # Listener's spam-block code -+ self.keep = FALSE # Keep messages -+ self.flush = FALSE # Flush messages -+ self.limitflush = FALSE # Flush oversized messages -+ self.fetchall = FALSE # Fetch old messages -+ self.rewrite = TRUE # Rewrite message headers -+ self.forcecr = FALSE # Force LF -> CR/LF -+ self.stripcr = FALSE # Strip CR -+ self.pass8bits = FALSE # Force BODY=7BIT -+ self.mimedecode = FALSE # Undo MIME armoring -+ self.dropstatus = FALSE # Drop incoming Status lines -+ self.dropdelivered = FALSE # Drop incoming Delivered-To lines -+ self.idle = FALSE # IDLE after poll -+ self.limit = 0 # Message size limit -+ self.warnings = 3600 # Size warning interval (see tunable.h) -+ self.fetchlimit = 0 # Max messages fetched per batch -+ self.fetchsizelimit = 100 # Max message sizes fetched per transaction -+ self.fastuidl = 4 # Do fast uidl 3 out of 4 times -+ self.batchlimit = 0 # Max message forwarded per batch -+ self.expunge = 0 # Interval between expunges (IMAP) -+ self.ssl = 0 # Enable Seccure Socket Layer -+ self.sslkey = None # SSL key filename -+ self.sslcert = None # SSL certificate filename -+ self.sslproto = None # Force SSL? -+ self.sslcertck = 0 # Enable strict SSL cert checking -+ self.sslcertpath = None # Path to trusted certificates -+ self.sslcommonname = None # SSL CommonName to expect -+ self.sslfingerprint = None # SSL key fingerprint to check -+ self.properties = None # Extension properties -+ User.typemap = ( -+ ('remote', 'String'), -+ # leave out mailboxes and localnames -+ ('password', 'String'), -+ # Leave out smtphunt, fetchdomains -+ ('smtpaddress', 'String'), -+ ('smtpname', 'String'), -+ ('preconnect', 'String'), -+ ('postconnect', 'String'), -+ ('mda', 'String'), -+ ('bsmtp', 'String'), -+ ('lmtp', 'Boolean'), -+ ('antispam', 'String'), -+ ('keep', 'Boolean'), -+ ('flush', 'Boolean'), -+ ('limitflush', 'Boolean'), -+ ('fetchall', 'Boolean'), -+ ('rewrite', 'Boolean'), -+ ('forcecr', 'Boolean'), -+ ('stripcr', 'Boolean'), -+ ('pass8bits', 'Boolean'), -+ ('mimedecode', 'Boolean'), -+ ('dropstatus', 'Boolean'), -+ ('dropdelivered', 'Boolean'), -+ ('idle', 'Boolean'), -+ ('limit', 'Int'), -+ ('warnings', 'Int'), -+ ('fetchlimit', 'Int'), -+ ('fetchsizelimit', 'Int'), -+ ('fastuidl', 'Int'), -+ ('batchlimit', 'Int'), -+ ('expunge', 'Int'), -+ ('ssl', 'Boolean'), -+ ('sslkey', 'String'), -+ ('sslcert', 'String'), -+ ('sslcertck', 'Boolean'), -+ ('sslcertpath', 'String'), -+ ('sslcommonname', 'String'), -+ ('sslfingerprint', 'String'), -+ ('properties', 'String')) - - def __repr__(self): -- res = " " -- res = res + "user " + `self.remote` + " there "; -- if self.password: -- res = res + "with password " + `self.password` + " " -- if self.localnames: -- res = res + "is" -- for x in self.localnames: -- res = res + " " + `x` -- res = res + " here" -- if (self.keep != UserDefaults.keep -- or self.flush != UserDefaults.flush -- or self.limitflush != UserDefaults.limitflush -- or self.fetchall != UserDefaults.fetchall -- or self.rewrite != UserDefaults.rewrite -- or self.forcecr != UserDefaults.forcecr -- or self.stripcr != UserDefaults.stripcr -- or self.pass8bits != UserDefaults.pass8bits -- or self.mimedecode != UserDefaults.mimedecode -- or self.dropstatus != UserDefaults.dropstatus -- or self.dropdelivered != UserDefaults.dropdelivered -- or self.idle != UserDefaults.idle): -- res = res + " options" -- if self.keep != UserDefaults.keep: -- res = res + flag2str(self.keep, 'keep') -- if self.flush != UserDefaults.flush: -- res = res + flag2str(self.flush, 'flush') -- if self.limitflush != UserDefaults.limitflush: -- res = res + flag2str(self.limitflush, 'limitflush') -- if self.fetchall != UserDefaults.fetchall: -- res = res + flag2str(self.fetchall, 'fetchall') -- if self.rewrite != UserDefaults.rewrite: -- res = res + flag2str(self.rewrite, 'rewrite') -- if self.forcecr != UserDefaults.forcecr: -- res = res + flag2str(self.forcecr, 'forcecr') -- if self.stripcr != UserDefaults.stripcr: -- res = res + flag2str(self.stripcr, 'stripcr') -- if self.pass8bits != UserDefaults.pass8bits: -- res = res + flag2str(self.pass8bits, 'pass8bits') -- if self.mimedecode != UserDefaults.mimedecode: -- res = res + flag2str(self.mimedecode, 'mimedecode') -- if self.dropstatus != UserDefaults.dropstatus: -- res = res + flag2str(self.dropstatus, 'dropstatus') -- if self.dropdelivered != UserDefaults.dropdelivered: -- res = res + flag2str(self.dropdelivered, 'dropdelivered') -- if self.idle != UserDefaults.idle: -- res = res + flag2str(self.idle, 'idle') -- if self.limit != UserDefaults.limit: -- res = res + " limit " + `self.limit` -- if self.warnings != UserDefaults.warnings: -- res = res + " warnings " + `self.warnings` -- if self.fetchlimit != UserDefaults.fetchlimit: -- res = res + " fetchlimit " + `self.fetchlimit` -- if self.fetchsizelimit != UserDefaults.fetchsizelimit: -- res = res + " fetchsizelimit " + `self.fetchsizelimit` -- if self.fastuidl != UserDefaults.fastuidl: -- res = res + " fastuidl " + `self.fastuidl` -- if self.batchlimit != UserDefaults.batchlimit: -- res = res + " batchlimit " + `self.batchlimit` -- if self.ssl and self.ssl != UserDefaults.ssl: -- res = res + flag2str(self.ssl, 'ssl') -- if self.sslkey and self.sslkey != UserDefaults.sslkey: -- res = res + " sslkey " + `self.sslkey` -- if self.sslcert and self.sslcert != UserDefaults.sslcert: -- res = res + " sslcert " + `self.sslcert` -- if self.sslproto and self.sslproto != UserDefaults.sslproto: -- res = res + " sslproto " + `self.sslproto` -- if self.sslcertck and self.sslcertck != UserDefaults.sslcertck: -- res = res + flag2str(self.sslcertck, 'sslcertck') -- if self.sslcertpath and self.sslcertpath != UserDefaults.sslcertpath: -- res = res + " sslcertpath " + `self.sslcertpath` -- if self.sslcommonname and self.sslcommonname != UserDefaults.sslcommonname: -- res = res + " sslcommonname " + `self.sslcommonname` -- if self.sslfingerprint and self.sslfingerprint != UserDefaults.sslfingerprint: -- res = res + " sslfingerprint " + `self.sslfingerprint` -- if self.expunge != UserDefaults.expunge: -- res = res + " expunge " + `self.expunge` -- res = res + "\n" -- trimmed = self.smtphunt; -- if trimmed != [] and trimmed[len(trimmed) - 1] == "localhost": -- trimmed = trimmed[0:len(trimmed) - 1] -- if trimmed != [] and trimmed[len(trimmed) - 1] == hostname: -- trimmed = trimmed[0:len(trimmed) - 1] -- if trimmed != []: -- res = res + " smtphost " -- for x in trimmed: -- res = res + " " + x -- res = res + "\n" -- trimmed = self.fetchdomains -- if trimmed != [] and trimmed[len(trimmed) - 1] == hostname: -- trimmed = trimmed[0:len(trimmed) - 1] -- if trimmed != []: -- res = res + " fetchdomains " -- for x in trimmed: -- res = res + " " + x -- res = res + "\n" -- if self.mailboxes: -- res = res + " folder" -- for x in self.mailboxes: -- res = res + ' "%s"' % x -- res = res + "\n" -- for fld in ('smtpaddress', 'preconnect', 'postconnect', 'mda', 'bsmtp', 'properties'): -- if getattr(self, fld): -- res = res + " %s %s\n" % (fld, `getattr(self, fld)`) -- if self.lmtp != UserDefaults.lmtp: -- res = res + flag2str(self.lmtp, 'lmtp') -- if self.antispam != UserDefaults.antispam: -- res = res + " antispam " + self.antispam + "\n" -- return res; -+ res = " " -+ res = res + "user " + `self.remote` + " there "; -+ if self.password: -+ res = res + "with password " + `self.password` + " " -+ if self.localnames: -+ res = res + "is" -+ for x in self.localnames: -+ res = res + " " + `x` -+ res = res + " here" -+ if (self.keep != UserDefaults.keep -+ or self.flush != UserDefaults.flush -+ or self.limitflush != UserDefaults.limitflush -+ or self.fetchall != UserDefaults.fetchall -+ or self.rewrite != UserDefaults.rewrite -+ or self.forcecr != UserDefaults.forcecr -+ or self.stripcr != UserDefaults.stripcr -+ or self.pass8bits != UserDefaults.pass8bits -+ or self.mimedecode != UserDefaults.mimedecode -+ or self.dropstatus != UserDefaults.dropstatus -+ or self.dropdelivered != UserDefaults.dropdelivered -+ or self.idle != UserDefaults.idle): -+ res = res + " options" -+ if self.keep != UserDefaults.keep: -+ res = res + flag2str(self.keep, 'keep') -+ if self.flush != UserDefaults.flush: -+ res = res + flag2str(self.flush, 'flush') -+ if self.limitflush != UserDefaults.limitflush: -+ res = res + flag2str(self.limitflush, 'limitflush') -+ if self.fetchall != UserDefaults.fetchall: -+ res = res + flag2str(self.fetchall, 'fetchall') -+ if self.rewrite != UserDefaults.rewrite: -+ res = res + flag2str(self.rewrite, 'rewrite') -+ if self.forcecr != UserDefaults.forcecr: -+ res = res + flag2str(self.forcecr, 'forcecr') -+ if self.stripcr != UserDefaults.stripcr: -+ res = res + flag2str(self.stripcr, 'stripcr') -+ if self.pass8bits != UserDefaults.pass8bits: -+ res = res + flag2str(self.pass8bits, 'pass8bits') -+ if self.mimedecode != UserDefaults.mimedecode: -+ res = res + flag2str(self.mimedecode, 'mimedecode') -+ if self.dropstatus != UserDefaults.dropstatus: -+ res = res + flag2str(self.dropstatus, 'dropstatus') -+ if self.dropdelivered != UserDefaults.dropdelivered: -+ res = res + flag2str(self.dropdelivered, 'dropdelivered') -+ if self.idle != UserDefaults.idle: -+ res = res + flag2str(self.idle, 'idle') -+ if self.limit != UserDefaults.limit: -+ res = res + " limit " + `self.limit` -+ if self.warnings != UserDefaults.warnings: -+ res = res + " warnings " + `self.warnings` -+ if self.fetchlimit != UserDefaults.fetchlimit: -+ res = res + " fetchlimit " + `self.fetchlimit` -+ if self.fetchsizelimit != UserDefaults.fetchsizelimit: -+ res = res + " fetchsizelimit " + `self.fetchsizelimit` -+ if self.fastuidl != UserDefaults.fastuidl: -+ res = res + " fastuidl " + `self.fastuidl` -+ if self.batchlimit != UserDefaults.batchlimit: -+ res = res + " batchlimit " + `self.batchlimit` -+ if self.ssl and self.ssl != UserDefaults.ssl: -+ res = res + flag2str(self.ssl, 'ssl') -+ if self.sslkey and self.sslkey != UserDefaults.sslkey: -+ res = res + " sslkey " + `self.sslkey` -+ if self.sslcert and self.sslcert != UserDefaults.sslcert: -+ res = res + " sslcert " + `self.sslcert` -+ if self.sslproto and self.sslproto != UserDefaults.sslproto: -+ res = res + " sslproto " + `self.sslproto` -+ if self.sslcertck and self.sslcertck != UserDefaults.sslcertck: -+ res = res + flag2str(self.sslcertck, 'sslcertck') -+ if self.sslcertpath and self.sslcertpath != UserDefaults.sslcertpath: -+ res = res + " sslcertpath " + `self.sslcertpath` -+ if self.sslcommonname and self.sslcommonname != UserDefaults.sslcommonname: -+ res = res + " sslcommonname " + `self.sslcommonname` -+ if self.sslfingerprint and self.sslfingerprint != UserDefaults.sslfingerprint: -+ res = res + " sslfingerprint " + `self.sslfingerprint` -+ if self.expunge != UserDefaults.expunge: -+ res = res + " expunge " + `self.expunge` -+ res = res + "\n" -+ trimmed = self.smtphunt; -+ if trimmed != [] and trimmed[len(trimmed) - 1] == "localhost": -+ trimmed = trimmed[0:len(trimmed) - 1] -+ if trimmed != [] and trimmed[len(trimmed) - 1] == hostname: -+ trimmed = trimmed[0:len(trimmed) - 1] -+ if trimmed != []: -+ res = res + " smtphost " -+ for x in trimmed: -+ res = res + " " + x -+ res = res + "\n" -+ trimmed = self.fetchdomains -+ if trimmed != [] and trimmed[len(trimmed) - 1] == hostname: -+ trimmed = trimmed[0:len(trimmed) - 1] -+ if trimmed != []: -+ res = res + " fetchdomains " -+ for x in trimmed: -+ res = res + " " + x -+ res = res + "\n" -+ if self.mailboxes: -+ res = res + " folder" -+ for x in self.mailboxes: -+ res = res + ' "%s"' % x -+ res = res + "\n" -+ for fld in ('smtpaddress', 'preconnect', 'postconnect', 'mda', 'bsmtp', 'properties'): -+ if getattr(self, fld): -+ res = res + " %s %s\n" % (fld, `getattr(self, fld)`) -+ if self.lmtp != UserDefaults.lmtp: -+ res = res + flag2str(self.lmtp, 'lmtp') -+ if self.antispam != UserDefaults.antispam: -+ res = res + " antispam " + self.antispam + "\n" -+ return res; - - def __str__(self): -- return "[User: " + repr(self) + "]" -+ return "[User: " + repr(self) + "]" - - # - # Helper code -@@ -433,24 +433,24 @@ class User: - - # IANA port assignments and bogus 1109 entry - ianaservices = {"pop2":109, -- "pop3":110, -- "1109":1109, -- "imap":143, -- "smtp":25, -- "odmr":366} -+ "pop3":110, -+ "1109":1109, -+ "imap":143, -+ "smtp":25, -+ "odmr":366} - - # fetchmail protocol to IANA service name - defaultports = {"auto":None, -- "POP2":"pop2", -- "POP3":"pop3", -- "APOP":"pop3", -- "KPOP":"1109", -- "IMAP":"imap", -- "ETRN":"smtp", -- "ODMR":"odmr"} -+ "POP2":"pop2", -+ "POP3":"pop3", -+ "APOP":"pop3", -+ "KPOP":"1109", -+ "IMAP":"imap", -+ "ETRN":"smtp", -+ "ODMR":"odmr"} - - authlist = ("any", "password", "gssapi", "kerberos", "ssh", "otp", -- "msn", "ntlm") -+ "msn", "ntlm") - - listboxhelp = { - 'title' : 'List Selection Help', -@@ -463,23 +463,23 @@ def flag2str(value, string): - # make a string representation of a .fetchmailrc flag or negated flag - str = "" - if value != None: -- str = str + (" ") -- if value == FALSE: str = str + ("no ") -- str = str + string; -+ str = str + (" ") -+ if value == FALSE: str = str + ("no ") -+ str = str + string; - return str - - class LabeledEntry(Frame): - # widget consisting of entry field with caption to left - def bind(self, key, action): -- self.E.bind(key, action) -+ self.E.bind(key, action) - def focus_set(self): -- self.E.focus_set() -+ self.E.focus_set() - def __init__(self, Master, text, textvar, lwidth, ewidth=12): -- Frame.__init__(self, Master) -- self.L = Label(self, {'text':text, 'width':lwidth, 'anchor':'w'}) -- self.E = Entry(self, {'textvar':textvar, 'width':ewidth}) -- self.L.pack({'side':'left'}) -- self.E.pack({'side':'left', 'expand':'1', 'fill':'x'}) -+ Frame.__init__(self, Master) -+ self.L = Label(self, {'text':text, 'width':lwidth, 'anchor':'w'}) -+ self.E = Entry(self, {'textvar':textvar, 'width':ewidth}) -+ self.L.pack({'side':'left'}) -+ self.E.pack({'side':'left', 'expand':'1', 'fill':'x'}) - - def ButtonBar(frame, legend, ref, alternatives, depth, command): - # array of radio buttons, caption to left, picking from a string list -@@ -487,20 +487,20 @@ def ButtonBar(frame, legend, ref, alternatives, depth, command): - width = (len(alternatives)+1) / depth; - Label(bar, text=legend).pack(side=LEFT) - for column in range(width): -- subframe = Frame(bar) -- for row in range(depth): -- ind = width * row + column -- if ind < len(alternatives): -- Radiobutton(subframe, -- {'text':alternatives[ind], -- 'variable':ref, -- 'value':alternatives[ind], -- 'command':command}).pack(side=TOP, anchor=W) -- else: -- # This is just a spacer -- Radiobutton(subframe, -- {'text':" ",'state':DISABLED}).pack(side=TOP, anchor=W) -- subframe.pack(side=LEFT) -+ subframe = Frame(bar) -+ for row in range(depth): -+ ind = width * row + column -+ if ind < len(alternatives): -+ Radiobutton(subframe, -+ {'text':alternatives[ind], -+ 'variable':ref, -+ 'value':alternatives[ind], -+ 'command':command}).pack(side=TOP, anchor=W) -+ else: -+ # This is just a spacer -+ Radiobutton(subframe, -+ {'text':" ",'state':DISABLED}).pack(side=TOP, anchor=W) -+ subframe.pack(side=LEFT) - bar.pack(side=TOP); - return bar - -@@ -520,142 +520,142 @@ def helpwin(helpdict): - scroll.pack(side=RIGHT, fill=BOTH) - helpwin.textwidget.insert(END, helpdict['text']); - Button(helpwin, text='Done', -- command=lambda x=helpwin: x.destroy(), bd=2).pack() -+ command=lambda x=helpwin: x.destroy(), bd=2).pack() - textframe.pack(side=TOP) - - def make_icon_window(base, image): - try: -- # Some older pythons will error out on this -- icon_image = PhotoImage(data=image) -- icon_window = Toplevel() -- Label(icon_window, image=icon_image, bg='black').pack() -- base.master.iconwindow(icon_window) -- # Avoid TkInter brain death. PhotoImage objects go out of -- # scope when the enclosing function returns. Therefore -- # we have to explicitly link them to something. -- base.keepalive.append(icon_image) -+ # Some older pythons will error out on this -+ icon_image = PhotoImage(data=image) -+ icon_window = Toplevel() -+ Label(icon_window, image=icon_image, bg='black').pack() -+ base.master.iconwindow(icon_window) -+ # Avoid TkInter brain death. PhotoImage objects go out of -+ # scope when the enclosing function returns. Therefore -+ # we have to explicitly link them to something. -+ base.keepalive.append(icon_image) - except: -- pass -+ pass - - class ListEdit(Frame): - # edit a list of values (duplicates not allowed) with a supplied editor hook - def __init__(self, newlegend, list, editor, deletor, master, helptxt): -- self.editor = editor -- self.deletor = deletor -- self.list = list -- -- # Set up a widget to accept new elements -- self.newval = StringVar(master) -- newwin = LabeledEntry(master, newlegend, self.newval, '12') -- newwin.bind('', self.handleNew) -- newwin.bind('', self.handleNew) -- newwin.pack(side=TOP, fill=X, anchor=E) -- -- # Edit the existing list -- listframe = Frame(master) -- scroll = Scrollbar(listframe) -- self.listwidget = Listbox(listframe, height=0, selectmode='browse') -- if self.list: -- for x in self.list: -- self.listwidget.insert(END, x) -- listframe.pack(side=TOP, expand=YES, fill=BOTH) -- self.listwidget.config(yscrollcommand=scroll.set) -- self.listwidget.pack(side=LEFT, expand=YES, fill=BOTH) -- scroll.config(command=self.listwidget.yview) -- scroll.pack(side=RIGHT, fill=BOTH) -- self.listwidget.config(selectmode=SINGLE, setgrid=TRUE) -- self.listwidget.bind('', self.handleList); -- self.listwidget.bind('', self.handleList); -- -- bf = Frame(master); -- if self.editor: -- Button(bf, text='Edit', command=self.editItem).pack(side=LEFT) -- Button(bf, text='Delete', command=self.deleteItem).pack(side=LEFT) -- if helptxt: -- self.helptxt = helptxt -- Button(bf, text='Help', fg='blue', -- command=self.help).pack(side=RIGHT) -- bf.pack(fill=X) -+ self.editor = editor -+ self.deletor = deletor -+ self.list = list -+ -+ # Set up a widget to accept new elements -+ self.newval = StringVar(master) -+ newwin = LabeledEntry(master, newlegend, self.newval, '12') -+ newwin.bind('', self.handleNew) -+ newwin.bind('', self.handleNew) -+ newwin.pack(side=TOP, fill=X, anchor=E) -+ -+ # Edit the existing list -+ listframe = Frame(master) -+ scroll = Scrollbar(listframe) -+ self.listwidget = Listbox(listframe, height=0, selectmode='browse') -+ if self.list: -+ for x in self.list: -+ self.listwidget.insert(END, x) -+ listframe.pack(side=TOP, expand=YES, fill=BOTH) -+ self.listwidget.config(yscrollcommand=scroll.set) -+ self.listwidget.pack(side=LEFT, expand=YES, fill=BOTH) -+ scroll.config(command=self.listwidget.yview) -+ scroll.pack(side=RIGHT, fill=BOTH) -+ self.listwidget.config(selectmode=SINGLE, setgrid=TRUE) -+ self.listwidget.bind('', self.handleList); -+ self.listwidget.bind('', self.handleList); -+ -+ bf = Frame(master); -+ if self.editor: -+ Button(bf, text='Edit', command=self.editItem).pack(side=LEFT) -+ Button(bf, text='Delete', command=self.deleteItem).pack(side=LEFT) -+ if helptxt: -+ self.helptxt = helptxt -+ Button(bf, text='Help', fg='blue', -+ command=self.help).pack(side=RIGHT) -+ bf.pack(fill=X) - - def help(self): -- helpwin(self.helptxt) -+ helpwin(self.helptxt) - - def handleList(self, event): -- self.editItem(); -+ self.editItem(); - - def handleNew(self, event): -- item = self.newval.get() -- if item: -- entire = self.listwidget.get(0, self.listwidget.index('end')); -- if item and (not entire) or (not item in self.listwidget.get(0, self.listwidget.index('end'))): -- self.listwidget.insert('end', item) -- if self.list != None: self.list.append(item) -- if self.editor: -- apply(self.editor, (item,)) -- self.newval.set('') -+ item = self.newval.get() -+ if item: -+ entire = self.listwidget.get(0, self.listwidget.index('end')); -+ if item and (not entire) or (not item in self.listwidget.get(0, self.listwidget.index('end'))): -+ self.listwidget.insert('end', item) -+ if self.list != None: self.list.append(item) -+ if self.editor: -+ apply(self.editor, (item,)) -+ self.newval.set('') - - def editItem(self): -- select = self.listwidget.curselection() -- if not select: -- helpwin(listboxhelp) -- else: -- index = select[0] -- if index and self.editor: -- label = self.listwidget.get(index); -- if self.editor: -- apply(self.editor, (label,)) -+ select = self.listwidget.curselection() -+ if not select: -+ helpwin(listboxhelp) -+ else: -+ index = select[0] -+ if index and self.editor: -+ label = self.listwidget.get(index); -+ if self.editor: -+ apply(self.editor, (label,)) - - def deleteItem(self): -- select = self.listwidget.curselection() -- if not select: -- helpwin(listboxhelp) -- else: -- index = string.atoi(select[0]) -- label = self.listwidget.get(index); -- self.listwidget.delete(index) -- if self.list != None: -- del self.list[index] -- if self.deletor != None: -- apply(self.deletor, (label,)) -+ select = self.listwidget.curselection() -+ if not select: -+ helpwin(listboxhelp) -+ else: -+ index = string.atoi(select[0]) -+ label = self.listwidget.get(index); -+ self.listwidget.delete(index) -+ if self.list != None: -+ del self.list[index] -+ if self.deletor != None: -+ apply(self.deletor, (label,)) - - def ConfirmQuit(frame, context): - ans = Dialog(frame, -- title = 'Quit?', -- text = 'Really quit ' + context + ' without saving?', -- bitmap = 'question', -- strings = ('Yes', 'No'), -- default = 1) -+ title = 'Quit?', -+ text = 'Really quit ' + context + ' without saving?', -+ bitmap = 'question', -+ strings = ('Yes', 'No'), -+ default = 1) - return ans.num == 0 - - def dispose_window(master, legend, help, savelegend='OK'): - dispose = Frame(master, relief=RAISED, bd=5) - Label(dispose, text=legend).pack(side=TOP,pady=10) - Button(dispose, text=savelegend, fg='blue', -- command=master.save).pack(side=LEFT) -+ command=master.save).pack(side=LEFT) - Button(dispose, text='Quit', fg='blue', -- command=master.nosave).pack(side=LEFT) -+ command=master.nosave).pack(side=LEFT) - Button(dispose, text='Help', fg='blue', -- command=lambda x=help: helpwin(x)).pack(side=RIGHT) -+ command=lambda x=help: helpwin(x)).pack(side=RIGHT) - dispose.pack(fill=X) - return dispose - - class MyWidget: - # Common methods for Tkinter widgets -- deals with Tkinter declaration - def post(self, widgetclass, field): -- for x in widgetclass.typemap: -- if x[1] == 'Boolean': -- setattr(self, x[0], BooleanVar(self)) -- elif x[1] == 'String': -- setattr(self, x[0], StringVar(self)) -- elif x[1] == 'Int': -- setattr(self, x[0], IntVar(self)) -- source = getattr(getattr(self, field), x[0]) -- if source: -- getattr(self, x[0]).set(source) -+ for x in widgetclass.typemap: -+ if x[1] == 'Boolean': -+ setattr(self, x[0], BooleanVar(self)) -+ elif x[1] == 'String': -+ setattr(self, x[0], StringVar(self)) -+ elif x[1] == 'Int': -+ setattr(self, x[0], IntVar(self)) -+ source = getattr(getattr(self, field), x[0]) -+ if source: -+ getattr(self, x[0]).set(source) - - def fetch(self, widgetclass, field): -- for x in widgetclass.typemap: -- setattr(getattr(self, field), x[0], getattr(self, x[0]).get()) -+ for x in widgetclass.typemap: -+ setattr(getattr(self, field), x[0], getattr(self, x[0]).get()) - - # - # First, code to set the global fetchmail run controls. -@@ -708,46 +708,46 @@ In the `Run Controls' panel, you can set the following options that - control how fetchmail runs: - - Poll interval -- Number of seconds to wait between polls in the background. -- If zero, fetchmail will run in foreground. -+ Number of seconds to wait between polls in the background. -+ If zero, fetchmail will run in foreground. - - Logfile -- If empty, emit progress and error messages to stderr. -- Otherwise this gives the name of the files to write to. -- This field is ignored if the "Log to syslog?" option is on. -+ If empty, emit progress and error messages to stderr. -+ Otherwise this gives the name of the files to write to. -+ This field is ignored if the "Log to syslog?" option is on. - - Idfile -- If empty, store seen-message IDs in .fetchids under user's home -- directory. If nonempty, use given file name. -+ If empty, store seen-message IDs in .fetchids under user's home -+ directory. If nonempty, use given file name. - - Postmaster -- Who to send multidrop mail to as a last resort if no address can -- be matched. Normally empty; in this case, fetchmail treats the -- invoking user as the address of last resort unless that user is -- root. If that user is root, fetchmail sends to `postmaster'. -+ Who to send multidrop mail to as a last resort if no address can -+ be matched. Normally empty; in this case, fetchmail treats the -+ invoking user as the address of last resort unless that user is -+ root. If that user is root, fetchmail sends to `postmaster'. - - Bounces to sender? -- If this option is on (the default) error mail goes to the sender. -- Otherwise it goes to the postmaster. -+ If this option is on (the default) error mail goes to the sender. -+ Otherwise it goes to the postmaster. - - Send spam bounces? -- If this option is on, spam bounces are sent to the sender or -- postmaster (depending on the "Bounces to sender?" option. Otherwise, -- spam bounces are not sent (the default). -+ If this option is on, spam bounces are sent to the sender or -+ postmaster (depending on the "Bounces to sender?" option. Otherwise, -+ spam bounces are not sent (the default). - - Use soft bounces? -- If this option is on, permanent delivery errors are treated as -- temporary, i. e. mail is kept on the upstream server. Useful -- during testing and after configuration changes, and on by -- default. -- If this option is off, permanent delivery errors delete -- undeliverable mail from the upstream. -+ If this option is on, permanent delivery errors are treated as -+ temporary, i. e. mail is kept on the upstream server. Useful -+ during testing and after configuration changes, and on by -+ default. -+ If this option is off, permanent delivery errors delete -+ undeliverable mail from the upstream. - - Invisible -- If false (the default) fetchmail generates a Received line into -- each message and generates a HELO from the machine it is running on. -- If true, fetchmail generates no Received line and HELOs as if it were -- the remote site. -+ If false (the default) fetchmail generates a Received line into -+ each message and generates a HELO from the machine it is running on. -+ If true, fetchmail generates no Received line and HELOs as if it were -+ the remote site. - - In the `Remote Mail Configurations' panel, you can: - -@@ -767,155 +767,155 @@ This will take you to a site configuration dialogue. - - class ConfigurationEdit(Frame, MyWidget): - def __init__(self, configuration, outfile, master, onexit): -- self.subwidgets = {} -- self.configuration = configuration -- self.outfile = outfile -- self.container = master -- self.onexit = onexit -- ConfigurationEdit.mode_to_help = { -- 'novice':configure_novice_help, 'expert':configure_expert_help -- } -+ self.subwidgets = {} -+ self.configuration = configuration -+ self.outfile = outfile -+ self.container = master -+ self.onexit = onexit -+ ConfigurationEdit.mode_to_help = { -+ 'novice':configure_novice_help, 'expert':configure_expert_help -+ } - - def server_edit(self, sitename): -- self.subwidgets[sitename] = ServerEdit(sitename, self).edit(self.mode, Toplevel()) -+ self.subwidgets[sitename] = ServerEdit(sitename, self).edit(self.mode, Toplevel()) - - def server_delete(self, sitename): -- try: -- for user in self.subwidgets.keys(): -- user.destruct() -- del self.configuration[sitename] -- except: -- pass -+ try: -+ for user in self.subwidgets.keys(): -+ user.destruct() -+ del self.configuration[sitename] -+ except: -+ pass - - def edit(self, mode): -- self.mode = mode -- Frame.__init__(self, self.container) -- self.master.title('fetchmail ' + self.mode + ' configurator'); -- self.master.iconname('fetchmail ' + self.mode + ' configurator'); -- self.master.protocol('WM_DELETE_WINDOW', self.nosave) -- self.keepalive = [] # Use this to anchor the PhotoImage object -- make_icon_window(self, fetchmail_icon) -- Pack.config(self) -- self.post(Configuration, 'configuration') -- -- dispose_window(self, -- 'Configurator ' + self.mode + ' Controls', -- ConfigurationEdit.mode_to_help[self.mode], -- 'Save') -- -- gf = Frame(self, relief=RAISED, bd = 5) -- Label(gf, -- text='Fetchmail Run Controls', -- bd=2).pack(side=TOP, pady=10) -- -- df = Frame(gf) -- -- ff = Frame(df) -- if self.mode != 'novice': -- # Set the postmaster -- log = LabeledEntry(ff, ' Postmaster:', self.postmaster, '14') -- log.pack(side=RIGHT, anchor=E) -- -- # Set the poll interval -- de = LabeledEntry(ff, ' Poll interval:', self.poll_interval, '14') -- de.pack(side=RIGHT, anchor=E) -- ff.pack() -- -- df.pack() -- -- if self.mode != 'novice': -- pf = Frame(gf) -- Checkbutton(pf, -- {'text':'Bounces to sender?', -- 'variable':self.bouncemail, -- 'relief':GROOVE}).pack(side=LEFT, anchor=W) -- pf.pack(fill=X) -- -- sb = Frame(gf) -- Checkbutton(sb, -- {'text':'Send spam bounces?', -- 'variable':self.spambounce, -- 'relief':GROOVE}).pack(side=LEFT, anchor=W) -- sb.pack(fill=X) -- -- sb = Frame(gf) -- Checkbutton(sb, -- {'text':'Treat permanent errors as temporary?', -- 'variable':self.softbounce, -- 'relief':GROOVE}).pack(side=LEFT, anchor=W) -- sb.pack(fill=X) -- -- sf = Frame(gf) -- Checkbutton(sf, -- {'text':'Log to syslog?', -- 'variable':self.syslog, -- 'relief':GROOVE}).pack(side=LEFT, anchor=W) -- log = LabeledEntry(sf, ' Logfile:', self.logfile, '14') -- log.pack(side=RIGHT, anchor=E) -- sf.pack(fill=X) -- -- Checkbutton(gf, -- {'text':'Invisible mode?', -- 'variable':self.invisible, -- 'relief':GROOVE}).pack(side=LEFT, anchor=W) -- # Set the idfile -- log = LabeledEntry(gf, ' Idfile:', self.idfile, '14') -- log.pack(side=RIGHT, anchor=E) -- -- gf.pack(fill=X) -- -- # Expert mode allows us to edit multiple sites -- lf = Frame(self, relief=RAISED, bd=5) -- Label(lf, -- text='Remote Mail Server Configurations', -- bd=2).pack(side=TOP, pady=10) -- ListEdit('New Server:', -- map(lambda x: x.pollname, self.configuration.servers), -- lambda site, self=self: self.server_edit(site), -- lambda site, self=self: self.server_delete(site), -- lf, remotehelp) -- lf.pack(fill=X) -+ self.mode = mode -+ Frame.__init__(self, self.container) -+ self.master.title('fetchmail ' + self.mode + ' configurator'); -+ self.master.iconname('fetchmail ' + self.mode + ' configurator'); -+ self.master.protocol('WM_DELETE_WINDOW', self.nosave) -+ self.keepalive = [] # Use this to anchor the PhotoImage object -+ make_icon_window(self, fetchmail_icon) -+ Pack.config(self) -+ self.post(Configuration, 'configuration') -+ -+ dispose_window(self, -+ 'Configurator ' + self.mode + ' Controls', -+ ConfigurationEdit.mode_to_help[self.mode], -+ 'Save') -+ -+ gf = Frame(self, relief=RAISED, bd = 5) -+ Label(gf, -+ text='Fetchmail Run Controls', -+ bd=2).pack(side=TOP, pady=10) -+ -+ df = Frame(gf) -+ -+ ff = Frame(df) -+ if self.mode != 'novice': -+ # Set the postmaster -+ log = LabeledEntry(ff, ' Postmaster:', self.postmaster, '14') -+ log.pack(side=RIGHT, anchor=E) -+ -+ # Set the poll interval -+ de = LabeledEntry(ff, ' Poll interval:', self.poll_interval, '14') -+ de.pack(side=RIGHT, anchor=E) -+ ff.pack() -+ -+ df.pack() -+ -+ if self.mode != 'novice': -+ pf = Frame(gf) -+ Checkbutton(pf, -+ {'text':'Bounces to sender?', -+ 'variable':self.bouncemail, -+ 'relief':GROOVE}).pack(side=LEFT, anchor=W) -+ pf.pack(fill=X) -+ -+ sb = Frame(gf) -+ Checkbutton(sb, -+ {'text':'Send spam bounces?', -+ 'variable':self.spambounce, -+ 'relief':GROOVE}).pack(side=LEFT, anchor=W) -+ sb.pack(fill=X) -+ -+ sb = Frame(gf) -+ Checkbutton(sb, -+ {'text':'Treat permanent errors as temporary?', -+ 'variable':self.softbounce, -+ 'relief':GROOVE}).pack(side=LEFT, anchor=W) -+ sb.pack(fill=X) -+ -+ sf = Frame(gf) -+ Checkbutton(sf, -+ {'text':'Log to syslog?', -+ 'variable':self.syslog, -+ 'relief':GROOVE}).pack(side=LEFT, anchor=W) -+ log = LabeledEntry(sf, ' Logfile:', self.logfile, '14') -+ log.pack(side=RIGHT, anchor=E) -+ sf.pack(fill=X) -+ -+ Checkbutton(gf, -+ {'text':'Invisible mode?', -+ 'variable':self.invisible, -+ 'relief':GROOVE}).pack(side=LEFT, anchor=W) -+ # Set the idfile -+ log = LabeledEntry(gf, ' Idfile:', self.idfile, '14') -+ log.pack(side=RIGHT, anchor=E) -+ -+ gf.pack(fill=X) -+ -+ # Expert mode allows us to edit multiple sites -+ lf = Frame(self, relief=RAISED, bd=5) -+ Label(lf, -+ text='Remote Mail Server Configurations', -+ bd=2).pack(side=TOP, pady=10) -+ ListEdit('New Server:', -+ map(lambda x: x.pollname, self.configuration.servers), -+ lambda site, self=self: self.server_edit(site), -+ lambda site, self=self: self.server_delete(site), -+ lf, remotehelp) -+ lf.pack(fill=X) - - def destruct(self): -- for sitename in self.subwidgets.keys(): -- self.subwidgets[sitename].destruct() -- self.master.destroy() -- self.onexit() -+ for sitename in self.subwidgets.keys(): -+ self.subwidgets[sitename].destruct() -+ self.master.destroy() -+ self.onexit() - - def nosave(self): -- if ConfirmQuit(self, self.mode + " configuration editor"): -- self.destruct() -+ if ConfirmQuit(self, self.mode + " configuration editor"): -+ self.destruct() - - def save(self): -- for sitename in self.subwidgets.keys(): -- self.subwidgets[sitename].save() -- self.fetch(Configuration, 'configuration') -- fm = None -- if not self.outfile: -- fm = sys.stdout -- elif not os.path.isfile(self.outfile) or Dialog(self, -- title = 'Overwrite existing run control file?', -- text = 'Really overwrite existing run control file?', -- bitmap = 'question', -- strings = ('Yes', 'No'), -- default = 1).num == 0: -- try: -- os.rename(self.outfile, self.outfile + "~") -- # Pre-1.5.2 compatibility... -- except os.error: -- pass -- oldumask = os.umask(077) -- fm = open(self.outfile, 'w') -- os.umask(oldumask) -- if fm: -- # be paranoid -- if fm != sys.stdout: -- os.chmod(self.outfile, 0600) -- fm.write("# Configuration created %s by fetchmailconf %s\n" % (time.ctime(time.time()), version)) -- fm.write(`self.configuration`) -- if self.outfile: -- fm.close() -- self.destruct() -+ for sitename in self.subwidgets.keys(): -+ self.subwidgets[sitename].save() -+ self.fetch(Configuration, 'configuration') -+ fm = None -+ if not self.outfile: -+ fm = sys.stdout -+ elif not os.path.isfile(self.outfile) or Dialog(self, -+ title = 'Overwrite existing run control file?', -+ text = 'Really overwrite existing run control file?', -+ bitmap = 'question', -+ strings = ('Yes', 'No'), -+ default = 1).num == 0: -+ try: -+ os.rename(self.outfile, self.outfile + "~") -+ # Pre-1.5.2 compatibility... -+ except os.error: -+ pass -+ oldumask = os.umask(077) -+ fm = open(self.outfile, 'w') -+ os.umask(oldumask) -+ if fm: -+ # be paranoid -+ if fm != sys.stdout: -+ os.chmod(self.outfile, 0600) -+ fm.write("# Configuration created %s by fetchmailconf %s\n" % (time.ctime(time.time()), version)) -+ fm.write(`self.configuration`) -+ if self.outfile: -+ fm.close() -+ self.destruct() - - # - # Server editing stuff. -@@ -1063,217 +1063,217 @@ user's options on that site. - - class ServerEdit(Frame, MyWidget): - def __init__(self, host, parent): -- self.parent = parent -- self.server = None -- self.subwidgets = {} -- for site in parent.configuration.servers: -- if site.pollname == host: -- self.server = site -- if (self.server == None): -- self.server = Server() -- self.server.pollname = host -- self.server.via = None -- parent.configuration.servers.append(self.server) -+ self.parent = parent -+ self.server = None -+ self.subwidgets = {} -+ for site in parent.configuration.servers: -+ if site.pollname == host: -+ self.server = site -+ if (self.server == None): -+ self.server = Server() -+ self.server.pollname = host -+ self.server.via = None -+ parent.configuration.servers.append(self.server) - - def edit(self, mode, master=None): -- Frame.__init__(self, master) -- Pack.config(self) -- self.master.title('Fetchmail host ' + self.server.pollname); -- self.master.iconname('Fetchmail host ' + self.server.pollname); -- self.post(Server, 'server') -- self.makeWidgets(self.server.pollname, mode) -- self.keepalive = [] # Use this to anchor the PhotoImage object -- make_icon_window(self, fetchmail_icon) -+ Frame.__init__(self, master) -+ Pack.config(self) -+ self.master.title('Fetchmail host ' + self.server.pollname); -+ self.master.iconname('Fetchmail host ' + self.server.pollname); -+ self.post(Server, 'server') -+ self.makeWidgets(self.server.pollname, mode) -+ self.keepalive = [] # Use this to anchor the PhotoImage object -+ make_icon_window(self, fetchmail_icon) - # self.grab_set() - # self.focus_set() - # self.wait_window() -- return self -+ return self - - def destruct(self): -- for username in self.subwidgets.keys(): -- self.subwidgets[username].destruct() -- del self.parent.subwidgets[self.server.pollname] -- self.master.destroy() -+ for username in self.subwidgets.keys(): -+ self.subwidgets[username].destruct() -+ del self.parent.subwidgets[self.server.pollname] -+ self.master.destroy() - - def nosave(self): -- if ConfirmQuit(self, 'server option editing'): -- self.destruct() -+ if ConfirmQuit(self, 'server option editing'): -+ self.destruct() - - def save(self): -- self.fetch(Server, 'server') -- for username in self.subwidgets.keys(): -- self.subwidgets[username].save() -- self.destruct() -+ self.fetch(Server, 'server') -+ for username in self.subwidgets.keys(): -+ self.subwidgets[username].save() -+ self.destruct() - - def defaultPort(self): -- proto = self.protocol.get() -- # Callback to reset the port number whenever the protocol type changes. -- # We used to only reset the port if it had a default (zero) value. -- # This turns out to be a bad idea especially in Novice mode -- if -- # you set POP3 and then set IMAP, the port invisibly remained 110. -- # Now we reset unconditionally on the theory that if you're setting -- # a custom port number you should be in expert mode and playing -- # close enough attention to notice this... -- self.service.set(defaultports[proto]) -- if not proto in ("POP3", "APOP", "KPOP"): self.uidl.state = DISABLED -+ proto = self.protocol.get() -+ # Callback to reset the port number whenever the protocol type changes. -+ # We used to only reset the port if it had a default (zero) value. -+ # This turns out to be a bad idea especially in Novice mode -- if -+ # you set POP3 and then set IMAP, the port invisibly remained 110. -+ # Now we reset unconditionally on the theory that if you're setting -+ # a custom port number you should be in expert mode and playing -+ # close enough attention to notice this... -+ self.service.set(defaultports[proto]) -+ if not proto in ("POP3", "APOP", "KPOP"): self.uidl.state = DISABLED - - def user_edit(self, username, mode): -- self.subwidgets[username] = UserEdit(username, self).edit(mode, Toplevel()) -+ self.subwidgets[username] = UserEdit(username, self).edit(mode, Toplevel()) - - def user_delete(self, username): -- if self.subwidgets.has_key(username): -- self.subwidgets[username].destruct() -- del self.server[username] -+ if self.subwidgets.has_key(username): -+ self.subwidgets[username].destruct() -+ del self.server[username] - - def makeWidgets(self, host, mode): -- topwin = dispose_window(self, "Server options for querying " + host, serverhelp) -- -- leftwin = Frame(self); -- leftwidth = '25'; -- -- if mode != 'novice': -- ctlwin = Frame(leftwin, relief=RAISED, bd=5) -- Label(ctlwin, text="Run Controls").pack(side=TOP) -- Checkbutton(ctlwin, text='Poll ' + host + ' normally?', variable=self.active).pack(side=TOP) -- Checkbutton(ctlwin, text='Pass messages with bad headers?', -- variable=self.badheader).pack(side=TOP) -- LabeledEntry(ctlwin, 'True name of ' + host + ':', -- self.via, leftwidth).pack(side=TOP, fill=X) -- LabeledEntry(ctlwin, 'Cycles to skip between polls:', -- self.interval, leftwidth).pack(side=TOP, fill=X) -- LabeledEntry(ctlwin, 'Server timeout (seconds):', -- self.timeout, leftwidth).pack(side=TOP, fill=X) -- Button(ctlwin, text='Help', fg='blue', -- command=lambda: helpwin(controlhelp)).pack(side=RIGHT) -- ctlwin.pack(fill=X) -- -- # Compute the available protocols from the compile-time options -- protolist = ['auto'] -- if 'pop2' in feature_options: -- protolist.append("POP2") -- if 'pop3' in feature_options: -- protolist = protolist + ["POP3", "APOP", "KPOP"] -- if 'sdps' in feature_options: -- protolist.append("SDPS") -- if 'imap' in feature_options: -- protolist.append("IMAP") -- if 'etrn' in feature_options: -- protolist.append("ETRN") -- if 'odmr' in feature_options: -- protolist.append("ODMR") -- -- protwin = Frame(leftwin, relief=RAISED, bd=5) -- Label(protwin, text="Protocol").pack(side=TOP) -- ButtonBar(protwin, '', -- self.protocol, protolist, 2, -- self.defaultPort) -- if mode != 'novice': -- LabeledEntry(protwin, 'On server TCP/IP service:', -- self.service, leftwidth).pack(side=TOP, fill=X) -- self.defaultPort() -- Checkbutton(protwin, -- text="POP3: track `seen' with client-side UIDLs?", -- variable=self.uidl).pack(side=TOP) -- Button(protwin, text='Probe for supported protocols', fg='blue', -- command=self.autoprobe).pack(side=LEFT) -- Button(protwin, text='Help', fg='blue', -- command=lambda: helpwin(protohelp)).pack(side=RIGHT) -- protwin.pack(fill=X) -- -- userwin = Frame(leftwin, relief=RAISED, bd=5) -- Label(userwin, text="User entries for " + host).pack(side=TOP) -- ListEdit("New user: ", -- map(lambda x: x.remote, self.server.users), -- lambda u, m=mode, s=self: s.user_edit(u, m), -- lambda u, s=self: s.user_delete(u), -- userwin, suserhelp) -- userwin.pack(fill=X) -- -- leftwin.pack(side=LEFT, anchor=N, fill=X); -- -- if mode != 'novice': -- rightwin = Frame(self); -- -- mdropwin = Frame(rightwin, relief=RAISED, bd=5) -- Label(mdropwin, text="Multidrop options").pack(side=TOP) -- LabeledEntry(mdropwin, 'Envelope address header:', -- self.envelope, '22').pack(side=TOP, fill=X) -- LabeledEntry(mdropwin, 'Envelope headers to skip:', -- self.envskip, '22').pack(side=TOP, fill=X) -- LabeledEntry(mdropwin, 'Name prefix to strip:', -- self.qvirtual, '22').pack(side=TOP, fill=X) -- Checkbutton(mdropwin, text="Enable multidrop DNS lookup?", -- variable=self.dns).pack(side=TOP) -- Label(mdropwin, text="DNS aliases").pack(side=TOP) -- ListEdit("New alias: ", self.server.aka, None, None, mdropwin, None) -- Label(mdropwin, text="Domains to be considered local").pack(side=TOP) -- ListEdit("New domain: ", -- self.server.localdomains, None, None, mdropwin, multihelp) -- mdropwin.pack(fill=X) -- -- if os_type in ('linux', 'freebsd'): -- secwin = Frame(rightwin, relief=RAISED, bd=5) -- Label(secwin, text="Security").pack(side=TOP) -- # Don't actually let users set this. KPOP sets it implicitly -- ButtonBar(secwin, 'Authorization mode:', -- self.auth, authlist, 2, None).pack(side=TOP) -- if os_type == 'linux' or os_type == 'freebsd' or 'interface' in dictmembers: -- LabeledEntry(secwin, 'IP range to check before poll:', -- self.interface, leftwidth).pack(side=TOP, fill=X) -- if os_type == 'linux' or os_type == 'freebsd' or 'monitor' in dictmembers: -- LabeledEntry(secwin, 'Interface to monitor:', -- self.monitor, leftwidth).pack(side=TOP, fill=X) -- # Someday this should handle Kerberos 5 too -- if 'kerberos' in feature_options: -- LabeledEntry(secwin, 'Principal:', -- self.principal, '12').pack(side=TOP, fill=X) -- # ESMTP authentication -- LabeledEntry(secwin, 'ESMTP name:', -- self.esmtpname, '12').pack(side=TOP, fill=X) -- LabeledEntry(secwin, 'ESMTP password:', -- self.esmtppassword, '12').pack(side=TOP, fill=X) -- Button(secwin, text='Help', fg='blue', -- command=lambda: helpwin(sechelp)).pack(side=RIGHT) -- secwin.pack(fill=X) -- -- rightwin.pack(side=LEFT, anchor=N); -+ topwin = dispose_window(self, "Server options for querying " + host, serverhelp) -+ -+ leftwin = Frame(self); -+ leftwidth = '25'; -+ -+ if mode != 'novice': -+ ctlwin = Frame(leftwin, relief=RAISED, bd=5) -+ Label(ctlwin, text="Run Controls").pack(side=TOP) -+ Checkbutton(ctlwin, text='Poll ' + host + ' normally?', variable=self.active).pack(side=TOP) -+ Checkbutton(ctlwin, text='Pass messages with bad headers?', -+ variable=self.badheader).pack(side=TOP) -+ LabeledEntry(ctlwin, 'True name of ' + host + ':', -+ self.via, leftwidth).pack(side=TOP, fill=X) -+ LabeledEntry(ctlwin, 'Cycles to skip between polls:', -+ self.interval, leftwidth).pack(side=TOP, fill=X) -+ LabeledEntry(ctlwin, 'Server timeout (seconds):', -+ self.timeout, leftwidth).pack(side=TOP, fill=X) -+ Button(ctlwin, text='Help', fg='blue', -+ command=lambda: helpwin(controlhelp)).pack(side=RIGHT) -+ ctlwin.pack(fill=X) -+ -+ # Compute the available protocols from the compile-time options -+ protolist = ['auto'] -+ if 'pop2' in feature_options: -+ protolist.append("POP2") -+ if 'pop3' in feature_options: -+ protolist = protolist + ["POP3", "APOP", "KPOP"] -+ if 'sdps' in feature_options: -+ protolist.append("SDPS") -+ if 'imap' in feature_options: -+ protolist.append("IMAP") -+ if 'etrn' in feature_options: -+ protolist.append("ETRN") -+ if 'odmr' in feature_options: -+ protolist.append("ODMR") -+ -+ protwin = Frame(leftwin, relief=RAISED, bd=5) -+ Label(protwin, text="Protocol").pack(side=TOP) -+ ButtonBar(protwin, '', -+ self.protocol, protolist, 2, -+ self.defaultPort) -+ if mode != 'novice': -+ LabeledEntry(protwin, 'On server TCP/IP service:', -+ self.service, leftwidth).pack(side=TOP, fill=X) -+ self.defaultPort() -+ Checkbutton(protwin, -+ text="POP3: track `seen' with client-side UIDLs?", -+ variable=self.uidl).pack(side=TOP) -+ Button(protwin, text='Probe for supported protocols', fg='blue', -+ command=self.autoprobe).pack(side=LEFT) -+ Button(protwin, text='Help', fg='blue', -+ command=lambda: helpwin(protohelp)).pack(side=RIGHT) -+ protwin.pack(fill=X) -+ -+ userwin = Frame(leftwin, relief=RAISED, bd=5) -+ Label(userwin, text="User entries for " + host).pack(side=TOP) -+ ListEdit("New user: ", -+ map(lambda x: x.remote, self.server.users), -+ lambda u, m=mode, s=self: s.user_edit(u, m), -+ lambda u, s=self: s.user_delete(u), -+ userwin, suserhelp) -+ userwin.pack(fill=X) -+ -+ leftwin.pack(side=LEFT, anchor=N, fill=X); -+ -+ if mode != 'novice': -+ rightwin = Frame(self); -+ -+ mdropwin = Frame(rightwin, relief=RAISED, bd=5) -+ Label(mdropwin, text="Multidrop options").pack(side=TOP) -+ LabeledEntry(mdropwin, 'Envelope address header:', -+ self.envelope, '22').pack(side=TOP, fill=X) -+ LabeledEntry(mdropwin, 'Envelope headers to skip:', -+ self.envskip, '22').pack(side=TOP, fill=X) -+ LabeledEntry(mdropwin, 'Name prefix to strip:', -+ self.qvirtual, '22').pack(side=TOP, fill=X) -+ Checkbutton(mdropwin, text="Enable multidrop DNS lookup?", -+ variable=self.dns).pack(side=TOP) -+ Label(mdropwin, text="DNS aliases").pack(side=TOP) -+ ListEdit("New alias: ", self.server.aka, None, None, mdropwin, None) -+ Label(mdropwin, text="Domains to be considered local").pack(side=TOP) -+ ListEdit("New domain: ", -+ self.server.localdomains, None, None, mdropwin, multihelp) -+ mdropwin.pack(fill=X) -+ -+ if os_type in ('linux', 'freebsd'): -+ secwin = Frame(rightwin, relief=RAISED, bd=5) -+ Label(secwin, text="Security").pack(side=TOP) -+ # Don't actually let users set this. KPOP sets it implicitly -+ ButtonBar(secwin, 'Authorization mode:', -+ self.auth, authlist, 2, None).pack(side=TOP) -+ if os_type == 'linux' or os_type == 'freebsd' or 'interface' in dictmembers: -+ LabeledEntry(secwin, 'IP range to check before poll:', -+ self.interface, leftwidth).pack(side=TOP, fill=X) -+ if os_type == 'linux' or os_type == 'freebsd' or 'monitor' in dictmembers: -+ LabeledEntry(secwin, 'Interface to monitor:', -+ self.monitor, leftwidth).pack(side=TOP, fill=X) -+ # Someday this should handle Kerberos 5 too -+ if 'kerberos' in feature_options: -+ LabeledEntry(secwin, 'Principal:', -+ self.principal, '12').pack(side=TOP, fill=X) -+ # ESMTP authentication -+ LabeledEntry(secwin, 'ESMTP name:', -+ self.esmtpname, '12').pack(side=TOP, fill=X) -+ LabeledEntry(secwin, 'ESMTP password:', -+ self.esmtppassword, '12').pack(side=TOP, fill=X) -+ Button(secwin, text='Help', fg='blue', -+ command=lambda: helpwin(sechelp)).pack(side=RIGHT) -+ secwin.pack(fill=X) -+ -+ rightwin.pack(side=LEFT, anchor=N); - - def autoprobe(self): -- # Note: this only handles case (1) near fetchmail.c:1032 -- # We're assuming people smart enough to set up ssh tunneling -- # won't need autoprobing. -- if self.server.via: -- realhost = self.server.via -- else: -- realhost = self.server.pollname -- greetline = None -- for protocol in ("IMAP","POP3","POP2"): -- service = defaultports[protocol] -- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -- try: -- sock.connect((realhost, ianaservices[service])) -- greetline = sock.recv(1024) -- sock.close() -- except: -- pass -- else: -- break -- confwin = Toplevel() -- if greetline == None: -- title = "Autoprobe of " + realhost + " failed" -- confirm = """ -+ # Note: this only handles case (1) near fetchmail.c:1032 -+ # We're assuming people smart enough to set up ssh tunneling -+ # won't need autoprobing. -+ if self.server.via: -+ realhost = self.server.via -+ else: -+ realhost = self.server.pollname -+ greetline = None -+ for protocol in ("IMAP","POP3","POP2"): -+ service = defaultports[protocol] -+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -+ try: -+ sock.connect((realhost, ianaservices[service])) -+ greetline = sock.recv(1024) -+ sock.close() -+ except: -+ pass -+ else: -+ break -+ confwin = Toplevel() -+ if greetline == None: -+ title = "Autoprobe of " + realhost + " failed" -+ confirm = """ - Fetchmailconf didn't find any mailservers active. - This could mean the host doesn't support any, - or that your Internet connection is down, or - that the host is so slow that the probe timed - out before getting a response. - """ -- else: -- warnings = '' -- # OK, now try to recognize potential problems -+ else: -+ warnings = '' -+ # OK, now try to recognize potential problems - -- if protocol == "POP2": -- warnings = warnings + """ -+ if protocol == "POP2": -+ warnings = warnings + """ - It appears you have somehow found a mailserver running only POP2. - Congratulations. Have you considered a career in archaeology? - -@@ -1286,8 +1286,8 @@ switch --enable-POP2. - - ### POP3 servers start here - -- if string.find(greetline, "1.003") > 0 or string.find(greetline, "1.004") > 0: -- warnings = warnings + """ -+ if string.find(greetline, "1.003") > 0 or string.find(greetline, "1.004") > 0: -+ warnings = warnings + """ - This appears to be an old version of the UC Davis POP server. These are - dangerously unreliable (among other problems, they may drop your mailbox - on the floor if your connection is interrupted during the session). -@@ -1296,8 +1296,8 @@ It is strongly recommended that you find a better POP3 server. The fetchmail - FAQ includes pointers to good ones. - - """ -- if string.find(greetline, "comcast.net") > 0: -- warnings = warnings + """ -+ if string.find(greetline, "comcast.net") > 0: -+ warnings = warnings + """ - The Comcast Maillennium POP3 server only returns the first 80K of a long - message retrieved with TOP. Its response to RETR is normal, so use the - `fetchall' option. -@@ -1321,8 +1321,8 @@ message retrieved with TOP. Its response to RETR is normal, so use the - # - # +OK Cubic Circle's v1.31 1998/05/13 POP3 ready <6229000062f95036@wakko> - # -- if string.find(greetline, "Cubic Circle") > 0: -- warnings = warnings + """ -+ if string.find(greetline, "Cubic Circle") > 0: -+ warnings = warnings + """ - I see your server is running cucipop. Better make sure the server box - isn't a SunOS 4.1.4 machine; cucipop tickles a bug in SunOS realloc() - under that version, and doesn't cope with the result gracefully. Newer -@@ -1332,8 +1332,8 @@ Also, some versions of cucipop don't assert an exclusive lock on your - mailbox when it's being queried. This means that if you have more than - one fetchmail query running against the same mailbox, bad things can happen. - """ -- if string.find(greetline, "David POP3 Server") > 0: -- warnings = warnings + """ -+ if string.find(greetline, "David POP3 Server") > 0: -+ warnings = warnings + """ - This POP3 server is badly broken. You should get rid of it -- and the - brain-dead Microsoft operating system it rode in on. - -@@ -1341,20 +1341,20 @@ brain-dead Microsoft operating system it rode in on. - # The greeting line on the server known to be buggy is: - # +OK POP3 server ready (running FTGate V2, 2, 1, 0 Jun 21 1999 09:55:01) - # -- if string.find(greetline, "FTGate") > 0: -- warnings = warnings + """ -+ if string.find(greetline, "FTGate") > 0: -+ warnings = warnings + """ - This POP server has a weird bug; it says OK twice in response to TOP. - Its response to RETR is normal, so use the `fetchall' option. - - """ -- if string.find(greetline, " geonet.de") > 0: -- warnings = warnings + """ -+ if string.find(greetline, " geonet.de") > 0: -+ warnings = warnings + """ - You appear to be using geonet. As of late 2002, the TOP command on - geonet's POP3 is broken. Use the fetchall option. - - """ -- if string.find(greetline, "OpenMail") > 0: -- warnings = warnings + """ -+ if string.find(greetline, "OpenMail") > 0: -+ warnings = warnings + """ - You appear to be using some version of HP OpenMail. Many versions of - OpenMail do not process the "TOP" command correctly; the symptom is that - only the header and first line of each message is retrieved. To work -@@ -1362,16 +1362,16 @@ around this bug, turn on `fetchall' on all user entries associated with - this server. - - """ -- if string.find(greetline, "Escape character is") > 0: -- warnings = warnings + """ -+ if string.find(greetline, "Escape character is") > 0: -+ warnings = warnings + """ - Your greeting line looks like it was written by a fetid pile of - camel dung identified to me as `popa3d written by Solar Designer'. - Beware! The UIDL support in this thing is known to be completely broken, - and other things probably are too. - - """ -- if string.find(greetline, "MercuryP/NLM v1.48") > 0: -- warnings = warnings + """ -+ if string.find(greetline, "MercuryP/NLM v1.48") > 0: -+ warnings = warnings + """ - This is not a POP3 server. It has delusions of being one, but after - RETR all messages are automatically marked to be deleted. The only - way to prevent this is to issue an RSET before leaving the server. -@@ -1379,8 +1379,8 @@ Fetchmail does this, but we suspect this is probably broken in lots - of other ways, too. - - """ -- if string.find(greetline, "POP-Max") > 0: -- warnings = warnings + """ -+ if string.find(greetline, "POP-Max") > 0: -+ warnings = warnings + """ - The Mail Max POP3 server screws up on mail with attachments. It - reports the message size with attachments included, but doesn't - download them on a RETR or TOP (this violates the IMAP RFCs). It also -@@ -1388,14 +1388,14 @@ doesn't implement TOP correctly. You should get rid of it -- and the - brain-dead NT server it rode in on. - - """ -- if string.find(greetline, "POP3 Server Ready") > 0: -- warnings = warnings + """ -+ if string.find(greetline, "POP3 Server Ready") > 0: -+ warnings = warnings + """ - Some server that uses this greeting line has been observed to choke on - TOP %d 99999999. Use the fetchall option. if necessary, to force RETR. - - """ -- if string.find(greetline, "QPOP") > 0: -- warnings = warnings + """ -+ if string.find(greetline, "QPOP") > 0: -+ warnings = warnings + """ - This appears to be a version of Eudora qpopper. That's good. Fetchmail - knows all about qpopper. However, be aware that the 2.53 version of - qpopper does something odd that causes fetchmail to hang with a socket -@@ -1404,16 +1404,16 @@ it has been observed with fetchpop. The fix is to upgrade to qpopper - 3.0beta or a more recent version. Better yet, switch to IMAP. - - """ -- if string.find(greetline, " sprynet.com") > 0: -- warnings = warnings + """ -+ if string.find(greetline, " sprynet.com") > 0: -+ warnings = warnings + """ - You appear to be using a SpryNet server. In mid-1999 it was reported that - the SpryNet TOP command marks messages seen. Therefore, for proper error - recovery in the event of a line drop, it is strongly recommended that you - turn on `fetchall' on all user entries associated with this server. - - """ -- if string.find(greetline, "TEMS POP3") > 0: -- warnings = warnings + """ -+ if string.find(greetline, "TEMS POP3") > 0: -+ warnings = warnings + """ - Your POP3 server has "TEMS" in its header line. At least one such - server does not process the "TOP" command correctly; the symptom is - that fetchmail hangs when trying to retrieve mail. To work around -@@ -1421,8 +1421,8 @@ this bug, turn on `fetchall' on all user entries associated with this - server. - - """ -- if string.find(greetline, " spray.se") > 0: -- warnings = warnings + """ -+ if string.find(greetline, " spray.se") > 0: -+ warnings = warnings + """ - Your POP3 server has "spray.se" in its header line. In May 2000 at - least one such server did not process the "TOP" command correctly; the - symptom is that messages are treated as headerless. To work around -@@ -1430,8 +1430,8 @@ this bug, turn on `fetchall' on all user entries associated with this - server. - - """ -- if string.find(greetline, " usa.net") > 0: -- warnings = warnings + """ -+ if string.find(greetline, " usa.net") > 0: -+ warnings = warnings + """ - You appear to be using USA.NET's free mail service. Their POP3 servers - (at least as of the 2.2 version in use mid-1998) are quite flaky, but - fetchmail can compensate. They seem to require that fetchall be switched on -@@ -1444,15 +1444,15 @@ Therefore, it is strongly recommended that you turn on `fetchall' on all - user entries associated with this server. - - """ -- if string.find(greetline, " Novonyx POP3") > 0: -- warnings = warnings + """ -+ if string.find(greetline, " Novonyx POP3") > 0: -+ warnings = warnings + """ - Your mailserver is running Novonyx POP3. This server, at least as of - version 2.17, seems to have problems handling and reporting seen bits. - You may have to use the fetchall option. - - """ -- if string.find(greetline, " IMS POP3") > 0: -- warnings = warnings + """ -+ if string.find(greetline, " IMS POP3") > 0: -+ warnings = warnings + """ - Some servers issuing the greeting line 'IMS POP3' have been known to - do byte-stuffing incorrectly. This means that if a message you receive - has a . (period) at start of line, fetchmail will become confused and -@@ -1462,8 +1462,8 @@ probably wedge itself. (This bug was recorded on IMS POP3 0.86.) - - ### IMAP servers start here - -- if string.find(greetline, "GroupWise") > 0: -- warnings = warnings + """ -+ if string.find(greetline, "GroupWise") > 0: -+ warnings = warnings + """ - The Novell GroupWise IMAP server would be better named GroupFoolish; - it is (according to the designer of IMAP) unusably broken. Among - other things, it doesn't include a required content length in its -@@ -1475,8 +1475,8 @@ with code as shoddy as GroupWise seems to be, you will probably pay - for it with other problems.

- - """ -- if string.find(greetline, "InterChange") > 0: -- warnings = warnings + """ -+ if string.find(greetline, "InterChange") > 0: -+ warnings = warnings + """ - - The InterChange IMAP server at release levels below 3.61.08 screws up - on mail with attachments. It doesn't fetch them if you give it a -@@ -1487,16 +1487,16 @@ Exchange (quite legally under RFC2062) rejectsit. The InterChange - folks claim to have fixed this bug in 3.61.08. - - """ -- if string.find(greetline, "Imail") > 0: -- warnings = warnings + """ -+ if string.find(greetline, "Imail") > 0: -+ warnings = warnings + """ - We've seen a bug report indicating that this IMAP server (at least as of - version 5.0.7) returns an invalid body size for messages with MIME - attachments; the effect is to drop the attachments on the floor. We - recommend you upgrade to a non-broken IMAP server. - - """ -- if string.find(greetline, "Domino IMAP4") > 0: -- warnings = warnings + """ -+ if string.find(greetline, "Domino IMAP4") > 0: -+ warnings = warnings + """ - Your IMAP server appears to be Lotus Domino. This server, at least up - to version 4.6.2a, has a bug in its generation of MIME boundaries (see - the details in the fetchmail FAQ). As a result, even MIME aware MUAs -@@ -1507,16 +1507,16 @@ POP3 facility is enabled, we recommend you fall back on it. - - ### Checks for protocol variants start here - -- closebrak = string.find(greetline, ">") -- if closebrak > 0 and greetline[closebrak+1] == "\r": -- warnings = warnings + """ -+ closebrak = string.find(greetline, ">") -+ if closebrak > 0 and greetline[closebrak+1] == "\r": -+ warnings = warnings + """ - It looks like you could use APOP on this server and avoid sending it your - password in clear. You should talk to the mailserver administrator about - this. - - """ -- if string.find(greetline, "IMAP2bis") > 0: -- warnings = warnings + """ -+ if string.find(greetline, "IMAP2bis") > 0: -+ warnings = warnings + """ - IMAP2bis servers have a minor problem; they can't peek at messages without - marking them seen. If you take a line hit during the retrieval, the - interrupted message may get left on the server, marked seen. -@@ -1529,30 +1529,30 @@ To fix this bug, upgrade to an IMAP4 server. The fetchmail FAQ includes - a pointer to an open-source implementation. - - """ -- if string.find(greetline, "IMAP4rev1") > 0: -- warnings = warnings + """ -+ if string.find(greetline, "IMAP4rev1") > 0: -+ warnings = warnings + """ - I see an IMAP4rev1 server. Excellent. This is (a) the best kind of - remote-mail server, and (b) the one the fetchmail author uses. Fetchmail - has therefore been extremely well tested with this class of server. - - """ -- if warnings == '': -- warnings = warnings + """ -+ if warnings == '': -+ warnings = warnings + """ - Fetchmail doesn't know anything special about this server type. - - """ - -- # Display success window with warnings -- title = "Autoprobe of " + realhost + " succeeded" -- confirm = "The " + protocol + " server said:\n\n" + greetline + warnings -- self.protocol.set(protocol) -- self.service.set(defaultports[protocol]) -- confwin.title(title) -- confwin.iconname(title) -- Label(confwin, text=title).pack() -- Message(confwin, text=confirm, width=600).pack() -- Button(confwin, text='Done', -- command=lambda x=confwin: x.destroy(), bd=2).pack() -+ # Display success window with warnings -+ title = "Autoprobe of " + realhost + " succeeded" -+ confirm = "The " + protocol + " server said:\n\n" + greetline + warnings -+ self.protocol.set(protocol) -+ self.service.set(defaultports[protocol]) -+ confwin.title(title) -+ confwin.iconname(title) -+ Label(confwin, text=title).pack() -+ Message(confwin, text=confirm, width=600).pack() -+ Button(confwin, text='Done', -+ command=lambda x=confwin: x.destroy(), bd=2).pack() - - # - # User editing stuff -@@ -1597,193 +1597,193 @@ of sending it to your local system. - - class UserEdit(Frame, MyWidget): - def __init__(self, username, parent): -- self.parent = parent -- self.user = None -- for user in parent.server.users: -- if user.remote == username: -- self.user = user -- if self.user == None: -- self.user = User() -- self.user.remote = username -- self.user.localnames = [username] -- parent.server.users.append(self.user) -+ self.parent = parent -+ self.user = None -+ for user in parent.server.users: -+ if user.remote == username: -+ self.user = user -+ if self.user == None: -+ self.user = User() -+ self.user.remote = username -+ self.user.localnames = [username] -+ parent.server.users.append(self.user) - - def edit(self, mode, master=None): -- Frame.__init__(self, master) -- Pack.config(self) -- self.master.title('Fetchmail user ' + self.user.remote -- + ' querying ' + self.parent.server.pollname); -- self.master.iconname('Fetchmail user ' + self.user.remote); -- self.post(User, 'user') -- self.makeWidgets(mode, self.parent.server.pollname) -- self.keepalive = [] # Use this to anchor the PhotoImage object -- make_icon_window(self, fetchmail_icon) -+ Frame.__init__(self, master) -+ Pack.config(self) -+ self.master.title('Fetchmail user ' + self.user.remote -+ + ' querying ' + self.parent.server.pollname); -+ self.master.iconname('Fetchmail user ' + self.user.remote); -+ self.post(User, 'user') -+ self.makeWidgets(mode, self.parent.server.pollname) -+ self.keepalive = [] # Use this to anchor the PhotoImage object -+ make_icon_window(self, fetchmail_icon) - # self.grab_set() - # self.focus_set() - # self.wait_window() -- return self -+ return self - - def destruct(self): -- # Yes, this test can fail -- if you delete the parent window. -- if self.parent.subwidgets.has_key(self.user.remote): -- del self.parent.subwidgets[self.user.remote] -- self.master.destroy() -+ # Yes, this test can fail -- if you delete the parent window. -+ if self.parent.subwidgets.has_key(self.user.remote): -+ del self.parent.subwidgets[self.user.remote] -+ self.master.destroy() - - def nosave(self): -- if ConfirmQuit(self, 'user option editing'): -- self.destruct() -+ if ConfirmQuit(self, 'user option editing'): -+ self.destruct() - - def save(self): -- ok = 0 -- for x in self.user.localnames: ok = ok + (string.find(x, '@') != -1) -- if ok == 0 or Dialog(self, -- title = "Really accept an embedded '@' ?", -- text = "Local names with an embedded '@', such as in foo@bar " -- "might result in your mail being sent to foo@bar.com " -- "instead of your local system.\n Are you sure you want " -- "a local user name with an '@' in it?", -- bitmap = 'question', -- strings = ('Yes', 'No'), -- default = 1).num == 0: -- self.fetch(User, 'user') -- self.destruct() -+ ok = 0 -+ for x in self.user.localnames: ok = ok + (string.find(x, '@') != -1) -+ if ok == 0 or Dialog(self, -+ title = "Really accept an embedded '@' ?", -+ text = "Local names with an embedded '@', such as in foo@bar " -+ "might result in your mail being sent to foo@bar.com " -+ "instead of your local system.\n Are you sure you want " -+ "a local user name with an '@' in it?", -+ bitmap = 'question', -+ strings = ('Yes', 'No'), -+ default = 1).num == 0: -+ self.fetch(User, 'user') -+ self.destruct() - - def makeWidgets(self, mode, servername): -- dispose_window(self, -- "User options for " + self.user.remote + " querying " + servername, -- userhelp) -- -- if mode != 'novice': -- leftwin = Frame(self); -- else: -- leftwin = self -- -- secwin = Frame(leftwin, relief=RAISED, bd=5) -- Label(secwin, text="Authentication").pack(side=TOP) -- LabeledEntry(secwin, 'Password:', -- self.password, '12').pack(side=TOP, fill=X) -- secwin.pack(fill=X, anchor=N) -- -- if 'ssl' in feature_options or 'ssl' in dictmembers: -- sslwin = Frame(leftwin, relief=RAISED, bd=5) -- Checkbutton(sslwin, text="Use SSL?", -- variable=self.ssl).pack(side=TOP, fill=X) -- LabeledEntry(sslwin, 'SSL key:', -- self.sslkey, '14').pack(side=TOP, fill=X) -- LabeledEntry(sslwin, 'SSL certificate:', -- self.sslcert, '14').pack(side=TOP, fill=X) -- Checkbutton(sslwin, text="Check server SSL certificate?", -- variable=self.sslcertck).pack(side=TOP, fill=X) -- LabeledEntry(sslwin, 'SSL trusted certificate directory:', -- self.sslcertpath, '14').pack(side=TOP, fill=X) -- LabeledEntry(sslwin, 'SSL CommonName:', -- self.sslcommonname, '14').pack(side=TOP, fill=X) -- LabeledEntry(sslwin, 'SSL key fingerprint:', -- self.sslfingerprint, '14').pack(side=TOP, fill=X) -- sslwin.pack(fill=X, anchor=N) -- -- names = Frame(leftwin, relief=RAISED, bd=5) -- Label(names, text="Local names").pack(side=TOP) -- ListEdit("New name: ", -- self.user.localnames, None, None, names, localhelp) -- names.pack(fill=X, anchor=N) -- -- if mode != 'novice': -- targwin = Frame(leftwin, relief=RAISED, bd=5) -- Label(targwin, text="Forwarding Options").pack(side=TOP) -- Label(targwin, text="Listeners to forward to").pack(side=TOP) -- ListEdit("New listener:", -- self.user.smtphunt, None, None, targwin, None) -- Label(targwin, text="Domains to fetch from (ODMR/ETRN only)").pack(side=TOP) -- ListEdit("Domains:", -- self.user.fetchdomains, None, None, targwin, None) -- LabeledEntry(targwin, 'Use domain on RCPT TO line:', -- self.smtpaddress, '26').pack(side=TOP, fill=X) -- LabeledEntry(targwin, 'Set fixed RCPT TO address:', -- self.smtpname, '26').pack(side=TOP, fill=X) -- LabeledEntry(targwin, 'Connection setup command:', -- self.preconnect, '26').pack(side=TOP, fill=X) -- LabeledEntry(targwin, 'Connection wrapup command:', -- self.postconnect, '26').pack(side=TOP, fill=X) -- LabeledEntry(targwin, 'Local delivery agent:', -- self.mda, '26').pack(side=TOP, fill=X) -- LabeledEntry(targwin, 'BSMTP output file:', -- self.bsmtp, '26').pack(side=TOP, fill=X) -- LabeledEntry(targwin, 'Listener spam-block codes:', -- self.antispam, '26').pack(side=TOP, fill=X) -- LabeledEntry(targwin, 'Pass-through properties:', -- self.properties, '26').pack(side=TOP, fill=X) -- Checkbutton(targwin, text="Use LMTP?", -- variable=self.lmtp).pack(side=TOP, fill=X) -- targwin.pack(fill=X, anchor=N) -- -- if mode != 'novice': -- leftwin.pack(side=LEFT, fill=X, anchor=N) -- rightwin = Frame(self) -- else: -- rightwin = self -- -- optwin = Frame(rightwin, relief=RAISED, bd=5) -- Label(optwin, text="Processing Options").pack(side=TOP) -- Checkbutton(optwin, text="Suppress deletion of messages after reading", -- variable=self.keep).pack(side=TOP, anchor=W) -- Checkbutton(optwin, text="Fetch old messages as well as new", -- variable=self.fetchall).pack(side=TOP, anchor=W) -- if mode != 'novice': -- Checkbutton(optwin, text="Flush seen messages before retrieval", -- variable=self.flush).pack(side=TOP, anchor=W) -- Checkbutton(optwin, text="Flush oversized messages before retrieval", -- variable=self.limitflush).pack(side=TOP, anchor=W) -- Checkbutton(optwin, text="Rewrite To/Cc/Bcc messages to enable reply", -- variable=self.rewrite).pack(side=TOP, anchor=W) -- Checkbutton(optwin, text="Force CR/LF at end of each line", -- variable=self.forcecr).pack(side=TOP, anchor=W) -- Checkbutton(optwin, text="Strip CR from end of each line", -- variable=self.stripcr).pack(side=TOP, anchor=W) -- Checkbutton(optwin, text="Pass 8 bits even though SMTP says 7BIT", -- variable=self.pass8bits).pack(side=TOP, anchor=W) -- Checkbutton(optwin, text="Undo MIME armoring on header and body", -- variable=self.mimedecode).pack(side=TOP, anchor=W) -- Checkbutton(optwin, text="Drop Status lines from forwarded messages", -- variable=self.dropstatus).pack(side=TOP, anchor=W) -- Checkbutton(optwin, text="Drop Delivered-To lines from forwarded messages", -- variable=self.dropdelivered).pack(side=TOP, anchor=W) -- optwin.pack(fill=X) -- -- if mode != 'novice': -- limwin = Frame(rightwin, relief=RAISED, bd=5) -- Label(limwin, text="Resource Limits").pack(side=TOP) -- LabeledEntry(limwin, 'Message size limit:', -- self.limit, '30').pack(side=TOP, fill=X) -- LabeledEntry(limwin, 'Size warning interval:', -- self.warnings, '30').pack(side=TOP, fill=X) -- LabeledEntry(limwin, 'Max messages to fetch per poll:', -- self.fetchlimit, '30').pack(side=TOP, fill=X) -- LabeledEntry(limwin, 'Max message sizes to fetch per transaction:', -- self.fetchsizelimit, '30').pack(side=TOP, fill=X) -- if self.parent.server.protocol not in ('ETRN', 'ODMR'): -- LabeledEntry(limwin, 'Use fast UIDL:', -- self.fastuidl, '30').pack(side=TOP, fill=X) -- LabeledEntry(limwin, 'Max messages to forward per poll:', -- self.batchlimit, '30').pack(side=TOP, fill=X) -- if self.parent.server.protocol not in ('ETRN', 'ODMR'): -- LabeledEntry(limwin, 'Interval between expunges:', -- self.expunge, '30').pack(side=TOP, fill=X) -- Checkbutton(limwin, text="Idle after each poll (IMAP only)", -- variable=self.idle).pack(side=TOP, anchor=W) -- limwin.pack(fill=X) -- -- if self.parent.server.protocol == 'IMAP': -- foldwin = Frame(rightwin, relief=RAISED, bd=5) -- Label(foldwin, text="Remote folders (IMAP only)").pack(side=TOP) -- ListEdit("New folder:", self.user.mailboxes, -- None, None, foldwin, None) -- foldwin.pack(fill=X, anchor=N) -- -- if mode != 'novice': -- rightwin.pack(side=LEFT) -- else: -- self.pack() -+ dispose_window(self, -+ "User options for " + self.user.remote + " querying " + servername, -+ userhelp) -+ -+ if mode != 'novice': -+ leftwin = Frame(self); -+ else: -+ leftwin = self -+ -+ secwin = Frame(leftwin, relief=RAISED, bd=5) -+ Label(secwin, text="Authentication").pack(side=TOP) -+ LabeledEntry(secwin, 'Password:', -+ self.password, '12').pack(side=TOP, fill=X) -+ secwin.pack(fill=X, anchor=N) -+ -+ if 'ssl' in feature_options or 'ssl' in dictmembers: -+ sslwin = Frame(leftwin, relief=RAISED, bd=5) -+ Checkbutton(sslwin, text="Use SSL?", -+ variable=self.ssl).pack(side=TOP, fill=X) -+ LabeledEntry(sslwin, 'SSL key:', -+ self.sslkey, '14').pack(side=TOP, fill=X) -+ LabeledEntry(sslwin, 'SSL certificate:', -+ self.sslcert, '14').pack(side=TOP, fill=X) -+ Checkbutton(sslwin, text="Check server SSL certificate?", -+ variable=self.sslcertck).pack(side=TOP, fill=X) -+ LabeledEntry(sslwin, 'SSL trusted certificate directory:', -+ self.sslcertpath, '14').pack(side=TOP, fill=X) -+ LabeledEntry(sslwin, 'SSL CommonName:', -+ self.sslcommonname, '14').pack(side=TOP, fill=X) -+ LabeledEntry(sslwin, 'SSL key fingerprint:', -+ self.sslfingerprint, '14').pack(side=TOP, fill=X) -+ sslwin.pack(fill=X, anchor=N) -+ -+ names = Frame(leftwin, relief=RAISED, bd=5) -+ Label(names, text="Local names").pack(side=TOP) -+ ListEdit("New name: ", -+ self.user.localnames, None, None, names, localhelp) -+ names.pack(fill=X, anchor=N) -+ -+ if mode != 'novice': -+ targwin = Frame(leftwin, relief=RAISED, bd=5) -+ Label(targwin, text="Forwarding Options").pack(side=TOP) -+ Label(targwin, text="Listeners to forward to").pack(side=TOP) -+ ListEdit("New listener:", -+ self.user.smtphunt, None, None, targwin, None) -+ Label(targwin, text="Domains to fetch from (ODMR/ETRN only)").pack(side=TOP) -+ ListEdit("Domains:", -+ self.user.fetchdomains, None, None, targwin, None) -+ LabeledEntry(targwin, 'Use domain on RCPT TO line:', -+ self.smtpaddress, '26').pack(side=TOP, fill=X) -+ LabeledEntry(targwin, 'Set fixed RCPT TO address:', -+ self.smtpname, '26').pack(side=TOP, fill=X) -+ LabeledEntry(targwin, 'Connection setup command:', -+ self.preconnect, '26').pack(side=TOP, fill=X) -+ LabeledEntry(targwin, 'Connection wrapup command:', -+ self.postconnect, '26').pack(side=TOP, fill=X) -+ LabeledEntry(targwin, 'Local delivery agent:', -+ self.mda, '26').pack(side=TOP, fill=X) -+ LabeledEntry(targwin, 'BSMTP output file:', -+ self.bsmtp, '26').pack(side=TOP, fill=X) -+ LabeledEntry(targwin, 'Listener spam-block codes:', -+ self.antispam, '26').pack(side=TOP, fill=X) -+ LabeledEntry(targwin, 'Pass-through properties:', -+ self.properties, '26').pack(side=TOP, fill=X) -+ Checkbutton(targwin, text="Use LMTP?", -+ variable=self.lmtp).pack(side=TOP, fill=X) -+ targwin.pack(fill=X, anchor=N) -+ -+ if mode != 'novice': -+ leftwin.pack(side=LEFT, fill=X, anchor=N) -+ rightwin = Frame(self) -+ else: -+ rightwin = self -+ -+ optwin = Frame(rightwin, relief=RAISED, bd=5) -+ Label(optwin, text="Processing Options").pack(side=TOP) -+ Checkbutton(optwin, text="Suppress deletion of messages after reading", -+ variable=self.keep).pack(side=TOP, anchor=W) -+ Checkbutton(optwin, text="Fetch old messages as well as new", -+ variable=self.fetchall).pack(side=TOP, anchor=W) -+ if mode != 'novice': -+ Checkbutton(optwin, text="Flush seen messages before retrieval", -+ variable=self.flush).pack(side=TOP, anchor=W) -+ Checkbutton(optwin, text="Flush oversized messages before retrieval", -+ variable=self.limitflush).pack(side=TOP, anchor=W) -+ Checkbutton(optwin, text="Rewrite To/Cc/Bcc messages to enable reply", -+ variable=self.rewrite).pack(side=TOP, anchor=W) -+ Checkbutton(optwin, text="Force CR/LF at end of each line", -+ variable=self.forcecr).pack(side=TOP, anchor=W) -+ Checkbutton(optwin, text="Strip CR from end of each line", -+ variable=self.stripcr).pack(side=TOP, anchor=W) -+ Checkbutton(optwin, text="Pass 8 bits even though SMTP says 7BIT", -+ variable=self.pass8bits).pack(side=TOP, anchor=W) -+ Checkbutton(optwin, text="Undo MIME armoring on header and body", -+ variable=self.mimedecode).pack(side=TOP, anchor=W) -+ Checkbutton(optwin, text="Drop Status lines from forwarded messages", -+ variable=self.dropstatus).pack(side=TOP, anchor=W) -+ Checkbutton(optwin, text="Drop Delivered-To lines from forwarded messages", -+ variable=self.dropdelivered).pack(side=TOP, anchor=W) -+ optwin.pack(fill=X) -+ -+ if mode != 'novice': -+ limwin = Frame(rightwin, relief=RAISED, bd=5) -+ Label(limwin, text="Resource Limits").pack(side=TOP) -+ LabeledEntry(limwin, 'Message size limit:', -+ self.limit, '30').pack(side=TOP, fill=X) -+ LabeledEntry(limwin, 'Size warning interval:', -+ self.warnings, '30').pack(side=TOP, fill=X) -+ LabeledEntry(limwin, 'Max messages to fetch per poll:', -+ self.fetchlimit, '30').pack(side=TOP, fill=X) -+ LabeledEntry(limwin, 'Max message sizes to fetch per transaction:', -+ self.fetchsizelimit, '30').pack(side=TOP, fill=X) -+ if self.parent.server.protocol not in ('ETRN', 'ODMR'): -+ LabeledEntry(limwin, 'Use fast UIDL:', -+ self.fastuidl, '30').pack(side=TOP, fill=X) -+ LabeledEntry(limwin, 'Max messages to forward per poll:', -+ self.batchlimit, '30').pack(side=TOP, fill=X) -+ if self.parent.server.protocol not in ('ETRN', 'ODMR'): -+ LabeledEntry(limwin, 'Interval between expunges:', -+ self.expunge, '30').pack(side=TOP, fill=X) -+ Checkbutton(limwin, text="Idle after each poll (IMAP only)", -+ variable=self.idle).pack(side=TOP, anchor=W) -+ limwin.pack(fill=X) -+ -+ if self.parent.server.protocol == 'IMAP': -+ foldwin = Frame(rightwin, relief=RAISED, bd=5) -+ Label(foldwin, text="Remote folders (IMAP only)").pack(side=TOP) -+ ListEdit("New folder:", self.user.mailboxes, -+ None, None, foldwin, None) -+ foldwin.pack(fill=X, anchor=N) -+ -+ if mode != 'novice': -+ rightwin.pack(side=LEFT) -+ else: -+ self.pack() - - - # -@@ -1793,162 +1793,162 @@ class UserEdit(Frame, MyWidget): - - class Configurator(Frame): - def __init__(self, outfile, master, onexit, parent): -- Frame.__init__(self, master) -- self.outfile = outfile -- self.onexit = onexit -- self.parent = parent -- self.master.title('fetchmail configurator'); -- self.master.iconname('fetchmail configurator'); -- Pack.config(self) -- self.keepalive = [] # Use this to anchor the PhotoImage object -- make_icon_window(self, fetchmail_icon) -- -- Message(self, text=""" -+ Frame.__init__(self, master) -+ self.outfile = outfile -+ self.onexit = onexit -+ self.parent = parent -+ self.master.title('fetchmail configurator'); -+ self.master.iconname('fetchmail configurator'); -+ Pack.config(self) -+ self.keepalive = [] # Use this to anchor the PhotoImage object -+ make_icon_window(self, fetchmail_icon) -+ -+ Message(self, text=""" - Use `Novice Configuration' for basic fetchmail setup; - with this, you can easily set up a single-drop connection - to one remote mail server. - """, width=600).pack(side=TOP) -- Button(self, text='Novice Configuration', -- fg='blue', command=self.novice).pack() -+ Button(self, text='Novice Configuration', -+ fg='blue', command=self.novice).pack() - -- Message(self, text=""" -+ Message(self, text=""" - Use `Expert Configuration' for advanced fetchmail setup, - including multiple-site or multidrop connections. - """, width=600).pack(side=TOP) -- Button(self, text='Expert Configuration', -- fg='blue', command=self.expert).pack() -+ Button(self, text='Expert Configuration', -+ fg='blue', command=self.expert).pack() - -- Message(self, text=""" -+ Message(self, text=""" - Or you can just select `Quit' to leave the configurator now and - return to the main panel. - """, width=600).pack(side=TOP) -- Button(self, text='Quit', fg='blue', command=self.leave).pack() -- master.protocol("WM_DELETE_WINDOW", self.leave) -+ Button(self, text='Quit', fg='blue', command=self.leave).pack() -+ master.protocol("WM_DELETE_WINDOW", self.leave) - - def novice(self): -- self.master.destroy() -- ConfigurationEdit(Fetchmailrc, self.outfile, Toplevel(), self.onexit).edit('novice') -+ self.master.destroy() -+ ConfigurationEdit(Fetchmailrc, self.outfile, Toplevel(), self.onexit).edit('novice') - - def expert(self): -- self.master.destroy() -- ConfigurationEdit(Fetchmailrc, self.outfile, Toplevel(), self.onexit).edit('expert') -+ self.master.destroy() -+ ConfigurationEdit(Fetchmailrc, self.outfile, Toplevel(), self.onexit).edit('expert') - - def leave(self): -- self.master.destroy() -- self.onexit() -+ self.master.destroy() -+ self.onexit() - - # Run a command in a scrolling text widget, displaying its output - - class RunWindow(Frame): - def __init__(self, command, master, parent): -- Frame.__init__(self, master) -- self.master = master -- self.master.title('fetchmail run window'); -- self.master.iconname('fetchmail run window'); -- Pack.config(self) -- Label(self, -- text="Running "+command, -- bd=2).pack(side=TOP, pady=10) -- self.keepalive = [] # Use this to anchor the PhotoImage object -- make_icon_window(self, fetchmail_icon) -- -- # This is a scrolling text window -- textframe = Frame(self) -- scroll = Scrollbar(textframe) -- self.textwidget = Text(textframe, setgrid=TRUE) -- textframe.pack(side=TOP, expand=YES, fill=BOTH) -- self.textwidget.config(yscrollcommand=scroll.set) -- self.textwidget.pack(side=LEFT, expand=YES, fill=BOTH) -- scroll.config(command=self.textwidget.yview) -- scroll.pack(side=RIGHT, fill=BOTH) -- textframe.pack(side=TOP) -- -- Button(self, text='Quit', fg='blue', command=self.leave).pack() -- -- self.update() # Draw widget before executing fetchmail -- -- # Always look for a runnable command in the directory we're running in -- # first. This avoids some obscure version-skew errors that can occur -- # if you pick up an old fetchmail from the standard system locations. -- os.environ["PATH"] = os.path.dirname(sys.argv[0]) + ":" + os.environ["PATH"] -- child_stdout = os.popen(command + " 2>&1 &1 " + tmpfile -+ cmd = "umask 077 && fetchmail " + tmpfile - else: -- cmd = "umask 077 && fetchmail " + tmpfile -+ cmd = "umask 077 && fetchmail " + tmpfile - - try: -- s = os.system(cmd) -- if s != 0: -- print "`" + cmd + "' run failure, status " + `s` -- raise SystemExit -+ s = os.system(cmd) -+ if s != 0: -+ print "`" + cmd + "' run failure, status " + `s` -+ raise SystemExit - except: -- print "Unknown error while running fetchmail --configdump" -- os.remove(tmpfile) -- sys.exit(1) -+ print "Unknown error while running fetchmail --configdump" -+ os.remove(tmpfile) -+ sys.exit(1) - - try: -- execfile(tmpfile) -+ execfile(tmpfile) - except: -- print "Can't read configuration output of fetchmail --configdump." -- os.remove(tmpfile) -- sys.exit(1) -+ print "Can't read configuration output of fetchmail --configdump." -+ os.remove(tmpfile) -+ sys.exit(1) - - os.remove(tmpfile) - -@@ -2145,23 +2145,23 @@ COPYING in the source or documentation directory for details.""" - copy_instance(Fetchmailrc, fetchmailrc) - Fetchmailrc.servers = []; - for server in fetchmailrc['servers']: -- Newsite = Server() -- copy_instance(Newsite, server) -- Fetchmailrc.servers.append(Newsite) -- Newsite.users = []; -- for user in server['users']: -- Newuser = User() -- copy_instance(Newuser, user) -- Newsite.users.append(Newuser) -+ Newsite = Server() -+ copy_instance(Newsite, server) -+ Fetchmailrc.servers.append(Newsite) -+ Newsite.users = []; -+ for user in server['users']: -+ Newuser = User() -+ copy_instance(Newuser, user) -+ Newsite.users.append(Newuser) - - # We may want to display the configuration and quit - if dump: -- print "This is a dump of the configuration we read:\n"+`Fetchmailrc` -+ print "This is a dump of the configuration we read:\n"+`Fetchmailrc` - - # The theory here is that -f alone sets the rcfile location, - # but -d and -f together mean the new configuration should go to stdout. - if not rcfile and not dump: -- rcfile = os.environ["HOME"] + "/.fetchmailrc" -+ rcfile = os.environ["HOME"] + "/.fetchmailrc" - - # OK, now run the configuration edit - root = MainWindow(rcfile) --- -libgit2 0.26.0 - diff --git a/fetchmail-fetchmailconf-python3-2of3.patch b/fetchmail-fetchmailconf-python3-2of3.patch deleted file mode 100644 index 37157fd..0000000 --- a/fetchmail-fetchmailconf-python3-2of3.patch +++ /dev/null @@ -1,280 +0,0 @@ -From ff279a5697992730bc885ddd171456c06c09fb10 Mon Sep 17 00:00:00 2001 -From: Samuel Martin -Date: Wed, 8 Jun 2016 21:36:29 +0200 -Subject: [PATCH] fetchmailconf.py: make fetchmailconf.py python{2, 3}-compliant - -This change does: -- use repr(...) instead of `...` (see [1]); -- fix print call; -- fix octal numbers. - -[1] https://docs.python.org/release/3.0.1/whatsnew/3.0.html#removed-syntax - -Signed-off-by: Samuel Martin -Signed-off-by: Matthias Andree ---- - fetchmailconf.py | 94 ++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------- - 1 file changed, 48 insertions(+), 46 deletions(-) - -diff --git a/fetchmailconf.py b/fetchmailconf.py -index d64556e..697e4f7 100755 ---- a/fetchmailconf.py -+++ b/fetchmailconf.py -@@ -5,6 +5,8 @@ - # Matthias Andree - # Requires Python with Tkinter, and the following OS-dependent services: - # posix, posixpath, socket -+from __future__ import print_function -+ - version = "1.57" - - from Tkinter import * -@@ -64,7 +66,7 @@ class Configuration: - if self.properties != ConfigurationDefaults.properties: - str = str + ("set properties \"%s\"\n" % (self.properties,)); - if self.poll_interval > 0: -- str = str + "set daemon " + `self.poll_interval` + "\n" -+ str = str + "set daemon " + repr(self.poll_interval) + "\n" - if self.invisible: - str = str + ("set invisible\n") - for site in self.servers: -@@ -145,12 +147,12 @@ class Server: - if self.service and self.protocol and self.service != defaultports[self.protocol] and defaultports[self.protocol] and self.service != ianaservices[defaultports[self.protocol]]: - res = res + " service " + self.service - if self.timeout != ServerDefaults.timeout: -- res = res + " timeout " + `self.timeout` -+ res = res + " timeout " + repr(self.timeout) - if self.interval != ServerDefaults.interval: -- res = res + " interval " + `self.interval` -+ res = res + " interval " + repr(self.interval) - if self.envelope != ServerDefaults.envelope or self.envskip != ServerDefaults.envskip: - if self.envskip: -- res = res + " envelope " + `self.envskip` + " " + self.envelope -+ res = res + " envelope " + repr(self.envskip) + " " + self.envelope - else: - res = res + " envelope " + self.envelope - if self.qvirtual: -@@ -189,15 +191,15 @@ class Server: - if self.monitor: - res = res + " monitor " + str(self.monitor) - if self.plugin: -- res = res + " plugin " + `self.plugin` -+ res = res + " plugin " + repr(self.plugin) - if self.plugout: -- res = res + " plugout " + `self.plugout` -+ res = res + " plugout " + repr(self.plugout) - if self.principal: -- res = res + " principal " + `self.principal` -+ res = res + " principal " + repr(self.principal) - if self.esmtpname: -- res = res + " esmtpname " + `self.esmtpname` -+ res = res + " esmtpname " + repr(self.esmtpname) - if self.esmtppassword: -- res = res + " esmtppassword " + `self.esmtppassword` -+ res = res + " esmtppassword " + repr(self.esmtppassword) - if self.interface or self.monitor or self.principal or self.plugin or self.plugout: - if folded: - res = res + "\n" -@@ -230,7 +232,7 @@ class User: - elif os.environ.has_key("LOGNAME"): - self.remote = os.environ["LOGNAME"] - else: -- print "Can't get your username!" -+ print("Can't get your username!") - sys.exit(1) - self.localnames = [self.remote,]# Local names - self.password = None # Password for mail account access -@@ -316,13 +318,13 @@ class User: - - def __repr__(self): - res = " " -- res = res + "user " + `self.remote` + " there "; -+ res = res + "user " + repr(self.remote) + " there "; - if self.password: -- res = res + "with password " + `self.password` + " " -+ res = res + "with password " + repr(self.password) + " " - if self.localnames: - res = res + "is" - for x in self.localnames: -- res = res + " " + `x` -+ res = res + " " + repr(x) - res = res + " here" - if (self.keep != UserDefaults.keep - or self.flush != UserDefaults.flush -@@ -362,35 +364,35 @@ class User: - if self.idle != UserDefaults.idle: - res = res + flag2str(self.idle, 'idle') - if self.limit != UserDefaults.limit: -- res = res + " limit " + `self.limit` -+ res = res + " limit " + repr(self.limit) - if self.warnings != UserDefaults.warnings: -- res = res + " warnings " + `self.warnings` -+ res = res + " warnings " + repr(self.warnings) - if self.fetchlimit != UserDefaults.fetchlimit: -- res = res + " fetchlimit " + `self.fetchlimit` -+ res = res + " fetchlimit " + repr(self.fetchlimit) - if self.fetchsizelimit != UserDefaults.fetchsizelimit: -- res = res + " fetchsizelimit " + `self.fetchsizelimit` -+ res = res + " fetchsizelimit " + repr(self.fetchsizelimit) - if self.fastuidl != UserDefaults.fastuidl: -- res = res + " fastuidl " + `self.fastuidl` -+ res = res + " fastuidl " + repr(self.fastuidl) - if self.batchlimit != UserDefaults.batchlimit: -- res = res + " batchlimit " + `self.batchlimit` -+ res = res + " batchlimit " + repr(self.batchlimit) - if self.ssl and self.ssl != UserDefaults.ssl: - res = res + flag2str(self.ssl, 'ssl') - if self.sslkey and self.sslkey != UserDefaults.sslkey: -- res = res + " sslkey " + `self.sslkey` -+ res = res + " sslkey " + repr(self.sslkey) - if self.sslcert and self.sslcert != UserDefaults.sslcert: -- res = res + " sslcert " + `self.sslcert` -+ res = res + " sslcert " + repr(self.sslcert) - if self.sslproto and self.sslproto != UserDefaults.sslproto: -- res = res + " sslproto " + `self.sslproto` -+ res = res + " sslproto " + repr(self.sslproto) - if self.sslcertck and self.sslcertck != UserDefaults.sslcertck: - res = res + flag2str(self.sslcertck, 'sslcertck') - if self.sslcertpath and self.sslcertpath != UserDefaults.sslcertpath: -- res = res + " sslcertpath " + `self.sslcertpath` -+ res = res + " sslcertpath " + repr(self.sslcertpath) - if self.sslcommonname and self.sslcommonname != UserDefaults.sslcommonname: -- res = res + " sslcommonname " + `self.sslcommonname` -+ res = res + " sslcommonname " + repr(self.sslcommonname) - if self.sslfingerprint and self.sslfingerprint != UserDefaults.sslfingerprint: -- res = res + " sslfingerprint " + `self.sslfingerprint` -+ res = res + " sslfingerprint " + repr(self.sslfingerprint) - if self.expunge != UserDefaults.expunge: -- res = res + " expunge " + `self.expunge` -+ res = res + " expunge " + repr(self.expunge) - res = res + "\n" - trimmed = self.smtphunt; - if trimmed != [] and trimmed[len(trimmed) - 1] == "localhost": -@@ -417,7 +419,7 @@ class User: - res = res + "\n" - for fld in ('smtpaddress', 'preconnect', 'postconnect', 'mda', 'bsmtp', 'properties'): - if getattr(self, fld): -- res = res + " %s %s\n" % (fld, `getattr(self, fld)`) -+ res = res + " %s %s\n" % (fld, repr(getattr(self, fld))) - if self.lmtp != UserDefaults.lmtp: - res = res + flag2str(self.lmtp, 'lmtp') - if self.antispam != UserDefaults.antispam: -@@ -904,15 +906,15 @@ class ConfigurationEdit(Frame, MyWidget): - # Pre-1.5.2 compatibility... - except os.error: - pass -- oldumask = os.umask(077) -+ oldumask = os.umask(0o77) - fm = open(self.outfile, 'w') - os.umask(oldumask) - if fm: - # be paranoid - if fm != sys.stdout: -- os.chmod(self.outfile, 0600) -+ os.chmod(self.outfile, 0o600) - fm.write("# Configuration created %s by fetchmailconf %s\n" % (time.ctime(time.time()), version)) -- fm.write(`self.configuration`) -+ fm.write(repr(self.configuration)) - if self.outfile: - fm.close() - self.destruct() -@@ -1988,15 +1990,15 @@ def copy_instance(toclass, fromdict): - if 'typemap' in class_sig: - class_sig.remove('typemap') - if tuple(class_sig) != tuple(dict_keys): -- print "Fields don't match what fetchmailconf expected:" --# print "Class signature: " + `class_sig` --# print "Dictionary keys: " + `dict_keys` -+ print("Fields don't match what fetchmailconf expected:") -+# print("Class signature: " + repr(class_sig)) -+# print("Dictionary keys: " + repr(dict_keys)) - diff = setdiff(class_sig, common) - if diff: -- print "Not matched in class `" + toclass.__class__.__name__ + "' signature: " + `diff` -+ print("Not matched in class `" + toclass.__class__.__name__ + "' signature: " + repr(diff)) - diff = setdiff(dict_keys, common) - if diff: -- print "Not matched in dictionary keys: " + `diff` -+ print("Not matched in dictionary keys: " + repr(diff)) - sys.exit(1) - else: - for x in fromdict.keys(): -@@ -2028,7 +2030,7 @@ def copy_instance(toclass, fromdict): - if __name__ == '__main__': - - if not os.environ.has_key("DISPLAY"): -- print "fetchmailconf must be run under X" -+ print("fetchmailconf must be run under X") - sys.exit(1) - - fetchmail_icon = """ -@@ -2068,7 +2070,7 @@ gUSiYASJpMEHhilJTEnhAlGoQqYAZQ1AiqEMZ0jDGtqQImhwwA13yMMevoQAGvGhEAWHGMOAAAA7 - # The base64 data in the string above was generated by the following procedure: - # - # import base64 --# print base64.encodestring(open("fetchmail.gif", "rb").read()) -+# print(base64.encodestring(open("fetchmail.gif", "rb").read())) - # - - # Process options -@@ -2081,22 +2083,22 @@ gUSiYASJpMEHhilJTEnhAlGoQqYAZQ1AiqEMZ0jDGtqQImhwwA13yMMevoQAGvGhEAWHGMOAAAA7 - elif (switch == '-f'): - rcfile = val - elif (switch == '-h' or switch == '--help'): -- print """ -+ print(""" - Usage: fetchmailconf {[-d] [-f fetchmailrc]|-h|--help|-V|--version} - -d - dump configuration (for debugging) - -f fmrc - read alternate fetchmailrc file - --help, -h - print this help text and quit - --version, -V - print fetchmailconf version and quit --""" -+""") - sys.exit(0) - elif (switch == '-V' or switch == '--version'): -- print "fetchmailconf %s" % version -- print """ -+ print("fetchmailconf %s" % version) -+ print(""" - Copyright (C) 1997 - 2003 Eric S. Raymond - Copyright (C) 2005, 2006, 2008, 2009 Matthias Andree - fetchmailconf comes with ABSOLUTELY NO WARRANTY. This is free software, you are - welcome to redistribute it under certain conditions. Please see the file --COPYING in the source or documentation directory for details.""" -+COPYING in the source or documentation directory for details.""") - sys.exit(0) - - # Get client host's FQDN -@@ -2119,17 +2121,17 @@ COPYING in the source or documentation directory for details.""" - try: - s = os.system(cmd) - if s != 0: -- print "`" + cmd + "' run failure, status " + `s` -+ print("`" + cmd + "' run failure, status " + repr(s)) - raise SystemExit - except: -- print "Unknown error while running fetchmail --configdump" -+ print("Unknown error while running fetchmail --configdump") - os.remove(tmpfile) - sys.exit(1) - - try: - execfile(tmpfile) - except: -- print "Can't read configuration output of fetchmail --configdump." -+ print("Can't read configuration output of fetchmail --configdump.") - os.remove(tmpfile) - sys.exit(1) - -@@ -2156,7 +2158,7 @@ COPYING in the source or documentation directory for details.""" - - # We may want to display the configuration and quit - if dump: -- print "This is a dump of the configuration we read:\n"+`Fetchmailrc` -+ print("This is a dump of the configuration we read:\n" + repr(Fetchmailrc)) - - # The theory here is that -f alone sets the rcfile location, - # but -d and -f together mean the new configuration should go to stdout. --- -libgit2 0.26.0 - diff --git a/fetchmail-fetchmailconf-python3-3of3.patch b/fetchmail-fetchmailconf-python3-3of3.patch deleted file mode 100644 index 025bac8..0000000 --- a/fetchmail-fetchmailconf-python3-3of3.patch +++ /dev/null @@ -1,86 +0,0 @@ -From 1a405368c25f76db054fd3befa7fb72e7a5e1f2e Mon Sep 17 00:00:00 2001 -From: Matthias Andree -Date: Wed, 8 Jun 2016 22:34:23 +0200 -Subject: [PATCH] A few Python 3 compatibility fixes. - -Still needs 2to3 to be run under Python 3. ---- - fetchmailconf.py | 20 +++++++++++++------- - 1 file changed, 13 insertions(+), 7 deletions(-) - -diff --git a/fetchmailconf.py b/fetchmailconf.py -index 697e4f7..5c0b8ed 100755 ---- a/fetchmailconf.py -+++ b/fetchmailconf.py -@@ -5,12 +5,17 @@ - # Matthias Andree - # Requires Python with Tkinter, and the following OS-dependent services: - # posix, posixpath, socket -+ -+# WARNING: this needs to be updated for fetchmail 6.4's SSL options, -+# and other recent new options; -+# WARNING: to be compatible with Python 3, needs to be run thru 2to3.py. - from __future__ import print_function - --version = "1.57" -+version = "1.58" - - from Tkinter import * - from Dialog import * -+ - import sys, time, os, string, socket, getopt, tempfile - - # -@@ -227,9 +232,9 @@ class Server: - - class User: - def __init__(self): -- if os.environ.has_key("USER"): -+ if "USER" in os.environ: - self.remote = os.environ["USER"] # Remote username -- elif os.environ.has_key("LOGNAME"): -+ elif "LOGNAME" in os.environ: - self.remote = os.environ["LOGNAME"] - else: - print("Can't get your username!") -@@ -1123,7 +1128,7 @@ class ServerEdit(Frame, MyWidget): - self.subwidgets[username] = UserEdit(username, self).edit(mode, Toplevel()) - - def user_delete(self, username): -- if self.subwidgets.has_key(username): -+ if username in self.subwidgets: - self.subwidgets[username].destruct() - del self.server[username] - -@@ -1627,7 +1632,7 @@ class UserEdit(Frame, MyWidget): - - def destruct(self): - # Yes, this test can fail -- if you delete the parent window. -- if self.parent.subwidgets.has_key(self.user.remote): -+ if self.user.remote in self.parent.subwidgets: - del self.parent.subwidgets[self.user.remote] - self.master.destroy() - -@@ -2029,7 +2034,7 @@ def copy_instance(toclass, fromdict): - - if __name__ == '__main__': - -- if not os.environ.has_key("DISPLAY"): -+ if "DISPLAY" not in os.environ: - print("fetchmailconf must be run under X") - sys.exit(1) - -@@ -2130,8 +2135,9 @@ COPYING in the source or documentation directory for details.""") - - try: - execfile(tmpfile) -- except: -+ except Exception as e: - print("Can't read configuration output of fetchmail --configdump.") -+ print(repr(e)) - os.remove(tmpfile) - sys.exit(1) - --- -libgit2 0.26.0 - diff --git a/fetchmail-openssl11.patch b/fetchmail-openssl11.patch deleted file mode 100644 index 9e01412..0000000 --- a/fetchmail-openssl11.patch +++ /dev/null @@ -1,1576 +0,0 @@ -Description: - TODO: Put a short summary on the line above and replace this paragraph - with a longer explanation of this change. Complete the meta-information - with other relevant fields (see below for details). To make it easier, the - information below has been extracted from the changelog. Adjust it or drop - it. - . - fetchmail (6.3.26-2) unstable; urgency=low - . - * New maintainer (closes: #800750). - * Backport upstream fix for SSLv3 removal (closes: #804604) and do not - recommend SSLv3 (closes: #801178). - * Remove quilt and its usage. - * Add dh-python to build depends. - * Update upstream URLs. - * Update watch file. - * Update Standards-Version to 3.9.6 . -Author: Laszlo Boszormenyi (GCS) -Bug-Debian: https://bugs.debian.org/800750 -Bug-Debian: https://bugs.debian.org/801178 -Bug-Debian: https://bugs.debian.org/804604 - ---- -The information above should follow the Patch Tagging Guidelines, please -checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here -are templates for supplementary fields that you might want to add: - -Origin: , -Bug: -Bug-Debian: https://bugs.debian.org/ -Bug-Ubuntu: https://launchpad.net/bugs/ -Forwarded: -Reviewed-By: -Last-Update: - ---- fetchmail-6.3.26.orig/Makefile.am -+++ fetchmail-6.3.26/Makefile.am -@@ -31,7 +31,7 @@ libfm_a_SOURCES= xmalloc.c base64.c rfc8 - servport.c ntlm.h smbbyteorder.h smbdes.h smbmd4.h \ - smbencrypt.h smbdes.c smbencrypt.c smbmd4.c smbutil.c \ - libesmtp/gethostbyname.h libesmtp/gethostbyname.c \ -- smbtypes.h fm_getaddrinfo.c tls.c rfc822valid.c \ -+ smbtypes.h fm_getaddrinfo.c starttls.c rfc822valid.c \ - xmalloc.h sdump.h sdump.c x509_name_match.c \ - fm_strl.h md5c.c - if NTLM_ENABLE ---- fetchmail-6.3.26.orig/Makefile.in -+++ fetchmail-6.3.26/Makefile.in -@@ -97,14 +97,14 @@ am__libfm_a_SOURCES_DIST = xmalloc.c bas - rfc2047e.c servport.c ntlm.h smbbyteorder.h smbdes.h smbmd4.h \ - smbencrypt.h smbdes.c smbencrypt.c smbmd4.c smbutil.c \ - libesmtp/gethostbyname.h libesmtp/gethostbyname.c smbtypes.h \ -- fm_getaddrinfo.c tls.c rfc822valid.c xmalloc.h sdump.h sdump.c \ -+ fm_getaddrinfo.c starttls.c rfc822valid.c xmalloc.h sdump.h sdump.c \ - x509_name_match.c fm_strl.h md5c.c ntlmsubr.c - @NTLM_ENABLE_TRUE@am__objects_1 = ntlmsubr.$(OBJEXT) - am_libfm_a_OBJECTS = xmalloc.$(OBJEXT) base64.$(OBJEXT) \ - rfc822.$(OBJEXT) report.$(OBJEXT) rfc2047e.$(OBJEXT) \ - servport.$(OBJEXT) smbdes.$(OBJEXT) smbencrypt.$(OBJEXT) \ - smbmd4.$(OBJEXT) smbutil.$(OBJEXT) gethostbyname.$(OBJEXT) \ -- fm_getaddrinfo.$(OBJEXT) tls.$(OBJEXT) rfc822valid.$(OBJEXT) \ -+ fm_getaddrinfo.$(OBJEXT) starttls.$(OBJEXT) rfc822valid.$(OBJEXT) \ - sdump.$(OBJEXT) x509_name_match.$(OBJEXT) md5c.$(OBJEXT) \ - $(am__objects_1) - libfm_a_OBJECTS = $(am_libfm_a_OBJECTS) -@@ -483,7 +483,7 @@ libfm_a_SOURCES = xmalloc.c base64.c rfc - servport.c ntlm.h smbbyteorder.h smbdes.h smbmd4.h \ - smbencrypt.h smbdes.c smbencrypt.c smbmd4.c smbutil.c \ - libesmtp/gethostbyname.h libesmtp/gethostbyname.c smbtypes.h \ -- fm_getaddrinfo.c tls.c rfc822valid.c xmalloc.h sdump.h sdump.c \ -+ fm_getaddrinfo.c starttls.c rfc822valid.c xmalloc.h sdump.h sdump.c \ - x509_name_match.c fm_strl.h md5c.c $(am__append_1) - libfm_a_LIBADD = $(EXTRAOBJ) - libfm_a_DEPENDENCIES = $(EXTRAOBJ) ---- fetchmail-6.3.26.orig/NEWS -+++ fetchmail-6.3.26/NEWS -@@ -51,8 +51,6 @@ removed from a 6.4.0 or newer release.) - * The --bsmtp - mode of operation may be removed in a future release. - * Given that OpenSSL is severely underdocumented, and needs license exceptions, - fetchmail may switch to a different SSL library. --* SSLv2 support will be removed from a future fetchmail release. It has been -- obsolete for more than a decade. - - -------------------------------------------------------------------------------- - ---- fetchmail-6.3.26.orig/README.SSL -+++ fetchmail-6.3.26/README.SSL -@@ -11,36 +11,45 @@ specific to fetchmail. - In case of troubles, mail the README.SSL-SERVER file to your ISP and - have them check their server configuration against it. - --Unfortunately, fetchmail confuses SSL/TLS protocol levels with whether --a service needs to use in-band negotiation (STLS/STARTTLS for POP3/IMAP4) or is --totally SSL-wrapped on a separate port. For compatibility reasons, this cannot --be fixed in a bugfix release. -+Unfortunately, fetchmail confuses SSL/TLS protocol levels with whether a -+service needs to use in-band negotiation (STLS/STARTTLS for POP3/IMAP4) -+or is totally SSL-wrapped on a separate port. For compatibility -+reasons, this cannot be fixed in a bugfix or minor release. -+ -+Also, fetchmail 6.4.0 and newer releases changed some of the semantics -+as the result of a bug-fix, and will auto-negotiate TLSv1 or newer only. -+If your server does not support this, you may have to specify --sslproto -+ssl3. This is in order to prefer the newer TLS protocols, because SSLv2 -+and v3 are broken. - -- -- Matthias Andree, 2009-05-09 -+ -- Matthias Andree, 2015-01-16 - - - Quickstart - ---------- - -+Use an up-to-date release of OpenSSL 1.0.1 or newer, so as to get -+TLSv1.2 support. -+ - For use of SSL or TLS with in-band negotiation on the regular service's port, - i. e. with STLS or STARTTLS, use these command line options - -- --sslproto tls1 --sslcertck -+ --sslproto auto --sslcertck - - or these options in the rcfile (after the respective "user"... options) - -- sslproto tls1 sslcertck -+ sslproto auto sslcertck - - - For use of SSL or TLS on a separate port, if the whole TCP connection is --SSL-encrypted from the very beginning, use these command line options (in the --rcfile, omit all leading "--"): -+SSL-encrypted from the very beginning (SSL- or TLS-wrapped), use these -+command line options (in the rcfile, omit all leading "--"): - -- --ssl --sslproto ssl3 --sslcertck -+ --ssl --sslproto auto --sslcertck - - or these options in the rcfile (after the respective "user"... options) - -- ssl sslproto ssl3 sslcertck -+ ssl sslproto auto sslcertck - - - Background and use (long version :-)) ---- fetchmail-6.3.26.orig/config.h.in -+++ fetchmail-6.3.26/config.h.in -@@ -49,9 +49,9 @@ - don't. */ - #undef HAVE_DECL_H_ERRNO - --/* Define to 1 if you have the declaration of `SSLv2_client_method', and to 0 -+/* Define to 1 if you have the declaration of `SSLv3_client_method', and to 0 - if you don't. */ --#undef HAVE_DECL_SSLV2_CLIENT_METHOD -+#undef HAVE_DECL_SSLV3_CLIENT_METHOD - - /* Define to 1 if you have the declaration of `strerror', and to 0 if you - don't. */ ---- fetchmail-6.3.26.orig/configure -+++ fetchmail-6.3.26/configure -@@ -1,13 +1,11 @@ - #! /bin/sh - # Guess values for system-dependent variables and create Makefiles. --# Generated by GNU Autoconf 2.68 for fetchmail 6.3.26. -+# Generated by GNU Autoconf 2.69 for fetchmail 6.3.26. - # - # Report bugs to . - # - # --# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, --# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software --# Foundation, Inc. -+# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. - # - # - # This configure script is free software; the Free Software Foundation -@@ -136,6 +134,31 @@ export LANGUAGE - # CDPATH. - (unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -+# Use a proper internal environment variable to ensure we don't fall -+ # into an infinite loop, continuously re-executing ourselves. -+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then -+ _as_can_reexec=no; export _as_can_reexec; -+ # We cannot yet assume a decent shell, so we have to provide a -+# neutralization value for shells without unset; and this also -+# works around shells that cannot unset nonexistent variables. -+# Preserve -v and -x to the replacement shell. -+BASH_ENV=/dev/null -+ENV=/dev/null -+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -+case $- in # (((( -+ *v*x* | *x*v* ) as_opts=-vx ;; -+ *v* ) as_opts=-v ;; -+ *x* ) as_opts=-x ;; -+ * ) as_opts= ;; -+esac -+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -+# Admittedly, this is quite paranoid, since all the known shells bail -+# out after a failed `exec'. -+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -+as_fn_exit 255 -+ fi -+ # We don't want this to propagate to other subprocesses. -+ { _as_can_reexec=; unset _as_can_reexec;} - if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh -@@ -169,7 +192,8 @@ if ( set x; as_fn_ret_success y && test - else - exitcode=1; echo positional parameters were not saved. - fi --test x\$exitcode = x0 || exit 1" -+test x\$exitcode = x0 || exit 1 -+test -x / || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && -@@ -214,21 +238,25 @@ IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : -- # We cannot yet assume a decent shell, so we have to provide a -- # neutralization value for shells without unset; and this also -- # works around shells that cannot unset nonexistent variables. -- # Preserve -v and -x to the replacement shell. -- BASH_ENV=/dev/null -- ENV=/dev/null -- (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -- export CONFIG_SHELL -- case $- in # (((( -- *v*x* | *x*v* ) as_opts=-vx ;; -- *v* ) as_opts=-v ;; -- *x* ) as_opts=-x ;; -- * ) as_opts= ;; -- esac -- exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} -+ export CONFIG_SHELL -+ # We cannot yet assume a decent shell, so we have to provide a -+# neutralization value for shells without unset; and this also -+# works around shells that cannot unset nonexistent variables. -+# Preserve -v and -x to the replacement shell. -+BASH_ENV=/dev/null -+ENV=/dev/null -+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -+case $- in # (((( -+ *v*x* | *x*v* ) as_opts=-vx ;; -+ *v* ) as_opts=-v ;; -+ *x* ) as_opts=-x ;; -+ * ) as_opts= ;; -+esac -+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -+# Admittedly, this is quite paranoid, since all the known shells bail -+# out after a failed `exec'. -+$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -+exit 255 - fi - - if test x$as_have_required = xno; then : -@@ -331,6 +359,14 @@ $as_echo X"$as_dir" | - - - } # as_fn_mkdir_p -+ -+# as_fn_executable_p FILE -+# ----------------------- -+# Test if FILE is an executable regular file. -+as_fn_executable_p () -+{ -+ test -f "$1" && test -x "$1" -+} # as_fn_executable_p - # as_fn_append VAR VALUE - # ---------------------- - # Append the text in VALUE to the end of the definition contained in VAR. Take -@@ -452,6 +488,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } - -+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have -+ # already done that, so ensure we don't try to do so again and fall -+ # in an infinite loop. This has already happened in practice. -+ _as_can_reexec=no; export _as_can_reexec - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). -@@ -486,16 +526,16 @@ if (echo >conf$$.file) 2>/dev/null; then - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. -- # In both cases, we have to default to `cp -p'. -+ # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || -- as_ln_s='cp -p' -+ as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else -- as_ln_s='cp -p' -+ as_ln_s='cp -pR' - fi - else -- as_ln_s='cp -p' -+ as_ln_s='cp -pR' - fi - rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file - rmdir conf$$.dir 2>/dev/null -@@ -507,28 +547,8 @@ else - as_mkdir_p=false - fi - --if test -x / >/dev/null 2>&1; then -- as_test_x='test -x' --else -- if ls -dL / >/dev/null 2>&1; then -- as_ls_L_option=L -- else -- as_ls_L_option= -- fi -- as_test_x=' -- eval sh -c '\'' -- if test -d "$1"; then -- test -d "$1/."; -- else -- case $1 in #( -- -*)set "./$1";; -- esac; -- case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( -- ???[sx]*):;;*)false;;esac;fi -- '\'' sh -- ' --fi --as_executable_p=$as_test_x -+as_test_x='test -x' -+as_executable_p=as_fn_executable_p - - # Sed expression to map a string onto a valid CPP name. - as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" -@@ -742,6 +762,7 @@ infodir - docdir - oldincludedir - includedir -+runstatedir - localstatedir - sharedstatedir - sysconfdir -@@ -841,6 +862,7 @@ datadir='${datarootdir}' - sysconfdir='${prefix}/etc' - sharedstatedir='${prefix}/com' - localstatedir='${prefix}/var' -+runstatedir='${localstatedir}/run' - includedir='${prefix}/include' - oldincludedir='/usr/include' - docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' -@@ -1093,6 +1115,15 @@ do - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - -+ -runstatedir | --runstatedir | --runstatedi | --runstated \ -+ | --runstate | --runstat | --runsta | --runst | --runs \ -+ | --run | --ru | --r) -+ ac_prev=runstatedir ;; -+ -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ -+ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ -+ | --run=* | --ru=* | --r=*) -+ runstatedir=$ac_optarg ;; -+ - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ -@@ -1230,7 +1261,7 @@ fi - for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ -- libdir localedir mandir -+ libdir localedir mandir runstatedir - do - eval ac_val=\$$ac_var - # Remove trailing slashes. -@@ -1258,8 +1289,6 @@ target=$target_alias - if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe -- $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. -- If a cross compiler is detected then cross compile mode will be used" >&2 - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -@@ -1385,6 +1414,7 @@ Fine tuning of the installation director - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] -+ --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] -@@ -1548,9 +1578,9 @@ test -n "$ac_init_help" && exit $ac_stat - if $ac_init_version; then - cat <<\_ACEOF - fetchmail configure 6.3.26 --generated by GNU Autoconf 2.68 -+generated by GNU Autoconf 2.69 - --Copyright (C) 2010 Free Software Foundation, Inc. -+Copyright (C) 2012 Free Software Foundation, Inc. - This configure script is free software; the Free Software Foundation - gives unlimited permission to copy, distribute and modify it. - _ACEOF -@@ -1827,7 +1857,7 @@ $as_echo "$ac_try_echo"; } >&5 - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || -- $as_test_x conftest$ac_exeext -+ test -x conftest$ac_exeext - }; then : - ac_retval=0 - else -@@ -2030,7 +2060,8 @@ int - main () - { - static int test_array [1 - 2 * !(($2) >= 0)]; --test_array [0] = 0 -+test_array [0] = 0; -+return test_array [0]; - - ; - return 0; -@@ -2046,7 +2077,8 @@ int - main () - { - static int test_array [1 - 2 * !(($2) <= $ac_mid)]; --test_array [0] = 0 -+test_array [0] = 0; -+return test_array [0]; - - ; - return 0; -@@ -2072,7 +2104,8 @@ int - main () - { - static int test_array [1 - 2 * !(($2) < 0)]; --test_array [0] = 0 -+test_array [0] = 0; -+return test_array [0]; - - ; - return 0; -@@ -2088,7 +2121,8 @@ int - main () - { - static int test_array [1 - 2 * !(($2) >= $ac_mid)]; --test_array [0] = 0 -+test_array [0] = 0; -+return test_array [0]; - - ; - return 0; -@@ -2122,7 +2156,8 @@ int - main () - { - static int test_array [1 - 2 * !(($2) <= $ac_mid)]; --test_array [0] = 0 -+test_array [0] = 0; -+return test_array [0]; - - ; - return 0; -@@ -2195,7 +2230,7 @@ This file contains any messages produced - running configure, to aid debugging if configure makes a mistake. - - It was created by fetchmail $as_me 6.3.26, which was --generated by GNU Autoconf 2.68. Invocation command line was -+generated by GNU Autoconf 2.69. Invocation command line was - - $ $0 $@ - -@@ -2689,7 +2724,7 @@ case $as_dir/ in #(( - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do -- if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then -+ if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. -@@ -2858,7 +2893,7 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 -@@ -2898,7 +2933,7 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 -@@ -2949,7 +2984,7 @@ do - test -z "$as_dir" && as_dir=. - for ac_prog in mkdir gmkdir; do - for ac_exec_ext in '' $ac_executable_extensions; do -- { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue -+ as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue - case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( - 'mkdir (GNU coreutils) '* | \ - 'mkdir (coreutils) '* | \ -@@ -3002,7 +3037,7 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 -@@ -3295,7 +3330,7 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 -@@ -3466,7 +3501,7 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 -@@ -3512,7 +3547,7 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 -@@ -3552,7 +3587,7 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="gcc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 -@@ -3605,7 +3640,7 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="${ac_tool_prefix}cc" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 -@@ -3646,7 +3681,7 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue -@@ -3704,7 +3739,7 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_CC="$ac_tool_prefix$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 -@@ -3748,7 +3783,7 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_CC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 -@@ -4194,8 +4229,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ - /* end confdefs.h. */ - #include - #include --#include --#include -+struct stat; - /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ - struct buf { int x; }; - FILE * (*rcsopen) (struct buf *, struct stat *, int); -@@ -4751,7 +4785,7 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 -@@ -4791,7 +4825,7 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 -@@ -4859,7 +4893,7 @@ do - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" -- { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue -+ as_fn_executable_p "$ac_path_GREP" || continue - # Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP - case `"$ac_path_GREP" --version 2>&1` in -@@ -4925,7 +4959,7 @@ do - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" -- { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue -+ as_fn_executable_p "$ac_path_EGREP" || continue - # Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP - case `"$ac_path_EGREP" --version 2>&1` in -@@ -5132,8 +5166,8 @@ else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext - /* end confdefs.h. */ - --# define __EXTENSIONS__ 1 -- $ac_includes_default -+# define __EXTENSIONS__ 1 -+ $ac_includes_default - int - main () - { -@@ -5513,11 +5547,11 @@ else - int - main () - { --/* FIXME: Include the comments suggested by Paul. */ -+ - #ifndef __cplusplus -- /* Ultrix mips cc rejects this. */ -+ /* Ultrix mips cc rejects this sort of thing. */ - typedef int charset[2]; -- const charset cs; -+ const charset cs = { 0, 0 }; - /* SunOS 4.1.1 cc rejects this. */ - char const *const *pcpcc; - char **ppc; -@@ -5534,8 +5568,9 @@ main () - ++pcpcc; - ppc = (char**) pcpcc; - pcpcc = (char const *const *) ppc; -- { /* SCO 3.2v4 cc rejects this. */ -- char *t; -+ { /* SCO 3.2v4 cc rejects this sort of thing. */ -+ char tx; -+ char *t = &tx; - char const *s = 0 ? (char *) 0 : (char const *) 0; - - *t++ = 0; -@@ -5551,10 +5586,10 @@ main () - iptr p = 0; - ++p; - } -- { /* AIX XL C 1.02.0.0 rejects this saying -+ { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying - "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ -- struct s { int j; const int *ap[3]; }; -- struct s *b; b->j = 5; -+ struct s { int j; const int *ap[3]; } bx; -+ struct s *b = &bx; b->j = 5; - } - { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; -@@ -5600,7 +5635,7 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_LEX="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 -@@ -5632,7 +5667,8 @@ a { ECHO; } - b { REJECT; } - c { yymore (); } - d { yyless (1); } --e { yyless (input () != 0); } -+e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ -+ yyless ((input () != 0)); } - f { unput (yytext[0]); } - . { BEGIN INITIAL; } - %% -@@ -5792,7 +5828,7 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_YACC="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 -@@ -6044,7 +6080,7 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 -@@ -8548,7 +8584,7 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_procmail="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 -@@ -8590,7 +8626,7 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_sendmail="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 -@@ -8632,7 +8668,7 @@ do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do -- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_maildrop="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 -@@ -10121,16 +10157,16 @@ $as_echo "$as_me: WARNING: Consider re-r - fi - - case "$LIBS" in *-lssl*) -- ac_fn_c_check_decl "$LINENO" "SSLv2_client_method" "ac_cv_have_decl_SSLv2_client_method" "#include -+ ac_fn_c_check_decl "$LINENO" "SSLv3_client_method" "ac_cv_have_decl_SSLv3_client_method" "#include - " --if test "x$ac_cv_have_decl_SSLv2_client_method" = xyes; then : -+if test "x$ac_cv_have_decl_SSLv3_client_method" = xyes; then : - ac_have_decl=1 - else - ac_have_decl=0 - fi - - cat >>confdefs.h <<_ACEOF --#define HAVE_DECL_SSLV2_CLIENT_METHOD $ac_have_decl -+#define HAVE_DECL_SSLV3_CLIENT_METHOD $ac_have_decl - _ACEOF - - ;; -@@ -11334,16 +11370,16 @@ if (echo >conf$$.file) 2>/dev/null; then - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. -- # In both cases, we have to default to `cp -p'. -+ # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || -- as_ln_s='cp -p' -+ as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else -- as_ln_s='cp -p' -+ as_ln_s='cp -pR' - fi - else -- as_ln_s='cp -p' -+ as_ln_s='cp -pR' - fi - rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file - rmdir conf$$.dir 2>/dev/null -@@ -11403,28 +11439,16 @@ else - as_mkdir_p=false - fi - --if test -x / >/dev/null 2>&1; then -- as_test_x='test -x' --else -- if ls -dL / >/dev/null 2>&1; then -- as_ls_L_option=L -- else -- as_ls_L_option= -- fi -- as_test_x=' -- eval sh -c '\'' -- if test -d "$1"; then -- test -d "$1/."; -- else -- case $1 in #( -- -*)set "./$1";; -- esac; -- case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( -- ???[sx]*):;;*)false;;esac;fi -- '\'' sh -- ' --fi --as_executable_p=$as_test_x -+ -+# as_fn_executable_p FILE -+# ----------------------- -+# Test if FILE is an executable regular file. -+as_fn_executable_p () -+{ -+ test -f "$1" && test -x "$1" -+} # as_fn_executable_p -+as_test_x='test -x' -+as_executable_p=as_fn_executable_p - - # Sed expression to map a string onto a valid CPP name. - as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" -@@ -11446,7 +11470,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri - # values after options handling. - ac_log=" - This file was extended by fetchmail $as_me 6.3.26, which was --generated by GNU Autoconf 2.68. Invocation command line was -+generated by GNU Autoconf 2.69. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS -@@ -11512,10 +11536,10 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_writ - ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" - ac_cs_version="\\ - fetchmail config.status 6.3.26 --configured by $0, generated by GNU Autoconf 2.68, -+configured by $0, generated by GNU Autoconf 2.69, - with options \\"\$ac_cs_config\\" - --Copyright (C) 2010 Free Software Foundation, Inc. -+Copyright (C) 2012 Free Software Foundation, Inc. - This config.status script is free software; the Free Software Foundation - gives unlimited permission to copy, distribute and modify it." - -@@ -11606,7 +11630,7 @@ fi - _ACEOF - cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - if \$ac_cs_recheck; then -- set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion -+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion - shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 - CONFIG_SHELL='$SHELL' ---- fetchmail-6.3.26.orig/configure.ac -+++ fetchmail-6.3.26/configure.ac -@@ -802,7 +802,7 @@ else - fi - - case "$LIBS" in *-lssl*) -- AC_CHECK_DECLS([SSLv2_client_method],,,[#include ]) -+ AC_CHECK_DECLS([SSLv3_client_method],,,[#include ]) - ;; - esac - ---- fetchmail-6.3.26.orig/fetchmail-FAQ.html -+++ fetchmail-6.3.26/fetchmail-FAQ.html -@@ -667,8 +667,8 @@ because there is not currently a standar - also uses this method, so the two will interoperate happily. They - better, because this is how Craig gets his mail ;-)

- --

Finally, you can use SSL for complete --end-to-end encryption if you have an SSL-enabled mailserver.

-+

Finally, you can use SSL or TLS for complete -+end-to-end encryption if you have a TLS-enabled mailserver.

- -

G11. Is any special configuration needed - to use a dynamic IP address?

-@@ -2120,7 +2120,7 @@ SSL? - -

You'll need to have the OpenSSL libraries installed, and they --should at least be version 0.9.7. -+should at least be version 0.9.8, with 1.0.1 preferred. - Configure with --with-ssl. If you have the OpenSSL libraries - installed in commonly-used default locations, this will - suffice. If you have them installed in a non-default location, -@@ -2130,7 +2130,7 @@ to --with-ssl after an equal sign.

-

Fetchmail binaries built this way support ssl, - sslkey, and sslcert options that control - SSL encryption, and will automatically use tls if the --server offers it. You will need to have an SSL-enabled mailserver to -+server offers it. You will need to have an SSL/TLS-enabled mailserver to - use these options. See the manual page for details and some words - of care on the limited security provided.

- -@@ -2155,13 +2155,14 @@ poll MYSERVER port 993 plugin "openssl s - protocol imap username MYUSERNAME password MYPASSWORD - - --

You should note that SSL is only secure against a "man-in-the-middle" --attack if the client is able to verify that the peer's public key is the --correct one, and has not been substituted by an attacker. fetchmail can do --this in one of two ways: by verifying the SSL certificate, or by checking --the fingerprint of the peer's public key.

-+

You should note that SSL or TLS are only secure against a -+"man-in-the-middle" attack if the client is able to verify that the -+peer's public key is the correct one, and has not been substituted by an -+attacker. fetchmail can do this in one of two ways: by verifying the SSL -+certificate, or by checking the fingerprint of the peer's public -+key.

- --

There are three parts to SSL certificate verification: checking that the -+

There are three parts to TLS certificate verification: checking that the - domain name in the certificate matches the hostname you asked to connect to; - checking that the certificate expiry date has not passed; and checking that - the certificate has been signed by a known Certificate Authority (CA). This -@@ -2227,8 +2228,12 @@ will automatically attempt TLS negotiati - time. This can however cause problems if the upstream didn't configure - his certificates properly.

- --

In order to prevent fetchmail from trying TLS (STLS, STARTTLS) --negotiation, add this option:

-+

In order to prevent fetchmail 6.4.0 and newer versions from trying -+STLS or STARTTLS negotiation, add this option:

-+
sslproto ''
-+ -+

In order to prevent older fetchmail versions from trying TLS (STLS, STARTTLS) -+negotiation where the above does not work, try this option:

- -
sslproto ssl23
- -@@ -2876,15 +2881,22 @@ need to say something like 'envelo - -
- Received: from send103.yahoomail.com (send103.yahoomail.com [205.180.60.92])
--    by iserv.ttns.net (8.8.5/8.8.5) with SMTP id RAA10088
--    for <ksturgeon@fbceg.org>; Wed, 9 Sep 1998 17:01:59 -0700
-+    by iserv.example.net (8.8.5/8.8.5) with SMTP id RAA10088
-+    for <ksturgeon@fbceg.example.org>; Wed, 9 Sep 1998 17:01:59 -0700
- 
- --

it checks to see if 'iserv.ttns.net' is a DNS alias of your --mailserver before accepting 'ksturgeon@fbceg.org' as an envelope -+

it checks to see if 'iserv.example.net' is a DNS alias of your -+mailserver before accepting 'ksturgeon@fbceg.example.org' as an envelope - address. This check might fail if your DNS were misconfigured, or --if you were using 'no dns' and had failed to declare iserv.ttns.net --as an alias of your server.

-+if you were using 'no dns' and had failed to declare iserv.example.net -+as an alias of your server. The typical hint is logging similar to: -+line rejected, iserv.example.net is not an alias of the mailserver, -+if you use fetchmail in verbose mode.

-+ -+

Workaround: You can specify the alias explicitly, with aka -+ iserv.example.net statements in the rcfile. Replace -+iserv.example.net by the name you find in your -+'by' part of the 'Received:' line.

- -

M8. Users are getting multiple copies of - messages.

-@@ -3237,6 +3249,8 @@ Hayes mode escape "+++".

-

X8. A spurious ) is being appended to my - messages.

- -+

Fetchmail 6.3.5 and newer releases are supposed to fix this.

-+ -

Due to the problem described in S2, the - IMAP support in fetchmail cannot follow the IMAP protocol 100 %. - Most of the time it doesn't matter, but if you combine it with an -@@ -3279,8 +3293,6 @@ it at the end of the message it forwards - on, you'll get a message about actual != expected. - - --

There is no fix for this.

-- -

X9. Missing "Content-Transfer-Encoding" header - with Domino IMAP

- ---- fetchmail-6.3.26.orig/fetchmail.c -+++ fetchmail-6.3.26/fetchmail.c -@@ -54,6 +54,10 @@ - #define ENETUNREACH 128 /* Interactive doesn't know this */ - #endif /* ENETUNREACH */ - -+#ifdef SSL_ENABLE -+#include /* for OPENSSL_NO_SSL2 and ..._SSL3 checks */ -+#endif -+ - /* prototypes for internal functions */ - static int load_params(int, char **, int); - static void dump_params (struct runctl *runp, struct query *, flag implicit); -@@ -138,7 +142,7 @@ static void printcopyright(FILE *fp) { - "Copyright (C) 2004 Matthias Andree, Eric S. Raymond,\n" - " Robert M. Funk, Graham Wilson\n" - "Copyright (C) 2005 - 2012 Sunil Shetye\n" -- "Copyright (C) 2005 - 2013 Matthias Andree\n" -+ "Copyright (C) 2005 - 2015 Matthias Andree\n" - )); - fprintf(fp, GT_("Fetchmail comes with ABSOLUTELY NO WARRANTY. This is free software, and you\n" - "are welcome to redistribute it under certain conditions. For details,\n" -@@ -262,6 +266,9 @@ int main(int argc, char **argv) - #endif /* ODMR_ENABLE */ - #ifdef SSL_ENABLE - "+SSL" -+#if (HAVE_DECL_SSLV3_CLIENT_METHOD + 0 == 0) || defined(OPENSSL_NO_SSL3) -+ "-SSLv3" -+#endif - #endif - #ifdef OPIE_ENABLE - "+OPIE" ---- fetchmail-6.3.26.orig/fetchmail.h -+++ fetchmail-6.3.26/fetchmail.h -@@ -771,9 +771,9 @@ int servport(const char *service); - int fm_getaddrinfo(const char *node, const char *serv, const struct addrinfo *hints, struct addrinfo **res); - void fm_freeaddrinfo(struct addrinfo *ai); - --/* prototypes from tls.c */ --int maybe_tls(struct query *ctl); --int must_tls(struct query *ctl); -+/* prototypes from starttls.c */ -+int maybe_starttls(struct query *ctl); -+int must_starttls(struct query *ctl); - - /* prototype from rfc822valid.c */ - int rfc822_valid_msgid(const unsigned char *); ---- fetchmail-6.3.26.orig/fetchmail.man -+++ fetchmail-6.3.26/fetchmail.man -@@ -412,23 +412,22 @@ from. The folder information is written - .B \-\-ssl - (Keyword: ssl) - .br --Causes the connection to the mail server to be encrypted --via SSL. Connect to the server using the specified base protocol over a --connection secured by SSL. This option defeats opportunistic starttls --negotiation. It is highly recommended to use \-\-sslproto 'SSL3' --\-\-sslcertck to validate the certificates presented by the server and --defeat the obsolete SSLv2 negotiation. More information is available in --the \fIREADME.SSL\fP file that ships with fetchmail. --.IP --Note that fetchmail may still try to negotiate SSL through starttls even --if this option is omitted. You can use the \-\-sslproto option to defeat --this behavior or tell fetchmail to negotiate a particular SSL protocol. -+Causes the connection to the mail server to be encrypted via SSL, by -+negotiating SSL directly after connecting (SSL-wrapped mode). It is -+highly recommended to use \-\-sslcertck to validate the certificates -+presented by the server. Please see the description of \-\-sslproto -+below! More information is available in the \fIREADME.SSL\fP file that -+ships with fetchmail. -+.IP -+Note that even if this option is omitted, fetchmail may still negotiate -+SSL in-band for POP3 or IMAP, through the STLS or STARTTLS feature. You -+can use the \-\-sslproto option to modify that behavior. - .IP - If no port is specified, the connection is attempted to the well known - port of the SSL version of the base protocol. This is generally a - different port than the port used by the base protocol. For IMAP, this - is port 143 for the clear protocol and port 993 for the SSL secured --protocol, for POP3, it is port 110 for the clear text and port 995 for -+protocol; for POP3, it is port 110 for the clear text and port 995 for - the encrypted variant. - .IP - If your system lacks the corresponding entries from /etc/services, see -@@ -470,39 +469,73 @@ cause some complications in daemon mode. - .IP - Also see \-\-sslcert above. - .TP --.B \-\-sslproto --(Keyword: sslproto) -+.B \-\-sslproto -+(Keyword: sslproto, NOTE: semantic changes since v6.4.0) - .br --Forces an SSL/TLS protocol. Possible values are \fB''\fP, --\&'\fBSSL2\fP' (not supported on all systems), --\&'\fBSSL23\fP', (use of these two values is discouraged --and should only be used as a last resort) \&'\fBSSL3\fP', and --\&'\fBTLS1\fP'. The default behaviour if this option is unset is: for --connections without \-\-ssl, use \&'\fBTLS1\fP' so that fetchmail will --opportunistically try STARTTLS negotiation with TLS1. You can configure --this option explicitly if the default handshake (TLS1 if \-\-ssl is not --used) does not work for your server. --.IP --Use this option with '\fBTLS1\fP' value to enforce a STARTTLS --connection. In this mode, it is highly recommended to also use --\-\-sslcertck (see below). Note that this will then cause fetchmail --v6.3.19 to force STARTTLS negotiation even if it is not advertised by --the server. --.IP --To defeat opportunistic TLSv1 negotiation when the server advertises --STARTTLS or STLS, and use a cleartext connection use \fB''\fP. This --option, even if the argument is the empty string, will also suppress the --diagnostic 'SERVER: opportunistic upgrade to TLS.' message in verbose --mode. The default is to try appropriate protocols depending on context. -+This option has a dual use, out of historic fetchmail behaviour. It -+controls both the SSL/TLS protocol version and, if \-\-ssl is not -+specified, the STARTTLS behaviour (upgrading the protocol to an SSL or -+TLS connection in-band). Some other options may however make TLS -+mandatory. -+.PP -+Only if this option and \-\-ssl are both missing for a poll, there will -+be opportunistic TLS for POP3 and IMAP, where fetchmail will attempt to -+upgrade to TLSv1 or newer. -+.PP -+Recognized values for \-\-sslproto are given below. You should normally -+chose one of the auto-negotiating options, i. e. '\fBauto\fP' or one of -+the options ending in a plus (\fB+\fP) character. Note that depending -+on OpenSSL library version and configuration, some options cause -+run-time errors because the requested SSL or TLS versions are not -+supported by the particular installed OpenSSL library. -+.RS -+.IP "\fB''\fP, the empty string" -+Disable STARTTLS. If \-\-ssl is given for the same server, log an error -+and pretend that '\fBauto\fP' had been used instead. -+.IP '\fBauto\fP' -+(default). Since v6.4.0. Require TLS. Auto-negotiate TLSv1 or newer, disable SSLv3 downgrade. -+(fetchmail 6.3.26 and older have auto-negotiated all protocols that -+their OpenSSL library supported, including the broken SSLv3). -+.IP "\&'\fBSSL23\fP' -+see '\fBauto\fP'. -+.IP \&'\fBSSL3\fP' -+Require SSLv3 exactly. SSLv3 is broken, not supported on all systems, avoid it -+if possible. This will make fetchmail negotiate SSLv3 only, and is the -+only way besides '\fBSSL3+\fP' to have fetchmail 6.4.0 or newer permit SSLv3. -+.IP \&'\fBSSL3+\fP' -+same as '\fBauto\fP', but permit SSLv3 as well. This is the only way -+besides '\fBSSL3\fP' to have fetchmail 6.4.0 or newer permit SSLv3. -+.IP \&'\fBTLS1\fP' -+Require TLSv1. This does not negotiate TLSv1.1 or newer, and is -+discouraged. Replace by TLS1+ unless the latter chokes your server. -+.IP \&'\fBTLS1+\fP' -+Since v6.4.0. See 'fBauto\fP'. -+.IP \&'\fBTLS1.1\fP' -+Since v6.4.0. Require TLS v1.1 exactly. -+.IP \&'\fBTLS1.1+\fP' -+Since v6.4.0. Require TLS. Auto-negotiate TLSv1.1 or newer. -+.IP \&'\fBTLS1.2\fP' -+Since v6.4.0. Require TLS v1.2 exactly. -+.IP '\fBTLS1.2+\fP' -+Since v6.4.0. Require TLS. Auto-negotiate TLSv1.2 or newer. -+.IP "Unrecognized parameters" -+are treated the same as '\fBauto\fP'. -+.RE -+.IP -+NOTE: you should hardly ever need to use anything other than '' (to -+force an unencrypted connection) or 'auto' (to enforce TLS). - .TP - .B \-\-sslcertck - (Keyword: sslcertck) - .br --Causes fetchmail to strictly check the server certificate against a set of --local trusted certificates (see the \fBsslcertfile\fP and \fBsslcertpath\fP --options). If the server certificate cannot be obtained or is not signed by one --of the trusted ones (directly or indirectly), the SSL connection will fail, --regardless of the \fBsslfingerprint\fP option. -+Causes fetchmail to require that SSL/TLS be used and disconnect if it -+can not successfully negotiate SSL or TLS, or if it cannot successfully -+verify and validate the certificate and follow it to a trust anchor (or -+trusted root certificate). The trust anchors are given as a set of local -+trusted certificates (see the \fBsslcertfile\fP and \fBsslcertpath\fP -+options). If the server certificate cannot be obtained or is not signed -+by one of the trusted ones (directly or indirectly), fetchmail will -+disconnect, regardless of the \fBsslfingerprint\fP option. - .IP - Note that CRL (certificate revocation lists) are only supported in - OpenSSL 0.9.7 and newer! Your system clock should also be reasonably -@@ -1202,31 +1235,33 @@ capability response. Specify a user opti - username and the part to the right as the NTLM domain. - - .SS Secure Socket Layers (SSL) and Transport Layer Security (TLS) -+.PP All retrieval protocols can use SSL or TLS wrapping for the -+transport. Additionally, POP3 and IMAP retrival can also negotiate -+SSL/TLS by means of STARTTLS (or STLS). - .PP - Note that fetchmail currently uses the OpenSSL library, which is - severely underdocumented, so failures may occur just because the - programmers are not aware of OpenSSL's requirement of the day. - For instance, since v6.3.16, fetchmail calls - OpenSSL_add_all_algorithms(), which is necessary to support certificates --using SHA256 on OpenSSL 0.9.8 -- this information is deeply hidden in the --documentation and not at all obvious. Please do not hesitate to report --subtle SSL failures. --.PP --You can access SSL encrypted services by specifying the \-\-ssl option. --You can also do this using the "ssl" user option in the .fetchmailrc --file. With SSL encryption enabled, queries are initiated over a --connection after negotiating an SSL session, and the connection fails if --SSL cannot be negotiated. Some services, such as POP3 and IMAP, have -+using SHA256 on OpenSSL 0.9.8 -- this information is deeply hidden in -+the documentation and not at all obvious. Please do not hesitate to -+report subtle SSL failures. -+.PP -+You can access SSL encrypted services by specifying the options starting -+with \-\-ssl, such as \-\-ssl, \-\-sslproto, \-\-sslcertck, and others. -+You can also do this using the corresponding user options in the .fetchmailrc -+file. Some services, such as POP3 and IMAP, have - different well known ports defined for the SSL encrypted services. The - encrypted ports will be selected automatically when SSL is enabled and --no explicit port is specified. The \-\-sslproto 'SSL3' option should be --used to select the SSLv3 protocol (default if unset: v2 or v3). Also, --the \-\-sslcertck command line or sslcertck run control file option --should be used to force strict certificate checking - see below. -+no explicit port is specified. Also, the \-\-sslcertck command line or -+sslcertck run control file option should be used to force strict -+certificate checking - see below. - .PP - If SSL is not configured, fetchmail will usually opportunistically try to use --STARTTLS. STARTTLS can be enforced by using \-\-sslproto "TLS1". TLS --connections use the same port as the unencrypted version of the -+STARTTLS. STARTTLS can be enforced by using \-\-sslproto\~auto and -+defeated by using \-\-sslproto\~''. -+TLS connections use the same port as the unencrypted version of the - protocol and negotiate TLS via special command. The \-\-sslcertck - command line or sslcertck run control file option should be used to - force strict certificate checking - see below. ---- fetchmail-6.3.26.orig/imap.c -+++ fetchmail-6.3.26/imap.c -@@ -405,6 +405,8 @@ static int imap_getauth(int sock, struct - /* apply for connection authorization */ - { - int ok = 0; -+ char *commonname; -+ - (void)greeting; - - /* -@@ -429,25 +431,21 @@ static int imap_getauth(int sock, struct - return(PS_SUCCESS); - } - --#ifdef SSL_ENABLE -- if (maybe_tls(ctl)) { -- char *commonname; -- -- commonname = ctl->server.pollname; -- if (ctl->server.via) -- commonname = ctl->server.via; -- if (ctl->sslcommonname) -- commonname = ctl->sslcommonname; -+ commonname = ctl->server.pollname; -+ if (ctl->server.via) -+ commonname = ctl->server.via; -+ if (ctl->sslcommonname) -+ commonname = ctl->sslcommonname; - -- if (strstr(capabilities, "STARTTLS") -- || must_tls(ctl)) /* if TLS is mandatory, ignore capabilities */ -+#ifdef SSL_ENABLE -+ if (maybe_starttls(ctl)) { -+ if ((strstr(capabilities, "STARTTLS") && maybe_starttls(ctl)) -+ || must_starttls(ctl)) /* if TLS is mandatory, ignore capabilities */ - { -- /* Use "tls1" rather than ctl->sslproto because tls1 is the only -- * protocol that will work with STARTTLS. Don't need to worry -- * whether TLS is mandatory or opportunistic unless SSLOpen() fails -- * (see below). */ -+ /* Don't need to worry whether TLS is mandatory or -+ * opportunistic unless SSLOpen() fails (see below). */ - if (gen_transact(sock, "STARTTLS") == PS_SUCCESS -- && (set_timeout(mytimeout), SSLOpen(sock, ctl->sslcert, ctl->sslkey, "tls1", ctl->sslcertck, -+ && (set_timeout(mytimeout), SSLOpen(sock, ctl->sslcert, ctl->sslkey, ctl->sslproto, ctl->sslcertck, - ctl->sslcertfile, ctl->sslcertpath, ctl->sslfingerprint, commonname, - ctl->server.pollname, &ctl->remotename)) != -1) - { -@@ -470,7 +468,7 @@ static int imap_getauth(int sock, struct - { - report(stdout, GT_("%s: upgrade to TLS succeeded.\n"), commonname); - } -- } else if (must_tls(ctl)) { -+ } else if (must_starttls(ctl)) { - /* Config required TLS but we couldn't guarantee it, so we must - * stop. */ - set_timeout(0); -@@ -492,6 +490,10 @@ static int imap_getauth(int sock, struct - /* Usable. Proceed with authenticating insecurely. */ - } - } -+ } else { -+ if (strstr(capabilities, "STARTTLS") && outlevel >= O_VERBOSE) { -+ report(stdout, GT_("%s: WARNING: server offered STARTTLS but sslproto '' given.\n"), commonname); -+ } - } - #endif /* SSL_ENABLE */ - ---- fetchmail-6.3.26.orig/po/Makevars -+++ fetchmail-6.3.26/po/Makevars -@@ -46,3 +46,15 @@ MSGID_BUGS_ADDRESS = fetchmail-devel@lis - # This is the list of locale categories, beyond LC_MESSAGES, for which the - # message catalogs shall be used. It is usually empty. - EXTRA_LOCALE_CATEGORIES = -+ -+# This tells whether the $(DOMAIN).pot file contains messages with an 'msgctxt' -+# context. Possible values are "yes" and "no". Set this to yes if the -+# package uses functions taking also a message context, like pgettext(), or -+# if in $(XGETTEXT_OPTIONS) you define keywords with a context argument. -+USE_MSGCTXT = no -+ -+# These options get passed to msgmerge. -+# Useful options are in particular: -+# --previous to keep previous msgids of translated messages, -+# --quiet to reduce the verbosity. -+MSGMERGE_OPTIONS = ---- fetchmail-6.3.26.orig/pop3.c -+++ fetchmail-6.3.26/pop3.c -@@ -281,6 +281,7 @@ static int pop3_getauth(int sock, struct - #endif /* OPIE_ENABLE */ - #ifdef SSL_ENABLE - flag connection_may_have_tls_errors = FALSE; -+ char *commonname; - #endif /* SSL_ENABLE */ - - done_capa = FALSE; -@@ -393,7 +394,7 @@ static int pop3_getauth(int sock, struct - (ctl->server.authenticate == A_KERBEROS_V5) || - (ctl->server.authenticate == A_OTP) || - (ctl->server.authenticate == A_CRAM_MD5) || -- maybe_tls(ctl)) -+ maybe_starttls(ctl)) - { - if ((ok = capa_probe(sock)) != PS_SUCCESS) - /* we are in STAGE_GETAUTH => failure is PS_AUTHFAIL! */ -@@ -406,12 +407,12 @@ static int pop3_getauth(int sock, struct - (ok == PS_SOCKET && !ctl->wehaveauthed)) - { - #ifdef SSL_ENABLE -- if (must_tls(ctl)) { -+ if (must_starttls(ctl)) { - /* fail with mandatory STLS without repoll */ - report(stderr, GT_("TLS is mandatory for this session, but server refused CAPA command.\n")); - report(stderr, GT_("The CAPA command is however necessary for TLS.\n")); - return ok; -- } else if (maybe_tls(ctl)) { -+ } else if (maybe_starttls(ctl)) { - /* defeat opportunistic STLS */ - xfree(ctl->sslproto); - ctl->sslproto = xstrdup(""); -@@ -431,24 +432,19 @@ static int pop3_getauth(int sock, struct - } - - #ifdef SSL_ENABLE -- if (maybe_tls(ctl)) { -- char *commonname; -+ commonname = ctl->server.pollname; -+ if (ctl->server.via) -+ commonname = ctl->server.via; -+ if (ctl->sslcommonname) -+ commonname = ctl->sslcommonname; - -- commonname = ctl->server.pollname; -- if (ctl->server.via) -- commonname = ctl->server.via; -- if (ctl->sslcommonname) -- commonname = ctl->sslcommonname; -- -- if (has_stls -- || must_tls(ctl)) /* if TLS is mandatory, ignore capabilities */ -+ if (maybe_starttls(ctl)) { -+ if (has_stls || must_starttls(ctl)) /* if TLS is mandatory, ignore capabilities */ - { -- /* Use "tls1" rather than ctl->sslproto because tls1 is the only -- * protocol that will work with STARTTLS. Don't need to worry -- * whether TLS is mandatory or opportunistic unless SSLOpen() fails -- * (see below). */ -+ /* Don't need to worry whether TLS is mandatory or -+ * opportunistic unless SSLOpen() fails (see below). */ - if (gen_transact(sock, "STLS") == PS_SUCCESS -- && (set_timeout(mytimeout), SSLOpen(sock, ctl->sslcert, ctl->sslkey, "tls1", ctl->sslcertck, -+ && (set_timeout(mytimeout), SSLOpen(sock, ctl->sslcert, ctl->sslkey, ctl->sslproto, ctl->sslcertck, - ctl->sslcertfile, ctl->sslcertpath, ctl->sslfingerprint, commonname, - ctl->server.pollname, &ctl->remotename)) != -1) - { -@@ -475,7 +471,7 @@ static int pop3_getauth(int sock, struct - { - report(stdout, GT_("%s: upgrade to TLS succeeded.\n"), commonname); - } -- } else if (must_tls(ctl)) { -+ } else if (must_starttls(ctl)) { - /* Config required TLS but we couldn't guarantee it, so we must - * stop. */ - set_timeout(0); -@@ -495,7 +491,11 @@ static int pop3_getauth(int sock, struct - } - } - } -- } /* maybe_tls() */ -+ } else { /* maybe_starttls() */ -+ if (has_stls && outlevel >= O_VERBOSE) { -+ report(stdout, GT_("%s: WARNING: server offered STLS, but sslproto '' given.\n"), commonname); -+ } -+ } /* maybe_starttls() */ - #endif /* SSL_ENABLE */ - - /* ---- fetchmail-6.3.26.orig/socket.c -+++ fetchmail-6.3.26/socket.c -@@ -876,7 +876,9 @@ int SSLOpen(int sock, char *mycert, char - { - struct stat randstat; - int i; -+ int avoid_ssl_versions = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3; - long sslopts = SSL_OP_ALL; -+ int ssle_connect = 0; - - SSL_load_error_strings(); - SSL_library_init(); -@@ -906,25 +908,57 @@ int SSLOpen(int sock, char *mycert, char - /* Make sure a connection referring to an older context is not left */ - _ssl_context[sock] = NULL; - if(myproto) { -- if(!strcasecmp("ssl2",myproto)) { --#if HAVE_DECL_SSLV2_CLIENT_METHOD + 0 > 0 -- _ctx[sock] = SSL_CTX_new(SSLv2_client_method()); -+ if(!strcasecmp("ssl3",myproto)) { -+#if (HAVE_DECL_SSLV3_CLIENT_METHOD > 0) && (0 == OPENSSL_NO_SSL3 + 0) -+ _ctx[sock] = SSL_CTX_new(SSLv3_client_method()); -+ avoid_ssl_versions &= ~SSL_OP_NO_SSLv3; - #else -- report(stderr, GT_("Your operating system does not support SSLv2.\n")); -+ report(stderr, GT_("Your OpenSSL version does not support SSLv3.\n")); - return -1; - #endif -- } else if(!strcasecmp("ssl3",myproto)) { -- _ctx[sock] = SSL_CTX_new(SSLv3_client_method()); -+ } else if(!strcasecmp("ssl3+",myproto)) { -+ avoid_ssl_versions &= ~SSL_OP_NO_SSLv3; -+ myproto = NULL; - } else if(!strcasecmp("tls1",myproto)) { - _ctx[sock] = SSL_CTX_new(TLSv1_client_method()); -- } else if (!strcasecmp("ssl23",myproto)) { -+ } else if(!strcasecmp("tls1+",myproto)) { -+ myproto = NULL; -+#if defined(TLS1_1_VERSION) && TLS_MAX_VERSION >= TLS1_1_VERSION -+ } else if(!strcasecmp("tls1.1",myproto)) { -+ _ctx[sock] = SSL_CTX_new(TLSv1_1_client_method()); -+ } else if(!strcasecmp("tls1.1+",myproto)) { -+ myproto = NULL; -+ avoid_ssl_versions |= SSL_OP_NO_TLSv1; -+#else -+ } else if(!strcasecmp("tls1.1",myproto) || !strcasecmp("tls1.1+", myproto)) { -+ report(stderr, GT_("Your OpenSSL version does not support TLS v1.1.\n")); -+ return -1; -+#endif -+#if defined(TLS1_2_VERSION) && TLS_MAX_VERSION >= TLS1_2_VERSION -+ } else if(!strcasecmp("tls1.2",myproto)) { -+ _ctx[sock] = SSL_CTX_new(TLSv1_2_client_method()); -+ } else if(!strcasecmp("tls1.2+",myproto)) { -+ myproto = NULL; -+ avoid_ssl_versions |= SSL_OP_NO_TLSv1; -+ avoid_ssl_versions |= SSL_OP_NO_TLSv1_1; -+#else -+ } else if(!strcasecmp("tls1.2",myproto) || !strcasecmp("tls1.2+", myproto)) { -+ report(stderr, GT_("Your OpenSSL version does not support TLS v1.2.\n")); -+ return -1; -+#endif -+ } else if (!strcasecmp("ssl23",myproto) || 0 == strcasecmp("auto",myproto)) { - myproto = NULL; - } else { -- report(stderr,GT_("Invalid SSL protocol '%s' specified, using default (SSLv23).\n"), myproto); -+ report(stderr,GT_("Invalid SSL protocol '%s' specified, using default autoselect (SSL23).\n"), myproto); - myproto = NULL; - } - } -- if(!myproto) { -+ // do not combine into an else { } as myproto may be nulled -+ // above! -+ if (!myproto) { -+ // SSLv23 is a misnomer and will in fact use the best -+ // available protocol, subject to SSL_OP_NO* -+ // constraints. - _ctx[sock] = SSL_CTX_new(SSLv23_client_method()); - } - if(_ctx[sock] == NULL) { -@@ -938,7 +972,7 @@ int SSLOpen(int sock, char *mycert, char - sslopts &= ~ SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS; - } - -- SSL_CTX_set_options(_ctx[sock], sslopts); -+ SSL_CTX_set_options(_ctx[sock], sslopts | avoid_ssl_versions); - - if (certck) { - SSL_CTX_set_verify(_ctx[sock], SSL_VERIFY_PEER, SSL_ck_verify_callback); -@@ -1008,8 +1042,18 @@ int SSLOpen(int sock, char *mycert, char - } - - if (SSL_set_fd(_ssl_context[sock], sock) == 0 -- || SSL_connect(_ssl_context[sock]) < 1) { -+ || (ssle_connect = SSL_connect(_ssl_context[sock])) < 1) { -+ int e = errno; -+ unsigned long ssle_err_from_queue = ERR_peek_error(); -+ unsigned long ssle_err_from_get_error = SSL_get_error(_ssl_context[sock], ssle_connect); - ERR_print_errors_fp(stderr); -+ if (SSL_ERROR_SYSCALL == ssle_err_from_get_error && 0 == ssle_err_from_queue) { -+ if (0 == ssle_connect) { -+ report(stderr, GT_("Server shut down connection prematurely during SSL_connect().\n")); -+ } else if (ssle_connect < 0) { -+ report(stderr, GT_("System error during SSL_connect(): %s\n"), strerror(e)); -+ } -+ } - SSL_free( _ssl_context[sock] ); - _ssl_context[sock] = NULL; - SSL_CTX_free(_ctx[sock]); -@@ -1017,6 +1061,24 @@ int SSLOpen(int sock, char *mycert, char - return(-1); - } - -+ if (outlevel >= O_VERBOSE) { -+ SSL_CIPHER const *sc; -+ int bitsmax, bitsused; -+ -+ const char *ver; -+ -+ ver = SSL_get_version(_ssl_context[sock]); -+ -+ sc = SSL_get_current_cipher(_ssl_context[sock]); -+ if (!sc) { -+ report (stderr, GT_("Cannot obtain current SSL/TLS cipher - no session established?\n")); -+ } else { -+ bitsused = SSL_CIPHER_get_bits(sc, &bitsmax); -+ report(stdout, GT_("SSL/TLS: using protocol %s, cipher %s, %d/%d secret/processed bits\n"), -+ ver, SSL_CIPHER_get_name(sc), bitsused, bitsmax); -+ } -+ } -+ - /* Paranoia: was the callback not called as we expected? */ - if (!_depth0ck) { - report(stderr, GT_("Certificate/fingerprint verification was somehow skipped!\n")); ---- /dev/null -+++ fetchmail-6.3.26/starttls.c -@@ -0,0 +1,37 @@ -+/** \file tls.c - collect common TLS functionality -+ * \author Matthias Andree -+ * \date 2006 -+ */ -+ -+#include "fetchmail.h" -+ -+#include -+ -+#ifdef HAVE_STRINGS_H -+#include -+#endif -+ -+/** return true if user allowed opportunistic STARTTLS/STLS */ -+int maybe_starttls(struct query *ctl) { -+#ifdef SSL_ENABLE -+ /* opportunistic or forced TLS */ -+ return (!ctl->sslproto || strlen(ctl->sslproto)) -+ && !ctl->use_ssl; -+#else -+ (void)ctl; -+ return 0; -+#endif -+} -+ -+/** return true if user requires STARTTLS/STLS, note though that this -+ * code must always use a logical AND with maybe_tls(). */ -+int must_starttls(struct query *ctl) { -+#ifdef SSL_ENABLE -+ return maybe_starttls(ctl) -+ && (ctl->sslfingerprint || ctl->sslcertck -+ || (ctl->sslproto && !strcasecmp(ctl->sslproto, "tls1"))); -+#else -+ (void)ctl; -+ return 0; -+#endif -+} diff --git a/fetchmail.changes b/fetchmail.changes index 0481158..5f2691d 100644 --- a/fetchmail.changes +++ b/fetchmail.changes @@ -1,3 +1,139 @@ +------------------------------------------------------------------- +Fri Oct 4 12:41:35 UTC 2019 - Pedro Monreal Gonzalez + +- Update to 6.4.1 [bsc#1152964] + ## REGRESSION FIXES: + * The bug fix Debian Bug#941129 was incomplete and caused + - a regression in the default file locations, so that fetchmail was + no longer able to find its configuration files in some situations. + - a regression under _FORTIFY_SOURCE where PATH_MAX > minimal _POSIX_PATH_MAX. + +- Update to 6.4.0 + ## SECURITY FIXES THAT AFFECT BEHAVIOUR AND MAY REQUIRE RECONFIGURATION + * Fetchmail no longer supports SSLv2. + * Fetchmail no longer attempts to negotiate SSLv3 by default, + even with --sslproto ssl23. Fetchmail can now use SSLv3, or TLSv1.1 or a newer + TLS version, with STLS/STARTTLS (it would previously force TLSv1.0 with + STARTTLS). If the OpenSSL version used at build and run-time supports these + versions, --sslproto ssl3 and --sslproto ssl3+ can be used to re-enable SSLv3. + Doing so is discouraged because the SSLv3 protocol is broken. + While this change is supposed to be compatible with common configurations, + users may have to and are advised to change all explicit --sslproto ssl2 + (change to newer protocols required), --sslproto ssl3, --sslproto tls1 to + --sslproto auto, so that they can benefit from TLSv1.1 and TLSv1.2 where + supported by the server. + The --sslproto option now understands the values auto, ssl3+, tls1+, tls1.1, + tls1.1+, tls1.2, tls1.2+, tls1.3, tls1.3+ (case insensitively), see CHANGES + below for details. + * Fetchmail defaults to --sslcertck behaviour. A new option --nosslcertck to + override this has been added, but may be removed in future fetchmail versions + in favour of another configuration option that makes the insecurity in using + this option clearer. + ## SECURITY FIXES + * Fetchmail prevents buffer overruns in GSSAPI authentication with user names + beyond c. 6000 characters in length. Reported by Greg Hudson. + ## CHANGED REQUIREMENTS + * fetchmail 6.4.0 is written in C99 and requires a SUSv3 (Single Unix + Specification v3, a superset of POSIX.1-2001 aka. IEEE Std 1003.1-2001 with + XSI extension) compliant system. For now, a C89 compiler should also work + if the system is SUSv3 compliant. + In particular, older fetchmail versions had workaround for several functions + standardized in the Single Unix Specification v3, these have been removed. + The trio/ library has been removed from the distribution. + ## CHANGES + * fetchmail 6.3.X is unsupported. + * fetchmail now configures OpenSSL support by default. + * fetchmail now requires OpenSSL v1.0.2 or newer. + * Fetchmail now supports --sslproto auto and --sslproto tls1+ (same as ssl23). + * --sslproto tls1.1+, tls1.2+, and tls1.3+ are now supported for + auto-negotiation with a minimum specified TLS protocol version, and --sslproto + tls1.1, --sslproto tls1.2 and --sslproto tls1.3 to force the specified TLS + protocol version. Note that tls1.3 requires OpenSSL v1.1.1 or newer. + * Fetchmail now detects if the server hangs up prematurely during SSL_connect() + and reports this condition as such, and not just as SSL connection failure. + (OpenSSL 1.0.2 reported incompatible with pop3.live.com by Jerry Seibert). + * A foreground fetchmail can now accept a few more options while another copy is + running in the background. + * fetchmail now handles POP3 --keep UID lists more efficiently, by using Rainer + Weikusat's P-Tree implementation. This reduces the complexity for handling + a large UIDL from O(n^2) to O(n log n) and becomes noticably faster with + thousands of kept messages. (IMAP does not currently track UIDs and is unaffected.) + At the same time, the UIDL emulation code for deficient servers has been + removed. It never worked really well. Servers that do not implement the + optional UIDL command only work with --fetchall option set, which in itself is + incompatible with the --keep option (it would cause message duplication). + * fetchmail, when setting up TLS connections, now uses SSL_set_tlsext_host_name() + to set up the SNI (Server Name Indication). Some servers (for instance + googlemail) require SNI when using newer SSL protocols. + * Fetchmail now sets the expected hostname through OpenSSL 1.0.2's new + X509_VERIFY_PARAM_set1_host() function to enable OpenSSL's native certificate + verification features. + * fetchmail will drop the connection when fetching with IMAP and receiving an + unexpected untagged "* BYE" response, to work around certain faulty servers. + * The FETCHMAIL_POP3_FORCE_RETR environment variable is now documented, + it forces fetchmail, when talking POP3, to always use the RETR command, + even if it would otherwise use the TOP command. + * Fetchmail's configure stage will try to query pkg-config or pkgconf for libssl + and libcrypto, in case other system use .pc files to document specific library dependencies. + * The gethostbyname() API calls and compatibility functions have been removed. + * These translations are shipped but not installed by default because + they have less than 500 translated messages out of 714: el fi gl pt_BR sk tr + -> Greek, Finnish, Galician, Brazilian Portuguese, Slovak, Turkish. + * Fetchmail now refuses delivery if the MDA option contains single-quoted expansions. + ## FIXES + * Do not translate header tags such as "Subject:". + * Convert most links from berlios.de to sourceforge.net. + * Report error to stderr, and exit, if --idle is combined with multiple accounts. + * Point to --idle from GENERAL OPERATION to clarify --idle and multiple mailboxes do not mix. + * Fix SSL-enabled build on systems that do not declare SSLv3_client_method(), + or that #define OPENSSL_NO_SSL3 inside #include + * Version report lists -SSLv3 on SSL-enabled no-ssl3 builds. + * Fetchmail no longer adds a NUL byte to the username in GSSAPI authentication. + This was reported to break Kerberos-based authentication with Microsoft Exchange 2013 + * Set umask properly before writing the .fetchids file, to avoid failing the + security check on the next run. + * When forwarding by LMTP, also check antispam response code when collecting + the responses after the CR LF . CR LF sequence at the end of the DATA phase. + * fetchmail will not try other protocols after a socket error. This avoids mismatches + of how different prococols see messages as "seen" and re-fetches of known mail. + * fetchmail no longer reports "System error during SSL_connect(): Success." + * fetchmailconf would ignore Edit or Delete actions on the first (topmost) + item in a list (no matter if server list, user list, ...). + * The mimedecode feature now properly detects multipart/mixed-type matches, so + that quoted-printable-encoded multipart messages can get decoded. + (Regression in 5.0.0 on 1999-03-27, as a side effect of a PGP-mimedecode fix + attributed to Henrik Storner.) + * FETCHMAILHOME can now safely be a relative path, which will be qualified + through realpath(). Previously, it had to be absolute in daemon mode. + ## KNOWN BUGS AND WORKAROUNDS + (This section floats upwards through the NEWS file so it stays with the + current release information) + * Fetchmail does not handle messages without Message-ID header well + (See sourceforge.net bug #780933) + * Fetchmail currently uses 31-bit signed integers in several places + where unsigned and/or wider types should have been used, for instance, + for mailbox sizes, and misreports sizes of 2 GibiB and beyond. + Fixing this requires C89 compatibility to be relinquished. + * BSMTP is mostly untested and errors can cause corrupt output. + * Sun Workshop 6 (SPARC) is known to miscompile the configuration file lexer in + 64-bit mode. Either compile 32-bit code or use GCC to compile 64-bit fetchmail. + * Fetchmail does not track pending deletes across crashes. + * The command line interface is sometimes a bit stubborn, for instance, + fetchmail -s doesn't work with a daemon running. + * Linux systems may return duplicates of an IP address in some circumstances if + no or no global IPv6 addresses are configured. + (No workaround. Ubuntu Bug#582585, Novell Bug#606980.) + * Kerberos 5 may be broken, particularly on Heimdal, and provide bogus error + messages. This will not be fixed, because the maintainer has no Kerberos 5 + server to test against. Use GSSAPI. + +- Remove patches merged upstream: + * fetchmail-openssl11.patch + * fetchmail-fetchmailconf-python3-1of3.patch + * fetchmail-fetchmailconf-python3-2of3.patch + * fetchmail-fetchmailconf-python3-3of3.patch +- Rebase fetchmail-6.3.8-smtp_errors.patch + ------------------------------------------------------------------- Fri May 31 08:05:50 UTC 2019 - Pedro Monreal Gonzalez diff --git a/fetchmail.spec b/fetchmail.spec index bc758aa..322c37d 100644 --- a/fetchmail.spec +++ b/fetchmail.spec @@ -22,26 +22,21 @@ %endif Name: fetchmail -Version: 6.3.26 +Version: 6.4.1 Release: 0 Summary: Full-Featured POP and IMAP Mail Retrieval Daemon License: GPL-2.0-or-later Group: Productivity/Networking/Email/Utilities Url: http://www.fetchmail.info/ -Source: http://sourceforge.net/projects/fetchmail/files/branch_6.3/%{name}-%{version}.tar.xz +Source: https://sourceforge.net/projects/fetchmail/files/branch_6.4/%{name}-%{version}.tar.xz +#Source1: https://sourceforge.net/projects/fetchmail/files/branch_6.4/%%{name}-%%{version}.tar.xz.asc Source2: %{name}.logrotate Source3: sysconfig.%{name} -Source4: http://sourceforge.net/projects/fetchmail/files/branch_6.3/%{name}-%{version}.tar.xz.asc Source5: %{name}.keyring Source6: %{name}.service Source7: %{name}.tmpfiles Source8: %{name}.exec Patch0: fetchmail-6.3.8-smtp_errors.patch -Patch1: fetchmail-openssl11.patch -# PATCH-FIX-UPSTREAM bsc#1082694 Fix fetchmailconf to be able to compile with python{2,3} -Patch2: fetchmail-fetchmailconf-python3-1of3.patch -Patch3: fetchmail-fetchmailconf-python3-2of3.patch -Patch4: fetchmail-fetchmailconf-python3-3of3.patch BuildRequires: automake BuildRequires: krb5-devel BuildRequires: openssl-devel @@ -88,10 +83,6 @@ files (.fetchmailrc). %prep %setup -q %patch0 -p1 -%patch1 -p1 -%patch2 -p1 -%patch3 -p1 -%patch4 -p1 cp -a %{SOURCE2} %{SOURCE3} . ACLOCAL="aclocal -I m4 -I m4-local" autoreconf -fvi @@ -159,13 +150,17 @@ if [ $1 = 0 ]; then rm -rf var/lib/fetchmail fi +%check +make %{?_smp_mflags} check + %files -f %{name}.lang %defattr(-, root, root) +%license COPYING +%doc FAQ FEATURES NEWS NOTES OLDNEWS README README.NTLM README.SSL README.SSL-SERVER TODO contrib *.html *.txt *.pdf %{_bindir}/fetchmail %dir %attr(0700, fetchmail, root) %{_localstatedir}/lib/fetchmail %ghost %attr(0600, fetchmail, root) %{_localstatedir}/log/fetchmail %{_mandir}/man1/fetchmail.1.gz -%doc COPYING FAQ FEATURES NEWS NOTES OLDNEWS README README.NTLM README.SSL README.SSL-SERVER TODO contrib *.html *.txt *.pdf %ghost %config(noreplace) %attr(0600, fetchmail, root) %{_sysconfdir}/fetchmailrc %config(noreplace) %{_sysconfdir}/logrotate.d/fetchmail %{_unitdir}/%{name}.service