Peter,
Mon équipe et moi avons connu le même défi. Samplebias, essayez de fournir une fonction callback_get_login
mais définissez votre callback_server_ssl_trust_prompt
pour renvoyer (True, trust_dict['failures'], True)
. La subversion IFF n'a pas mis en cache les paramètres de confiance de votre certificat de serveur, alors vous pouvez trouver la commande info2()
(ou la commande list()
de Peter) (elle n'est pas réellement suspendue, il faut juste beaucoup plus de temps pour retourner). Bizarrement, lorsque vous utilisez CTRL-C comme interprète dans ces scénarios, vous obtenez une indication indiquant qu'il s'est accroché au rappel de connexion, et non à la vérification server_cert. Jouez avec vos paramètres ~/.subversion/auth
(en particulier les répertoires svn.simple
et svn.ssl.server
) et vous verrez des quantités différentes de «temps d'attente». Regardez pysvn.Client.callback_cancel
si vous avez besoin de gérer des situations qui ne reviennent jamais vraiment. Considérant: http://pysvn.tigris.org/docs/pysvn_prog_ref.html#pysvn_client_callback_ssl_server_trust_prompt vous devez décider quel est votre comportement désiré.
Voulez-vous UNIQUEMENT autoriser les connexions pour lesquelles vous avez déjà une réponse de confiance mise en cache? Ou, voulez-vous TOUJOURS accepter quelle que soit la vérification du certificat de serveur (ATTENTION: cela pourrait (évidemment) avoir des implications de sécurité négatives). Considérez la suggestion suivante:
import pysvn
URL1 = "https://exists.your.org/svn/repos/dev/trunk/current"
URL2 = "https://doesntexit.your.org/svn/repos/dev/trunk/current"
URL3 = "https://exists.your.org/svn/repos/dev/trunk/youDontHavePermissionsBranch"
ALWAYS = "ALWAYS"
NEVER = "NEVER"
DESIRED_BEHAVIOR = ALWAYS
def ssl_server_certificate_trust_prompt(trust_dict):
if DESIRED_BEHAVIOR == NEVER:
return (False, 0, False)
elif DESIRED_BEHAVIOR == ALWAYS:
return (True, trust_dict['failures'], True)
raise Exception, "Unsupported behavior"
def testURL(url):
try:
c.info2(url)
return True
except pysvn.ClientError, ce:
if ('non-existant' in ce.args[0]) or ('Host not found' in ce.args[0]):
return False
else:
raise ce
c = pysvn.Client()
c.callback_ssl_server_trust_prompt = lambda t: (False, t['failures'], True)
c.callback_get_login = lambda x, y, z: (True, "uname", "pw", False)
if not testURL(URL1): print "Test1 failed."
if testURL(URL2): print "Test2 failed."
try:
testURL(URL3)
print "Test3 failed."
except: pass
En réalité, vous ne voulez probablement pas être aussi chic que j'ai avec les valeurs de retour. I do pense qu'il était important de considérer un potentiel 403 renvoyé par le serveur et le scénario "Hôte non trouvé" séparément.
Si l'appel reste bloqué inexpliqué par le code ci-dessus, vous pouvez implémenter pysvn.Client.callback_cancel et voir quel est l'état d'exécution lorsque vous recevez le rappel. Sinon, je devrais voir plus de détails sur votre configuration de code/serveur. N'hésitez pas à me contacter hors ligne si vous le souhaitez. –