如何通过 Python 为 offlineimap 使用 gpg 加密的 oauth 文件
how to use gpg encrypted oauth files via Python for offlineimap
我正在研究 oauth2 以更好地理解它。出于这个原因,我安装了 offlineimap,它应该充当第三方应用程序。我在 stackexchange.
上找到了一种读取加密凭据的好方法
基于链接的 post 我 modified/copied 以下 python 脚本:
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()
在相应的 offlineimaprc 文件中,我使用正确的参数调用函数:
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')
请注意在本地文件中 PATHTOFILE
设置正确。我所做的是从 Google 下载 JSON 文件,包括 oauth2 凭据并对其进行加密。我已将刷新令牌存储在一个单独的文件中。
但是,如果我 运行 offlineimap 我收到身份验证错误:
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')"})
然后我尝试在 python 解释器中检查两个 python 函数 passwd
和 oauthpasswd
的输出。我得到了想要的输出。更重要的是,我已经将 python 解释器中函数的输出复制到 offlineimaprc 配置文件中,并且我能够同步到 Gmail。这意味着 offlineimap 执行文件时一定有错误,但我看不出有什么问题。
如果我只加密我的 Gmail 密码,一切正常。这意味着从 Google(client_id、client_secret 和刷新令牌)下载的详细信息出现问题。如上所述,价值观本身是正确的。我真的复制了
的输出
oauthpasswd('gmail', 'client_id')
oauthpasswd('gmail', 'client_secret')
passwd('gmail_rf_token.gpg')
从 python 控制台到 offlineimaprc 文件,它成功了。
出现的问题如下。根据此 answer offlineimap 不允许对 offlinemaprc 文件中的所有密钥进行加密。这就是为什么 python 函数永远不会被计算,并且会传递错误的字符串。
我正在研究 oauth2 以更好地理解它。出于这个原因,我安装了 offlineimap,它应该充当第三方应用程序。我在 stackexchange.
上找到了一种读取加密凭据的好方法基于链接的 post 我 modified/copied 以下 python 脚本:
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()
在相应的 offlineimaprc 文件中,我使用正确的参数调用函数:
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')
请注意在本地文件中 PATHTOFILE
设置正确。我所做的是从 Google 下载 JSON 文件,包括 oauth2 凭据并对其进行加密。我已将刷新令牌存储在一个单独的文件中。
但是,如果我 运行 offlineimap 我收到身份验证错误:
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')"})
然后我尝试在 python 解释器中检查两个 python 函数 passwd
和 oauthpasswd
的输出。我得到了想要的输出。更重要的是,我已经将 python 解释器中函数的输出复制到 offlineimaprc 配置文件中,并且我能够同步到 Gmail。这意味着 offlineimap 执行文件时一定有错误,但我看不出有什么问题。
如果我只加密我的 Gmail 密码,一切正常。这意味着从 Google(client_id、client_secret 和刷新令牌)下载的详细信息出现问题。如上所述,价值观本身是正确的。我真的复制了
的输出oauthpasswd('gmail', 'client_id')
oauthpasswd('gmail', 'client_secret')
passwd('gmail_rf_token.gpg')
从 python 控制台到 offlineimaprc 文件,它成功了。
出现的问题如下。根据此 answer offlineimap 不允许对 offlinemaprc 文件中的所有密钥进行加密。这就是为什么 python 函数永远不会被计算,并且会传递错误的字符串。