libv8 7.3.492.27.1 → 8.4.255.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (718) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +11 -14
  4. data/CHANGELOG.md +10 -0
  5. data/README.md +10 -11
  6. data/Rakefile +30 -36
  7. data/ext/libv8/builder.rb +1 -1
  8. data/lib/libv8/version.rb +1 -1
  9. data/libv8.gemspec +1 -3
  10. data/vendor/depot_tools/{cipd.ps1 → .cipd_impl.ps1} +0 -0
  11. data/vendor/depot_tools/.gitattributes +1 -1
  12. data/vendor/depot_tools/.gitignore +7 -2
  13. data/vendor/depot_tools/.style.yapf +3 -1
  14. data/vendor/depot_tools/.vpython +55 -0
  15. data/vendor/depot_tools/.vpython3 +23 -0
  16. data/vendor/depot_tools/CROS_OWNERS +3 -1
  17. data/vendor/depot_tools/GOMA_OWNERS +9 -0
  18. data/vendor/depot_tools/LUCI_OWNERS +5 -0
  19. data/vendor/depot_tools/OWNERS +21 -6
  20. data/vendor/depot_tools/PRESUBMIT.py +35 -18
  21. data/vendor/depot_tools/README.git-cl.md +0 -14
  22. data/vendor/depot_tools/README.md +1 -1
  23. data/vendor/depot_tools/WATCHLISTS +2 -2
  24. data/vendor/depot_tools/auth.py +60 -772
  25. data/vendor/depot_tools/autoninja +12 -6
  26. data/vendor/depot_tools/autoninja.bat +14 -6
  27. data/vendor/depot_tools/autoninja.py +64 -27
  28. data/vendor/depot_tools/bb +1 -1
  29. data/vendor/depot_tools/bootstrap/{win/README.md → README.md} +28 -14
  30. data/vendor/depot_tools/bootstrap/{win/win_tools.py → bootstrap.py} +60 -43
  31. data/vendor/depot_tools/bootstrap/{win/git-bash.template.sh → git-bash.template.sh} +1 -1
  32. data/vendor/depot_tools/bootstrap/{win/git.template.bat → git.template.bat} +0 -0
  33. data/vendor/depot_tools/bootstrap/manifest.txt +27 -0
  34. data/vendor/depot_tools/bootstrap/manifest_bleeding_edge.txt +27 -0
  35. data/vendor/depot_tools/bootstrap/{win/profile.d.python.sh → profile.d.python.sh} +0 -0
  36. data/vendor/depot_tools/bootstrap/{win/python27.bleeding_edge.bat → python27.bat} +0 -0
  37. data/vendor/depot_tools/bootstrap/{win/python27.new.bat → python3.bat} +3 -3
  38. data/vendor/depot_tools/bootstrap/{win/win_tools.bat → win_tools.bat} +21 -16
  39. data/vendor/depot_tools/bootstrap_python3 +35 -0
  40. data/vendor/depot_tools/cbuildbot +1 -1
  41. data/vendor/depot_tools/chrome_set_ver +1 -1
  42. data/vendor/depot_tools/cipd +43 -39
  43. data/vendor/depot_tools/cipd.bat +2 -2
  44. data/vendor/depot_tools/cipd_client_version +1 -1
  45. data/vendor/depot_tools/cipd_client_version.digests +15 -14
  46. data/vendor/depot_tools/cipd_manifest.txt +31 -8
  47. data/vendor/depot_tools/cipd_manifest.versions +278 -158
  48. data/vendor/depot_tools/cit.py +9 -7
  49. data/vendor/depot_tools/clang_format.py +4 -1
  50. data/vendor/depot_tools/clang_format_merge_driver.py +10 -8
  51. data/vendor/depot_tools/compile_single_file.py +7 -2
  52. data/vendor/depot_tools/cpplint.py +51 -45
  53. data/vendor/depot_tools/cros +87 -0
  54. data/vendor/depot_tools/cros_sdk +1 -1
  55. data/vendor/depot_tools/crosjobs +13 -0
  56. data/vendor/depot_tools/detect_host_arch.py +0 -1
  57. data/vendor/depot_tools/dirmd +12 -0
  58. data/vendor/depot_tools/dirmd.bat +7 -0
  59. data/vendor/depot_tools/download_from_google_storage.py +47 -27
  60. data/vendor/depot_tools/ensure_bootstrap +14 -0
  61. data/vendor/depot_tools/fetch +14 -1
  62. data/vendor/depot_tools/fetch.bat +14 -1
  63. data/vendor/depot_tools/fetch.py +5 -7
  64. data/vendor/depot_tools/fetch_configs/chromium.py +6 -4
  65. data/vendor/depot_tools/fetch_configs/devtools-frontend.py +44 -0
  66. data/vendor/depot_tools/fetch_configs/ios_internal.py +10 -19
  67. data/vendor/depot_tools/fix_encoding.py +19 -5
  68. data/vendor/depot_tools/gclient +28 -12
  69. data/vendor/depot_tools/gclient-new-workdir.py +2 -0
  70. data/vendor/depot_tools/gclient.bat +18 -1
  71. data/vendor/depot_tools/gclient.py +160 -119
  72. data/vendor/depot_tools/gclient_eval.py +119 -107
  73. data/vendor/depot_tools/gclient_paths.py +67 -57
  74. data/vendor/depot_tools/gclient_scm.py +181 -159
  75. data/vendor/depot_tools/gclient_utils.py +177 -124
  76. data/vendor/depot_tools/gerrit_client.py +21 -13
  77. data/vendor/depot_tools/gerrit_util.py +188 -228
  78. data/vendor/depot_tools/git-cache +1 -1
  79. data/vendor/depot_tools/git-cl +1 -1
  80. data/vendor/depot_tools/git-drover +1 -1
  81. data/vendor/depot_tools/git-find-releases +1 -1
  82. data/vendor/depot_tools/git-footers +1 -1
  83. data/vendor/depot_tools/git-freeze +1 -1
  84. data/vendor/depot_tools/git-hyper-blame +1 -1
  85. data/vendor/depot_tools/git-map +1 -1
  86. data/vendor/depot_tools/git-map-branches +1 -1
  87. data/vendor/depot_tools/git-mark-merge-base +1 -1
  88. data/vendor/depot_tools/git-nav-downstream +1 -1
  89. data/vendor/depot_tools/git-new-branch +1 -1
  90. data/vendor/depot_tools/git-number +1 -1
  91. data/vendor/depot_tools/git-rebase-update +1 -1
  92. data/vendor/depot_tools/git-rename-branch +1 -1
  93. data/vendor/depot_tools/git-reparent-branch +1 -1
  94. data/vendor/depot_tools/git-retry +1 -1
  95. data/vendor/depot_tools/git-squash-branch +1 -1
  96. data/vendor/depot_tools/git-thaw +1 -1
  97. data/vendor/depot_tools/git-upstream-diff +1 -1
  98. data/vendor/depot_tools/git_cache.py +255 -360
  99. data/vendor/depot_tools/git_cl.py +1562 -2059
  100. data/vendor/depot_tools/git_cl_completion.sh +16 -2
  101. data/vendor/depot_tools/git_common.py +77 -32
  102. data/vendor/depot_tools/git_drover.py +17 -8
  103. data/vendor/depot_tools/git_find_releases.py +11 -9
  104. data/vendor/depot_tools/git_footers.py +13 -9
  105. data/vendor/depot_tools/git_freezer.py +3 -1
  106. data/vendor/depot_tools/git_hyper_blame.py +25 -32
  107. data/vendor/depot_tools/git_map.py +115 -93
  108. data/vendor/depot_tools/git_map_branches.py +11 -10
  109. data/vendor/depot_tools/git_mark_merge_base.py +8 -6
  110. data/vendor/depot_tools/git_nav_downstream.py +9 -6
  111. data/vendor/depot_tools/git_new_branch.py +39 -33
  112. data/vendor/depot_tools/git_number.py +28 -17
  113. data/vendor/depot_tools/git_rebase_update.py +50 -49
  114. data/vendor/depot_tools/git_rename_branch.py +2 -2
  115. data/vendor/depot_tools/git_reparent_branch.py +8 -6
  116. data/vendor/depot_tools/git_upstream_diff.py +4 -2
  117. data/vendor/depot_tools/gn.py +6 -4
  118. data/vendor/depot_tools/goma_auth +12 -0
  119. data/vendor/depot_tools/goma_auth.bat +8 -0
  120. data/vendor/depot_tools/goma_ctl +12 -0
  121. data/vendor/depot_tools/goma_ctl.bat +8 -0
  122. data/vendor/depot_tools/gsutil.py +5 -2
  123. data/vendor/depot_tools/gsutil.py.bat +8 -0
  124. data/vendor/depot_tools/gsutil.vpython +3 -1
  125. data/vendor/depot_tools/infra/config/OWNERS +2 -2
  126. data/vendor/depot_tools/infra/config/recipes.cfg +3 -2
  127. data/vendor/depot_tools/led +1 -1
  128. data/vendor/depot_tools/lockfile.py +116 -0
  129. data/vendor/depot_tools/luci-auth +1 -1
  130. data/vendor/depot_tools/lucicfg +1 -1
  131. data/vendor/depot_tools/mac_toolchain +1 -1
  132. data/vendor/depot_tools/man/html/depot_tools.html +1 -1
  133. data/vendor/depot_tools/man/html/depot_tools_tutorial.html +31 -25
  134. data/vendor/depot_tools/man/html/git-cl.html +1 -1
  135. data/vendor/depot_tools/man/html/git-drover.html +18 -18
  136. data/vendor/depot_tools/man/html/git-footers.html +1 -1
  137. data/vendor/depot_tools/man/html/git-freeze.html +3 -3
  138. data/vendor/depot_tools/man/html/git-hyper-blame.html +1 -1
  139. data/vendor/depot_tools/man/html/git-map-branches.html +2 -2
  140. data/vendor/depot_tools/man/html/git-map.html +1 -1
  141. data/vendor/depot_tools/man/html/git-mark-merge-base.html +1 -1
  142. data/vendor/depot_tools/man/html/git-nav-downstream.html +3 -3
  143. data/vendor/depot_tools/man/html/git-nav-upstream.html +12 -6
  144. data/vendor/depot_tools/man/html/git-new-branch.html +1 -1
  145. data/vendor/depot_tools/man/html/git-rebase-update.html +20 -1
  146. data/vendor/depot_tools/man/html/git-rename-branch.html +1 -1
  147. data/vendor/depot_tools/man/html/git-reparent-branch.html +1 -1
  148. data/vendor/depot_tools/man/html/git-retry.html +1 -1
  149. data/vendor/depot_tools/man/html/git-squash-branch.html +1 -1
  150. data/vendor/depot_tools/man/html/git-thaw.html +1 -1
  151. data/vendor/depot_tools/man/html/git-upstream-diff.html +10 -6
  152. data/vendor/depot_tools/man/man1/git-cl.1 +4 -4
  153. data/vendor/depot_tools/man/man1/git-drover.1 +21 -21
  154. data/vendor/depot_tools/man/man1/git-footers.1 +4 -4
  155. data/vendor/depot_tools/man/man1/git-freeze.1 +6 -6
  156. data/vendor/depot_tools/man/man1/git-hyper-blame.1 +4 -4
  157. data/vendor/depot_tools/man/man1/git-map-branches.1 +4 -4
  158. data/vendor/depot_tools/man/man1/git-map.1 +4 -4
  159. data/vendor/depot_tools/man/man1/git-mark-merge-base.1 +4 -4
  160. data/vendor/depot_tools/man/man1/git-nav-downstream.1 +6 -6
  161. data/vendor/depot_tools/man/man1/git-nav-upstream.1 +15 -9
  162. data/vendor/depot_tools/man/man1/git-new-branch.1 +3 -3
  163. data/vendor/depot_tools/man/man1/git-rebase-update.1 +14 -4
  164. data/vendor/depot_tools/man/man1/git-rename-branch.1 +4 -4
  165. data/vendor/depot_tools/man/man1/git-reparent-branch.1 +4 -4
  166. data/vendor/depot_tools/man/man1/git-retry.1 +4 -4
  167. data/vendor/depot_tools/man/man1/git-squash-branch.1 +4 -4
  168. data/vendor/depot_tools/man/man1/git-thaw.1 +4 -4
  169. data/vendor/depot_tools/man/man1/git-upstream-diff.1 +7 -13
  170. data/vendor/depot_tools/man/man7/depot_tools.7 +4 -4
  171. data/vendor/depot_tools/man/man7/depot_tools_tutorial.7 +31 -25
  172. data/vendor/depot_tools/man/src/common_demo_functions.sh +2 -2
  173. data/vendor/depot_tools/man/src/depot_tools_tutorial.txt +3 -3
  174. data/vendor/depot_tools/man/src/filter_demo_output.py +4 -2
  175. data/vendor/depot_tools/man/src/git-new-branch.txt +2 -1
  176. data/vendor/depot_tools/man/src/git-rebase-update.txt +8 -1
  177. data/vendor/depot_tools/metrics.README.md +8 -5
  178. data/vendor/depot_tools/metrics.py +7 -6
  179. data/vendor/depot_tools/metrics_utils.py +4 -14
  180. data/vendor/depot_tools/my_activity.py +85 -251
  181. data/vendor/depot_tools/ninja +1 -0
  182. data/vendor/depot_tools/ninja-mac +0 -0
  183. data/vendor/depot_tools/ninjalog_uploader.py +146 -145
  184. data/vendor/depot_tools/ninjalog_uploader_wrapper.py +69 -60
  185. data/vendor/depot_tools/owners.py +156 -43
  186. data/vendor/depot_tools/owners_finder.py +28 -14
  187. data/vendor/depot_tools/post_build_ninja_summary.py +76 -48
  188. data/vendor/depot_tools/presubmit_canned_checks.py +293 -106
  189. data/vendor/depot_tools/presubmit_support.py +527 -333
  190. data/vendor/depot_tools/prpc +1 -1
  191. data/vendor/depot_tools/pylint +2 -12
  192. data/vendor/depot_tools/pylint-1.5 +78 -0
  193. data/vendor/depot_tools/pylint-1.6 +78 -0
  194. data/vendor/depot_tools/pylint-1.7 +78 -0
  195. data/vendor/depot_tools/pylint-1.8 +78 -0
  196. data/vendor/depot_tools/pylint-1.9 +78 -0
  197. data/vendor/depot_tools/{depot-tools-auth.bat → pylint.bat} +2 -2
  198. data/vendor/depot_tools/pylint_main.py +45 -0
  199. data/vendor/depot_tools/pylintrc +14 -1
  200. data/vendor/depot_tools/python-bin/python3 +7 -0
  201. data/vendor/depot_tools/python_runner.sh +13 -8
  202. data/vendor/depot_tools/rdb +12 -0
  203. data/vendor/depot_tools/rdb.bat +7 -0
  204. data/vendor/depot_tools/recipes/OWNERS +0 -1
  205. data/vendor/depot_tools/recipes/README.recipes.md +218 -151
  206. data/vendor/depot_tools/recipes/recipe_modules/OWNERS +1 -1
  207. data/vendor/depot_tools/recipes/recipe_modules/bot_update/__init__.py +17 -16
  208. data/vendor/depot_tools/recipes/recipe_modules/bot_update/api.py +127 -78
  209. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic.json +19 -4
  210. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic_luci.json +18 -3
  211. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/basic_with_branch_heads.json +19 -4
  212. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/clobber.json +29 -8
  213. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/deprecated_got_revision_mapping.json +28 -10
  214. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/gerrit_no_rebase_patch_ref.json +29 -8
  215. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/gerrit_no_reset.json +29 -8
  216. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/input_commit_with_id_without_repo.json +29 -8
  217. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/multiple_patch_refs.json +29 -8
  218. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_apply_patch_on_gclient.json +35 -10
  219. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/{with_manifest_name.json → no_cp_checkout_HEAD.json} +25 -15
  220. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_cp_checkout_a_branch_head.json +65 -0
  221. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_cp_checkout_a_specific_commit.json +65 -0
  222. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/no_cp_checkout_master.json +65 -0
  223. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/refs.json +29 -8
  224. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/reset_root_solution_revision.json +29 -8
  225. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/resolve_chromium_fixed_version.json +117 -0
  226. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail.json +17 -11
  227. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail_patch.json +41 -10
  228. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_fail_patch_download.json +24 -11
  229. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_angle.json +35 -10
  230. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_branch_heads.json +35 -10
  231. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_feature_branch.json +38 -11
  232. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_v8_feature_branch.json +36 -11
  233. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_gerrit_webrtc.json +35 -10
  234. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_v8.json +35 -10
  235. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/tryjob_v8_head_by_default.json +35 -10
  236. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/unrecognized_commit_repo.json +0 -5
  237. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.expected/with_tags.json +29 -8
  238. data/vendor/depot_tools/recipes/recipe_modules/bot_update/examples/full.py +95 -22
  239. data/vendor/depot_tools/recipes/recipe_modules/bot_update/resources/bot_update.py +187 -114
  240. data/vendor/depot_tools/recipes/recipe_modules/bot_update/test_api.py +2 -2
  241. data/vendor/depot_tools/recipes/recipe_modules/bot_update/tests/do_not_retry_patch_failures_in_cq.py +42 -0
  242. data/vendor/depot_tools/recipes/recipe_modules/bot_update/tests/ensure_checkout.py +1 -0
  243. data/vendor/depot_tools/recipes/recipe_modules/cipd/__init__.py +0 -1
  244. data/vendor/depot_tools/recipes/recipe_modules/cipd/api.py +2 -2
  245. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/basic.json +0 -1
  246. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/basic_pkg.json +0 -1
  247. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/describe-failed.json +2 -4
  248. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/describe-many-instances.json +0 -1
  249. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/mac64.json +0 -1
  250. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_file.json +26 -6
  251. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_mode.json +23 -5
  252. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/pkg_bad_verfile.json +23 -5
  253. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/full.expected/win64.json +0 -1
  254. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/junk arch.json +0 -1
  255. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/junk bits.json +0 -1
  256. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_arm_32.json +0 -1
  257. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_arm_64.json +0 -1
  258. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_intel_32.json +0 -1
  259. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_intel_64.json +0 -1
  260. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/linux_mips_64.json +0 -1
  261. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/mac_intel_64.json +0 -1
  262. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/win_intel_32.json +0 -1
  263. data/vendor/depot_tools/recipes/recipe_modules/cipd/examples/platform_suffix.expected/win_intel_64.json +0 -1
  264. data/vendor/depot_tools/recipes/recipe_modules/cipd/test_api.py +1 -1
  265. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/api.py +4 -1
  266. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/basic.json +4 -2
  267. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/basic_luci.json +3 -1
  268. data/vendor/depot_tools/recipes/recipe_modules/depot_tools/examples/full.expected/win.json +4 -2
  269. data/vendor/depot_tools/recipes/recipe_modules/gclient/__init__.py +2 -1
  270. data/vendor/depot_tools/recipes/recipe_modules/gclient/api.py +82 -13
  271. data/vendor/depot_tools/recipes/recipe_modules/gclient/config.py +23 -11
  272. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/basic.json +3 -4
  273. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/revision.json +3 -6
  274. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/tryserver.json +3 -4
  275. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.py +7 -7
  276. data/vendor/depot_tools/recipes/recipe_modules/gclient/resources/diff_deps.py +16 -0
  277. data/vendor/depot_tools/recipes/recipe_modules/gclient/test_api.py +4 -0
  278. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.expected/basic.json +55 -0
  279. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.expected/dont have revision yet.json +84 -0
  280. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.expected/no change, exception.json +83 -0
  281. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.expected/windows.json +55 -0
  282. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/diff_deps.py +88 -0
  283. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/patch_project.py +9 -21
  284. data/vendor/depot_tools/recipes/recipe_modules/gclient/tests/sync_failure.py +24 -0
  285. data/vendor/depot_tools/recipes/recipe_modules/gerrit/api.py +2 -1
  286. data/vendor/depot_tools/recipes/recipe_modules/gerrit/examples/full.expected/basic.json +7 -12
  287. data/vendor/depot_tools/recipes/recipe_modules/git/__init__.py +0 -2
  288. data/vendor/depot_tools/recipes/recipe_modules/git/api.py +9 -17
  289. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic.json +2 -8
  290. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_branch.json +2 -8
  291. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_file_name.json +2 -8
  292. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_hash.json +2 -8
  293. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_ref.json +2 -8
  294. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_submodule_update_force.json +2 -8
  295. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_tags.json +2 -8
  296. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/can_fail_build.json +3 -13
  297. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/cannot_fail_build.json +2 -8
  298. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/cat-file_test.json +4 -12
  299. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_delta.json +2 -10
  300. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_failed.json +1 -7
  301. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_with_bad_output.json +1 -7
  302. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/count-objects_with_bad_output_fails_build.json +0 -8
  303. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/curl_trace_file.json +3 -10
  304. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/git-cache-checkout.json +3 -11
  305. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/platform_win.json +2 -8
  306. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/rebase_failed.json +3 -13
  307. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/remote_not_origin.json +2 -8
  308. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/set_got_revision.json +2 -8
  309. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.py +0 -5
  310. data/vendor/depot_tools/recipes/recipe_modules/git_cl/__init__.py +1 -1
  311. data/vendor/depot_tools/recipes/recipe_modules/git_cl/api.py +7 -13
  312. data/vendor/depot_tools/recipes/recipe_modules/git_cl/examples/full.expected/basic.json +21 -16
  313. data/vendor/depot_tools/recipes/recipe_modules/git_cl/examples/full.py +1 -2
  314. data/vendor/depot_tools/recipes/recipe_modules/gitiles/api.py +1 -1
  315. data/vendor/depot_tools/recipes/recipe_modules/gitiles/examples/full.expected/basic.json +0 -1
  316. data/vendor/depot_tools/recipes/recipe_modules/gitiles/resources/gerrit_client.py +2 -2
  317. data/vendor/depot_tools/recipes/recipe_modules/gitiles/tests/parse_repo_url.expected/basic.json +0 -1
  318. data/vendor/depot_tools/recipes/recipe_modules/gsutil/api.py +23 -8
  319. data/vendor/depot_tools/recipes/recipe_modules/gsutil/examples/full.expected/basic.json +52 -1
  320. data/vendor/depot_tools/recipes/recipe_modules/gsutil/examples/full.py +15 -0
  321. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/__init__.py +1 -0
  322. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/api.py +32 -8
  323. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/ancient_version.json +83 -0
  324. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/automatic_version.json +83 -0
  325. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/explicit_version.json +83 -0
  326. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/linux.json +0 -1
  327. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/mac.json +5 -4
  328. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.expected/win.json +0 -1
  329. data/vendor/depot_tools/recipes/recipe_modules/osx_sdk/examples/full.py +21 -2
  330. data/vendor/depot_tools/recipes/recipe_modules/presubmit/__init__.py +20 -0
  331. data/vendor/depot_tools/recipes/recipe_modules/presubmit/api.py +235 -3
  332. data/vendor/depot_tools/recipes/recipe_modules/presubmit/examples/full.expected/basic.json +13 -5
  333. data/vendor/depot_tools/recipes/recipe_modules/presubmit/examples/full.py +5 -1
  334. data/vendor/depot_tools/recipes/recipe_modules/presubmit/properties.proto +14 -0
  335. data/vendor/depot_tools/recipes/recipe_modules/presubmit/test_api.py +19 -0
  336. data/vendor/depot_tools/recipes/recipe_modules/presubmit/tests/execute.py +247 -0
  337. data/vendor/depot_tools/recipes/recipe_modules/presubmit/tests/prepare.py +49 -0
  338. data/vendor/depot_tools/recipes/recipe_modules/tryserver/api.py +33 -45
  339. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/basic_tags.json +0 -1
  340. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch.json +64 -21
  341. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_gerrit_patch_and_target_ref.json +64 -21
  342. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch.json +1 -22
  343. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_wrong_patch_new.json +1 -22
  344. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.py +5 -32
  345. data/vendor/depot_tools/recipes/recipe_modules/tryserver/tests/gerrit_change_fetch_ref_timeout.py +29 -0
  346. data/vendor/depot_tools/recipes/recipe_modules/tryserver/tests/gerrit_change_owner.expected/basic.json +5 -0
  347. data/vendor/depot_tools/recipes/recipe_modules/tryserver/tests/gerrit_change_owner.py +22 -0
  348. data/vendor/depot_tools/recipes/recipe_modules/tryserver/tests/gerrit_change_target_ref.py +32 -0
  349. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/linux.json +0 -1
  350. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/mac.json +0 -1
  351. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.expected/win.json +2 -1
  352. data/vendor/depot_tools/recipes/recipe_modules/windows_sdk/examples/full.py +1 -6
  353. data/vendor/depot_tools/recipes/recipes.py +49 -28
  354. data/vendor/depot_tools/recipes/recipes/fetch_end_to_end_test.expected/basic.json +11 -6
  355. data/vendor/depot_tools/repo +698 -540
  356. data/vendor/depot_tools/roll-dep +14 -1
  357. data/vendor/depot_tools/roll-dep.bat +10 -1
  358. data/vendor/depot_tools/roll_dep.py +15 -10
  359. data/vendor/depot_tools/scm.py +95 -75
  360. data/vendor/depot_tools/setup_color.py +36 -2
  361. data/vendor/depot_tools/split_cl.py +44 -32
  362. data/vendor/depot_tools/subcommand.py +6 -6
  363. data/vendor/depot_tools/subprocess2.py +38 -322
  364. data/vendor/depot_tools/third_party/colorama/LICENSE.txt +0 -1
  365. data/vendor/depot_tools/third_party/colorama/README.chromium +4 -5
  366. data/vendor/depot_tools/third_party/colorama/README.rst +346 -0
  367. data/vendor/depot_tools/third_party/colorama/__init__.py +3 -4
  368. data/vendor/depot_tools/third_party/colorama/ansi.py +82 -30
  369. data/vendor/depot_tools/third_party/colorama/ansitowin32.py +105 -37
  370. data/vendor/depot_tools/third_party/colorama/initialise.py +39 -15
  371. data/vendor/depot_tools/third_party/colorama/win32.py +46 -28
  372. data/vendor/depot_tools/third_party/colorama/winterm.py +80 -31
  373. data/vendor/depot_tools/update_depot_tools +18 -8
  374. data/vendor/depot_tools/update_depot_tools.bat +19 -15
  375. data/vendor/depot_tools/upload_metrics.py +7 -6
  376. data/vendor/depot_tools/upload_to_google_storage.py +23 -16
  377. data/vendor/depot_tools/vpython +4 -4
  378. data/vendor/depot_tools/vpython.bat +1 -1
  379. data/vendor/depot_tools/vpython3 +55 -0
  380. data/vendor/depot_tools/vpython3.bat +12 -0
  381. data/vendor/depot_tools/watchlists.py +14 -11
  382. data/vendor/depot_tools/weekly +4 -2
  383. data/vendor/depot_tools/win32imports.py +61 -0
  384. data/vendor/depot_tools/win_toolchain/get_toolchain_if_necessary.py +49 -41
  385. data/vendor/depot_tools/win_toolchain/package_from_installed.py +142 -149
  386. data/vendor/depot_tools/wtf +5 -3
  387. data/vendor/depot_tools/yapf +5 -1
  388. metadata +68 -343
  389. data/vendor/depot_tools/README.testing +0 -23
  390. data/vendor/depot_tools/annotated_gclient.py +0 -89
  391. data/vendor/depot_tools/appengine_mapper.py +0 -23
  392. data/vendor/depot_tools/bootstrap/win/manifest.txt +0 -20
  393. data/vendor/depot_tools/bootstrap/win/manifest_bleeding_edge.txt +0 -20
  394. data/vendor/depot_tools/bootstrap/win/pylint.new.bat +0 -7
  395. data/vendor/depot_tools/buildbucket.py +0 -186
  396. data/vendor/depot_tools/checkout.py +0 -431
  397. data/vendor/depot_tools/cros +0 -1
  398. data/vendor/depot_tools/dart_format.py +0 -58
  399. data/vendor/depot_tools/depot-tools-auth +0 -8
  400. data/vendor/depot_tools/depot-tools-auth.py +0 -102
  401. data/vendor/depot_tools/my_reviews.py +0 -396
  402. data/vendor/depot_tools/patch.py +0 -548
  403. data/vendor/depot_tools/pylint.py +0 -30
  404. data/vendor/depot_tools/recipes/recipe_modules/gclient/examples/full.expected/buildbot.json +0 -239
  405. data/vendor/depot_tools/recipes/recipe_modules/git/examples/full.expected/basic_luci.json +0 -222
  406. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/__init__.py +0 -4
  407. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/api.py +0 -29
  408. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/basic.json +0 -15
  409. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_buildbot_linux.json +0 -15
  410. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_buildbot_mac.json +0 -15
  411. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_buildbot_win.json +0 -15
  412. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_generic_linux.json +0 -15
  413. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_generic_mac.json +0 -15
  414. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_generic_win.json +0 -15
  415. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_kitchen_linux.json +0 -15
  416. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_kitchen_mac.json +0 -15
  417. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.expected/paths_kitchen_win.json +0 -15
  418. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/examples/full.py +0 -33
  419. data/vendor/depot_tools/recipes/recipe_modules/infra_paths/path_config.py +0 -66
  420. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/set_failure_hash_with_no_steps.json +0 -11
  421. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_git_patch.json +0 -45
  422. data/vendor/depot_tools/recipes/recipe_modules/tryserver/examples/full.expected/with_git_patch_luci.json +0 -45
  423. data/vendor/depot_tools/rietveld.py +0 -779
  424. data/vendor/depot_tools/roll-dep-svn +0 -8
  425. data/vendor/depot_tools/roll-dep-svn.bat +0 -12
  426. data/vendor/depot_tools/roll_dep_svn.py +0 -430
  427. data/vendor/depot_tools/support/chromite_wrapper +0 -96
  428. data/vendor/depot_tools/third_party/boto/LICENSE +0 -18
  429. data/vendor/depot_tools/third_party/boto/README.chromium +0 -43
  430. data/vendor/depot_tools/third_party/boto/README.rst +0 -163
  431. data/vendor/depot_tools/third_party/boto/__init__.py +0 -793
  432. data/vendor/depot_tools/third_party/boto/auth.py +0 -682
  433. data/vendor/depot_tools/third_party/boto/auth_handler.py +0 -58
  434. data/vendor/depot_tools/third_party/boto/cacerts/__init__.py +0 -22
  435. data/vendor/depot_tools/third_party/boto/cacerts/cacerts.txt +0 -2183
  436. data/vendor/depot_tools/third_party/boto/compat.py +0 -28
  437. data/vendor/depot_tools/third_party/boto/connection.py +0 -1081
  438. data/vendor/depot_tools/third_party/boto/contrib/__init__.py +0 -22
  439. data/vendor/depot_tools/third_party/boto/contrib/ymlmessage.py +0 -52
  440. data/vendor/depot_tools/third_party/boto/core/README +0 -58
  441. data/vendor/depot_tools/third_party/boto/core/__init__.py +0 -23
  442. data/vendor/depot_tools/third_party/boto/core/auth.py +0 -78
  443. data/vendor/depot_tools/third_party/boto/core/credentials.py +0 -154
  444. data/vendor/depot_tools/third_party/boto/core/dictresponse.py +0 -178
  445. data/vendor/depot_tools/third_party/boto/core/service.py +0 -67
  446. data/vendor/depot_tools/third_party/boto/datapipeline/__init__.py +0 -0
  447. data/vendor/depot_tools/third_party/boto/datapipeline/exceptions.py +0 -42
  448. data/vendor/depot_tools/third_party/boto/datapipeline/layer1.py +0 -546
  449. data/vendor/depot_tools/third_party/boto/ecs/__init__.py +0 -90
  450. data/vendor/depot_tools/third_party/boto/ecs/item.py +0 -153
  451. data/vendor/depot_tools/third_party/boto/exception.py +0 -476
  452. data/vendor/depot_tools/third_party/boto/file/README +0 -49
  453. data/vendor/depot_tools/third_party/boto/file/__init__.py +0 -28
  454. data/vendor/depot_tools/third_party/boto/file/bucket.py +0 -112
  455. data/vendor/depot_tools/third_party/boto/file/connection.py +0 -33
  456. data/vendor/depot_tools/third_party/boto/file/key.py +0 -199
  457. data/vendor/depot_tools/third_party/boto/file/simpleresultset.py +0 -30
  458. data/vendor/depot_tools/third_party/boto/fps/__init__.py +0 -21
  459. data/vendor/depot_tools/third_party/boto/fps/connection.py +0 -369
  460. data/vendor/depot_tools/third_party/boto/fps/exception.py +0 -344
  461. data/vendor/depot_tools/third_party/boto/fps/response.py +0 -175
  462. data/vendor/depot_tools/third_party/boto/gs/__init__.py +0 -22
  463. data/vendor/depot_tools/third_party/boto/gs/acl.py +0 -304
  464. data/vendor/depot_tools/third_party/boto/gs/bucket.py +0 -870
  465. data/vendor/depot_tools/third_party/boto/gs/bucketlistresultset.py +0 -64
  466. data/vendor/depot_tools/third_party/boto/gs/connection.py +0 -103
  467. data/vendor/depot_tools/third_party/boto/gs/cors.py +0 -169
  468. data/vendor/depot_tools/third_party/boto/gs/key.py +0 -704
  469. data/vendor/depot_tools/third_party/boto/gs/resumable_upload_handler.py +0 -659
  470. data/vendor/depot_tools/third_party/boto/gs/user.py +0 -54
  471. data/vendor/depot_tools/third_party/boto/handler.py +0 -44
  472. data/vendor/depot_tools/third_party/boto/https_connection.py +0 -124
  473. data/vendor/depot_tools/third_party/boto/jsonresponse.py +0 -163
  474. data/vendor/depot_tools/third_party/boto/manage/__init__.py +0 -23
  475. data/vendor/depot_tools/third_party/boto/manage/cmdshell.py +0 -241
  476. data/vendor/depot_tools/third_party/boto/manage/propget.py +0 -64
  477. data/vendor/depot_tools/third_party/boto/manage/server.py +0 -556
  478. data/vendor/depot_tools/third_party/boto/manage/task.py +0 -175
  479. data/vendor/depot_tools/third_party/boto/manage/test_manage.py +0 -34
  480. data/vendor/depot_tools/third_party/boto/manage/volume.py +0 -420
  481. data/vendor/depot_tools/third_party/boto/mashups/__init__.py +0 -23
  482. data/vendor/depot_tools/third_party/boto/mashups/interactive.py +0 -97
  483. data/vendor/depot_tools/third_party/boto/mashups/iobject.py +0 -115
  484. data/vendor/depot_tools/third_party/boto/mashups/order.py +0 -211
  485. data/vendor/depot_tools/third_party/boto/mashups/server.py +0 -395
  486. data/vendor/depot_tools/third_party/boto/plugin.py +0 -90
  487. data/vendor/depot_tools/third_party/boto/provider.py +0 -337
  488. data/vendor/depot_tools/third_party/boto/pyami/__init__.py +0 -22
  489. data/vendor/depot_tools/third_party/boto/pyami/bootstrap.py +0 -134
  490. data/vendor/depot_tools/third_party/boto/pyami/config.py +0 -229
  491. data/vendor/depot_tools/third_party/boto/pyami/copybot.cfg +0 -60
  492. data/vendor/depot_tools/third_party/boto/pyami/copybot.py +0 -97
  493. data/vendor/depot_tools/third_party/boto/pyami/helloworld.py +0 -28
  494. data/vendor/depot_tools/third_party/boto/pyami/launch_ami.py +0 -178
  495. data/vendor/depot_tools/third_party/boto/pyami/scriptbase.py +0 -44
  496. data/vendor/depot_tools/third_party/boto/pyami/startup.py +0 -60
  497. data/vendor/depot_tools/third_party/boto/regioninfo.py +0 -63
  498. data/vendor/depot_tools/third_party/boto/resultset.py +0 -169
  499. data/vendor/depot_tools/third_party/boto/roboto/__init__.py +0 -1
  500. data/vendor/depot_tools/third_party/boto/roboto/awsqueryrequest.py +0 -504
  501. data/vendor/depot_tools/third_party/boto/roboto/awsqueryservice.py +0 -121
  502. data/vendor/depot_tools/third_party/boto/roboto/param.py +0 -147
  503. data/vendor/depot_tools/third_party/boto/s3/__init__.py +0 -84
  504. data/vendor/depot_tools/third_party/boto/s3/acl.py +0 -164
  505. data/vendor/depot_tools/third_party/boto/s3/bucket.py +0 -1634
  506. data/vendor/depot_tools/third_party/boto/s3/bucketlistresultset.py +0 -139
  507. data/vendor/depot_tools/third_party/boto/s3/bucketlogging.py +0 -83
  508. data/vendor/depot_tools/third_party/boto/s3/connection.py +0 -540
  509. data/vendor/depot_tools/third_party/boto/s3/cors.py +0 -210
  510. data/vendor/depot_tools/third_party/boto/s3/deletemarker.py +0 -55
  511. data/vendor/depot_tools/third_party/boto/s3/key.py +0 -1712
  512. data/vendor/depot_tools/third_party/boto/s3/keyfile.py +0 -134
  513. data/vendor/depot_tools/third_party/boto/s3/lifecycle.py +0 -231
  514. data/vendor/depot_tools/third_party/boto/s3/multidelete.py +0 -138
  515. data/vendor/depot_tools/third_party/boto/s3/multipart.py +0 -315
  516. data/vendor/depot_tools/third_party/boto/s3/prefix.py +0 -42
  517. data/vendor/depot_tools/third_party/boto/s3/resumable_download_handler.py +0 -339
  518. data/vendor/depot_tools/third_party/boto/s3/tagging.py +0 -71
  519. data/vendor/depot_tools/third_party/boto/s3/user.py +0 -49
  520. data/vendor/depot_tools/third_party/boto/s3/website.py +0 -237
  521. data/vendor/depot_tools/third_party/boto/services/__init__.py +0 -23
  522. data/vendor/depot_tools/third_party/boto/services/bs.py +0 -179
  523. data/vendor/depot_tools/third_party/boto/services/message.py +0 -58
  524. data/vendor/depot_tools/third_party/boto/services/result.py +0 -136
  525. data/vendor/depot_tools/third_party/boto/services/service.py +0 -161
  526. data/vendor/depot_tools/third_party/boto/services/servicedef.py +0 -91
  527. data/vendor/depot_tools/third_party/boto/services/sonofmmm.cfg +0 -43
  528. data/vendor/depot_tools/third_party/boto/services/sonofmmm.py +0 -81
  529. data/vendor/depot_tools/third_party/boto/services/submit.py +0 -88
  530. data/vendor/depot_tools/third_party/boto/ses/__init__.py +0 -54
  531. data/vendor/depot_tools/third_party/boto/ses/connection.py +0 -521
  532. data/vendor/depot_tools/third_party/boto/ses/exceptions.py +0 -77
  533. data/vendor/depot_tools/third_party/boto/storage_uri.py +0 -835
  534. data/vendor/depot_tools/third_party/boto/sts/__init__.py +0 -55
  535. data/vendor/depot_tools/third_party/boto/sts/connection.py +0 -207
  536. data/vendor/depot_tools/third_party/boto/sts/credentials.py +0 -215
  537. data/vendor/depot_tools/third_party/boto/utils.py +0 -927
  538. data/vendor/depot_tools/third_party/colorama/README.txt +0 -304
  539. data/vendor/depot_tools/third_party/fancy_urllib/README +0 -22
  540. data/vendor/depot_tools/third_party/fancy_urllib/__init__.py +0 -460
  541. data/vendor/depot_tools/third_party/logilab/README.chromium +0 -6
  542. data/vendor/depot_tools/third_party/logilab/__init__.py +0 -0
  543. data/vendor/depot_tools/third_party/logilab/astroid/LICENSE.txt +0 -340
  544. data/vendor/depot_tools/third_party/logilab/astroid/README.chromium +0 -11
  545. data/vendor/depot_tools/third_party/logilab/astroid/__init__.py +0 -136
  546. data/vendor/depot_tools/third_party/logilab/astroid/__pkginfo__.py +0 -42
  547. data/vendor/depot_tools/third_party/logilab/astroid/arguments.py +0 -233
  548. data/vendor/depot_tools/third_party/logilab/astroid/as_string.py +0 -548
  549. data/vendor/depot_tools/third_party/logilab/astroid/astpeephole.py +0 -86
  550. data/vendor/depot_tools/third_party/logilab/astroid/bases.py +0 -636
  551. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_builtin_inference.py +0 -336
  552. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_dateutil.py +0 -15
  553. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_gi.py +0 -195
  554. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_mechanize.py +0 -18
  555. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_nose.py +0 -82
  556. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_numpy.py +0 -62
  557. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_pytest.py +0 -76
  558. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_qt.py +0 -44
  559. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_six.py +0 -288
  560. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_ssl.py +0 -65
  561. data/vendor/depot_tools/third_party/logilab/astroid/brain/brain_stdlib.py +0 -473
  562. data/vendor/depot_tools/third_party/logilab/astroid/builder.py +0 -263
  563. data/vendor/depot_tools/third_party/logilab/astroid/context.py +0 -81
  564. data/vendor/depot_tools/third_party/logilab/astroid/decorators.py +0 -75
  565. data/vendor/depot_tools/third_party/logilab/astroid/exceptions.py +0 -71
  566. data/vendor/depot_tools/third_party/logilab/astroid/inference.py +0 -359
  567. data/vendor/depot_tools/third_party/logilab/astroid/manager.py +0 -267
  568. data/vendor/depot_tools/third_party/logilab/astroid/mixins.py +0 -147
  569. data/vendor/depot_tools/third_party/logilab/astroid/modutils.py +0 -741
  570. data/vendor/depot_tools/third_party/logilab/astroid/node_classes.py +0 -1053
  571. data/vendor/depot_tools/third_party/logilab/astroid/nodes.py +0 -87
  572. data/vendor/depot_tools/third_party/logilab/astroid/objects.py +0 -186
  573. data/vendor/depot_tools/third_party/logilab/astroid/protocols.py +0 -470
  574. data/vendor/depot_tools/third_party/logilab/astroid/raw_building.py +0 -390
  575. data/vendor/depot_tools/third_party/logilab/astroid/rebuilder.py +0 -989
  576. data/vendor/depot_tools/third_party/logilab/astroid/scoped_nodes.py +0 -1716
  577. data/vendor/depot_tools/third_party/logilab/astroid/test_utils.py +0 -201
  578. data/vendor/depot_tools/third_party/logilab/astroid/transforms.py +0 -96
  579. data/vendor/depot_tools/third_party/logilab/astroid/util.py +0 -89
  580. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/LICENSE +0 -19
  581. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/README.chromium +0 -11
  582. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/__init__.py +0 -20
  583. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/cext.c +0 -1421
  584. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/compat.py +0 -9
  585. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/simple.py +0 -246
  586. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/slots.py +0 -414
  587. data/vendor/depot_tools/third_party/logilab/lazy_object_proxy/utils.py +0 -13
  588. data/vendor/depot_tools/third_party/logilab/wrapt/LICENSE +0 -24
  589. data/vendor/depot_tools/third_party/logilab/wrapt/README.chromium +0 -11
  590. data/vendor/depot_tools/third_party/logilab/wrapt/__init__.py +0 -19
  591. data/vendor/depot_tools/third_party/logilab/wrapt/_wrappers.c +0 -2729
  592. data/vendor/depot_tools/third_party/logilab/wrapt/arguments.py +0 -96
  593. data/vendor/depot_tools/third_party/logilab/wrapt/decorators.py +0 -512
  594. data/vendor/depot_tools/third_party/logilab/wrapt/importer.py +0 -228
  595. data/vendor/depot_tools/third_party/logilab/wrapt/wrappers.py +0 -901
  596. data/vendor/depot_tools/third_party/mock/LICENSE.txt +0 -26
  597. data/vendor/depot_tools/third_party/mock/README.chromium +0 -24
  598. data/vendor/depot_tools/third_party/mock/__init__.py +0 -2366
  599. data/vendor/depot_tools/third_party/oauth2client/LICENSE +0 -202
  600. data/vendor/depot_tools/third_party/oauth2client/MODIFICATIONS.diff +0 -66
  601. data/vendor/depot_tools/third_party/oauth2client/README.chromium +0 -15
  602. data/vendor/depot_tools/third_party/oauth2client/__init__.py +0 -5
  603. data/vendor/depot_tools/third_party/oauth2client/anyjson.py +0 -32
  604. data/vendor/depot_tools/third_party/oauth2client/appengine.py +0 -963
  605. data/vendor/depot_tools/third_party/oauth2client/client.py +0 -1363
  606. data/vendor/depot_tools/third_party/oauth2client/clientsecrets.py +0 -153
  607. data/vendor/depot_tools/third_party/oauth2client/crypt.py +0 -377
  608. data/vendor/depot_tools/third_party/oauth2client/django_orm.py +0 -134
  609. data/vendor/depot_tools/third_party/oauth2client/file.py +0 -124
  610. data/vendor/depot_tools/third_party/oauth2client/gce.py +0 -90
  611. data/vendor/depot_tools/third_party/oauth2client/keyring_storage.py +0 -109
  612. data/vendor/depot_tools/third_party/oauth2client/locked_file.py +0 -373
  613. data/vendor/depot_tools/third_party/oauth2client/multistore_file.py +0 -465
  614. data/vendor/depot_tools/third_party/oauth2client/old_run.py +0 -160
  615. data/vendor/depot_tools/third_party/oauth2client/tools.py +0 -243
  616. data/vendor/depot_tools/third_party/oauth2client/util.py +0 -196
  617. data/vendor/depot_tools/third_party/oauth2client/xsrfutil.py +0 -113
  618. data/vendor/depot_tools/third_party/protobuf26/README.chromium +0 -23
  619. data/vendor/depot_tools/third_party/protobuf26/__init__.py +0 -0
  620. data/vendor/depot_tools/third_party/protobuf26/compiler/__init__.py +0 -0
  621. data/vendor/depot_tools/third_party/protobuf26/compiler/plugin_pb2.py +0 -184
  622. data/vendor/depot_tools/third_party/protobuf26/descriptor.py +0 -849
  623. data/vendor/depot_tools/third_party/protobuf26/descriptor_database.py +0 -137
  624. data/vendor/depot_tools/third_party/protobuf26/descriptor_pb2.py +0 -1522
  625. data/vendor/depot_tools/third_party/protobuf26/descriptor_pool.py +0 -643
  626. data/vendor/depot_tools/third_party/protobuf26/internal/__init__.py +0 -0
  627. data/vendor/depot_tools/third_party/protobuf26/internal/api_implementation.py +0 -89
  628. data/vendor/depot_tools/third_party/protobuf26/internal/containers.py +0 -269
  629. data/vendor/depot_tools/third_party/protobuf26/internal/cpp_message.py +0 -663
  630. data/vendor/depot_tools/third_party/protobuf26/internal/decoder.py +0 -831
  631. data/vendor/depot_tools/third_party/protobuf26/internal/encoder.py +0 -788
  632. data/vendor/depot_tools/third_party/protobuf26/internal/enum_type_wrapper.py +0 -89
  633. data/vendor/depot_tools/third_party/protobuf26/internal/message_listener.py +0 -78
  634. data/vendor/depot_tools/third_party/protobuf26/internal/python_message.py +0 -1247
  635. data/vendor/depot_tools/third_party/protobuf26/internal/type_checkers.py +0 -328
  636. data/vendor/depot_tools/third_party/protobuf26/internal/wire_format.py +0 -268
  637. data/vendor/depot_tools/third_party/protobuf26/message.py +0 -284
  638. data/vendor/depot_tools/third_party/protobuf26/message_factory.py +0 -155
  639. data/vendor/depot_tools/third_party/protobuf26/reflection.py +0 -205
  640. data/vendor/depot_tools/third_party/protobuf26/service.py +0 -226
  641. data/vendor/depot_tools/third_party/protobuf26/service_reflection.py +0 -284
  642. data/vendor/depot_tools/third_party/protobuf26/symbol_database.py +0 -185
  643. data/vendor/depot_tools/third_party/protobuf26/text_encoding.py +0 -110
  644. data/vendor/depot_tools/third_party/protobuf26/text_format.py +0 -873
  645. data/vendor/depot_tools/third_party/pylint.py +0 -37
  646. data/vendor/depot_tools/third_party/pylint/LICENSE.txt +0 -340
  647. data/vendor/depot_tools/third_party/pylint/README.chromium +0 -30
  648. data/vendor/depot_tools/third_party/pylint/__init__.py +0 -46
  649. data/vendor/depot_tools/third_party/pylint/__main__.py +0 -3
  650. data/vendor/depot_tools/third_party/pylint/__pkginfo__.py +0 -80
  651. data/vendor/depot_tools/third_party/pylint/checkers/__init__.py +0 -123
  652. data/vendor/depot_tools/third_party/pylint/checkers/async.py +0 -82
  653. data/vendor/depot_tools/third_party/pylint/checkers/base.py +0 -2010
  654. data/vendor/depot_tools/third_party/pylint/checkers/classes.py +0 -1120
  655. data/vendor/depot_tools/third_party/pylint/checkers/design_analysis.py +0 -348
  656. data/vendor/depot_tools/third_party/pylint/checkers/exceptions.py +0 -369
  657. data/vendor/depot_tools/third_party/pylint/checkers/format.py +0 -993
  658. data/vendor/depot_tools/third_party/pylint/checkers/imports.py +0 -654
  659. data/vendor/depot_tools/third_party/pylint/checkers/logging.py +0 -258
  660. data/vendor/depot_tools/third_party/pylint/checkers/misc.py +0 -105
  661. data/vendor/depot_tools/third_party/pylint/checkers/newstyle.py +0 -169
  662. data/vendor/depot_tools/third_party/pylint/checkers/python3.py +0 -591
  663. data/vendor/depot_tools/third_party/pylint/checkers/raw_metrics.py +0 -129
  664. data/vendor/depot_tools/third_party/pylint/checkers/similar.py +0 -371
  665. data/vendor/depot_tools/third_party/pylint/checkers/spelling.py +0 -264
  666. data/vendor/depot_tools/third_party/pylint/checkers/stdlib.py +0 -280
  667. data/vendor/depot_tools/third_party/pylint/checkers/strings.py +0 -618
  668. data/vendor/depot_tools/third_party/pylint/checkers/typecheck.py +0 -974
  669. data/vendor/depot_tools/third_party/pylint/checkers/utils.py +0 -741
  670. data/vendor/depot_tools/third_party/pylint/checkers/variables.py +0 -1191
  671. data/vendor/depot_tools/third_party/pylint/config.py +0 -820
  672. data/vendor/depot_tools/third_party/pylint/epylint.py +0 -181
  673. data/vendor/depot_tools/third_party/pylint/extensions/__init__.py +0 -0
  674. data/vendor/depot_tools/third_party/pylint/extensions/check_docs.py +0 -311
  675. data/vendor/depot_tools/third_party/pylint/extensions/check_elif.py +0 -62
  676. data/vendor/depot_tools/third_party/pylint/graph.py +0 -179
  677. data/vendor/depot_tools/third_party/pylint/gui.py +0 -531
  678. data/vendor/depot_tools/third_party/pylint/interfaces.py +0 -102
  679. data/vendor/depot_tools/third_party/pylint/lint.py +0 -1381
  680. data/vendor/depot_tools/third_party/pylint/pyreverse/__init__.py +0 -5
  681. data/vendor/depot_tools/third_party/pylint/pyreverse/diadefslib.py +0 -230
  682. data/vendor/depot_tools/third_party/pylint/pyreverse/diagrams.py +0 -258
  683. data/vendor/depot_tools/third_party/pylint/pyreverse/inspector.py +0 -372
  684. data/vendor/depot_tools/third_party/pylint/pyreverse/main.py +0 -147
  685. data/vendor/depot_tools/third_party/pylint/pyreverse/utils.py +0 -210
  686. data/vendor/depot_tools/third_party/pylint/pyreverse/vcgutils.py +0 -198
  687. data/vendor/depot_tools/third_party/pylint/pyreverse/writer.py +0 -198
  688. data/vendor/depot_tools/third_party/pylint/reporters/__init__.py +0 -149
  689. data/vendor/depot_tools/third_party/pylint/reporters/guireporter.py +0 -27
  690. data/vendor/depot_tools/third_party/pylint/reporters/html.py +0 -108
  691. data/vendor/depot_tools/third_party/pylint/reporters/json.py +0 -64
  692. data/vendor/depot_tools/third_party/pylint/reporters/text.py +0 -237
  693. data/vendor/depot_tools/third_party/pylint/reporters/ureports/__init__.py +0 -106
  694. data/vendor/depot_tools/third_party/pylint/reporters/ureports/html_writer.py +0 -93
  695. data/vendor/depot_tools/third_party/pylint/reporters/ureports/nodes.py +0 -181
  696. data/vendor/depot_tools/third_party/pylint/reporters/ureports/text_writer.py +0 -99
  697. data/vendor/depot_tools/third_party/pylint/testutils.py +0 -414
  698. data/vendor/depot_tools/third_party/pylint/utils.py +0 -1148
  699. data/vendor/depot_tools/third_party/pymox/COPYING +0 -202
  700. data/vendor/depot_tools/third_party/pymox/MANIFEST.in +0 -5
  701. data/vendor/depot_tools/third_party/pymox/README +0 -56
  702. data/vendor/depot_tools/third_party/pymox/__init__.py +0 -0
  703. data/vendor/depot_tools/third_party/pymox/mox.py +0 -1643
  704. data/vendor/depot_tools/third_party/pymox/mox_test.py +0 -1708
  705. data/vendor/depot_tools/third_party/pymox/mox_test_helper.py +0 -76
  706. data/vendor/depot_tools/third_party/pymox/setup.py +0 -14
  707. data/vendor/depot_tools/third_party/pymox/stubout.py +0 -142
  708. data/vendor/depot_tools/third_party/pymox/stubout_test.py +0 -47
  709. data/vendor/depot_tools/third_party/pymox/stubout_testee.py +0 -2
  710. data/vendor/depot_tools/third_party/simplejson/LICENSE.txt +0 -19
  711. data/vendor/depot_tools/third_party/simplejson/PKG-INFO +0 -29
  712. data/vendor/depot_tools/third_party/simplejson/__init__.py +0 -437
  713. data/vendor/depot_tools/third_party/simplejson/decoder.py +0 -421
  714. data/vendor/depot_tools/third_party/simplejson/encoder.py +0 -501
  715. data/vendor/depot_tools/third_party/simplejson/ordered_dict.py +0 -119
  716. data/vendor/depot_tools/third_party/simplejson/scanner.py +0 -77
  717. data/vendor/depot_tools/third_party/simplejson/tool.py +0 -39
  718. data/vendor/depot_tools/third_party/upload.py +0 -2565
