diff --git a/GnuPG/__init__.py b/GnuPG/__init__.py index 540622e..6404720 100644 --- a/GnuPG/__init__.py +++ b/GnuPG/__init__.py @@ -101,7 +101,7 @@ def confirm_key( content, email ): # adds a key and ensures it has the given email address def add_key( keyhome, content ): - p = subprocess.Popen( build_command(keyhome, '--import', '--batch'), stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) + p = subprocess.Popen( ['/usr/bin/gpg', '--homedir', keyhome, '--import', '--batch'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) p.communicate(input=content) p.wait() @@ -130,7 +130,7 @@ class GPGEncryptor: self._message += message def encrypt(self): - p = subprocess.Popen( self._command(), stdin=subprocess.PIPE, stdout=subprocess.PIPE,stderr=subprocess.PIPE ) + p = subprocess.Popen( self._command(), stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) encdata = p.communicate(input=self._message)[0] return (encdata, p.returncode) @@ -158,7 +158,7 @@ class GPGDecryptor: self._message += message def decrypt(self): - p = subprocess.Popen( self._command(), stdin=subprocess.PIPE, stdout=subprocess.PIPE,stderr=subprocess.PIPE ) + p = subprocess.Popen( self._command(), stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) decdata = p.communicate(input=self._message)[0] return (decdata, p.returncode) diff --git a/gpg-mailgate-web/cron.py b/gpg-mailgate-web/cron.py index 3f305ba..98cd8d1 100644 --- a/gpg-mailgate-web/cron.py +++ b/gpg-mailgate-web/cron.py @@ -19,7 +19,7 @@ # along with gpg-mailgate source code. If not, see . # -from ConfigParser import RawConfigParser +from configparser import RawConfigParser import GnuPG import MySQLdb import smtplib @@ -64,7 +64,7 @@ for sect in _cfg.sections(): for (name, value) in _cfg.items(sect): cfg[sect][name] = value -if cfg.has_key('database') and cfg['database'].has_key('enabled') and cfg['database']['enabled'] == 'yes' and cfg['database'].has_key('name') and cfg['database'].has_key('host') and cfg['database'].has_key('username') and cfg['database'].has_key('password'): +if 'database' in cfg and 'enabled' in cfg['database'] and cfg['database']['enabled'] == 'yes' and 'name' in cfg['database'] and 'host' in cfg['database'] and 'username' in cfg['database'] and 'password' in cfg['database']: connection = MySQLdb.connect(host = cfg['database']['host'], user = cfg['database']['username'], passwd = cfg['database']['password'], db = cfg['database']['name'], port = 3306) cursor = connection.cursor() @@ -83,17 +83,17 @@ if cfg.has_key('database') and cfg['database'].has_key('enabled') and cfg['datab GnuPG.add_key(cfg['gpg']['keyhome'], row[0]) # import the key to gpg cursor.execute("UPDATE gpgmw_keys SET status = 1 WHERE id = %s", (row[1],)) # mark key as accepted appendLog('Imported key from <' + row[2] + '>') - if cfg['cron'].has_key('send_email') and cfg['cron']['send_email'] == 'yes': + if 'send_email' in cfg['cron'] and cfg['cron']['send_email'] == 'yes': send_msg( "PGP key registration successful", "registrationSuccess.md", row[2] ) else: cursor.execute("DELETE FROM gpgmw_keys WHERE id = %s", (row[1],)) # delete key appendLog('Import confirmation failed for <' + row[2] + '>') - if cfg['cron'].has_key('send_email') and cfg['cron']['send_email'] == 'yes': + if 'send_email' in cfg['cron'] and cfg['cron']['send_email'] == 'yes': send_msg( "PGP key registration failed", "registrationError.md", row[2] ) else: # delete key so we don't continue processing it cursor.execute("DELETE FROM gpgmw_keys WHERE id = %s", (row[1],)) - if cfg['cron'].has_key('send_email') and cfg['cron']['send_email'] == 'yes': + if 'send_email' in cfg['cron'] and cfg['cron']['send_email'] == 'yes': send_msg( "PGP key deleted", "keyDeleted.md", row[2]) connection.commit() @@ -108,4 +108,4 @@ if cfg.has_key('database') and cfg['database'].has_key('enabled') and cfg['datab appendLog('Deleted key for <' + row[0] + '>') connection.commit() else: - print "Warning: doing nothing since database settings are not configured!" + print("Warning: doing nothing since database settings are not configured!") diff --git a/gpg-mailgate.py b/gpg-mailgate.py index b39c786..e520aa5 100755 --- a/gpg-mailgate.py +++ b/gpg-mailgate.py @@ -19,7 +19,7 @@ # along with gpg-mailgate source code. If not, see . # -from ConfigParser import RawConfigParser +from configparser import RawConfigParser from email.mime.base import MIMEBase from email.mime.multipart import MIMEMultipart import copy @@ -94,7 +94,7 @@ def gpg_decrypt( raw_message, recipients ): keys[fingerprint] = sanitize_case_sense(keys[fingerprint]) for to in recipients: - if to in keys.values() and not get_bool_from_cfg('default', 'dec_keymap_only', 'yes'): + if to in list(keys.values()) and not get_bool_from_cfg('default', 'dec_keymap_only', 'yes'): gpg_to.append(to) # Is this recipient defined in regex for default decryption? elif not (dec_regex is None) and not (re.match(dec_regex, to) is None): @@ -106,7 +106,7 @@ def gpg_decrypt( raw_message, recipients ): if not cfg['dec_keymap'][to] in keys: log("Key '%s' in decryption keymap not found in keyring for email address '%s'. Won't decrypt." % (cfg['dec_keymap'][to], to)) # Avoid unwanted encryption if set - if to in keys.values() and get_bool_from_cfg('default', 'failsave_dec', 'yes'): + if to in list(keys.values()) and get_bool_from_cfg('default', 'failsave_dec', 'yes'): noenc_to.append(to) else: ungpg_to.append(to) @@ -116,7 +116,7 @@ def gpg_decrypt( raw_message, recipients ): if verbose: log("Recipient (%s) not in PGP domain list for decrypting." % to) # Avoid unwanted encryption if set - if to in keys.values() and get_bool_from_cfg('default', 'failsave_dec', 'yes'): + if to in list(keys.values()) and get_bool_from_cfg('default', 'failsave_dec', 'yes'): noenc_to.append(to) else: ungpg_to.append(to) @@ -206,7 +206,7 @@ def decrypt_inline_with_attachments( payloads, success, message = None ): message = email.mime.multipart.MIMEMultipart(payloads.get_content_subtype()) for payload in payloads.get_payload(): - if( type( payload.get_payload() ) == list ): + if( isinstance(payload.get_payload(), list) ): # Take care of cascaded MIME messages submessage, subsuccess = decrypt_inline_with_attachments( payload, success ) message.attach(submessage) @@ -317,7 +317,7 @@ def gpg_encrypt( raw_message, recipients ): log("Key '%s' in encrypt keymap not found in keyring for email address '%s'." % (cfg['enc_keymap'][to], to)) # Check if key in keychain is present - if to in keys.values() and not get_bool_from_cfg('default', 'enc_keymap_only', 'yes'): + if to in list(keys.values()) and not get_bool_from_cfg('default', 'enc_keymap_only', 'yes'): gpg_to.append( (to, to) ) continue @@ -341,7 +341,7 @@ def gpg_encrypt( raw_message, recipients ): ungpg_to.append(to) if gpg_to != list(): - log("Encrypting email to: %s" % ' '.join( map(lambda x: x[0], gpg_to) )) + log("Encrypting email to: %s" % ' '.join( [x[0] for x in gpg_to] )) # Getting PGP style for recipient gpg_to_smtp_mime = list() @@ -378,8 +378,8 @@ def gpg_encrypt( raw_message, recipients ): if get_bool_from_cfg('default', 'add_header', 'yes'): raw_message_mime['X-GPG-Mailgate'] = 'Encrypted by GPG Mailgate' - if raw_message_mime.has_key('Content-Transfer-Encoding'): - raw_message_mime.replace_header('Content-Transfer-Encoding','8BIT') + if 'Content-Transfer-Encoding' in raw_message_mime: + raw_message_mime.replace_header('Content-Transfer-Encoding', '8BIT') else: raw_message_mime['Content-Transfer-Encoding'] = '8BIT' @@ -395,8 +395,8 @@ def gpg_encrypt( raw_message, recipients ): if get_bool_from_cfg('default', 'add_header', 'yes'): raw_message_inline['X-GPG-Mailgate'] = 'Encrypted by GPG Mailgate' - if raw_message_inline.has_key('Content-Transfer-Encoding'): - raw_message_inline.replace_header('Content-Transfer-Encoding','8BIT') + if 'Content-Transfer-Encoding' in raw_message_inline: + raw_message_inline.replace_header('Content-Transfer-Encoding', '8BIT') else: raw_message_inline['Content-Transfer-Encoding'] = '8BIT' @@ -411,11 +411,11 @@ def encrypt_all_payloads_inline( message, gpg_to_cmdline ): # This breaks cascaded MIME messages. Blame PGP/INLINE. encrypted_payloads = list() - if type( message.get_payload() ) == str: + if isinstance(message.get_payload(), str): return encrypt_payload( message, gpg_to_cmdline ).get_payload() for payload in message.get_payload(): - if( type( payload.get_payload() ) == list ): + if( isinstance(payload.get_payload(), list) ): encrypted_payloads.extend( encrypt_all_payloads_inline( payload, gpg_to_cmdline ) ) else: encrypted_payloads.append( encrypt_payload( payload, gpg_to_cmdline ) ) @@ -437,13 +437,13 @@ def encrypt_all_payloads_mime( message, gpg_to_cmdline ): submsg2.set_param('inline', "", 'Content-Disposition' ) submsg2.set_param('filename', "encrypted.asc", 'Content-Disposition' ) - if type ( message.get_payload() ) == str: + if isinstance(message.get_payload(), str): # WTF! It seems to swallow the first line. Not sure why. Perhaps # it's skipping an imaginary blank line someplace. (ie skipping a header) # Workaround it here by prepending a blank line. # This happens only on text only messages. additionalSubHeader="" - if message.has_key('Content-Type') and not message['Content-Type'].startswith('multipart'): + if 'Content-Type' in message and not message['Content-Type'].startswith('multipart'): additionalSubHeader="Content-Type: "+message['Content-Type']+"\n" submsg2.set_payload(additionalSubHeader+"\n" +message.get_payload(decode=True)) check_nested = True @@ -460,7 +460,7 @@ def encrypt_all_payloads_mime( message, gpg_to_cmdline ): boundary = junk_msg.get_boundary() # This also modifies the boundary in the body of the message, ie it gets parsed. - if message.has_key('Content-Type'): + if 'Content-Type' in message: message.replace_header('Content-Type', "multipart/encrypted; protocol=\"application/pgp-encrypted\";\nboundary=\"%s\"\n" % boundary) else: message['Content-Type'] = "multipart/encrypted; protocol=\"application/pgp-encrypted\";\nboundary=\"%s\"\n" % boundary @@ -608,7 +608,7 @@ def generate_message_from_payloads( payloads, message = None ): message = email.mime.multipart.MIMEMultipart(payloads.get_content_subtype()) for payload in payloads.get_payload(): - if( type( payload.get_payload() ) == list ): + if( isinstance(payload.get_payload(), list) ): message.attach(generate_message_from_payloads(payload)) else: message.attach(payload) @@ -624,7 +624,7 @@ def get_first_payload( payloads ): def send_msg( message, recipients ): - recipients = filter(None, recipients) + recipients = [_f for _f in recipients if _f] if recipients: if not (get_bool_from_cfg('relay', 'host') and get_bool_from_cfg('relay', 'port')): log("Missing settings for relay. Sending email aborted.") @@ -632,7 +632,7 @@ def send_msg( message, recipients ): log("Sending email to: <%s>" % '> <'.join( recipients )) relay = (cfg['relay']['host'], int(cfg['relay']['port'])) smtp = smtplib.SMTP(relay[0], relay[1]) - if cfg.has_key('relay') and cfg['relay'].has_key('starttls') and cfg['relay']['starttls'] == 'yes': + if 'relay' in cfg and 'starttls' in cfg['relay'] and cfg['relay']['starttls'] == 'yes': smtp.starttls() smtp.sendmail( from_addr, recipients, message ) else: diff --git a/register-handler.py b/register-handler.py index 5b1cf9a..f4c1e57 100644 --- a/register-handler.py +++ b/register-handler.py @@ -1,6 +1,6 @@ #!/usr/bin/python -from ConfigParser import RawConfigParser +from configparser import RawConfigParser import email, os, smtplib, sys, traceback, markdown, syslog, requests from M2Crypto import BIO, Rand, SMIME, X509 @@ -17,7 +17,7 @@ for sect in _cfg.sections(): cfg[sect][name] = value def log(msg): - if cfg.has_key('logging') and cfg['logging'].has_key('file'): + if 'logging' in cfg and 'file' in cfg['logging']: if cfg['logging']['file'] == "syslog": syslog.syslog(syslog.LOG_INFO | syslog.LOG_MAIL, msg) else: @@ -78,9 +78,9 @@ if __name__ == "__main__": sys.exit(0) if sign_type == 'smime': - raw_sig = sign_part.get_payload().replace("\n","") + raw_sig = sign_part.get_payload().replace("\n", "") # re-wrap signature so that it fits base64 standards - cooked_sig = '\n'.join(raw_sig[pos:pos+76] for pos in xrange(0, len(raw_sig), 76)) + cooked_sig = '\n'.join(raw_sig[pos:pos+76] for pos in range(0, len(raw_sig), 76)) # now, wrap the signature in a PKCS7 block sig = """ @@ -106,7 +106,7 @@ if __name__ == "__main__": # format in user-specific data # sending success mail only for S/MIME as GPGMW handles this on its own success_msg = file(cfg['mailregister']['mail_templates']+"/registrationSuccess.md").read() - success_msg = success_msg.replace("[:FROMADDRESS:]",from_addr) + success_msg = success_msg.replace("[:FROMADDRESS:]", from_addr) msg = MIMEMultipart("alternative") msg["From"] = cfg['mailregister']['register_email'] @@ -128,7 +128,7 @@ if __name__ == "__main__": if r.status_code != 200: log("Could not hand registration over to GPGMW. Error: %s" % r.status_code) error_msg = file(cfg['mailregister']['mail_templates']+"/gpgmwFailed.md").read() - error_msg = error_msg.replace("[:FROMADDRESS:]",from_addr) + error_msg = error_msg.replace("[:FROMADDRESS:]", from_addr) msg = MIMEMultipart("alternative") msg["From"] = cfg['mailregister']['register_email'] diff --git a/test/e2e_test.py b/test/e2e_test.py index d53d6d9..0f7705f 100644 --- a/test/e2e_test.py +++ b/test/e2e_test.py @@ -24,7 +24,7 @@ import sys import difflib -import ConfigParser +import configparser import logging from time import sleep @@ -35,7 +35,7 @@ CONFIG_FILE = "test/gpg-mailgate.conf" PYTHON_BIN = "python2.7" def build_config(config): - cp = ConfigParser.ConfigParser() + cp = configparser.ConfigParser() cp.add_section("logging") cp.set("logging", "file", config["log_file"]) @@ -83,7 +83,7 @@ def report_result(message_file, expected, test_output): else: status = "Failure" - print message_file.ljust(30), status + print(message_file.ljust(30), status) def execute_e2e_test(case_name, config, config_path): """Read test case configuration from config and run that test case. @@ -116,7 +116,7 @@ def execute_e2e_test(case_name, config, config_path): report_result(config.get(case_name, "in"), config.get(case_name, "out"), testout) def load_test_config(): - cp = ConfigParser.ConfigParser() + cp = configparser.ConfigParser() cp.read("test/e2e.ini") return cp @@ -146,4 +146,4 @@ for case_no in range(1, config.getint("tests", "cases")+1): execute_e2e_test(case_name, config, config_path) -print "See diagnostic output for details. Tests: '%s', Lacre: '%s'" % (config.get("tests", "e2e_log"), config.get("tests", "lacre_log")) +print("See diagnostic output for details. Tests: '%s', Lacre: '%s'" % (config.get("tests", "e2e_log"), config.get("tests", "lacre_log"))) diff --git a/test/relay.py b/test/relay.py index 01b93d4..bc6969c 100644 --- a/test/relay.py +++ b/test/relay.py @@ -40,8 +40,8 @@ def serve(port): try: s.bind(('', port)) s.listen(1) - except socket.error, e: - print "Cannot connect", e + except socket.error as e: + print("Cannot connect", e) sys.exit(EXIT_UNAVAILABLE) (conn, addr) = s.accept() @@ -69,7 +69,7 @@ def serve(port): return message[:-len(EOM)] def error(msg): - print "ERROR: %s" % (msg) + print("ERROR: %s" % (msg)) sys.exit(1) @@ -79,4 +79,4 @@ if len(sys.argv) < 2: port = int(sys.argv[1]) body = serve(port) -print body +print(body)