From 9d926879327a3ba9118a630369675d074afbf533 Mon Sep 17 00:00:00 2001 From: VG Date: Wed, 27 Apr 2016 23:01:18 +0200 Subject: Auto-commit on 807fe7afb37fe2cfcf15c9457d04f64fa11b7511 --- climl.py | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++ climl_imap_bridge.py | 93 ---------------------------------------------------- 2 files changed, 93 insertions(+), 93 deletions(-) create mode 100644 climl.py delete mode 100644 climl_imap_bridge.py diff --git a/climl.py b/climl.py new file mode 100644 index 0000000..cfc527c --- /dev/null +++ b/climl.py @@ -0,0 +1,93 @@ +#!/usr/bin/python3 + +import os +import subprocess +import confparser +import imapclient +import contextlib +import backports.ssl +import socket + +def conf_boolean_postprocess(src): + src = src.lower().strip() + if src == 'true' or src == 'on' or src == '1': + return True + return False + +def conf_postprocess(conf): + d = { + 'imap.tls': conf_boolean_postprocess, + 'imap.start_tls': conf_boolean_postprocess, + 'imap.tls_nocheck_hostname': conf_boolean_postprocess, + 'imap.tls_nocheck_ca': conf_boolean_postprocess, + } + return {key: d[key](value) if key in d else value + for key, value in conf.items()} + +@contextlib.contextmanager +def connect_to_imap(conf, password): + + cafile = conf.get('imap.tls_ca', None) + + if cafile: + cafile = os.path.expanduser(cafile) + + ssl_context = imapclient.create_default_context(cafile=cafile) + + if conf.get('imap.tls_nocheck_hostname', False): + # don't check if certificate hostname doesn't match target hostname + ssl_context.check_hostname = False + + if conf.get('imap.tls_nocheck_ca', False): + # don't check if the certificate is trusted by a certificate authority + ssl_context.verify_mode = backports.ssl.CERT_NONE + + connection = imapclient.IMAPClient(host=conf.get('imap.server'), + ssl=conf.get('imap.tls', True), + ssl_context=ssl_context) + if conf.get('imap.start_tls', False): + connection.start_tls(ssl_context=ssl_context) + print('connection succeed') + connection.login(username=conf.get('imap.username'), password=password) + print('successfuly logged') + + # TODO: replace shutdown by logouts when it will not timeout through ssl + try: + yield connection + #connection.logout() + except (connection.AbortError, socket.error, socket.timeout, + backports.ssl.SSLError, backports.ssl.CertificateError): + raise + else: + pass + #connection.logout() + finally: + connection.shutdown() + +def main(): + confpath = os.path.expanduser('~/temp/conf.cfg') + conf = conf_postprocess(confparser.read_conf(confpath)) + print('Read conf:', conf) + password_command = conf.get('imap.password_command', None) + if password_command: + password = subprocess.check_output(password_command, shell=True) + password = password.rstrip().decode('utf8') + print('got pasword:', password) + + #connection = connect_to_imap(conf, password) + with connect_to_imap(conf, password) as connection: + print('selecting folder') + connection.select_folder(conf.get('imap.mailbox')) + print('entering idle mode') + connection.idle() + print('waiting for an event') + while True: + try: + result = connection.idle_check(timeout=10) + except KeyboardInterrupt: + break + print('result:', result) + print('end of connection') + + +main() # dev mode for now diff --git a/climl_imap_bridge.py b/climl_imap_bridge.py deleted file mode 100644 index cfc527c..0000000 --- a/climl_imap_bridge.py +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/python3 - -import os -import subprocess -import confparser -import imapclient -import contextlib -import backports.ssl -import socket - -def conf_boolean_postprocess(src): - src = src.lower().strip() - if src == 'true' or src == 'on' or src == '1': - return True - return False - -def conf_postprocess(conf): - d = { - 'imap.tls': conf_boolean_postprocess, - 'imap.start_tls': conf_boolean_postprocess, - 'imap.tls_nocheck_hostname': conf_boolean_postprocess, - 'imap.tls_nocheck_ca': conf_boolean_postprocess, - } - return {key: d[key](value) if key in d else value - for key, value in conf.items()} - -@contextlib.contextmanager -def connect_to_imap(conf, password): - - cafile = conf.get('imap.tls_ca', None) - - if cafile: - cafile = os.path.expanduser(cafile) - - ssl_context = imapclient.create_default_context(cafile=cafile) - - if conf.get('imap.tls_nocheck_hostname', False): - # don't check if certificate hostname doesn't match target hostname - ssl_context.check_hostname = False - - if conf.get('imap.tls_nocheck_ca', False): - # don't check if the certificate is trusted by a certificate authority - ssl_context.verify_mode = backports.ssl.CERT_NONE - - connection = imapclient.IMAPClient(host=conf.get('imap.server'), - ssl=conf.get('imap.tls', True), - ssl_context=ssl_context) - if conf.get('imap.start_tls', False): - connection.start_tls(ssl_context=ssl_context) - print('connection succeed') - connection.login(username=conf.get('imap.username'), password=password) - print('successfuly logged') - - # TODO: replace shutdown by logouts when it will not timeout through ssl - try: - yield connection - #connection.logout() - except (connection.AbortError, socket.error, socket.timeout, - backports.ssl.SSLError, backports.ssl.CertificateError): - raise - else: - pass - #connection.logout() - finally: - connection.shutdown() - -def main(): - confpath = os.path.expanduser('~/temp/conf.cfg') - conf = conf_postprocess(confparser.read_conf(confpath)) - print('Read conf:', conf) - password_command = conf.get('imap.password_command', None) - if password_command: - password = subprocess.check_output(password_command, shell=True) - password = password.rstrip().decode('utf8') - print('got pasword:', password) - - #connection = connect_to_imap(conf, password) - with connect_to_imap(conf, password) as connection: - print('selecting folder') - connection.select_folder(conf.get('imap.mailbox')) - print('entering idle mode') - connection.idle() - print('waiting for an event') - while True: - try: - result = connection.idle_check(timeout=10) - except KeyboardInterrupt: - break - print('result:', result) - print('end of connection') - - -main() # dev mode for now -- cgit v1.2.3