2010-09-07 109 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): 
    ... 

工作得很好。

相關問題