aboutsummaryrefslogtreecommitdiffstats
path: root/pygn2m
diff options
context:
space:
mode:
authorMatej Cepl <mcepl@redhat.com>2008-02-26 17:27:08 +0100
committerMatej Cepl <mcepl@redhat.com>2008-02-26 17:27:08 +0100
commitc50ce75f2e06b6b8abe49e34775d343b74f7e8cd (patch)
tree14c314e39296b0c3abe781e4dac194949e220136 /pygn2m
downloadpygn-c50ce75f2e06b6b8abe49e34775d343b74f7e8cd.tar.gz
The original upstream from Debian orig.tar.gz tarball.0.9.7
Diffstat (limited to 'pygn2m')
-rwxr-xr-xpygn2m214
1 files changed, 214 insertions, 0 deletions
diff --git a/pygn2m b/pygn2m
new file mode 100755
index 0000000..d093756
--- /dev/null
+++ b/pygn2m
@@ -0,0 +1,214 @@
+#!/usr/bin/env python
+
+"""News to mail gateway script. Copyright 2000 Cosimo Alfarano
+
+Author: Cosimo Alfarano
+Date: June 11 2000
+
+pygs - Copyright 2000 by Cosimo Alfarano <Alfarano@Students.CS.UniBo.It>
+You can use this software under the terms of the GPL. If we meet some day,
+and you think this stuff is worth it, you can buy me a beer in return.
+
+Thanks to md for this useful formula. Beer is beer.
+
+Gets news article from stdin and sends it via SMTP.
+"""
+
+import sys, os
+import getopt
+from string import split
+
+sys.path.append('/usr/lib/pyg')
+
+import pyginfo
+import whitelist
+import news2mail
+#import mail2news
+
+
+def parse_cmdline(gw):
+ """Parses cmdline with getopt.
+ set a dictionary with smtp new header in gw parameter (gw.smtpheads)
+ return (test,verbose) boolean tuple
+ """
+
+ opt, arg = None, None
+ test, verbose = 0, 0
+ retnull = (None, None)
+
+ try:
+ opt, arg = getopt.getopt(sys.argv[1:],"H:t:s:e:w:l:hdvVT")
+ except (getopt.error), message:
+ print '%s: %s\n' % (sys.argv[0], message)
+ sys.exit(1)
+
+ if len(sys.argv) == 1 or opt == []:
+ gw.smtpheads = None
+ return retnull
+
+ for i in range(len(opt)):
+ if opt[i][0] == '-h':
+ gw.smtpheads = None
+ return retnull
+ elif opt[i][0] == '-v':
+ gw.smtpheads = None
+ return retnull
+ elif opt[i][0] == '-H':
+ gw.smtpserver = opt[i][1]
+ elif opt[i][0] == '-s':
+ gw.smtpheads['Resent-Sender:'] = opt[i][1] + '\n'
+ gw.sender = opt[i][1]
+ elif opt[i][0] == '-t' or opt[i][0] == '-r':
+ gw.smtpheads['To:'] = opt[i][1] + '\n'
+ gw.rcpt = opt[i][1]
+ elif opt[i][0] == '-e':
+ gw.smtpheads['Resent-From:'] = opt[i][1] + '\n' #envelope
+ gw.envelope = opt[i][1]
+ elif opt[i][0] == '-w':
+ gw.wlfile = opt[i][1]
+ elif opt[i][0] == '-l':
+ gw.logfile = opt[i][1]
+ elif opt[i][0] == '-d':
+ gw.debug = 1
+ elif opt[i][0] == '-T':
+ test = 1
+ elif opt[i][0] == '-V':
+ verbose = 1
+
+# By rfc822 [Resent-]Sender: should be ever set, unless == From:
+# (not this case). Should be a human, while [Resent-]From: may be a program.
+
+ if gw.rcpt == '' or gw.sender == '':
+ print 'missing command line option'
+ gw.smtpheads = None
+ return retnull
+
+ if gw.envelope == '' and gw.sender != '':
+ gw.smtpheads['Resent-From:'] = gw.sender + '\n'
+ gw.envelope = gw.sender
+ elif gw.envelope == -1:
+ gw.smtpheads = None
+ return retnull
+
+ sys.argv[1:] = arg
+
+ return (test, verbose)
+
+
+def usage():
+ i = pyginfo.pygsinfo()
+
+ print '%s version %s - Copyright 2000 Cosimo Alfarano' % (i.PROGNAME, i.VERSION)
+ print i.__doc__
+ print
+ print 'usage: %s [-h] [-d] [-T] [-V] [-H smtphost] [-l logfile] [-w whitelist] -t recipient@... -s sender@... [-e envelope@...]' % split(sys.argv[0],'/')[-1]
+ print '-t -s recipient, sender are necessary'
+ print '-e envelope [default: same of sender]'
+ print '-T for test mode (not send article via SMTP)'
+ print '-V for verbose output'
+ print '-d for debug'
+ print '-h or -v for this info'
+
+
+
+
+
+
+
+
+"""main is structured in 4 phases:
+ 1) check and set pyg's internal variables
+ 2) check whitelist for users' permission
+ 3) format rfc 822 headers from input article
+ 4) open smtp connection and send e-mail
+"""
+
+
+try:
+
+ """phase 1:
+ check and set pyg's internal variables
+ """
+
+ n2m = news2mail.news2mail()
+ owner = None
+
+ # it returns only test, other parms are set directly in the actual parameter
+ (test, verbose) = parse_cmdline(n2m)
+ if (test, verbose) == (None, None):
+ usage()
+ sys.exit(0)
+
+
+ # check if n2m has some file prefercences set on commandline
+ if(n2m.wlfile == None):
+ wl = os.environ['HOME'] + '/pyg.whitelist'
+ else:
+ wl = n2m.wlfile
+
+ if(n2m.logfile == None):
+ log = os.environ['HOME'] + '/pyg.log'
+ else:
+ log = n2m.logfile
+
+# print 'using %s %s\n' % (wl,log)
+
+ wl = whitelist.whitelist(wl,log)
+
+ # reads stdin and parses article separating head from body
+ n2m.readfile()
+ n2m.parsearticle()
+
+
+ """phase 2:
+ check whitelist for user's permission
+ """
+
+ # make a first check of From: address
+ owner = wl.checkfrom(n2m.nntpheads['From:'])
+ if(owner == None):
+ if(sys.stdin.isatty()==1 or test):
+ print ('"%s" is not in whitelist!' % (n2m.nntpheads['From:'][:-1]))
+ else:
+ wl.logmsg(n2m.nntpheads,wl.DENY)
+
+ # if verbose, I want to print out headers, so I can't
+ # exit now.
+ if(not verbose):
+ sys.exit(1)
+
+ """phase 3:
+ format rfc 822 headers from input article
+ """
+
+ n2m.mergeheads() # make unique dict from NNTP and SMTP dicts
+
+ n2m.addheads() # add some important heads
+ n2m.renameheads() # rename useless heads
+ n2m.removeheads() # remove other heads
+
+ n2m.sortheads() # sort remaining heads :)
+
+ # prints formatted email message only (without send) if user wants
+ if(verbose):
+ for line in n2m.headers:
+ print line[:-1]
+
+ if(owner == None):
+ sys.exit(1)
+
+
+ """phase 4:
+ open smtp connection and send e-mail
+ """
+
+ if len(n2m.headers) > 0:
+ wl.logmsg(n2m.heads_dict,wl.ACCEPT,owner)
+ if(not test):
+ n2m.sendarticle()
+ else:
+ print 'Error: No Headers!!!'
+
+except KeyboardInterrupt:
+ print 'Keyboard Interrupt'
+ sys.exit(1)