2009-11-25 9 views
2

J'ai un ancien formulaire Web basé sur Python que je suis en train de mettre à jour pour utiliser un GPG pour l'encodage au lieu d'un paquet python non supporté. Lorsque vous appelez le script via la ligne de commande, cela fonctionne très bien, mais via le navigateur Web et le CGI, il y a une erreur: IOError: [Errno 32] Broken pipe. Cette erreur se produit si j'utilise le paquetage gnupg ou si j'essaie de parler directement à gpg via un sous-processus.Script CGI Python IOError Broken Pipe

Versions:

Python 2.4.1 
gnupg 0.2.2 (python GPG wrapper) 
Apache/2.2.9 
gpg 1.4.9 

Voici un script simplifié:

#!/usr/bin/python 

import sys 
# send python tracebacks out to the web browser 
sys.stderr = sys.stdout 
import gnupg 
gpg = gnupg.GPG() 
gpgkey = 'np' 
message = 'Our secret message!' 
print "Content-type: text/html\r\n" 
print '''<html><head><title>Test GPG access via cgi</title> 
      </head><body><pre>''' 
print 'message in the clear:' 
print message 
encrypted = str(gpg.encrypt(message, 'np')) 
print 'message encrypted:' 
print encrypted 
print '''</pre></body></html>'''sf 

Lorsque le script ci-dessus est appelé via la ligne de commande, il fonctionne très bien, mais un appel par CGI génère le erreurs suivantes:

message in the clear: 
Our secret message! 
Traceback (most recent call last): 
    File "/home/dkmaster/www/nickads/secure-cgi/gpgtest.py", line 23, in 
    encrypted = str(gpg.encrypt(message, 'np')) 
    File "/home/dkmaster/www/nickads/secure-cgi/gnupg.py", line 517, in encrypt 
    return self.encrypt_file(StringIO(data), recipients, **kwargs) 
    File "/home/dkmaster/www/nickads/secure-cgi/gnupg.py", line 467, in encrypt_file 
    self._handle_io(args, file, result, passphrase=passphrase) 
    File "/home/dkmaster/www/nickads/secure-cgi/gnupg.py", line 201, in _handle_io 
    _copy_data(file, stdin) 
    File "/home/dkmaster/www/nickads/secure-cgi/gnupg.py", line 75, in _copy_data 
    outstream.write(data) 
IOError: [Errno 32] Broken pipe 

J'ai également essayé de parler à GPG directement via un sous-processus et non le module gnupg.

#!/usr/bin/python 

import sys 
import subprocess 
sys.stderr = sys.stdout 
print "Content-type: text/html\r\n" 
print '''<html><head><title>Test subprocess via cgi</title> 
      </head><body><pre>''' 

plain_text = 'the quick fox ' * 10 
print plain_text 
gpgCommand = "/usr/bin/gpg --quiet -a -e -r 'np' " 
gpgProcess = subprocess.Popen(
         gpgCommand, 
         stdin=subprocess.PIPE, 
         stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE, 
         shell=True 
        ) 
encrypted_text = gpgProcess.communicate(plain_text)[0] 
print encrypted_text 

Encore une fois cela fonctionne très bien à partir de la ligne de commande, mais pas par l'intermédiaire de CGI qui génère une erreur semblable:

Traceback (most recent call last): 
    File "/home/dkmaster/www/nickads/secure-cgi/subprocesstest.py", line 20, in 
    encrypted_text = gpgProcess.communicate(plain_text)[0] 
    File "/usr/lib/python2.5/subprocess.py", line 670, in communicate 
    return self._communicate(input) 
    File "/usr/lib/python2.5/subprocess.py", line 1220, in _communicate 
    bytes_written = self._write_no_intr(self.stdin.fileno(), buffer(input, input_offset, 512)) 
    File "/usr/lib/python2.5/subprocess.py", line 999, in _write_no_intr 
    return os.write(fd, s) 
OSError: [Errno 32] Broken pipe 

Alors, comment puis-je fixer les tuyaux dans CGI?

Répondre

0

Bonne question - Je ne suis pas sûr que ce soit un problème python-gnupg ou même un problème gpg. Il pourrait être un problème avec subprocess ou cgi ou une certaine interaction entre les deux. Que se passe-t-il si vous essayez ceci avec un script très minimal qui lit à partir de stdin et écrit la sortie dans un fichier? Est-ce que ça marche?

Cela vaut aussi la peine d'activer la journalisation pour voir ce qui se produit, si tant est que ce soit le cas. Voir le script test_gnupg.py pour un exemple sur la façon de le faire.

1

Je sais que ma réponse pourrait arriver trop tard, mais j'ai récemment eu le même problème et je pense que je pourrais le résoudre.

GPG semble sortie des choses (« Vous avez besoin d'un mot de passe » blabla) au terminal quel que soit stdout redirigé - ne me demandez pas comment :)

Cependant, le Broken Pipe semble se produire parce que GPG ne peut pas sortir ces messages dans un environnement cgi (qui se passe pour moi avec uwsgi). Il les imprime même si --quiet a été passé. Il semble seulement être vraiment vraiment calme si vous passez --batch en outre.

Questions connexes