[Python] Problema con proxy

Pietro Battiston me a pietrobattiston.it
Dom 30 Set 2012 09:08:15 CEST


Sei un grande.

In effetti ieri sera avevo già iniziato a dubitare di quella
find_user_password (a maggior ragione dopo che in urllib2.py avevo letto
il TODO
"# check digest against correct (i.e. non-apache) implementation").

Però non avevo idea di come modificarla (né d'altronde di come creare un
proxy di test al volo). Tu hai risolto il problema alla radice...

grazie mille, temo non si possa inviare le birre col DHL, ma se passo
da 
Roma è garantita

Pietro

Il giorno dom, 30/09/2012 alle 00.52 +0200, Simone Federici ha scritto:
> Premessa, 
> anche se l'ho fatto funzionare... dubito delle API,
> 
> 
> mi sono configurato un apache proxy digest
> <VirtualHost *:9999>
>     ServerName romilda.aldaran.org
>     ProxyRequests On
>     <Proxy *> 
>         Order deny,allow 
>         Deny from all 
>         Allow from all
>         AuthType Digest
>         AuthName "private"
>         AuthUserFile /etc/apache2/passwd-digest
>         Require valid-user
>     </Proxy>
> </VirtualHost>
> 
> 
> dopodichè questo è il client python che riesce a leggere la mia pagina
> web tramite proxy 
> 
> 
> #! /usr/bin/python
> import urllib2
> proxy_url = r'http://localhost:9999/'
> proxy = urllib2.ProxyHandler({'http': proxy_url})
> auth = urllib2.ProxyDigestAuthHandler()
> #auth.add_password('private', proxy_url, 'user', 'gb')
> auth.add_password('private', 'janua.it:80', 'user', 'gb')
> auth.add_password('private', 'libera.scuola.steineriana.janua.it:80',
> 'user', 'gb')
> opener = urllib2.build_opener(proxy, auth, urllib2.HTTPHandler)
> 
> 
> urllib2.install_opener(opener)
> conn = urllib2.urlopen('http://janua.it/')
> print conn.read()
> 
> 
> 
> 
> come vedi ho commentato 
> #auth.add_password('private', proxy_url, 'user', 'gb')
> 
> 
> e ho aggiunto 2 linee per far funzionare l'esempio.
> debuggando con pdb ho visto che in effetti il client ci riprova anche
> 5 volte se trova una 407, ma deve associare
> correttamente utente e password con il realm.
> 
> 
> il metodo incriminato di urllib2 è questo, che nel caso "commentato"
> ritorna None, None
> indi per cui usciva con un secco 407 anche su wireshark non trovando
> user e password per il dominio richiesto.
>  
> File:
>   /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py
> Definition: auth.passwd.find_user_password(self, realm, authuri)
> Source:
>     def find_user_password(self, realm, authuri):
>         domains = self.passwd.get(realm, {})
>         for default_port in True, False:
>             reduced_authuri = self.reduce_uri(authuri, default_port)
>             for uris, authinfo in domains.iteritems():
>                 for uri in uris:
>                     if self.is_suburi(uri, reduced_authuri):
>                         return authinfo
>         return None, None
> 
> 
> a me questo add_password non mi piace per niente cosi :)
> che senso ha definire una strategia diversa su un proxy a seconda del
> dominio da visitare? nessuna
> immagino che le api sono pensate per siti web con autenticazione
> digest
> 
> 
> consiglio questa strada:
> 
> 
> #! /usr/bin/python
> import urllib2
> 
> 
> class MyHTTPPasswordMgr(urllib2.HTTPPasswordMgr):
>     def find_user_password(self, realm, authuri):
>         return "user", "gb"
> 
> 
> proxy_url = r'http://localhost:9999/'
> proxy = urllib2.ProxyHandler({'http': proxy_url})
> auth = urllib2.ProxyDigestAuthHandler(MyHTTPPasswordMgr())
> opener = urllib2.build_opener(proxy, auth, urllib2.HTTPHandler)
> 
> 
> urllib2.install_opener(opener)
> conn = urllib2.urlopen('http://janua.it/')
> print conn.read()
> 
> 
> ciao
> S
> 
> 
> 2012/9/29 Simone Federici <s.federici a gmail.com>
>         da quello che so io i proxy continuano a darti 407 finche non
>         gli passi la autenticazione nel modo giusto.
>         
>         
>         secondo me sei sulla strada giusta e c'è un dettaglio che
>         probabilmente ci sta sfuggendo.
>         non credo invece alla teoria che urlib2 sia bacata sul digest
>         mentre funziona sul basic :-D
>          
>         mi piacerebbe darti una mano, hai un proxy pubblico e una
>         utenza con cui fare le prove?
>         
>         
>         ciao
>         S
>         
>         
>         2012/9/29 Pietro Battiston <me a pietrobattiston.it>
>                 Grazie della dritta... io il realm lo conosco anche,
>                 ma dove dovrei
>                 darglielo?!
>                 
>                 In HTTPPasswordMgrWithDefaultRealm.add_password gliene
>                 posso dare uno,
>                 ma da quello che ho capito
>                 - serve solo a stabilire quali dati di autenticazione
>                 utilizzare a
>                 seconda del realm ricevuto nell'errore 407 (e None
>                 significa "per tutti
>                 i realm"), ed
>                 - è il realm ricevuto che dovrebbe essere utilizzato
>                 poi per
>                 l'autenticazione.
>                 
>                 In sintesi, da quel che ho capito è _normale_ che nel
>                 corso
>                 dell'autenticazione digest si riceva un 407. Non ho
>                 capito nulla?
>                 
>         
>         
> 
> 
> _______________________________________________
> Python mailing list
> Python a lists.python.it
> http://lists.python.it/mailman/listinfo/python




Maggiori informazioni sulla lista Python