彼得,
我和我的团队都经历着同样的挑战。 Samplebias,请尝试提供callback_get_login
函数,但将您的callback_server_ssl_trust_prompt
设置为返回(True, trust_dict['failures'], True)
。 IFF subversion没有缓存您的服务器证书信任设置,那么您可能会发现info2()
(或Peter的list()
命令)挂起(它实际上并未挂起,它只是间歇性地花费更长的时间返回)。奇怪的是,当你在这些场景中使用CTRL-C解释器时,你会发现它挂在登录回调上,而不是server_cert验证。玩弄你的~/.subversion/auth
设置(特别是svn.simple
和svn.ssl.server
目录),你会看到不同数量的“挂起时间”。如果您需要处理真正永不返回的情况,请查看pysvn.Client.callback_cancel
。
考虑到:http://pysvn.tigris.org/docs/pysvn_prog_ref.html#pysvn_client_callback_ssl_server_trust_prompt您需要确定您的期望行为。您是否只希望允许那些您已经拥有缓存信任答案的连接?或者,是否要始终接受,无论服务器证书验证如何(警告:这可能(显然)会对安全产生负面影响)。考虑以下建议:
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
实际上,您可能不希望像我对返回值一样花哨。我想做认为重要的是要考虑服务器返回的潜在403和单独的“找不到主机”方案。
如果上述代码未能说明呼叫仍然存在,则可能需要实施pysvn.Client.callback_cancel,并查看获取回调时的执行状态。否则,我需要查看关于代码/服务器配置的更多细节。如果您愿意,请随时与我联系。 – 2011-03-14 02:18:20