2010-09-07 5 views
0

J'essaye de décrypter des messages en utilisant pyme (un wrapper python de gpgme). Cela fonctionne bien si je tape le mot de passe quand il m'indique mais je ne peux pas obtenir le callback de phrase secrète pour fonctionner. Voici le codeProblème de décryptage de PGP en python avec pyme sans intervention de l'utilisateur

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() 

Quand je lance ce et ne fournissent pas le mot de passe de manière interactive le programme tente alors l'impression de rappel « dans le rappel de mot de passe », mais échoue avec l'erreur:

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

Première et avant tout, pourquoi le callback de phrase secrète ne fonctionne pas? Et deuxièmement, comment puis-je empêcher le programme d'inviter l'utilisateur à entrer un mot de passe avant d'appeler le rappel de phrase secrète?

Ce fonctionne sur Ubuntu 10.04

Répondre

0

Je suis en mesure de reproduire l'erreur que vous rapportez en retournant None à partir du rappel de mot de passe. Les fonctions Python renvoient None par défaut si elles atteignent la fin de l'exécution d'une fonction sans atteindre une instruction return. Est-il possible que vous renvoyiez accidentellement None de votre rappel, peut-être en raison d'une mauvaise indication de votre code qui met fin à votre fonction plus tôt? (L'idée de misindentation est juste une supposition basée sur l'empreinte illégale dans votre exemple.)

+0

Malheureusement, l'erreur d'indentation dans cet exemple était juste une erreur de copier-coller. Dans mon code, la fonction de rappel renvoie correctement une chaîne. Quelle version de python/pyme/os utilisez-vous pour que cela fonctionne? – user19745

+0

@ user19745 J'utilise Debian testing avec libgpgme11 1.2.0-1.2 et python-pyme 0.8.1 + clean-4. – llasram

2

apparemment, vous avez besoin d'interpréter le mot-clé hook:

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

fonctionne parfaitement bien.

Questions connexes