Added oauth2 support to imapfetch.py

Signed-off-by: Janos SUTO <sj@acts.hu>
This commit is contained in:
Janos SUTO 2022-12-01 18:21:11 +01:00
parent d9c82c09a1
commit d9909fb155

View File

@ -15,6 +15,11 @@ INBOX = 'INBOX'
ST_RUNNING = 1 ST_RUNNING = 1
def generate_auth_string(user, token):
auth_string = f"user={user}\1auth=Bearer {token}\1\1"
return auth_string
def read_options(filename="", opts={}): def read_options(filename="", opts={}):
s = "[piler]\n" + open(filename, 'r').read() s = "[piler]\n" + open(filename, 'r').read()
config = configparser.ConfigParser() config = configparser.ConfigParser()
@ -44,7 +49,8 @@ def read_folder_list(conn):
if isinstance(folder, type(b'')): if isinstance(folder, type(b'')):
folder = folder.decode('utf-8') folder = folder.decode('utf-8')
elif isinstance(folder, type(())): elif isinstance(folder, type(())):
folder = re.sub(r'\{\d+\}$', '', folder[0].decode('utf-8')) + folder[1].decode('utf-8') folder = re.sub(r'\{\d+\}$', '',
folder[0].decode('utf-8')) + folder[1].decode('utf-8')
# The regex should match ' "/" ' and ' "." ' # The regex should match ' "/" ' and ' "." '
if folder: if folder:
@ -68,7 +74,8 @@ def process_folder(conn, folder):
return return
if rc != "OK": if rc != "OK":
print("Error processing folder {}, rc={}, response={}".format(folder, rc, data)) print("Error processing folder {}, rc={}, response={}".format(folder,
rc, data))
return return
n = int(data[0]) n = int(data[0])
@ -79,7 +86,8 @@ def process_folder(conn, folder):
if opts['id']: if opts['id']:
cursor = opts['db'].cursor() cursor = opts['db'].cursor()
data = (ST_RUNNING, n, opts['id']) data = (ST_RUNNING, n, opts['id'])
cursor.execute("UPDATE import SET status=%s, total=total+%s WHERE id=%s", data) cursor.execute("UPDATE import SET status=%s, total=total+%s WHERE id=%s",
data)
opts['db'].commit() opts['db'].commit()
rc, data = conn.search(None, opts['search']) rc, data = conn.search(None, opts['search'])
@ -102,6 +110,7 @@ def main():
parser.add_argument("--no_ssl", help="Do not use ssl/tls", action='store_true') parser.add_argument("--no_ssl", help="Do not use ssl/tls", action='store_true')
parser.add_argument("-u", "--user", type=str, help="imap user") parser.add_argument("-u", "--user", type=str, help="imap user")
parser.add_argument("-p", "--password", type=str, help="imap password") parser.add_argument("-p", "--password", type=str, help="imap password")
parser.add_argument("--oauth2-token", type=str, help="oauth2 access token file")
parser.add_argument("-x", "--skip-list", type=str, help="IMAP folders to skip", parser.add_argument("-x", "--skip-list", type=str, help="IMAP folders to skip",
default="junk,trash,spam,draft,\"[Gmail]\"") default="junk,trash,spam,draft,\"[Gmail]\"")
parser.add_argument("-f", "--folders", type=str, parser.add_argument("-f", "--folders", type=str,
@ -129,6 +138,7 @@ def main():
opts['use_ssl'] = True opts['use_ssl'] = True
opts['db'] = None opts['db'] = None
opts['id'] = 0 opts['id'] = 0
opts['access_token'] = ''
if args.date: if args.date:
opts['search'] = args.date opts['search'] = args.date
@ -136,6 +146,10 @@ def main():
if args.no_ssl: if args.no_ssl:
opts['use_ssl'] = False opts['use_ssl'] = False
if args.oauth2_token:
with open(args.oauth2_token, 'r') as f:
opts['access_token'] = f.read()
server = '' server = ''
user = '' user = ''
password = '' password = ''
@ -147,7 +161,8 @@ def main():
opts['password'], opts['database']) opts['password'], opts['database'])
cursor = opts['db'].cursor() cursor = opts['db'].cursor()
cursor.execute("SELECT id, server, username, password FROM import WHERE started=0") cursor.execute("SELECT id, server, username, password " +
"FROM import WHERE started=0")
row = cursor.fetchone() row = cursor.fetchone()
if row: if row:
@ -171,7 +186,12 @@ def main():
else: else:
conn = imaplib.IMAP4(server) conn = imaplib.IMAP4(server)
conn.login(user, password) if opts['access_token']:
conn.authenticate("XOAUTH2", lambda x: generate_auth_string(
user, opts['access_token']))
else:
conn.login(user, password)
conn.select() conn.select()
if args.folders: if args.folders: