home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_2491 < prev    next >
Encoding:
Text File  |  2005-11-23  |  6.3 KB  |  161 lines

  1. Index: fetch_url.py
  2. ===================================================================
  3. RCS file: /cvsroot/pywin32/pywin32/win32/Demos/security/sspi/fetch_url.py,v
  4. retrieving revision 1.1
  5. diff -r1.1 fetch_url.py
  6. 14a15,16
  7. > import re
  8. > import win32security, sspicon
  9. 24c26
  10. < #    h.set_debuglevel(9)
  11. ---
  12. >     h.set_debuglevel(9)
  13. 48c50,77
  14. <         ca = ClientAuth("NTLM", auth_info=auth_info)
  15. ---
  16. >         for auth_hdr in resp.msg.getheaders("WWW-Authenticate"):
  17. >             # Eeek - this regex doesn't handle quoted quote chars!
  18. >             m = re.match('[ \t]*([^ \t]+)', auth_hdr)
  19. >             params = {}
  20. >             scheme = ""
  21. >             if m is not None:
  22. >                 scheme = m.group(1).lower()
  23. >                 rest = auth_hdr[m.span()[1]:]
  24. >                 auth_value = rest
  25. >                 while rest:
  26. >                     m = re.match('[ \t]*,?[ \t]*([^ \t]+)[ \t]*=[ \t]*"([^ \t]+)"', rest)
  27. >                     if m is None:
  28. >                         break
  29. >                     params[m.group(1)] = m.group(2)
  30. >                     rest = rest[m.span()[1]:]
  31. >             #sl = scheme.lower()
  32. >             if scheme.lower() in ["negotiate", "ntlm"]:
  33. >                 # If I pass 'negotiate' to ClientAuth here, it appears to
  34. >                 # perform the auth without the full NTLM dance??
  35. >                 ca = ClientAuth("NTLM", auth_info=auth_info)
  36. >                 break
  37. >             if scheme.lower() in ["digest"]:
  38. >                 ca = ClientAuth("WDigest", auth_info=auth_info)
  39. >                 break
  40. >             
  41. >         else:
  42. >             raise RuntimeError, "Don't handle any offered auth schemes"
  43. 50c79,91
  44. <         data = None
  45. ---
  46. >         credentials, \
  47. >         credentials_expiry=win32security.AcquireCredentialsHandle(
  48. >                                 None, auth_scheme,
  49. >                                 sspicon.SECPKG_CRED_OUTBOUND,
  50. >                                 None, None)
  51. >         #data = decodestring(params["nonce"])
  52. >         data = "Digest" + auth_value
  53. >         context = None
  54. >         last = False
  55. 52,55c93,155
  56. <             err, out_buf = ca.authorize(data)
  57. <             data = out_buf[0].Buffer
  58. <             # Encode it as base64 as required by HTTP
  59. <             auth = encodestring(data).replace("\012", "")
  60. ---
  61. >             context_in = context
  62. >             if context is None:
  63. >                 context = win32security.CtxtHandleType()
  64. >             ISC_REQ_HTTP = 0x10000000
  65. >             scflags = ISC_REQ_HTTP | sspicon.ISC_RET_REPLAY_DETECT
  66. >                       # sspicon.ISC_REQ_SEQUENCE_DETECT|\
  67. >                       # sspicon.ISC_REQ_REPLAY_DETECT|ISC_REQ_HTTP #|sspicon.ISC_REQ_ALLOCATE_MEMORY
  68. >                       # docs say can't use sspicon.ISC_REQ_CONFIDENTIALITY with ISC_REQ_HTTP
  69. >                       # sspicon.ISC_REQ_INTEGRITY|??
  70. >             print "The data is", data
  71. >             sec_buffer_new=win32security.SecBufferDescType()
  72. >             # 0 SECBUFFER_TOKEN Empty 
  73. >             tokenbuf=win32security.SecBufferType(ca.pkg_info['MaxToken'],
  74. >                                                  sspicon.SECBUFFER_TOKEN)
  75. >             tokenbuf.Buffer = data
  76. >             sec_buffer_new.append(tokenbuf)
  77. >             # 1 SECBUFFER_PKG_PARAMS Method 
  78. >             val = "GET"
  79. >             tokenbuf=win32security.SecBufferType(len(val)+1,
  80. >                                                  sspicon.SECBUFFER_PKG_PARAMS)
  81. >             tokenbuf.Buffer = val
  82. >             sec_buffer_new.append(tokenbuf)
  83. >             # 2 SECBUFFER_PKG_PARAMS Hentity.
  84. >             # as if...
  85. >             import md5
  86. >             val = md5.new('').hexdigest()
  87. >             #val = ''
  88. >             tokenbuf=win32security.SecBufferType(len(val)+1,
  89. >                                                  sspicon.SECBUFFER_PKG_PARAMS)
  90. >             tokenbuf.Buffer = val
  91. >             sec_buffer_new.append(tokenbuf)
  92. >             # NOT filled in by sspi due to ISC_REQ_ALLOCATE_MEMORY flag
  93. >             sec_buffer_out=win32security.SecBufferDescType()
  94. >             tokenbuf=win32security.SecBufferType(ca.pkg_info['MaxToken'],
  95. >                                                  sspicon.SECBUFFER_TOKEN)
  96. >             sec_buffer_out.append(tokenbuf)
  97. >             err, attr, exp=win32security.InitializeSecurityContext(
  98. >                 credentials,
  99. >                 context_in,
  100. >                 url,
  101. >                 scflags,
  102. >                 0,
  103. >                 sec_buffer_new,
  104. >                 context,
  105. >                 sec_buffer_out)
  106. >             print "InitializeSecurityContext returned", err, attr, exp
  107. > #            print "Buffer has", len(sec_buffer_out)
  108. > #            print sec_buffer_out[0].Buffer
  109. >             data = sec_buffer_out[0].Buffer
  110. >             print "challenge response is", data
  111. >             if last:
  112. >                 print "LAst one - breaking!"
  113. >                 break
  114. 57c157
  115. <             h.putheader('Authorization', auth_scheme + ' ' + auth)
  116. ---
  117. >             h.putheader('Authorization', 'Digest ' + data)
  118. 67c167,168
  119. <                 break
  120. ---
  121. >                 print "Err - 0 - flagging as last"
  122. >                 last = True
  123. 73c174,178
  124. <                         print repr(resp.read(int(cl)))
  125. ---
  126. >                         got = resp.read(int(cl))
  127. >                         if options.show_body:
  128. >                             print repr(got)
  129. >                         else:
  130. >                             print "<specify --show-body to see error page>"
  131. 79,87c184,187
  132. <             assert not resp.will_close, "NTLM is per-connection - must not close"
  133. <             schemes = [s.strip() for s in resp.msg.get("WWW-Authenticate", "").split(",")]
  134. <             for scheme in schemes:
  135. <                 if scheme.startswith(auth_scheme):
  136. <                     data = decodestring(scheme[len(auth_scheme)+1:])
  137. <                     break
  138. <             else:
  139. <                 print "Could not find scheme '%s' in schemes %r" % (auth_scheme, schemes)
  140. <                 break
  141. ---
  142. > #            assert not resp.will_close, "NTLM is per-connection - must not close"
  143. >             #if scheme.lower() in ["ntlm", "negotiate"]:
  144. >             data = resp.msg.get("WWW-Authenticate", "")
  145.