@@ -1,1363 +0,0 @@
1
- # Copyright (C) 2010 Google Inc.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- """An OAuth 2.0 client.
16
-
17
- Tools for interacting with OAuth 2.0 protected resources.
18
- """
19
-
20
- __author__ = 'jcgregorio@google.com (Joe Gregorio)'
21
-
22
- import base64
23
- import clientsecrets
24
- import copy
25
- import datetime
26
- from .. import httplib2
27
- import logging
28
- import sys
29
- import time
30
- import urllib
31
- import urlparse
32
-
33
- from . import GOOGLE_AUTH_URI
34
- from . import GOOGLE_REVOKE_URI
35
- from . import GOOGLE_TOKEN_URI
36
- from . import util
37
- from .anyjson import simplejson
38
-
39
- HAS_OPENSSL = False
40
- HAS_CRYPTO = False
41
- try:
42
- from . import crypt
43
- HAS_CRYPTO = True
44
- if crypt.OpenSSLVerifier is not None:
45
- HAS_OPENSSL = True
46
- except ImportError:
47
- pass
48
-
49
- try:
50
- from urlparse import parse_qsl
51
- except ImportError:
52
- from cgi import parse_qsl
53
-
54
- logger = logging.getLogger(__name__)
55
-
56
- # Expiry is stored in RFC3339 UTC format
57
- EXPIRY_FORMAT = '%Y-%m-%dT%H:%M:%SZ'
58
-
59
- # Which certs to use to validate id_tokens received.
60
- ID_TOKEN_VERIFICATON_CERTS = 'https://www.googleapis.com/oauth2/v1/certs'
61
-
62
- # Constant to use for the out of band OAuth 2.0 flow.
63
- OOB_CALLBACK_URN = 'urn:ietf:wg:oauth:2.0:oob'
64
-
65
- # Google Data client libraries may need to set this to [401, 403].
66
- REFRESH_STATUS_CODES = [401]
67
-
68
-
69
- class Error(Exception):
70
- """Base error for this module."""
71
-
72
-
73
- class FlowExchangeError(Error):
74
- """Error trying to exchange an authorization grant for an access token."""
75
-
76
-
77
- class AccessTokenRefreshError(Error):
78
- """Error trying to refresh an expired access token."""
79
-
80
-
81
- class TokenRevokeError(Error):
82
- """Error trying to revoke a token."""
83
-
84
-
85
- class UnknownClientSecretsFlowError(Error):
86
- """The client secrets file called for an unknown type of OAuth 2.0 flow. """
87
-
88
-
89
- class AccessTokenCredentialsError(Error):
90
- """Having only the access_token means no refresh is possible."""
91
-
92
-
93
- class VerifyJwtTokenError(Error):
94
- """Could on retrieve certificates for validation."""
95
-
96
-
97
- class NonAsciiHeaderError(Error):
98
- """Header names and values must be ASCII strings."""
99
-
100
-
101
- def _abstract():
102
- raise NotImplementedError('You need to override this function')
103
-
104
-
105
- class MemoryCache(object):
106
- """httplib2 Cache implementation which only caches locally."""
107
-
108
- def __init__(self):
109
- self.cache = {}
110
-
111
- def get(self, key):
112
- return self.cache.get(key)
113
-
114
- def set(self, key, value):
115
- self.cache[key] = value
116
-
117
- def delete(self, key):
118
- self.cache.pop(key, None)
119
-
120
-
121
- class Credentials(object):
122
- """Base class for all Credentials objects.
123
-
124
- Subclasses must define an authorize() method that applies the credentials to
125
- an HTTP transport.
126
-
127
- Subclasses must also specify a classmethod named 'from_json' that takes a JSON
128
- string as input and returns an instaniated Credentials object.
129
- """
130
-
131
- NON_SERIALIZED_MEMBERS = ['store']
132
-
133
- def authorize(self, http):
134
- """Take an httplib2.Http instance (or equivalent) and authorizes it.
135
-
136
- Authorizes it for the set of credentials, usually by replacing
137
- http.request() with a method that adds in the appropriate headers and then
138
- delegates to the original Http.request() method.
139
-
140
- Args:
141
- http: httplib2.Http, an http object to be used to make the refresh
142
- request.
143
- """
144
- _abstract()
145
-
146
- def refresh(self, http):
147
- """Forces a refresh of the access_token.
148
-
149
- Args:
150
- http: httplib2.Http, an http object to be used to make the refresh
151
- request.
152
- """
153
- _abstract()
154
-
155
- def revoke(self, http):
156
- """Revokes a refresh_token and makes the credentials void.
157
-
158
- Args:
159
- http: httplib2.Http, an http object to be used to make the revoke
160
- request.
161
- """
162
- _abstract()
163
-
164
- def apply(self, headers):
165
- """Add the authorization to the headers.
166
-
167
- Args:
168
- headers: dict, the headers to add the Authorization header to.
169
- """
170
- _abstract()
171
-
172
- def _to_json(self, strip):
173
- """Utility function that creates JSON repr. of a Credentials object.
174
-
175
- Args:
176
- strip: array, An array of names of members to not include in the JSON.
177
-
178
- Returns:
179
- string, a JSON representation of this instance, suitable to pass to
180
- from_json().
181
- """
182
- t = type(self)
183
- d = copy.copy(self.__dict__)
184
- for member in strip:
185
- if member in d:
186
- del d[member]
187
- if 'token_expiry' in d and isinstance(d['token_expiry'], datetime.datetime):
188
- d['token_expiry'] = d['token_expiry'].strftime(EXPIRY_FORMAT)
189
- # Add in information we will need later to reconsistitue this instance.
190
- d['_class'] = t.__name__
191
- d['_module'] = t.__module__
192
- return simplejson.dumps(d)
193
-
194
- def to_json(self):
195
- """Creating a JSON representation of an instance of Credentials.
196
-
197
- Returns:
198
- string, a JSON representation of this instance, suitable to pass to
199
- from_json().
200
- """
201
- return self._to_json(Credentials.NON_SERIALIZED_MEMBERS)
202
-
203
- @classmethod
204
- def new_from_json(cls, s):
205
- """Utility class method to instantiate a Credentials subclass from a JSON
206
- representation produced by to_json().
207
-
208
- Args:
209
- s: string, JSON from to_json().
210
-
211
- Returns:
212
- An instance of the subclass of Credentials that was serialized with
213
- to_json().
214
- """
215
- data = simplejson.loads(s)
216
- # Find and call the right classmethod from_json() to restore the object.
217
- module = data['_module']
218
- try:
219
- m = __import__(module)
220
- except ImportError:
221
- # In case there's an object from the old package structure, update it
222
- module = module.replace('.apiclient', '')
223
- m = __import__(module)
224
-
225
- m = __import__(module, fromlist=module.split('.')[:-1])
226
- kls = getattr(m, data['_class'])
227
- from_json = getattr(kls, 'from_json')
228
- return from_json(s)
229
-
230
- @classmethod
231
- def from_json(cls, s):
232
- """Instantiate a Credentials object from a JSON description of it.
233
-
234
- The JSON should have been produced by calling .to_json() on the object.
235
-
236
- Args:
237
- data: dict, A deserialized JSON object.
238
-
239
- Returns:
240
- An instance of a Credentials subclass.
241
- """
242
- return Credentials()
243
-
244
-
245
- class Flow(object):
246
- """Base class for all Flow objects."""
247
- pass
248
-
249
-
250
- class Storage(object):
251
- """Base class for all Storage objects.
252
-
253
- Store and retrieve a single credential. This class supports locking
254
- such that multiple processes and threads can operate on a single
255
- store.
256
- """
257
-
258
- def acquire_lock(self):
259
- """Acquires any lock necessary to access this Storage.
260
-
261
- This lock is not reentrant.
262
- """
263
- pass
264
-
265
- def release_lock(self):
266
- """Release the Storage lock.
267
-
268
- Trying to release a lock that isn't held will result in a
269
- RuntimeError.
270
- """
271
- pass
272
-
273
- def locked_get(self):
274
- """Retrieve credential.
275
-
276
- The Storage lock must be held when this is called.
277
-
278
- Returns:
279
- oauth2client.client.Credentials
280
- """
281
- _abstract()
282
-
283
- def locked_put(self, credentials):
284
- """Write a credential.
285
-
286
- The Storage lock must be held when this is called.
287
-
288
- Args:
289
- credentials: Credentials, the credentials to store.
290
- """
291
- _abstract()
292
-
293
- def locked_delete(self):
294
- """Delete a credential.
295
-
296
- The Storage lock must be held when this is called.
297
- """
298
- _abstract()
299
-
300
- def get(self):
301
- """Retrieve credential.
302
-
303
- The Storage lock must *not* be held when this is called.
304
-
305
- Returns:
306
- oauth2client.client.Credentials
307
- """
308
- self.acquire_lock()
309
- try:
310
- return self.locked_get()
311
- finally:
312
- self.release_lock()
313
-
314
- def put(self, credentials):
315
- """Write a credential.
316
-
317
- The Storage lock must be held when this is called.
318
-
319
- Args:
320
- credentials: Credentials, the credentials to store.
321
- """
322
- self.acquire_lock()
323
- try:
324
- self.locked_put(credentials)
325
- finally:
326
- self.release_lock()
327
-
328
- def delete(self):
329
- """Delete credential.
330
-
331
- Frees any resources associated with storing the credential.
332
- The Storage lock must *not* be held when this is called.
333
-
334
- Returns:
335
- None
336
- """
337
- self.acquire_lock()
338
- try:
339
- return self.locked_delete()
340
- finally:
341
- self.release_lock()
342
-
343
-
344
- def clean_headers(headers):
345
- """Forces header keys and values to be strings, i.e not unicode.
346
-
347
- The httplib module just concats the header keys and values in a way that may
348
- make the message header a unicode string, which, if it then tries to
349
- contatenate to a binary request body may result in a unicode decode error.
350
-
351
- Args:
352
- headers: dict, A dictionary of headers.
353
-
354
- Returns:
355
- The same dictionary but with all the keys converted to strings.
356
- """
357
- clean = {}
358
- try:
359
- for k, v in headers.iteritems():
360
- clean[str(k)] = str(v)
361
- except UnicodeEncodeError:
362
- raise NonAsciiHeaderError(k + ': ' + v)
363
- return clean
364
-
365
-
366
- def _update_query_params(uri, params):
367
- """Updates a URI with new query parameters.
368
-
369
- Args:
370
- uri: string, A valid URI, with potential existing query parameters.
371
- params: dict, A dictionary of query parameters.
372
-
373
- Returns:
374
- The same URI but with the new query parameters added.
375
- """
376
- parts = list(urlparse.urlparse(uri))
377
- query_params = dict(parse_qsl(parts[4])) # 4 is the index of the query part
378
- query_params.update(params)
379
- parts[4] = urllib.urlencode(query_params)
380
- return urlparse.urlunparse(parts)
381
-
382
-
383
- class OAuth2Credentials(Credentials):
384
- """Credentials object for OAuth 2.0.
385
-
386
- Credentials can be applied to an httplib2.Http object using the authorize()
387
- method, which then adds the OAuth 2.0 access token to each request.
388
-
389
- OAuth2Credentials objects may be safely pickled and unpickled.
390
- """
391
-
392
- @util.positional(8)
393
- def __init__(self, access_token, client_id, client_secret, refresh_token,
394
- token_expiry, token_uri, user_agent, revoke_uri=None,
395
- id_token=None, token_response=None):
396
- """Create an instance of OAuth2Credentials.
397
-
398
- This constructor is not usually called by the user, instead
399
- OAuth2Credentials objects are instantiated by the OAuth2WebServerFlow.
400
-
401
- Args:
402
- access_token: string, access token.
403
- client_id: string, client identifier.
404
- client_secret: string, client secret.
405
- refresh_token: string, refresh token.
406
- token_expiry: datetime, when the access_token expires.
407
- token_uri: string, URI of token endpoint.
408
- user_agent: string, The HTTP User-Agent to provide for this application.
409
- revoke_uri: string, URI for revoke endpoint. Defaults to None; a token
410
- can't be revoked if this is None.
411
- id_token: object, The identity of the resource owner.
412
- token_response: dict, the decoded response to the token request. None
413
- if a token hasn't been requested yet. Stored because some providers
414
- (e.g. wordpress.com) include extra fields that clients may want.
415
-
416
- Notes:
417
- store: callable, A callable that when passed a Credential
418
- will store the credential back to where it came from.
419
- This is needed to store the latest access_token if it
420
- has expired and been refreshed.
421
- """
422
- self.access_token = access_token
423
- self.client_id = client_id
424
- self.client_secret = client_secret
425
- self.refresh_token = refresh_token
426
- self.store = None
427
- self.token_expiry = token_expiry
428
- self.token_uri = token_uri
429
- self.user_agent = user_agent
430
- self.revoke_uri = revoke_uri
431
- self.id_token = id_token
432
- self.token_response = token_response
433
-
434
- # True if the credentials have been revoked or expired and can't be
435
- # refreshed.
436
- self.invalid = False
437
-
438
- def authorize(self, http):
439
- """Authorize an httplib2.Http instance with these credentials.
440
-
441
- The modified http.request method will add authentication headers to each
442
- request and will refresh access_tokens when a 401 is received on a
443
- request. In addition the http.request method has a credentials property,
444
- http.request.credentials, which is the Credentials object that authorized
445
- it.
446
-
447
- Args:
448
- http: An instance of httplib2.Http
449
- or something that acts like it.
450
-
451
- Returns:
452
- A modified instance of http that was passed in.
453
-
454
- Example:
455
-
456
- h = httplib2.Http()
457
- h = credentials.authorize(h)
458
-
459
- You can't create a new OAuth subclass of httplib2.Authenication
460
- because it never gets passed the absolute URI, which is needed for
461
- signing. So instead we have to overload 'request' with a closure
462
- that adds in the Authorization header and then calls the original
463
- version of 'request()'.
464
- """
465
- request_orig = http.request
466
-
467
- # The closure that will replace 'httplib2.Http.request'.
468
- @util.positional(1)
469
- def new_request(uri, method='GET', body=None, headers=None,
470
- redirections=httplib2.DEFAULT_MAX_REDIRECTS,
471
- connection_type=None):
472
- if not self.access_token:
473
- logger.info('Attempting refresh to obtain initial access_token')
474
- self._refresh(request_orig)
475
-
476
- # Modify the request headers to add the appropriate
477
- # Authorization header.
478
- if headers is None:
479
- headers = {}
480
- self.apply(headers)
481
-
482
- if self.user_agent is not None:
483
- if 'user-agent' in headers:
484
- headers['user-agent'] = self.user_agent + ' ' + headers['user-agent']
485
- else:
486
- headers['user-agent'] = self.user_agent
487
-
488
- resp, content = request_orig(uri, method, body, clean_headers(headers),
489
- redirections, connection_type)
490
-
491
- if resp.status in REFRESH_STATUS_CODES:
492
- logger.info('Refreshing due to a %s' % str(resp.status))
493
- self._refresh(request_orig)
494
- self.apply(headers)
495
- return request_orig(uri, method, body, clean_headers(headers),
496
- redirections, connection_type)
497
- else:
498
- return (resp, content)
499
-
500
- # Replace the request method with our own closure.
501
- http.request = new_request
502
-
503
- # Set credentials as a property of the request method.
504
- setattr(http.request, 'credentials', self)
505
-
506
- return http
507
-
508
- def refresh(self, http):
509
- """Forces a refresh of the access_token.
510
-
511
- Args:
512
- http: httplib2.Http, an http object to be used to make the refresh
513
- request.
514
- """
515
- self._refresh(http.request)
516
-
517
- def revoke(self, http):
518
- """Revokes a refresh_token and makes the credentials void.
519
-
520
- Args:
521
- http: httplib2.Http, an http object to be used to make the revoke
522
- request.
523
- """
524
- self._revoke(http.request)
525
-
526
- def apply(self, headers):
527
- """Add the authorization to the headers.
528
-
529
- Args:
530
- headers: dict, the headers to add the Authorization header to.
531
- """
532
- headers['Authorization'] = 'Bearer ' + self.access_token
533
-
534
- def to_json(self):
535
- return self._to_json(Credentials.NON_SERIALIZED_MEMBERS)
536
-
537
- @classmethod
538
- def from_json(cls, s):
539
- """Instantiate a Credentials object from a JSON description of it. The JSON
540
- should have been produced by calling .to_json() on the object.
541
-
542
- Args:
543
- data: dict, A deserialized JSON object.
544
-
545
- Returns:
546
- An instance of a Credentials subclass.
547
- """
548
- data = simplejson.loads(s)
549
- if 'token_expiry' in data and not isinstance(data['token_expiry'],
550
- datetime.datetime):
551
- try:
552
- data['token_expiry'] = datetime.datetime.strptime(
553
- data['token_expiry'], EXPIRY_FORMAT)
554
- except:
555
- data['token_expiry'] = None
556
- retval = cls(
557
- data['access_token'],
558
- data['client_id'],
559
- data['client_secret'],
560
- data['refresh_token'],
561
- data['token_expiry'],
562
- data['token_uri'],
563
- data['user_agent'],
564
- revoke_uri=data.get('revoke_uri', None),
565
- id_token=data.get('id_token', None),
566
- token_response=data.get('token_response', None))
567
- retval.invalid = data['invalid']
568
- return retval
569
-
570
- @property
571
- def access_token_expired(self):
572
- """True if the credential is expired or invalid.
573
-
574
- If the token_expiry isn't set, we assume the token doesn't expire.
575
- """
576
- if self.invalid:
577
- return True
578
-
579
- if not self.token_expiry:
580
- return False
581
-
582
- now = datetime.datetime.utcnow()
583
- if now >= self.token_expiry:
584
- logger.info('access_token is expired. Now: %s, token_expiry: %s',
585
- now, self.token_expiry)
586
- return True
587
- return False
588
-
589
- def set_store(self, store):
590
- """Set the Storage for the credential.
591
-
592
- Args:
593
- store: Storage, an implementation of Stroage object.
594
- This is needed to store the latest access_token if it
595
- has expired and been refreshed. This implementation uses
596
- locking to check for updates before updating the
597
- access_token.
598
- """
599
- self.store = store
600
-
601
- def _updateFromCredential(self, other):
602
- """Update this Credential from another instance."""
603
- self.__dict__.update(other.__getstate__())
604
-
605
- def __getstate__(self):
606
- """Trim the state down to something that can be pickled."""
607
- d = copy.copy(self.__dict__)
608
- del d['store']
609
- return d
610
-
611
- def __setstate__(self, state):
612
- """Reconstitute the state of the object from being pickled."""
613
- self.__dict__.update(state)
614
- self.store = None
615
-
616
- def _generate_refresh_request_body(self):
617
- """Generate the body that will be used in the refresh request."""
618
- body = urllib.urlencode({
619
- 'grant_type': 'refresh_token',
620
- 'client_id': self.client_id,
621
- 'client_secret': self.client_secret,
622
- 'refresh_token': self.refresh_token,
623
- })
624
- return body
625
-
626
- def _generate_refresh_request_headers(self):
627
- """Generate the headers that will be used in the refresh request."""
628
- headers = {
629
- 'content-type': 'application/x-www-form-urlencoded',
630
- }
631
-
632
- if self.user_agent is not None:
633
- headers['user-agent'] = self.user_agent
634
-
635
- return headers
636
-
637
- def _refresh(self, http_request):
638
- """Refreshes the access_token.
639
-
640
- This method first checks by reading the Storage object if available.
641
- If a refresh is still needed, it holds the Storage lock until the
642
- refresh is completed.
643
-
644
- Args:
645
- http_request: callable, a callable that matches the method signature of
646
- httplib2.Http.request, used to make the refresh request.
647
-
648
- Raises:
649
- AccessTokenRefreshError: When the refresh fails.
650
- """
651
- if not self.store:
652
- self._do_refresh_request(http_request)
653
- else:
654
- self.store.acquire_lock()
655
- try:
656
- new_cred = self.store.locked_get()
657
- if (new_cred and not new_cred.invalid and
658
- new_cred.access_token != self.access_token):
659
- logger.info('Updated access_token read from Storage')
660
- self._updateFromCredential(new_cred)
661
- else:
662
- self._do_refresh_request(http_request)
663
- finally:
664
- self.store.release_lock()
665
-
666
- def _do_refresh_request(self, http_request):
667
- """Refresh the access_token using the refresh_token.
668
-
669
- Args:
670
- http_request: callable, a callable that matches the method signature of
671
- httplib2.Http.request, used to make the refresh request.
672
-
673
- Raises:
674
- AccessTokenRefreshError: When the refresh fails.
675
- """
676
- body = self._generate_refresh_request_body()
677
- headers = self._generate_refresh_request_headers()
678
-
679
- logger.info('Refreshing access_token')
680
- resp, content = http_request(
681
- self.token_uri, method='POST', body=body, headers=headers)
682
- if resp.status == 200:
683
- # TODO(jcgregorio) Raise an error if loads fails?
684
- d = simplejson.loads(content)
685
- self.token_response = d
686
- self.access_token = d['access_token']
687
- self.refresh_token = d.get('refresh_token', self.refresh_token)
688
- if 'expires_in' in d:
689
- self.token_expiry = datetime.timedelta(
690
- seconds=int(d['expires_in'])) + datetime.datetime.utcnow()
691
- else:
692
- self.token_expiry = None
693
- if self.store:
694
- self.store.locked_put(self)
695
- else:
696
- # An {'error':...} response body means the token is expired or revoked,
697
- # so we flag the credentials as such.
698
- logger.info('Failed to retrieve access token: %s' % content)
699
- error_msg = 'Invalid response %s.' % resp['status']
700
- try:
701
- d = simplejson.loads(content)
702
- if 'error' in d:
703
- error_msg = d['error']
704
- self.invalid = True
705
- if self.store:
706
- self.store.locked_put(self)
707
- except StandardError:
708
- pass
709
- raise AccessTokenRefreshError(error_msg)
710
-
711
- def _revoke(self, http_request):
712
- """Revokes the refresh_token and deletes the store if available.
713
-
714
- Args:
715
- http_request: callable, a callable that matches the method signature of
716
- httplib2.Http.request, used to make the revoke request.
717
- """
718
- self._do_revoke(http_request, self.refresh_token)
719
-
720
- def _do_revoke(self, http_request, token):
721
- """Revokes the credentials and deletes the store if available.
722
-
723
- Args:
724
- http_request: callable, a callable that matches the method signature of
725
- httplib2.Http.request, used to make the refresh request.
726
- token: A string used as the token to be revoked. Can be either an
727
- access_token or refresh_token.
728
-
729
- Raises:
730
- TokenRevokeError: If the revoke request does not return with a 200 OK.
731
- """
732
- logger.info('Revoking token')
733
- query_params = {'token': token}
734
- token_revoke_uri = _update_query_params(self.revoke_uri, query_params)
735
- resp, content = http_request(token_revoke_uri)
736
- if resp.status == 200:
737
- self.invalid = True
738
- else:
739
- error_msg = 'Invalid response %s.' % resp.status
740
- try:
741
- d = simplejson.loads(content)
742
- if 'error' in d:
743
- error_msg = d['error']
744
- except StandardError:
745
- pass
746
- raise TokenRevokeError(error_msg)
747
-
748
- if self.store:
749
- self.store.delete()
750
-
751
-
752
- class AccessTokenCredentials(OAuth2Credentials):
753
- """Credentials object for OAuth 2.0.
754
-
755
- Credentials can be applied to an httplib2.Http object using the
756
- authorize() method, which then signs each request from that object
757
- with the OAuth 2.0 access token. This set of credentials is for the
758
- use case where you have acquired an OAuth 2.0 access_token from
759
- another place such as a JavaScript client or another web
760
- application, and wish to use it from Python. Because only the
761
- access_token is present it can not be refreshed and will in time
762
- expire.
763
-
764
- AccessTokenCredentials objects may be safely pickled and unpickled.
765
-
766
- Usage:
767
- credentials = AccessTokenCredentials('<an access token>',
768
- 'my-user-agent/1.0')
769
- http = httplib2.Http()
770
- http = credentials.authorize(http)
771
-
772
- Exceptions:
773
- AccessTokenCredentialsExpired: raised when the access_token expires or is
774
- revoked.
775
- """
776
-
777
- def __init__(self, access_token, user_agent, revoke_uri=None):
778
- """Create an instance of OAuth2Credentials
779
-
780
- This is one of the few types if Credentials that you should contrust,
781
- Credentials objects are usually instantiated by a Flow.
782
-
783
- Args:
784
- access_token: string, access token.
785
- user_agent: string, The HTTP User-Agent to provide for this application.
786
- revoke_uri: string, URI for revoke endpoint. Defaults to None; a token
787
- can't be revoked if this is None.
788
- """
789
- super(AccessTokenCredentials, self).__init__(
790
- access_token,
791
- None,
792
- None,
793
- None,
794
- None,
795
- None,
796
- user_agent,
797
- revoke_uri=revoke_uri)
798
-
799
-
800
- @classmethod
801
- def from_json(cls, s):
802
- data = simplejson.loads(s)
803
- retval = AccessTokenCredentials(
804
- data['access_token'],
805
- data['user_agent'])
806
- return retval
807
-
808
- def _refresh(self, http_request):
809
- raise AccessTokenCredentialsError(
810
- 'The access_token is expired or invalid and can\'t be refreshed.')
811
-
812
- def _revoke(self, http_request):
813
- """Revokes the access_token and deletes the store if available.
814
-
815
- Args:
816
- http_request: callable, a callable that matches the method signature of
817
- httplib2.Http.request, used to make the revoke request.
818
- """
819
- self._do_revoke(http_request, self.access_token)
820
-
821
-
822
- class AssertionCredentials(OAuth2Credentials):
823
- """Abstract Credentials object used for OAuth 2.0 assertion grants.
824
-
825
- This credential does not require a flow to instantiate because it
826
- represents a two legged flow, and therefore has all of the required
827
- information to generate and refresh its own access tokens. It must
828
- be subclassed to generate the appropriate assertion string.
829
-
830
- AssertionCredentials objects may be safely pickled and unpickled.
831
- """
832
-
833
- @util.positional(2)
834
- def __init__(self, assertion_type, user_agent=None,
835
- token_uri=GOOGLE_TOKEN_URI,
836
- revoke_uri=GOOGLE_REVOKE_URI,
837
- **unused_kwargs):
838
- """Constructor for AssertionFlowCredentials.
839
-
840
- Args:
841
- assertion_type: string, assertion type that will be declared to the auth
842
- server
843
- user_agent: string, The HTTP User-Agent to provide for this application.
844
- token_uri: string, URI for token endpoint. For convenience
845
- defaults to Google's endpoints but any OAuth 2.0 provider can be used.
846
- revoke_uri: string, URI for revoke endpoint.
847
- """
848
- super(AssertionCredentials, self).__init__(
849
- None,
850
- None,
851
- None,
852
- None,
853
- None,
854
- token_uri,
855
- user_agent,
856
- revoke_uri=revoke_uri)
857
- self.assertion_type = assertion_type
858
-
859
- def _generate_refresh_request_body(self):
860
- assertion = self._generate_assertion()
861
-
862
- body = urllib.urlencode({
863
- 'assertion': assertion,
864
- 'grant_type': 'urn:ietf:params:oauth:grant-type:jwt-bearer',
865
- })
866
-
867
- return body
868
-
869
- def _generate_assertion(self):
870
- """Generate the assertion string that will be used in the access token
871
- request.
872
- """
873
- _abstract()
874
-
875
- def _revoke(self, http_request):
876
- """Revokes the access_token and deletes the store if available.
877
-
878
- Args:
879
- http_request: callable, a callable that matches the method signature of
880
- httplib2.Http.request, used to make the revoke request.
881
- """
882
- self._do_revoke(http_request, self.access_token)
883
-
884
-
885
- if HAS_CRYPTO:
886
- # PyOpenSSL and PyCrypto are not prerequisites for oauth2client, so if it is
887
- # missing then don't create the SignedJwtAssertionCredentials or the
888
- # verify_id_token() method.
889
-
890
- class SignedJwtAssertionCredentials(AssertionCredentials):
891
- """Credentials object used for OAuth 2.0 Signed JWT assertion grants.
892
-
893
- This credential does not require a flow to instantiate because it represents
894
- a two legged flow, and therefore has all of the required information to
895
- generate and refresh its own access tokens.
896
-
897
- SignedJwtAssertionCredentials requires either PyOpenSSL, or PyCrypto 2.6 or
898
- later. For App Engine you may also consider using AppAssertionCredentials.
899
- """
900
-
901
- MAX_TOKEN_LIFETIME_SECS = 3600 # 1 hour in seconds
902
-
903
- @util.positional(4)
904
- def __init__(self,
905
- service_account_name,
906
- private_key,
907
- scope,
908
- private_key_password='notasecret',
909
- user_agent=None,
910
- token_uri=GOOGLE_TOKEN_URI,
911
- revoke_uri=GOOGLE_REVOKE_URI,
912
- **kwargs):
913
- """Constructor for SignedJwtAssertionCredentials.
914
-
915
- Args:
916
- service_account_name: string, id for account, usually an email address.
917
- private_key: string, private key in PKCS12 or PEM format.
918
- scope: string or iterable of strings, scope(s) of the credentials being
919
- requested.
920
- private_key_password: string, password for private_key, unused if
921
- private_key is in PEM format.
922
- user_agent: string, HTTP User-Agent to provide for this application.
923
- token_uri: string, URI for token endpoint. For convenience
924
- defaults to Google's endpoints but any OAuth 2.0 provider can be used.
925
- revoke_uri: string, URI for revoke endpoint.
926
- kwargs: kwargs, Additional parameters to add to the JWT token, for
927
- example sub=joe@xample.org."""
928
-
929
- super(SignedJwtAssertionCredentials, self).__init__(
930
- None,
931
- user_agent=user_agent,
932
- token_uri=token_uri,
933
- revoke_uri=revoke_uri,
934
- )
935
-
936
- self.scope = util.scopes_to_string(scope)
937
-
938
- # Keep base64 encoded so it can be stored in JSON.
939
- self.private_key = base64.b64encode(private_key)
940
-
941
- self.private_key_password = private_key_password
942
- self.service_account_name = service_account_name
943
- self.kwargs = kwargs
944
-
945
- @classmethod
946
- def from_json(cls, s):
947
- data = simplejson.loads(s)
948
- retval = SignedJwtAssertionCredentials(
949
- data['service_account_name'],
950
- base64.b64decode(data['private_key']),
951
- data['scope'],
952
- private_key_password=data['private_key_password'],
953
- user_agent=data['user_agent'],
954
- token_uri=data['token_uri'],
955
- **data['kwargs']
956
- )
957
- retval.invalid = data['invalid']
958
- retval.access_token = data['access_token']
959
- return retval
960
-
961
- def _generate_assertion(self):
962
- """Generate the assertion that will be used in the request."""
963
- now = long(time.time())
964
- payload = {
965
- 'aud': self.token_uri,
966
- 'scope': self.scope,
967
- 'iat': now,
968
- 'exp': now + SignedJwtAssertionCredentials.MAX_TOKEN_LIFETIME_SECS,
969
- 'iss': self.service_account_name
970
- }
971
- payload.update(self.kwargs)
972
- logger.debug(str(payload))
973
-
974
- private_key = base64.b64decode(self.private_key)
975
- return crypt.make_signed_jwt(crypt.Signer.from_string(
976
- private_key, self.private_key_password), payload)
977
-
978
- # Only used in verify_id_token(), which is always calling to the same URI
979
- # for the certs.
980
- _cached_http = httplib2.Http(MemoryCache())
981
-
982
- @util.positional(2)
983
- def verify_id_token(id_token, audience, http=None,
984
- cert_uri=ID_TOKEN_VERIFICATON_CERTS):
985
- """Verifies a signed JWT id_token.
986
-
987
- This function requires PyOpenSSL and because of that it does not work on
988
- App Engine.
989
-
990
- Args:
991
- id_token: string, A Signed JWT.
992
- audience: string, The audience 'aud' that the token should be for.
993
- http: httplib2.Http, instance to use to make the HTTP request. Callers
994
- should supply an instance that has caching enabled.
995
- cert_uri: string, URI of the certificates in JSON format to
996
- verify the JWT against.
997
-
998
- Returns:
999
- The deserialized JSON in the JWT.
1000
-
1001
- Raises:
1002
- oauth2client.crypt.AppIdentityError if the JWT fails to verify.
1003
- """
1004
- if http is None:
1005
- http = _cached_http
1006
-
1007
- resp, content = http.request(cert_uri)
1008
-
1009
- if resp.status == 200:
1010
- certs = simplejson.loads(content)
1011
- return crypt.verify_signed_jwt_with_certs(id_token, certs, audience)
1012
- else:
1013
- raise VerifyJwtTokenError('Status code: %d' % resp.status)
1014
-
1015
-
1016
- def _urlsafe_b64decode(b64string):
1017
- # Guard against unicode strings, which base64 can't handle.
1018
- b64string = b64string.encode('ascii')
1019
- padded = b64string + '=' * (4 - len(b64string) % 4)
1020
- return base64.urlsafe_b64decode(padded)
1021
-
1022
-
1023
- def _extract_id_token(id_token):
1024
- """Extract the JSON payload from a JWT.
1025
-
1026
- Does the extraction w/o checking the signature.
1027
-
1028
- Args:
1029
- id_token: string, OAuth 2.0 id_token.
1030
-
1031
- Returns:
1032
- object, The deserialized JSON payload.
1033
- """
1034
- segments = id_token.split('.')
1035
-
1036
- if (len(segments) != 3):
1037
- raise VerifyJwtTokenError(
1038
- 'Wrong number of segments in token: %s' % id_token)
1039
-
1040
- return simplejson.loads(_urlsafe_b64decode(segments[1]))
1041
-
1042
-
1043
- def _parse_exchange_token_response(content):
1044
- """Parses response of an exchange token request.
1045
-
1046
- Most providers return JSON but some (e.g. Facebook) return a
1047
- url-encoded string.
1048
-
1049
- Args:
1050
- content: The body of a response
1051
-
1052
- Returns:
1053
- Content as a dictionary object. Note that the dict could be empty,
1054
- i.e. {}. That basically indicates a failure.
1055
- """
1056
- resp = {}
1057
- try:
1058
- resp = simplejson.loads(content)
1059
- except StandardError:
1060
- # different JSON libs raise different exceptions,
1061
- # so we just do a catch-all here
1062
- resp = dict(parse_qsl(content))
1063
-
1064
- # some providers respond with 'expires', others with 'expires_in'
1065
- if resp and 'expires' in resp:
1066
- resp['expires_in'] = resp.pop('expires')
1067
-
1068
- return resp
1069
-
1070
-
1071
- @util.positional(4)
1072
- def credentials_from_code(client_id, client_secret, scope, code,
1073
- redirect_uri='postmessage', http=None,
1074
- user_agent=None, token_uri=GOOGLE_TOKEN_URI,
1075
- auth_uri=GOOGLE_AUTH_URI,
1076
- revoke_uri=GOOGLE_REVOKE_URI):
1077
- """Exchanges an authorization code for an OAuth2Credentials object.
1078
-
1079
- Args:
1080
- client_id: string, client identifier.
1081
- client_secret: string, client secret.
1082
- scope: string or iterable of strings, scope(s) to request.
1083
- code: string, An authroization code, most likely passed down from
1084
- the client
1085
- redirect_uri: string, this is generally set to 'postmessage' to match the
1086
- redirect_uri that the client specified
1087
- http: httplib2.Http, optional http instance to use to do the fetch
1088
- token_uri: string, URI for token endpoint. For convenience
1089
- defaults to Google's endpoints but any OAuth 2.0 provider can be used.
1090
- auth_uri: string, URI for authorization endpoint. For convenience
1091
- defaults to Google's endpoints but any OAuth 2.0 provider can be used.
1092
- revoke_uri: string, URI for revoke endpoint. For convenience
1093
- defaults to Google's endpoints but any OAuth 2.0 provider can be used.
1094
-
1095
- Returns:
1096
- An OAuth2Credentials object.
1097
-
1098
- Raises:
1099
- FlowExchangeError if the authorization code cannot be exchanged for an
1100
- access token
1101
- """
1102
- flow = OAuth2WebServerFlow(client_id, client_secret, scope,
1103
- redirect_uri=redirect_uri, user_agent=user_agent,
1104
- auth_uri=auth_uri, token_uri=token_uri,
1105
- revoke_uri=revoke_uri)
1106
-
1107
- credentials = flow.step2_exchange(code, http=http)
1108
- return credentials
1109
-
1110
-
1111
- @util.positional(3)
1112
- def credentials_from_clientsecrets_and_code(filename, scope, code,
1113
- message = None,
1114
- redirect_uri='postmessage',
1115
- http=None,
1116
- cache=None):
1117
- """Returns OAuth2Credentials from a clientsecrets file and an auth code.
1118
-
1119
- Will create the right kind of Flow based on the contents of the clientsecrets
1120
- file or will raise InvalidClientSecretsError for unknown types of Flows.
1121
-
1122
- Args:
1123
- filename: string, File name of clientsecrets.
1124
- scope: string or iterable of strings, scope(s) to request.
1125
- code: string, An authorization code, most likely passed down from
1126
- the client
1127
- message: string, A friendly string to display to the user if the
1128
- clientsecrets file is missing or invalid. If message is provided then
1129
- sys.exit will be called in the case of an error. If message in not
1130
- provided then clientsecrets.InvalidClientSecretsError will be raised.
1131
- redirect_uri: string, this is generally set to 'postmessage' to match the
1132
- redirect_uri that the client specified
1133
- http: httplib2.Http, optional http instance to use to do the fetch
1134
- cache: An optional cache service client that implements get() and set()
1135
- methods. See clientsecrets.loadfile() for details.
1136
-
1137
- Returns:
1138
- An OAuth2Credentials object.
1139
-
1140
- Raises:
1141
- FlowExchangeError if the authorization code cannot be exchanged for an
1142
- access token
1143
- UnknownClientSecretsFlowError if the file describes an unknown kind of Flow.
1144
- clientsecrets.InvalidClientSecretsError if the clientsecrets file is
1145
- invalid.
1146
- """
1147
- flow = flow_from_clientsecrets(filename, scope, message=message, cache=cache,
1148
- redirect_uri=redirect_uri)
1149
- credentials = flow.step2_exchange(code, http=http)
1150
- return credentials
1151
-
1152
-
1153
- class OAuth2WebServerFlow(Flow):
1154
- """Does the Web Server Flow for OAuth 2.0.
1155
-
1156
- OAuth2WebServerFlow objects may be safely pickled and unpickled.
1157
- """
1158
-
1159
- @util.positional(4)
1160
- def __init__(self, client_id, client_secret, scope,
1161
- redirect_uri=None,
1162
- user_agent=None,
1163
- auth_uri=GOOGLE_AUTH_URI,
1164
- token_uri=GOOGLE_TOKEN_URI,
1165
- revoke_uri=GOOGLE_REVOKE_URI,
1166
- **kwargs):
1167
- """Constructor for OAuth2WebServerFlow.
1168
-
1169
- The kwargs argument is used to set extra query parameters on the
1170
- auth_uri. For example, the access_type and approval_prompt
1171
- query parameters can be set via kwargs.
1172
-
1173
- Args:
1174
- client_id: string, client identifier.
1175
- client_secret: string client secret.
1176
- scope: string or iterable of strings, scope(s) of the credentials being
1177
- requested.
1178
- redirect_uri: string, Either the string 'urn:ietf:wg:oauth:2.0:oob' for
1179
- a non-web-based application, or a URI that handles the callback from
1180
- the authorization server.
1181
- user_agent: string, HTTP User-Agent to provide for this application.
1182
- auth_uri: string, URI for authorization endpoint. For convenience
1183
- defaults to Google's endpoints but any OAuth 2.0 provider can be used.
1184
- token_uri: string, URI for token endpoint. For convenience
1185
- defaults to Google's endpoints but any OAuth 2.0 provider can be used.
1186
- revoke_uri: string, URI for revoke endpoint. For convenience
1187
- defaults to Google's endpoints but any OAuth 2.0 provider can be used.
1188
- **kwargs: dict, The keyword arguments are all optional and required
1189
- parameters for the OAuth calls.
1190
- """
1191
- self.client_id = client_id
1192
- self.client_secret = client_secret
1193
- self.scope = util.scopes_to_string(scope)
1194
- self.redirect_uri = redirect_uri
1195
- self.user_agent = user_agent
1196
- self.auth_uri = auth_uri
1197
- self.token_uri = token_uri
1198
- self.revoke_uri = revoke_uri
1199
- self.params = {
1200
- 'access_type': 'offline',
1201
- 'response_type': 'code',
1202
- }
1203
- self.params.update(kwargs)
1204
-
1205
- @util.positional(1)
1206
- def step1_get_authorize_url(self, redirect_uri=None):
1207
- """Returns a URI to redirect to the provider.
1208
-
1209
- Args:
1210
- redirect_uri: string, Either the string 'urn:ietf:wg:oauth:2.0:oob' for
1211
- a non-web-based application, or a URI that handles the callback from
1212
- the authorization server. This parameter is deprecated, please move to
1213
- passing the redirect_uri in via the constructor.
1214
-
1215
- Returns:
1216
- A URI as a string to redirect the user to begin the authorization flow.
1217
- """
1218
- if redirect_uri is not None:
1219
- logger.warning(('The redirect_uri parameter for'
1220
- 'OAuth2WebServerFlow.step1_get_authorize_url is deprecated. Please'
1221
- 'move to passing the redirect_uri in via the constructor.'))
1222
- self.redirect_uri = redirect_uri
1223
-
1224
- if self.redirect_uri is None:
1225
- raise ValueError('The value of redirect_uri must not be None.')
1226
-
1227
- query_params = {
1228
- 'client_id': self.client_id,
1229
- 'redirect_uri': self.redirect_uri,
1230
- 'scope': self.scope,
1231
- }
1232
- query_params.update(self.params)
1233
- return _update_query_params(self.auth_uri, query_params)
1234
-
1235
- @util.positional(2)
1236
- def step2_exchange(self, code, http=None):
1237
- """Exhanges a code for OAuth2Credentials.
1238
-
1239
- Args:
1240
- code: string or dict, either the code as a string, or a dictionary
1241
- of the query parameters to the redirect_uri, which contains
1242
- the code.
1243
- http: httplib2.Http, optional http instance to use to do the fetch
1244
-
1245
- Returns:
1246
- An OAuth2Credentials object that can be used to authorize requests.
1247
-
1248
- Raises:
1249
- FlowExchangeError if a problem occured exchanging the code for a
1250
- refresh_token.
1251
- """
1252
-
1253
- if not (isinstance(code, str) or isinstance(code, unicode)):
1254
- if 'code' not in code:
1255
- if 'error' in code:
1256
- error_msg = code['error']
1257
- else:
1258
- error_msg = 'No code was supplied in the query parameters.'
1259
- raise FlowExchangeError(error_msg)
1260
- else:
1261
- code = code['code']
1262
-
1263
- body = urllib.urlencode({
1264
- 'grant_type': 'authorization_code',
1265
- 'client_id': self.client_id,
1266
- 'client_secret': self.client_secret,
1267
- 'code': code,
1268
- 'redirect_uri': self.redirect_uri,
1269
- 'scope': self.scope,
1270
- })
1271
- headers = {
1272
- 'content-type': 'application/x-www-form-urlencoded',
1273
- }
1274
-
1275
- if self.user_agent is not None:
1276
- headers['user-agent'] = self.user_agent
1277
-
1278
- if http is None:
1279
- http = httplib2.Http()
1280
-
1281
- resp, content = http.request(self.token_uri, method='POST', body=body,
1282
- headers=headers)
1283
- d = _parse_exchange_token_response(content)
1284
- if resp.status == 200 and 'access_token' in d:
1285
- access_token = d['access_token']
1286
- refresh_token = d.get('refresh_token', None)
1287
- token_expiry = None
1288
- if 'expires_in' in d:
1289
- token_expiry = datetime.datetime.utcnow() + datetime.timedelta(
1290
- seconds=int(d['expires_in']))
1291
-
1292
- if 'id_token' in d:
1293
- d['id_token'] = _extract_id_token(d['id_token'])
1294
-
1295
- logger.info('Successfully retrieved access token')
1296
- return OAuth2Credentials(access_token, self.client_id,
1297
- self.client_secret, refresh_token, token_expiry,
1298
- self.token_uri, self.user_agent,
1299
- revoke_uri=self.revoke_uri,
1300
- id_token=d.get('id_token', None),
1301
- token_response=d)
1302
- else:
1303
- logger.info('Failed to retrieve access token: %s' % content)
1304
- if 'error' in d:
1305
- # you never know what those providers got to say
1306
- error_msg = unicode(d['error'])
1307
- else:
1308
- error_msg = 'Invalid response: %s.' % str(resp.status)
1309
- raise FlowExchangeError(error_msg)
1310
-
1311
-
1312
- @util.positional(2)
1313
- def flow_from_clientsecrets(filename, scope, redirect_uri=None,
1314
- message=None, cache=None):
1315
- """Create a Flow from a clientsecrets file.
1316
-
1317
- Will create the right kind of Flow based on the contents of the clientsecrets
1318
- file or will raise InvalidClientSecretsError for unknown types of Flows.
1319
-
1320
- Args:
1321
- filename: string, File name of client secrets.
1322
- scope: string or iterable of strings, scope(s) to request.
1323
- redirect_uri: string, Either the string 'urn:ietf:wg:oauth:2.0:oob' for
1324
- a non-web-based application, or a URI that handles the callback from
1325
- the authorization server.
1326
- message: string, A friendly string to display to the user if the
1327
- clientsecrets file is missing or invalid. If message is provided then
1328
- sys.exit will be called in the case of an error. If message in not
1329
- provided then clientsecrets.InvalidClientSecretsError will be raised.
1330
- cache: An optional cache service client that implements get() and set()
1331
- methods. See clientsecrets.loadfile() for details.
1332
-
1333
- Returns:
1334
- A Flow object.
1335
-
1336
- Raises:
1337
- UnknownClientSecretsFlowError if the file describes an unknown kind of Flow.
1338
- clientsecrets.InvalidClientSecretsError if the clientsecrets file is
1339
- invalid.
1340
- """
1341
- try:
1342
- client_type, client_info = clientsecrets.loadfile(filename, cache=cache)
1343
- if client_type in (clientsecrets.TYPE_WEB, clientsecrets.TYPE_INSTALLED):
1344
- constructor_kwargs = {
1345
- 'redirect_uri': redirect_uri,
1346
- 'auth_uri': client_info['auth_uri'],
1347
- 'token_uri': client_info['token_uri'],
1348
- }
1349
- revoke_uri = client_info.get('revoke_uri')
1350
- if revoke_uri is not None:
1351
- constructor_kwargs['revoke_uri'] = revoke_uri
1352
- return OAuth2WebServerFlow(
1353
- client_info['client_id'], client_info['client_secret'],
1354
- scope, **constructor_kwargs)
1355
-
1356
- except clientsecrets.InvalidClientSecretsError:
1357
- if message:
1358
- sys.exit(message)
1359
- else:
1360
- raise
1361
- else:
1362
- raise UnknownClientSecretsFlowError(
1363
- 'This OAuth 2.0 flow is unsupported: %r' % client_type)