彼得,
我和我的團隊都經歷着同樣的挑戰。 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