2017-09-27 10 views
6

Je jouais avec oauth2 pour mieux le comprendre. Pour cette raison, j'ai installé offlineimap qui devrait agir comme une application tierce. J'ai trouvé une bonne façon de lire les informations d'identification cryptées ici sur stackexchange.comment utiliser les fichiers oauth gpg cryptés via Python pour offlineimap

Basé sur le poste lié j'ai modifié/copier le script python suivant:

import subprocess 
import os 
import json 

def passwd(file_name): 
    acct = os.path.basename(file_name) 
    path = "/PATHTOFILE/%s" % file_name 
    args = ["gpg", "--use-agent", "--quiet", "--batch", "-d", path] 
    try: 
    return subprocess.check_output(args).strip() 
    except subprocess.CalledProcessError: 
    return "" 

def oauthpasswd(acct, key): 
    acct = os.path.basename(acct) 
    path = "/PATHTOFILE/%s_oauth2.gpg" % acct 
    args = ["gpg", "--use-agent", "--quiet", "--batch", "-d", path] 
    try: 
    return str(json.loads(subprocess.check_output(args).strip())['installed'][key]) 
    except subprocess.CalledProcessError: 
    return "" 

def prime_gpg_agent(): 
    ret = False 
    i = 1 
    while not ret: 
    ret = (passwd("prime.gpg") == "prime") 
    if i > 2: 
     from offlineimap.ui import getglobalui 
     sys.stderr.write("Error reading in passwords. Terminating.\n") 
     getglobalui().terminate() 
    i += 1 
    return ret 

prime_gpg_agent() 

Dans le correspondant fichier offlineimaprc j'appelle la fonction avec les bons arguments:

oauth2_client_id = oauthpasswd('gmail', 'client_id') 
oauth2_client_secret = oauthpasswd('gmail', 'client_secret') 
oauth2_request_url = https://accounts.google.com/o/oauth2/token 
oauth2_refresh_token = passwd('gmail_rf_token.gpg') 

S'il vous plaît noter Dans le fichier local, le PATHTOFILE est défini correctement. Ce que j'ai fait a été téléchargé le fichier JSON de Google, y compris les informations d'identification oauth2 et crypté. J'ai stocké le jeton d'actualisation dans un fichier distinct. Cependant, si je lance offlineimap je reçois une erreur d'authentification:

ERROR: While attempting to sync account 'gmail' 
    ('http error', 401, 'Unauthorized', <httplib.HTTPMessage instance at 0x7f488c214320>) (configuration is: {'client_secret': "oauthpasswd('gmail', 'client_secret')", 'grant_type': 'refresh_token', 'refresh_token': "passwd('gmail_rf_token.gpg')", 'client_id': "oauthpasswd('gmail', 'client_id')"}) 

J'ai essayé alors de vérifier les sorties des deux fonctions de python passwd et oauthpasswd dans un interpréteur Python. Je reçois les sorties souhaitées. Plus encore, j'ai copié la sortie des fonctions de l'interpréteur python vers le fichier de configuration offlineimaprc et j'ai pu synchroniser avec Gmail. Cela implique qu'il doit y avoir une erreur lorsque offlineimap exécute le fichier mais je ne vois pas ce qui ne va pas.

Si je ne crypte que mon mot de passe Gmail, tout fonctionne. Cela signifie qu'il y a un problème avec les détails téléchargés sur Google (client_id, client_secret et refresh token). Comme indiqué ci-dessus, les valeurs elles-mêmes sont correctes. J'ai vraiment copié la sortie de

oauthpasswd('gmail', 'client_id') 
oauthpasswd('gmail', 'client_secret') 
passwd('gmail_rf_token.gpg') 

depuis une console python vers le fichier offlineimaprc et cela a fonctionné.

Répondre

1

Le problème qui se produit est le suivant. Selon ce answer offlineimap ne permet pas le cryptage de toutes les clés dans le fichier offlinemaprc. C'est pourquoi la fonction python n'est jamais évaluée et les mauvaises chaînes sont transmises.