2010-09-07 84 views
0

我想用pyme(一个来自gpgme的python包装)解密消息。如果我在提示时输入密码,但它无法使密码回调正常工作,它会正常工作。下面是代码在没有用户交互的情况下用pyme解密PGP的问题

import pyme.core 

def Callback(x, y, z): 
    print 'in passphrase callback' 
return 'passphrase' 

plain = pyme.core.Data() 
cipher = pyme.core.Data(sys.stdin.read()) 
c = pyme.core.Context() 
c.set_armor(1) 
c.set_passphrase_cb(Callback) 
c.op_decrypt(cipher, plain) 
plain.seek(0,0) 
print plain.read() 

当我运行这一点,并没有提供密码交互的程序然后尝试“在密码回调”回拨打印,但随后失败,错误:

pyme.errors.GPGMEError: Invocation of gpgme_op_decrypt: Unspecified source: General error (0,1) 

第一,最重要的是,为什么密码短语回调不起作用?其次,如何在调用密码短语回调之前阻止程序提示用户输入密码?

这是在Ubuntu 10.04

回答

0

运行我能够从密码回调返回None重现您报告的错误。 Python函数默认返回None,如果它们到达执行函数的末尾而没有达到return语句。可能是因为你的代码错误地认为你的函数提前结束了你的函数,你可能意外地从你的回调中返回了None? (该misindentation想法只是基于你的榜样非法缩进猜测。)

+0

不幸的是,这个例子中的缩进错误只是一个复制和粘贴错误。在我的代码中,回调函数正确地返回一个字符串。你运行的是什么版本的python/pyme/os,你可以得到这个工作? – user19745 2010-09-19 17:02:52

+0

@ user19745我使用libgpgme11 1.2.0-1.2和python-pyme 0.8.1 + clean-4运行Debian测试。 – llasram 2010-09-20 12:21:56

2

显然,你需要解释的关键字hook

def Callback(x, y, z, hook=None): 
    ... 

工作得很好。

相关问题