puppet 6.21.1-x64-mingw32 → 7.4.1-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (402) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -4
  3. data/Gemfile.lock +5 -5
  4. data/README.md +1 -1
  5. data/conf/fileserver.conf +5 -10
  6. data/ext/build_defaults.yaml +1 -2
  7. data/ext/osx/file_mapping.yaml +0 -5
  8. data/ext/project_data.yaml +2 -14
  9. data/ext/redhat/puppet.spec.erb +0 -1
  10. data/ext/windows/service/daemon.rb +6 -5
  11. data/install.rb +21 -17
  12. data/lib/puppet.rb +11 -20
  13. data/lib/puppet/application.rb +172 -98
  14. data/lib/puppet/application/device.rb +100 -104
  15. data/lib/puppet/application/filebucket.rb +13 -9
  16. data/lib/puppet/application/ssl.rb +1 -1
  17. data/lib/puppet/configurer.rb +27 -29
  18. data/lib/puppet/configurer/plugin_handler.rb +21 -19
  19. data/lib/puppet/defaults.rb +57 -162
  20. data/lib/puppet/environments.rb +8 -23
  21. data/lib/puppet/face/facts.rb +73 -49
  22. data/lib/puppet/face/help.rb +1 -1
  23. data/lib/puppet/face/node/clean.rb +8 -0
  24. data/lib/puppet/face/plugin.rb +5 -8
  25. data/lib/puppet/ffi/windows.rb +12 -0
  26. data/lib/puppet/ffi/windows/api_types.rb +311 -0
  27. data/lib/puppet/ffi/windows/constants.rb +404 -0
  28. data/lib/puppet/ffi/windows/functions.rb +628 -0
  29. data/lib/puppet/ffi/windows/structs.rb +338 -0
  30. data/lib/puppet/file_serving/configuration.rb +0 -5
  31. data/lib/puppet/file_serving/configuration/parser.rb +6 -32
  32. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  33. data/lib/puppet/file_serving/mount.rb +1 -2
  34. data/lib/puppet/forge/repository.rb +0 -1
  35. data/lib/puppet/generate/models/type/type.rb +4 -1
  36. data/lib/puppet/http.rb +22 -13
  37. data/lib/puppet/http/client.rb +164 -114
  38. data/lib/puppet/{network/resolver.rb → http/dns.rb} +2 -2
  39. data/lib/puppet/http/errors.rb +16 -0
  40. data/lib/puppet/http/external_client.rb +5 -7
  41. data/lib/puppet/{network/http → http}/factory.rb +8 -11
  42. data/lib/puppet/{network/http → http}/pool.rb +61 -26
  43. data/lib/puppet/{network/http/session.rb → http/pool_entry.rb} +2 -3
  44. data/lib/puppet/http/proxy.rb +137 -0
  45. data/lib/puppet/http/redirector.rb +4 -12
  46. data/lib/puppet/http/resolver.rb +5 -15
  47. data/lib/puppet/http/resolver/server_list.rb +6 -10
  48. data/lib/puppet/http/resolver/settings.rb +4 -7
  49. data/lib/puppet/http/resolver/srv.rb +7 -11
  50. data/lib/puppet/http/response.rb +36 -54
  51. data/lib/puppet/http/response_converter.rb +24 -0
  52. data/lib/puppet/http/response_net_http.rb +42 -0
  53. data/lib/puppet/http/retry_after_handler.rb +4 -13
  54. data/lib/puppet/http/service.rb +12 -26
  55. data/lib/puppet/http/service/ca.rb +11 -22
  56. data/lib/puppet/http/service/compiler.rb +22 -69
  57. data/lib/puppet/http/service/file_server.rb +18 -27
  58. data/lib/puppet/http/service/puppetserver.rb +26 -12
  59. data/lib/puppet/http/service/report.rb +8 -10
  60. data/lib/puppet/http/session.rb +11 -20
  61. data/lib/puppet/{network/http → http}/site.rb +1 -2
  62. data/lib/puppet/indirector/catalog/rest.rb +2 -4
  63. data/lib/puppet/indirector/facts/facter.rb +25 -3
  64. data/lib/puppet/indirector/facts/rest.rb +3 -22
  65. data/lib/puppet/indirector/file_bucket_file/rest.rb +3 -9
  66. data/lib/puppet/indirector/file_content/rest.rb +2 -6
  67. data/lib/puppet/indirector/file_metadata/rest.rb +3 -9
  68. data/lib/puppet/indirector/file_server.rb +1 -8
  69. data/lib/puppet/indirector/generic_http.rb +0 -11
  70. data/lib/puppet/indirector/node/rest.rb +2 -4
  71. data/lib/puppet/indirector/report/rest.rb +3 -8
  72. data/lib/puppet/indirector/request.rb +0 -101
  73. data/lib/puppet/indirector/rest.rb +12 -263
  74. data/lib/puppet/module_tool/applications.rb +0 -1
  75. data/lib/puppet/network/authconfig.rb +2 -96
  76. data/lib/puppet/network/authorization.rb +13 -35
  77. data/lib/puppet/network/formats.rb +67 -0
  78. data/lib/puppet/network/http.rb +3 -3
  79. data/lib/puppet/network/http/api/indirected_routes.rb +2 -20
  80. data/lib/puppet/network/http/api/master/v3.rb +11 -13
  81. data/lib/puppet/network/http/connection.rb +247 -316
  82. data/lib/puppet/network/http/handler.rb +0 -1
  83. data/lib/puppet/network/http_pool.rb +16 -34
  84. data/lib/puppet/node.rb +1 -30
  85. data/lib/puppet/pal/json_catalog_encoder.rb +4 -0
  86. data/lib/puppet/pal/pal_impl.rb +3 -1
  87. data/lib/puppet/parser/ast/pops_bridge.rb +0 -38
  88. data/lib/puppet/parser/compiler.rb +0 -198
  89. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +14 -39
  90. data/lib/puppet/parser/resource.rb +0 -69
  91. data/lib/puppet/pops/evaluator/evaluator_impl.rb +0 -5
  92. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +3 -3
  93. data/lib/puppet/pops/evaluator/runtime3_support.rb +1 -1
  94. data/lib/puppet/pops/issues.rb +0 -5
  95. data/lib/puppet/pops/loader/ruby_legacy_function_instantiator.rb +6 -8
  96. data/lib/puppet/pops/model/ast.pp +0 -42
  97. data/lib/puppet/pops/model/ast.rb +0 -290
  98. data/lib/puppet/pops/model/factory.rb +0 -45
  99. data/lib/puppet/pops/model/model_label_provider.rb +0 -5
  100. data/lib/puppet/pops/model/model_tree_dumper.rb +0 -22
  101. data/lib/puppet/pops/model/pn_transformer.rb +0 -16
  102. data/lib/puppet/pops/parser/egrammar.ra +0 -56
  103. data/lib/puppet/pops/parser/eparser.rb +1520 -1712
  104. data/lib/puppet/pops/parser/lexer2.rb +4 -4
  105. data/lib/puppet/pops/parser/parser_support.rb +0 -5
  106. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -24
  107. data/lib/puppet/pops/types/type_calculator.rb +0 -7
  108. data/lib/puppet/pops/types/type_parser.rb +0 -4
  109. data/lib/puppet/pops/types/types.rb +0 -1
  110. data/lib/puppet/pops/validation/checker4_0.rb +9 -37
  111. data/lib/puppet/pops/validation/tasks_checker.rb +0 -12
  112. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -2
  113. data/lib/puppet/provider.rb +0 -13
  114. data/lib/puppet/provider/nameservice.rb +0 -18
  115. data/lib/puppet/provider/package/dpkg.rb +0 -10
  116. data/lib/puppet/provider/package/gem.rb +23 -3
  117. data/lib/puppet/provider/package/pip.rb +0 -1
  118. data/lib/puppet/provider/package/pkg.rb +0 -4
  119. data/lib/puppet/provider/package/portage.rb +1 -1
  120. data/lib/puppet/provider/package/puppet_gem.rb +1 -4
  121. data/lib/puppet/provider/service/smf.rb +191 -73
  122. data/lib/puppet/provider/user/directoryservice.rb +0 -10
  123. data/lib/puppet/reference/configuration.rb +7 -5
  124. data/lib/puppet/reference/indirection.rb +1 -1
  125. data/lib/puppet/resource.rb +1 -89
  126. data/lib/puppet/resource/catalog.rb +1 -14
  127. data/lib/puppet/resource/type.rb +3 -119
  128. data/lib/puppet/resource/type_collection.rb +3 -48
  129. data/lib/puppet/runtime.rb +1 -2
  130. data/lib/puppet/settings.rb +45 -33
  131. data/lib/puppet/settings/integer_setting.rb +17 -0
  132. data/lib/puppet/settings/port_setting.rb +15 -0
  133. data/lib/puppet/settings/priority_setting.rb +5 -4
  134. data/lib/puppet/ssl.rb +10 -6
  135. data/lib/puppet/ssl/base.rb +3 -5
  136. data/lib/puppet/ssl/certificate.rb +0 -6
  137. data/lib/puppet/ssl/certificate_request.rb +1 -12
  138. data/lib/puppet/ssl/certificate_signer.rb +6 -0
  139. data/lib/puppet/ssl/oids.rb +3 -1
  140. data/lib/puppet/ssl/ssl_provider.rb +17 -0
  141. data/lib/puppet/ssl/state_machine.rb +3 -1
  142. data/lib/puppet/ssl/verifier.rb +2 -0
  143. data/lib/puppet/test/test_helper.rb +1 -3
  144. data/lib/puppet/transaction.rb +1 -7
  145. data/lib/puppet/transaction/report.rb +2 -4
  146. data/lib/puppet/type.rb +0 -76
  147. data/lib/puppet/type/file.rb +5 -7
  148. data/lib/puppet/type/file/checksum.rb +1 -1
  149. data/lib/puppet/type/file/source.rb +1 -1
  150. data/lib/puppet/type/filebucket.rb +3 -3
  151. data/lib/puppet/type/package.rb +5 -13
  152. data/lib/puppet/type/user.rb +1 -1
  153. data/lib/puppet/util/execution.rb +0 -11
  154. data/lib/puppet/util/http_proxy.rb +2 -215
  155. data/lib/puppet/util/monkey_patches.rb +0 -46
  156. data/lib/puppet/util/rdoc.rb +0 -7
  157. data/lib/puppet/util/retry_action.rb +1 -1
  158. data/lib/puppet/util/run_mode.rb +9 -1
  159. data/lib/puppet/util/windows.rb +3 -8
  160. data/lib/puppet/util/windows/daemon.rb +360 -0
  161. data/lib/puppet/util/windows/error.rb +1 -0
  162. data/lib/puppet/util/windows/eventlog.rb +4 -9
  163. data/lib/puppet/util/windows/file.rb +8 -242
  164. data/lib/puppet/util/windows/monkey_patches/process.rb +414 -0
  165. data/lib/puppet/util/windows/process.rb +4 -226
  166. data/lib/puppet/util/windows/service.rb +9 -460
  167. data/lib/puppet/util/windows/string.rb +12 -13
  168. data/lib/puppet/util/yaml.rb +0 -22
  169. data/lib/puppet/vendor/require_vendored.rb +0 -1
  170. data/lib/puppet/version.rb +1 -1
  171. data/lib/puppet/x509.rb +5 -1
  172. data/lib/puppet/x509/cert_provider.rb +29 -1
  173. data/locales/puppet.pot +521 -1226
  174. data/man/man5/puppet.conf.5 +34 -94
  175. data/man/man8/puppet-facts.8 +56 -35
  176. data/man/man8/puppet-filebucket.8 +3 -3
  177. data/man/man8/puppet-module.8 +0 -57
  178. data/man/man8/puppet.8 +1 -1
  179. data/spec/fixtures/unit/provider/service/smf/{svcs.out → svcs_instances.out} +0 -0
  180. data/spec/integration/application/agent_spec.rb +24 -11
  181. data/spec/integration/application/apply_spec.rb +1 -1
  182. data/spec/integration/application/filebucket_spec.rb +16 -16
  183. data/spec/integration/application/help_spec.rb +2 -0
  184. data/spec/integration/application/plugin_spec.rb +23 -1
  185. data/spec/integration/defaults_spec.rb +7 -3
  186. data/spec/integration/indirector/file_content/file_server_spec.rb +0 -2
  187. data/spec/integration/indirector/file_metadata/file_server_spec.rb +0 -2
  188. data/spec/integration/network/http_pool_spec.rb +3 -21
  189. data/spec/integration/parser/catalog_spec.rb +0 -38
  190. data/spec/integration/parser/node_spec.rb +0 -9
  191. data/spec/integration/parser/pcore_resource_spec.rb +0 -37
  192. data/spec/integration/type/file_spec.rb +5 -4
  193. data/spec/integration/util/windows/monkey_patches/process_spec.rb +231 -0
  194. data/spec/integration/util/windows/security_spec.rb +1 -1
  195. data/spec/lib/puppet_spec/puppetserver.rb +1 -1
  196. data/spec/lib/puppet_spec/settings.rb +1 -0
  197. data/spec/spec_helper.rb +2 -0
  198. data/spec/unit/agent_spec.rb +0 -2
  199. data/spec/unit/application/facts_spec.rb +86 -0
  200. data/spec/unit/application/filebucket_spec.rb +41 -39
  201. data/spec/unit/application/ssl_spec.rb +2 -2
  202. data/spec/unit/certificate_factory_spec.rb +1 -1
  203. data/spec/unit/configurer/downloader_spec.rb +6 -2
  204. data/spec/unit/configurer/plugin_handler_spec.rb +56 -18
  205. data/spec/unit/configurer_spec.rb +12 -9
  206. data/spec/unit/context/trusted_information_spec.rb +2 -6
  207. data/spec/unit/defaults_spec.rb +22 -47
  208. data/spec/unit/environments_spec.rb +0 -3
  209. data/spec/unit/face/facts_spec.rb +4 -0
  210. data/spec/unit/face/node_spec.rb +14 -2
  211. data/spec/unit/face/plugin_spec.rb +73 -33
  212. data/spec/unit/file_bucket/file_spec.rb +1 -1
  213. data/spec/unit/file_serving/configuration/parser_spec.rb +22 -18
  214. data/spec/unit/file_serving/configuration_spec.rb +6 -12
  215. data/spec/unit/functions/camelcase_spec.rb +1 -1
  216. data/spec/unit/functions/capitalize_spec.rb +1 -1
  217. data/spec/unit/functions/downcase_spec.rb +1 -1
  218. data/spec/unit/functions/upcase_spec.rb +1 -1
  219. data/spec/unit/http/client_spec.rb +7 -8
  220. data/spec/unit/{network/resolver_spec.rb → http/dns_spec.rb} +3 -3
  221. data/spec/unit/http/external_client_spec.rb +4 -4
  222. data/spec/unit/{network/http → http}/factory_spec.rb +5 -11
  223. data/spec/unit/{network/http/session_spec.rb → http/pool_entry_spec.rb} +3 -3
  224. data/spec/unit/{network/http → http}/pool_spec.rb +12 -17
  225. data/spec/unit/{util/http_proxy_spec.rb → http/proxy_spec.rb} +2 -69
  226. data/spec/unit/http/resolver_spec.rb +13 -13
  227. data/spec/unit/http/service/compiler_spec.rb +0 -62
  228. data/spec/unit/http/service/file_server_spec.rb +3 -3
  229. data/spec/unit/http/service/puppetserver_spec.rb +34 -4
  230. data/spec/unit/http/service_spec.rb +0 -1
  231. data/spec/unit/http/session_spec.rb +16 -14
  232. data/spec/unit/{network/http → http}/site_spec.rb +3 -3
  233. data/spec/unit/indirector/facts/facter_spec.rb +113 -0
  234. data/spec/unit/indirector/file_bucket_file/file_spec.rb +5 -3
  235. data/spec/unit/indirector/file_content/rest_spec.rb +0 -4
  236. data/spec/unit/indirector/file_metadata/rest_spec.rb +0 -4
  237. data/spec/unit/indirector/file_server_spec.rb +1 -15
  238. data/spec/unit/indirector/report/rest_spec.rb +2 -17
  239. data/spec/unit/indirector/request_spec.rb +0 -264
  240. data/spec/unit/indirector/rest_spec.rb +98 -752
  241. data/spec/unit/network/authconfig_spec.rb +2 -129
  242. data/spec/unit/network/authorization_spec.rb +2 -55
  243. data/spec/unit/network/formats_spec.rb +45 -4
  244. data/spec/unit/network/http/api/indirected_routes_spec.rb +1 -92
  245. data/spec/unit/network/http/api/master/v3_spec.rb +28 -7
  246. data/spec/unit/network/http/api_spec.rb +10 -0
  247. data/spec/unit/network/http/connection_spec.rb +19 -41
  248. data/spec/unit/network/http/handler_spec.rb +0 -1
  249. data/spec/unit/network/http_pool_spec.rb +0 -4
  250. data/spec/unit/node/environment_spec.rb +33 -21
  251. data/spec/unit/node_spec.rb +2 -54
  252. data/spec/unit/parser/functions/create_resources_spec.rb +2 -20
  253. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +4 -7
  254. data/spec/unit/pops/loaders/loaders_spec.rb +6 -21
  255. data/spec/unit/pops/parser/parse_application_spec.rb +4 -22
  256. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +0 -1
  257. data/spec/unit/pops/parser/parse_capabilities_spec.rb +8 -21
  258. data/spec/unit/pops/parser/parse_site_spec.rb +20 -24
  259. data/spec/unit/pops/resource/resource_type_impl_spec.rb +0 -71
  260. data/spec/unit/pops/serialization/to_from_hr_spec.rb +1 -1
  261. data/spec/unit/pops/types/type_calculator_spec.rb +6 -6
  262. data/spec/unit/pops/types/type_factory_spec.rb +1 -1
  263. data/spec/unit/pops/validator/validator_spec.rb +61 -46
  264. data/spec/unit/pops/visitor_spec.rb +1 -1
  265. data/spec/unit/provider/nameservice_spec.rb +0 -57
  266. data/spec/unit/provider/package/dpkg_spec.rb +0 -48
  267. data/spec/unit/provider/package/gem_spec.rb +32 -0
  268. data/spec/unit/provider/package/puppet_gem_spec.rb +3 -2
  269. data/spec/unit/provider/service/smf_spec.rb +401 -165
  270. data/spec/unit/provider/service/windows_spec.rb +0 -1
  271. data/spec/unit/provider_spec.rb +0 -12
  272. data/spec/unit/resource/type_collection_spec.rb +2 -22
  273. data/spec/unit/resource_spec.rb +0 -56
  274. data/spec/unit/settings/http_extra_headers_spec.rb +2 -4
  275. data/spec/unit/settings/integer_setting_spec.rb +42 -0
  276. data/spec/unit/settings/port_setting_spec.rb +31 -0
  277. data/spec/unit/settings/priority_setting_spec.rb +4 -4
  278. data/spec/unit/settings_spec.rb +17 -0
  279. data/spec/unit/ssl/base_spec.rb +36 -3
  280. data/spec/unit/ssl/certificate_request_spec.rb +19 -55
  281. data/spec/unit/ssl/certificate_spec.rb +2 -11
  282. data/spec/unit/ssl/state_machine_spec.rb +0 -1
  283. data/spec/unit/ssl/verifier_spec.rb +0 -21
  284. data/spec/unit/transaction/report_spec.rb +0 -2
  285. data/spec/unit/transaction/resource_harness_spec.rb +2 -2
  286. data/spec/unit/transaction_spec.rb +45 -79
  287. data/spec/unit/type/file/checksum_spec.rb +6 -6
  288. data/spec/unit/type/file/content_spec.rb +1 -1
  289. data/spec/unit/type/file/ensure_spec.rb +1 -1
  290. data/spec/unit/type/file/mode_spec.rb +1 -1
  291. data/spec/unit/type/file/source_spec.rb +0 -1
  292. data/spec/unit/type/file_spec.rb +12 -6
  293. data/spec/unit/type/package_spec.rb +1 -1
  294. data/spec/unit/type_spec.rb +20 -0
  295. data/spec/unit/util/backups_spec.rb +0 -2
  296. data/spec/unit/util/execution_spec.rb +0 -29
  297. data/spec/unit/util/monkey_patches_spec.rb +0 -6
  298. data/spec/unit/util/run_mode_spec.rb +21 -121
  299. data/spec/unit/util/windows/string_spec.rb +1 -3
  300. data/spec/unit/util/yaml_spec.rb +0 -54
  301. data/spec/unit/util_spec.rb +0 -18
  302. metadata +47 -218
  303. data/conf/auth.conf +0 -150
  304. data/lib/puppet/application/cert.rb +0 -76
  305. data/lib/puppet/application/key.rb +0 -4
  306. data/lib/puppet/application/man.rb +0 -4
  307. data/lib/puppet/application/status.rb +0 -4
  308. data/lib/puppet/face/key.rb +0 -16
  309. data/lib/puppet/face/man.rb +0 -145
  310. data/lib/puppet/face/module/build.rb +0 -14
  311. data/lib/puppet/face/module/generate.rb +0 -14
  312. data/lib/puppet/face/module/search.rb +0 -103
  313. data/lib/puppet/face/status.rb +0 -51
  314. data/lib/puppet/indirector/certificate/file.rb +0 -9
  315. data/lib/puppet/indirector/certificate/rest.rb +0 -18
  316. data/lib/puppet/indirector/certificate_request/file.rb +0 -9
  317. data/lib/puppet/indirector/certificate_request/memory.rb +0 -7
  318. data/lib/puppet/indirector/certificate_request/rest.rb +0 -11
  319. data/lib/puppet/indirector/file_content/http.rb +0 -22
  320. data/lib/puppet/indirector/key/file.rb +0 -46
  321. data/lib/puppet/indirector/key/memory.rb +0 -7
  322. data/lib/puppet/indirector/ssl_file.rb +0 -162
  323. data/lib/puppet/indirector/status.rb +0 -3
  324. data/lib/puppet/indirector/status/local.rb +0 -12
  325. data/lib/puppet/indirector/status/rest.rb +0 -27
  326. data/lib/puppet/module_tool/applications/searcher.rb +0 -29
  327. data/lib/puppet/network/auth_config_parser.rb +0 -90
  328. data/lib/puppet/network/authstore.rb +0 -283
  329. data/lib/puppet/network/http/api/master/v3/authorization.rb +0 -18
  330. data/lib/puppet/network/http/api/master/v3/environment.rb +0 -88
  331. data/lib/puppet/network/http/base_pool.rb +0 -36
  332. data/lib/puppet/network/http/compression.rb +0 -127
  333. data/lib/puppet/network/http/connection_adapter.rb +0 -184
  334. data/lib/puppet/network/http/nocache_pool.rb +0 -28
  335. data/lib/puppet/network/rest_controller.rb +0 -2
  336. data/lib/puppet/network/rights.rb +0 -210
  337. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +0 -66
  338. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +0 -22
  339. data/lib/puppet/parser/environment_compiler.rb +0 -202
  340. data/lib/puppet/pops/types/enumeration.rb +0 -16
  341. data/lib/puppet/resource/capability_finder.rb +0 -154
  342. data/lib/puppet/rest/errors.rb +0 -15
  343. data/lib/puppet/rest/response.rb +0 -35
  344. data/lib/puppet/rest/route.rb +0 -85
  345. data/lib/puppet/rest/routes.rb +0 -135
  346. data/lib/puppet/ssl/host.rb +0 -505
  347. data/lib/puppet/ssl/key.rb +0 -61
  348. data/lib/puppet/ssl/validator.rb +0 -61
  349. data/lib/puppet/ssl/validator/default_validator.rb +0 -209
  350. data/lib/puppet/ssl/validator/no_validator.rb +0 -22
  351. data/lib/puppet/ssl/verifier_adapter.rb +0 -58
  352. data/lib/puppet/status.rb +0 -40
  353. data/lib/puppet/util/connection.rb +0 -88
  354. data/lib/puppet/util/fact_dif.rb +0 -62
  355. data/lib/puppet/util/ssl.rb +0 -83
  356. data/lib/puppet/util/windows/api_types.rb +0 -309
  357. data/lib/puppet/util/windows/monkey_patches/dir.rb +0 -40
  358. data/lib/puppet/vendor/load_pathspec.rb +0 -1
  359. data/lib/puppet/vendor/pathspec/CHANGELOG.md +0 -2
  360. data/lib/puppet/vendor/pathspec/LICENSE +0 -201
  361. data/lib/puppet/vendor/pathspec/PUPPET_README.md +0 -6
  362. data/lib/puppet/vendor/pathspec/README.md +0 -53
  363. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +0 -122
  364. data/lib/puppet/vendor/pathspec/lib/pathspec/gitignorespec.rb +0 -275
  365. data/lib/puppet/vendor/pathspec/lib/pathspec/regexspec.rb +0 -17
  366. data/lib/puppet/vendor/pathspec/lib/pathspec/spec.rb +0 -14
  367. data/man/man8/puppet-key.8 +0 -126
  368. data/man/man8/puppet-man.8 +0 -76
  369. data/man/man8/puppet-status.8 +0 -108
  370. data/spec/integration/network/authconfig_spec.rb +0 -256
  371. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +0 -11
  372. data/spec/unit/application/man_spec.rb +0 -52
  373. data/spec/unit/capability_spec.rb +0 -414
  374. data/spec/unit/face/key_spec.rb +0 -9
  375. data/spec/unit/face/module/search_spec.rb +0 -231
  376. data/spec/unit/face/status_spec.rb +0 -9
  377. data/spec/unit/indirector/certificate/file_spec.rb +0 -14
  378. data/spec/unit/indirector/certificate/rest_spec.rb +0 -61
  379. data/spec/unit/indirector/certificate_request/file_spec.rb +0 -14
  380. data/spec/unit/indirector/certificate_request/rest_spec.rb +0 -25
  381. data/spec/unit/indirector/key/file_spec.rb +0 -78
  382. data/spec/unit/indirector/ssl_file_spec.rb +0 -305
  383. data/spec/unit/indirector/status/local_spec.rb +0 -10
  384. data/spec/unit/indirector/status/rest_spec.rb +0 -50
  385. data/spec/unit/module_tool/applications/searcher_spec.rb +0 -38
  386. data/spec/unit/network/auth_config_parser_spec.rb +0 -115
  387. data/spec/unit/network/authstore_spec.rb +0 -422
  388. data/spec/unit/network/http/api/master/v3/authorization_spec.rb +0 -57
  389. data/spec/unit/network/http/api/master/v3/environment_spec.rb +0 -185
  390. data/spec/unit/network/http/compression_spec.rb +0 -240
  391. data/spec/unit/network/http/nocache_pool_spec.rb +0 -64
  392. data/spec/unit/network/http_spec.rb +0 -9
  393. data/spec/unit/network/rights_spec.rb +0 -439
  394. data/spec/unit/parser/environment_compiler_spec.rb +0 -730
  395. data/spec/unit/pops/types/enumeration_spec.rb +0 -51
  396. data/spec/unit/resource/capability_finder_spec.rb +0 -148
  397. data/spec/unit/rest/route_spec.rb +0 -132
  398. data/spec/unit/ssl/host_spec.rb +0 -645
  399. data/spec/unit/ssl/key_spec.rb +0 -173
  400. data/spec/unit/ssl/validator_spec.rb +0 -278
  401. data/spec/unit/status_spec.rb +0 -45
  402. data/spec/unit/util/ssl_spec.rb +0 -91
@@ -5,7 +5,6 @@ module Puppet::ModuleTool
5
5
  require 'puppet/module_tool/applications/application'
6
6
  require 'puppet/module_tool/applications/checksummer'
7
7
  require 'puppet/module_tool/applications/installer'
8
- require 'puppet/module_tool/applications/searcher'
9
8
  require 'puppet/module_tool/applications/unpacker'
10
9
  require 'puppet/module_tool/applications/uninstaller'
11
10
  require 'puppet/module_tool/applications/upgrader'
@@ -1,101 +1,7 @@
1
- require 'puppet/network/rights'
2
- require 'puppet/network/http'
3
-
4
1
  module Puppet
5
- class ConfigurationError < Puppet::Error; end
6
- class Network::DefaultAuthProvider
7
- attr_accessor :rights
8
-
9
- def self.master_url_prefix
10
- Puppet::Network::HTTP::MASTER_URL_PREFIX
11
- end
12
-
13
- def self.default_acl
14
- [
15
- # Master API V3
16
- { :acl => "#{master_url_prefix}/v3/environments", :method => :find, :allow => '*', :authenticated => true },
17
-
18
- { :acl => "~ ^#{master_url_prefix}\/v3\/catalog\/([^\/]+)$", :method => :find, :allow => '$1', :authenticated => true },
19
- { :acl => "~ ^#{master_url_prefix}\/v3\/node\/([^\/]+)$", :method => :find, :allow => '$1', :authenticated => true },
20
- { :acl => "~ ^#{master_url_prefix}\/v3\/report\/([^\/]+)$", :method => :save, :allow => '$1', :authenticated => true },
21
-
22
- # this one will allow all file access, and thus delegate
23
- # to fileserver.conf
24
- { :acl => "#{master_url_prefix}/v3/file" },
25
-
26
- { :acl => "#{master_url_prefix}/v3/status", :method => [:find], :authenticated => true },
27
- ]
28
- end
29
-
30
- # Just proxy the setting methods to our rights stuff
31
- [:allow, :deny].each do |method|
32
- define_method(method) do |*args|
33
- @rights.send(method, *args)
34
- end
35
- end
36
-
37
- # force regular ACLs to be present
38
- def insert_default_acl
39
- self.class.default_acl.each do |acl|
40
- unless rights[acl[:acl]]
41
- Puppet.info _("Inserting default '%{acl}' (auth %{auth}) ACL") % { acl: acl[:acl], auth: acl[:authenticated] }
42
- mk_acl(acl)
43
- end
44
- end
45
- # queue an empty (ie deny all) right for every other path
46
- # actually this is not strictly necessary as the rights system
47
- # denies not explicitly allowed paths
48
- unless rights["/"]
49
- rights.newright("/").restrict_authenticated(:any)
50
- end
51
- end
52
-
53
- def mk_acl(acl)
54
- right = @rights.newright(acl[:acl])
55
- right.allow(acl[:allow] || "*")
56
-
57
- method = acl[:method]
58
- if method
59
- method = [method] unless method.is_a?(Array)
60
- method.each { |m| right.restrict_method(m) }
61
- end
62
- right.restrict_authenticated(acl[:authenticated]) unless acl[:authenticated].nil?
63
- end
64
-
65
- # check whether this request is allowed in our ACL
66
- # raise an Puppet::Network::AuthorizedError if the request
67
- # is denied.
68
- def check_authorization(method, path, params)
69
- authorization_failure_exception = @rights.is_request_forbidden_and_why?(method, path, params)
70
- if authorization_failure_exception
71
- Puppet.warning(_("Denying access: %{authorization_failure_exception}") % { authorization_failure_exception: authorization_failure_exception })
72
- raise authorization_failure_exception
73
- end
74
- end
75
-
76
- def initialize(rights=nil)
77
- @rights = rights || Puppet::Network::Rights.new
78
- insert_default_acl
79
- end
80
- end
81
-
82
2
  class Network::AuthConfig
83
- @@authprovider_class = nil
84
-
85
- def self.authprovider_class=(klass)
86
- @@authprovider_class = klass
87
- end
88
-
89
- def self.authprovider_class
90
- @@authprovider_class || Puppet::Network::DefaultAuthProvider
91
- end
92
-
93
- def initialize(rights=nil)
94
- @authprovider = self.class.authprovider_class.new(rights)
95
- end
96
-
97
- def check_authorization(method, path, params)
98
- @authprovider.check_authorization(method, path, params)
3
+ def self.authprovider_class=(_)
4
+ # legacy auth is not supported, ignore
99
5
  end
100
6
  end
101
7
  end
@@ -1,41 +1,19 @@
1
- require 'puppet/network/client_request'
2
- require 'puppet/network/authconfig'
3
- require 'puppet/network/auth_config_parser'
4
-
5
1
  module Puppet::Network
6
- class AuthConfigLoader
7
- # Create our config object if necessary. If there's no configuration file
8
- # we install our defaults
9
- def self.authconfig
10
- @auth_config_file ||= Puppet::Util::WatchedFile.new(Puppet[:rest_authconfig])
11
- if (not @auth_config) or @auth_config_file.changed?
12
- begin
13
- @auth_config = Puppet::Network::AuthConfigParser.new_from_file(Puppet[:rest_authconfig]).parse
14
- rescue Errno::ENOENT, Errno::ENOTDIR
15
- @auth_config = Puppet::Network::AuthConfig.new
16
- end
17
- end
18
-
19
- @auth_config
20
- end
21
- end
22
-
23
2
  module Authorization
24
- @@authconfigloader_class = nil
25
-
26
- def self.authconfigloader_class=(klass)
27
- @@authconfigloader_class = klass
28
- end
29
-
30
- def authconfig
31
- authconfigloader = @@authconfigloader_class || AuthConfigLoader
32
- authconfigloader.authconfig
33
- end
3
+ class << self
4
+ # This method is deprecated and will be removed in a future release.
5
+ def authconfigloader_class=(klass)
6
+ @authconfigloader_class = klass
7
+ end
34
8
 
35
- # Verify that our client has access.
36
- def check_authorization(method, path, params)
37
- authconfig.check_authorization(method, path, params)
9
+ # Verify something external to puppet is authorizing REST requests, so
10
+ # we don't fail insecurely due to misconfiguration.
11
+ def check_external_authorization(method, path)
12
+ if @authconfigloader_class.nil?
13
+ message = "Forbidden request: #{path} (method #{method})"
14
+ raise Puppet::Network::HTTP::Error::HTTPNotAuthorizedError.new(message, Puppet::Network::HTTP::Issues::FAILED_AUTHORIZATION)
15
+ end
16
+ end
38
17
  end
39
18
  end
40
19
  end
41
-
@@ -183,6 +183,73 @@ Puppet::Network::FormatHandler.create(:console,
183
183
  end
184
184
  end
185
185
 
186
+ Puppet::Network::FormatHandler.create(:flat,
187
+ :mime => 'text/x-flat-text',
188
+ :weight => 0) do
189
+
190
+ def flatten_hash(hash)
191
+ hash.each_with_object({}) do |(k, v), h|
192
+ if v.is_a? Hash
193
+ flatten_hash(v).map do |h_k, h_v|
194
+ h["#{k}.#{h_k}"] = h_v
195
+ end
196
+ elsif v.is_a? Array
197
+ v.each_with_index do |el, i|
198
+ if el.is_a? Hash
199
+ flatten_hash(el).map do |el_k, el_v|
200
+ h["#{k}.#{i}.#{el_k}"] = el_v
201
+ end
202
+ else
203
+ h["#{k}.#{i}"] = el
204
+ end
205
+ end
206
+ else
207
+ h[k] = v
208
+ end
209
+ end
210
+ end
211
+
212
+ def flatten_array(array)
213
+ a={}
214
+ array.each_with_index do |el, i|
215
+ if el.is_a? Hash
216
+ flatten_hash(el).map do |el_k, el_v|
217
+ a["#{i}.#{el_k}"] = el_v
218
+ end
219
+ else
220
+ a["#{i}"] = el
221
+ end
222
+ end
223
+ a
224
+ end
225
+
226
+ def construct_output(data)
227
+ output = ''
228
+ data.each do |key, value|
229
+ output << "#{key}=#{value}"
230
+ output << "\n"
231
+ end
232
+ output
233
+ end
234
+
235
+ def render(datum)
236
+ return datum if datum.is_a?(String) || datum.is_a?(Numeric)
237
+ # Simple hash
238
+ if datum.is_a?(Hash)
239
+ data = flatten_hash(datum)
240
+ return construct_output(data)
241
+ elsif datum.is_a?(Array)
242
+ data = flatten_array(datum)
243
+ return construct_output(data)
244
+ end
245
+ Puppet::Util::Json.dump(datum, :pretty => true, :quirks_mode => true)
246
+ end
247
+ def render_multiple(data)
248
+ data.collect(&:render).join("\n")
249
+ end
250
+ end
251
+
252
+
186
253
  Puppet::Network::FormatHandler.create(:rich_data_json, mime: 'application/vnd.puppet.rich+json', charset: Encoding::UTF_8, weight: 30) do
187
254
  def intern(klass, text)
188
255
  Puppet.override({:rich_data => true}) do
@@ -1,3 +1,4 @@
1
+ # This module is used to handle puppet REST requests in puppetserver.
1
2
  module Puppet::Network::HTTP
2
3
  HEADER_ENABLE_PROFILING = "X-Puppet-Profiling"
3
4
  HEADER_PUPPET_VERSION = "X-Puppet-Version"
@@ -8,7 +9,9 @@ module Puppet::Network::HTTP
8
9
  CA_URL_PREFIX = "/puppet-ca"
9
10
  CA_URL_VERSIONS = "v1"
10
11
 
12
+ require 'puppet/network/authconfig'
11
13
  require 'puppet/network/authorization'
14
+
12
15
  require 'puppet/network/http/issues'
13
16
  require 'puppet/network/http/error'
14
17
  require 'puppet/network/http/route'
@@ -19,7 +22,4 @@ module Puppet::Network::HTTP
19
22
  require 'puppet/network/http/response'
20
23
  require 'puppet/network/http/request'
21
24
  require 'puppet/network/http/memory_response'
22
- require 'puppet/network/http/compression'
23
-
24
- require 'puppet/http'
25
25
  end
@@ -1,8 +1,6 @@
1
- require 'puppet/network/authorization'
2
1
  require 'puppet/network/http/api/indirection_type'
3
2
 
4
3
  class Puppet::Network::HTTP::API::IndirectedRoutes
5
- include Puppet::Network::Authorization
6
4
 
7
5
  # How we map http methods and the indirection name in the URI
8
6
  # to an indirection method.
@@ -31,7 +29,8 @@ class Puppet::Network::HTTP::API::IndirectedRoutes
31
29
  Puppet::Network::HTTP::Route.path(/.*/).any(new)
32
30
  end
33
31
 
34
- # handle an HTTP request
32
+ # Handle an HTTP request. The request has already been authenticated prior
33
+ # to calling this method.
35
34
  def call(request, response)
36
35
  indirection, method, key, params = uri2indirection(request.method, request.path, request.params)
37
36
  certificate = request.client_cert
@@ -99,12 +98,6 @@ class Puppet::Network::HTTP::API::IndirectedRoutes
99
98
  params[:environment] = configured_environment
100
99
  end
101
100
 
102
- begin
103
- check_authorization(method, "#{url_prefix}/#{indirection_name}/#{key}", params)
104
- rescue Puppet::Network::AuthorizationError => e
105
- raise Puppet::Network::HTTP::Error::HTTPNotAuthorizedError.new(e.message)
106
- end
107
-
108
101
  if configured_environment.nil?
109
102
  raise Puppet::Network::HTTP::Error::HTTPNotFoundError.new(
110
103
  _("Could not find environment '%{environment}'") % { environment: environment })
@@ -120,17 +113,6 @@ class Puppet::Network::HTTP::API::IndirectedRoutes
120
113
  [indirection, method, key, params]
121
114
  end
122
115
 
123
- def self.request_to_uri(request)
124
- uri, body = request_to_uri_and_body(request)
125
- "#{uri}?#{body}"
126
- end
127
-
128
- def self.request_to_uri_and_body(request)
129
- url_prefix = IndirectionType.url_prefix_for(request.indirection_name.to_s)
130
- indirection = request.method == :search ? pluralize(request.indirection_name.to_s) : request.indirection_name.to_s
131
- ["#{url_prefix}/#{indirection}/#{Puppet::Util.uri_encode(request.key)}", "environment=#{request.environment.name}&#{request.query_string}"]
132
- end
133
-
134
116
  private
135
117
 
136
118
  # Execute our find.
@@ -1,28 +1,26 @@
1
1
  class Puppet::Network::HTTP::API::Master::V3
2
- require 'puppet/network/http/api/master/v3/authorization'
3
2
  require 'puppet/network/http/api/master/v3/environments'
4
- require 'puppet/network/http/api/master/v3/environment'
5
3
  require 'puppet/network/http/api/indirected_routes'
6
4
 
7
- AUTHZ = Authorization.new
5
+ def self.wrap(&block)
6
+ lambda do |request, response|
7
+ Puppet::Network::Authorization.check_external_authorization(request.method, request.path)
8
+
9
+ block.call.call(request, response)
10
+ end
11
+ end
8
12
 
9
13
  INDIRECTED = Puppet::Network::HTTP::Route.
10
14
  path(/.*/).
11
- any(Puppet::Network::HTTP::API::IndirectedRoutes.new)
15
+ any(wrap { Puppet::Network::HTTP::API::IndirectedRoutes.new } )
12
16
 
13
17
  ENVIRONMENTS = Puppet::Network::HTTP::Route.
14
- path(%r{^/environments$}).get(AUTHZ.wrap do
15
- Environments.new(Puppet.lookup(:environments))
16
- end)
17
-
18
- ENVIRONMENT = Puppet::Network::HTTP::Route.
19
- path(%r{^/environment/[^/]+$}).get(AUTHZ.wrap do
20
- Environment.new
21
- end)
18
+ path(%r{^/environments$}).
19
+ get(wrap { Environments.new(Puppet.lookup(:environments)) } )
22
20
 
23
21
  def self.routes
24
22
  Puppet::Network::HTTP::Route.path(%r{v3}).
25
23
  any.
26
- chain(ENVIRONMENTS, ENVIRONMENT, INDIRECTED)
24
+ chain(ENVIRONMENTS, INDIRECTED)
27
25
  end
28
26
  end
@@ -1,355 +1,286 @@
1
- require 'puppet/ssl/openssl_loader'
2
- require 'puppet/ssl/host'
3
- require 'puppet/ssl/validator'
4
- require 'puppet/network/http'
5
- require 'uri'
6
- require 'date'
7
- require 'time'
8
-
9
- module Puppet::Network::HTTP
10
-
11
- # This will be raised if too many redirects happen for a given HTTP request
12
- class RedirectionLimitExceededException < Puppet::Error ; end
13
-
14
- # This class provides simple methods for issuing various types of HTTP
15
- # requests. It's interface is intended to mirror Ruby's Net::HTTP
16
- # object, but it provides a few important bits of additional
17
- # functionality. Notably:
1
+ require 'puppet/http'
2
+
3
+ # This will be raised if too many redirects happen for a given HTTP request
4
+ class Puppet::Network::HTTP::RedirectionLimitExceededException < Puppet::Error ; end
5
+
6
+ # This class provides simple methods for issuing various types of HTTP
7
+ # requests. It's interface is intended to mirror Ruby's Net::HTTP
8
+ # object, but it provides a few important bits of additional
9
+ # functionality. Notably:
10
+ #
11
+ # * Any HTTPS requests made using this class will use Puppet's SSL
12
+ # certificate configuration for their authentication, and
13
+ # * Provides some useful error handling for any SSL errors that occur
14
+ # during a request.
15
+ #
16
+ # @deprecated Use {Puppet.runtime[:http]}
17
+ # @api public
18
+ class Puppet::Network::HTTP::Connection
19
+ include Puppet::HTTP::ResponseConverter
20
+
21
+ OPTION_DEFAULTS = {
22
+ :use_ssl => true,
23
+ :verifier => nil,
24
+ :redirect_limit => 10,
25
+ }
26
+
27
+ # Creates a new HTTP client connection to `host`:`port`.
28
+ # @param host [String] the host to which this client will connect to
29
+ # @param port [Integer] the port to which this client will connect to
30
+ # @param options [Hash] options influencing the properties of the created
31
+ # connection,
32
+ # @option options [Boolean] :use_ssl true to connect with SSL, false
33
+ # otherwise, defaults to true
34
+ # @option options [Puppet::SSL::Verifier] :verifier An object that will configure
35
+ # any verification to do on the connection
36
+ # @option options [Integer] :redirect_limit the number of allowed
37
+ # redirections, defaults to 10 passing any other option in the options
38
+ # hash results in a Puppet::Error exception
18
39
  #
19
- # * Any HTTPS requests made using this class will use Puppet's SSL
20
- # certificate configuration for their authentication, and
21
- # * Provides some useful error handling for any SSL errors that occur
22
- # during a request.
23
- # @api public
24
- class Connection
25
-
26
- OPTION_DEFAULTS = {
27
- :use_ssl => true,
28
- :verify => nil, # Puppet::SSL::Validator is deprecated
29
- :verifier => nil,
30
- :redirect_limit => 10,
31
- }
32
-
33
- # Creates a new HTTP client connection to `host`:`port`.
34
- # @param host [String] the host to which this client will connect to
35
- # @param port [Integer] the port to which this client will connect to
36
- # @param options [Hash] options influencing the properties of the created
37
- # connection,
38
- # @option options [Boolean] :use_ssl true to connect with SSL, false
39
- # otherwise, defaults to true
40
- # @option options [#setup_connection] :verify An object that will configure
41
- # any verification to do on the connection
42
- # @option options [Integer] :redirect_limit the number of allowed
43
- # redirections, defaults to 10 passing any other option in the options
44
- # hash results in a Puppet::Error exception
45
- #
46
- # @note the HTTP connection itself happens lazily only when {#request}, or
47
- # one of the {#get}, {#post}, {#delete}, {#head} or {#put} is called
48
- # @note The correct way to obtain a connection is to use one of the factory
49
- # methods on {Puppet::Network::HttpPool}
50
- # @api private
51
- def initialize(host, port, options = {})
52
- @host = host
53
- @port = port
54
-
55
- unknown_options = options.keys - OPTION_DEFAULTS.keys
56
- raise Puppet::Error, _("Unrecognized option(s): %{opts}") % { opts: unknown_options.map(&:inspect).sort.join(', ') } unless unknown_options.empty?
57
-
58
- options = OPTION_DEFAULTS.merge(options)
59
- @use_ssl = options[:use_ssl]
60
- if @use_ssl
61
- if options[:verifier]
62
- unless options[:verifier].is_a?(Puppet::SSL::Verifier)
63
- raise ArgumentError, _("Expected an instance of Puppet::SSL::Verifier but was passed a %{klass}") % { klass: options[:verifier].class }
64
- end
65
-
66
- @verifier = options[:verifier]
67
- else
68
- @verifier = Puppet::SSL::VerifierAdapter.new(options[:verify])
69
- end
40
+ # @note the HTTP connection itself happens lazily only when {#request}, or
41
+ # one of the {#get}, {#post}, {#delete}, {#head} or {#put} is called
42
+ # @note The correct way to obtain a connection is to use one of the factory
43
+ # methods on {Puppet::Network::HttpPool}
44
+ # @api private
45
+ def initialize(host, port, options = {})
46
+ unknown_options = options.keys - OPTION_DEFAULTS.keys
47
+ raise Puppet::Error, _("Unrecognized option(s): %{opts}") % { opts: unknown_options.map(&:inspect).sort.join(', ') } unless unknown_options.empty?
48
+
49
+ options = OPTION_DEFAULTS.merge(options)
50
+ @use_ssl = options[:use_ssl]
51
+ if @use_ssl
52
+ unless options[:verifier].is_a?(Puppet::SSL::Verifier)
53
+ raise ArgumentError, _("Expected an instance of Puppet::SSL::Verifier but was passed a %{klass}") % { klass: options[:verifier].class }
70
54
  end
71
- @redirect_limit = options[:redirect_limit]
72
- @site = Puppet::Network::HTTP::Site.new(@use_ssl ? 'https' : 'http', host, port)
73
- @pool = Puppet.lookup(:http_pool)
74
- end
75
55
 
76
- # @!macro [new] common_options
77
- # @param options [Hash] options influencing the request made. Any
78
- # options not recognized by this class will be ignored - no error will
79
- # be thrown.
80
- # @option options [Hash{Symbol => String}] :basic_auth The basic auth
81
- # :username and :password to use for the request, :metric_id Ignored
82
- # by this class - used by Puppet Server only. The metric id by which
83
- # to track metrics on requests.
84
-
85
- # @param path [String]
86
- # @param headers [Hash{String => String}]
87
- # @!macro common_options
88
- # @api public
89
- def get(path, headers = {}, options = {})
90
- do_request(Net::HTTP::Get.new(path, headers), options)
56
+ @verifier = options[:verifier]
91
57
  end
58
+ @redirect_limit = options[:redirect_limit]
59
+ @site = Puppet::HTTP::Site.new(@use_ssl ? 'https' : 'http', host, port)
60
+ @client = Puppet.runtime[:http]
61
+ end
92
62
 
93
- # @param path [String]
94
- # @param data [String]
95
- # @param headers [Hash{String => String}]
96
- # @!macro common_options
97
- # @api public
98
- def post(path, data, headers = nil, options = {})
99
- request = Net::HTTP::Post.new(path, headers)
100
- request.body = data
101
- do_request(request, options)
102
- end
63
+ # The address to connect to.
64
+ def address
65
+ @site.host
66
+ end
103
67
 
104
- # @param path [String]
105
- # @param headers [Hash{String => String}]
106
- # @!macro common_options
107
- # @api public
108
- def head(path, headers = {}, options = {})
109
- do_request(Net::HTTP::Head.new(path, headers), options)
110
- end
68
+ # The port to connect to.
69
+ def port
70
+ @site.port
71
+ end
111
72
 
112
- # @param path [String]
113
- # @param headers [Hash{String => String}]
114
- # @!macro common_options
115
- # @api public
116
- def delete(path, headers = {'Depth' => 'Infinity'}, options = {})
117
- do_request(Net::HTTP::Delete.new(path, headers), options)
118
- end
73
+ # Whether to use ssl
74
+ def use_ssl?
75
+ @site.use_ssl?
76
+ end
119
77
 
120
- # @param path [String]
121
- # @param data [String]
122
- # @param headers [Hash{String => String}]
123
- # @!macro common_options
124
- # @api public
125
- def put(path, data, headers = nil, options = {})
126
- request = Net::HTTP::Put.new(path, headers)
127
- request.body = data
128
- do_request(request, options)
129
- end
78
+ # @api private
79
+ def verifier
80
+ @verifier
81
+ end
130
82
 
131
- def request(method, *args)
132
- self.send(method, *args)
133
- end
83
+ # @!macro [new] common_options
84
+ # @param options [Hash] options influencing the request made. Any
85
+ # options not recognized by this class will be ignored - no error will
86
+ # be thrown.
87
+ # @option options [Hash{Symbol => String}] :basic_auth The basic auth
88
+ # :username and :password to use for the request, :metric_id Ignored
89
+ # by this class - used by Puppet Server only. The metric id by which
90
+ # to track metrics on requests.
91
+
92
+ # @param path [String]
93
+ # @param headers [Hash{String => String}]
94
+ # @!macro common_options
95
+ # @api public
96
+ def get(path, headers = {}, options = {})
97
+ headers ||= {}
98
+ options[:ssl_context] ||= resolve_ssl_context
99
+ options[:redirect_limit] ||= @redirect_limit
134
100
 
135
- # TODO: These are proxies for the Net::HTTP#request_* methods, which are
136
- # almost the same as the "get", "post", etc. methods that we've ported above,
137
- # but they are able to accept a code block and will yield to it, which is
138
- # necessary to stream responses, e.g. file content. For now
139
- # we're not funneling these proxy implementations through our #request
140
- # method above, so they will not inherit the same error handling. In the
141
- # future we may want to refactor these so that they are funneled through
142
- # that method and do inherit the error handling.
143
- def request_get(*args, &block)
144
- with_connection(@site) do |http|
145
- resp = http.request_get(*args, &block)
146
- Puppet.debug("HTTP GET #{@site}#{args.first.split('?').first} returned #{resp.code} #{resp.message}")
147
- resp
148
- end
101
+ with_error_handling do
102
+ to_ruby_response(@client.get(to_url(path), headers: headers, options: options))
149
103
  end
104
+ end
150
105
 
151
- def request_head(*args, &block)
152
- with_connection(@site) do |http|
153
- resp = http.request_head(*args, &block)
154
- Puppet.debug("HTTP HEAD #{@site}#{args.first.split('?').first} returned #{resp.code} #{resp.message}")
155
- resp
156
- end
106
+ # @param path [String]
107
+ # @param data [String]
108
+ # @param headers [Hash{String => String}]
109
+ # @!macro common_options
110
+ # @api public
111
+ def post(path, data, headers = nil, options = {})
112
+ headers ||= {}
113
+ headers['Content-Type'] ||= "application/x-www-form-urlencoded"
114
+ data ||= ''
115
+ options[:ssl_context] ||= resolve_ssl_context
116
+ options[:redirect_limit] ||= @redirect_limit
117
+
118
+ with_error_handling do
119
+ to_ruby_response(@client.post(to_url(path), data, headers: headers, options: options))
157
120
  end
121
+ end
158
122
 
159
- def request_post(*args, &block)
160
- with_connection(@site) do |http|
161
- resp = http.request_post(*args, &block)
162
- Puppet.debug("HTTP POST #{@site}#{args.first.split('?').first} returned #{resp.code} #{resp.message}")
163
- resp
164
- end
165
- end
166
- # end of Net::HTTP#request_* proxies
123
+ # @param path [String]
124
+ # @param headers [Hash{String => String}]
125
+ # @!macro common_options
126
+ # @api public
127
+ def head(path, headers = {}, options = {})
128
+ headers ||= {}
129
+ options[:ssl_context] ||= resolve_ssl_context
130
+ options[:redirect_limit] ||= @redirect_limit
167
131
 
168
- # The address to connect to.
169
- def address
170
- @site.host
132
+ with_error_handling do
133
+ to_ruby_response(@client.head(to_url(path), headers: headers, options: options))
171
134
  end
135
+ end
172
136
 
173
- # The port to connect to.
174
- def port
175
- @site.port
176
- end
137
+ # @param path [String]
138
+ # @param headers [Hash{String => String}]
139
+ # @!macro common_options
140
+ # @api public
141
+ def delete(path, headers = {'Depth' => 'Infinity'}, options = {})
142
+ headers ||= {}
143
+ options[:ssl_context] ||= resolve_ssl_context
144
+ options[:redirect_limit] ||= @redirect_limit
177
145
 
178
- # Whether to use ssl
179
- def use_ssl?
180
- @site.use_ssl?
146
+ with_error_handling do
147
+ to_ruby_response(@client.delete(to_url(path), headers: headers, options: options))
181
148
  end
149
+ end
182
150
 
183
- # @api private
184
- def verifier
185
- @verifier
151
+ # @param path [String]
152
+ # @param data [String]
153
+ # @param headers [Hash{String => String}]
154
+ # @!macro common_options
155
+ # @api public
156
+ def put(path, data, headers = nil, options = {})
157
+ headers ||= {}
158
+ headers['Content-Type'] ||= "application/x-www-form-urlencoded"
159
+ data ||= ''
160
+ options[:ssl_context] ||= resolve_ssl_context
161
+ options[:redirect_limit] ||= @redirect_limit
162
+
163
+ with_error_handling do
164
+ to_ruby_response(@client.put(to_url(path), data, headers: headers, options: options))
186
165
  end
166
+ end
187
167
 
188
- private
189
-
190
- def do_request(request, options)
191
- current_request = request
192
- current_site = @site
193
- response = nil
194
-
195
- 0.upto(@redirect_limit) do |redirection|
196
- return response if response
197
-
198
- with_connection(current_site) do |connection|
199
- apply_options_to(current_request, options)
200
-
201
- current_response = execute_request(connection, current_request)
202
-
203
- case current_response.code.to_i
204
- when 301, 302, 307
205
- # handle redirection
206
- location = URI.parse(current_response['location'])
207
- current_site = current_site.move_to(location)
208
-
209
- # update to the current request path
210
- current_request = current_request.class.new(location.path)
211
- current_request.body = request.body
212
- request.each do |header, value|
213
- current_request[header] = value
214
- end
215
- when 429, 503
216
- if connection.started?
217
- Puppet.debug("Closing connection for #{current_site}")
218
- connection.finish
219
- end
220
- response = handle_retry_after(current_response)
221
- else
222
- response = current_response
223
- end
224
- end
225
-
226
- # and try again...
227
- end
168
+ def request_get(*args, &block)
169
+ path, headers = *args
170
+ headers ||= {}
171
+ options = {
172
+ ssl_context: resolve_ssl_context,
173
+ redirect_limit: @redirect_limit
174
+ }
228
175
 
229
- raise RedirectionLimitExceededException, _("Too many HTTP redirections for %{host}:%{port}") % { host: @host, port: @port }
176
+ ruby_response = nil
177
+ @client.get(to_url(path), headers: headers, options: options) do |response|
178
+ ruby_response = to_ruby_response(response)
179
+ yield ruby_response if block_given?
230
180
  end
181
+ ruby_response
182
+ end
231
183
 
232
- # Handles the Retry-After header of a HTTPResponse
233
- #
234
- # This method checks the response for a Retry-After header and handles
235
- # it by sleeping for the indicated number of seconds. The response is
236
- # returned unmodified if no Retry-After header is present.
237
- #
238
- # @param response [Net::HTTPResponse] A response received from the
239
- # HTTP client.
240
- #
241
- # @return [nil] Sleeps and returns nil if the response contained a
242
- # Retry-After header that indicated the request should be retried.
243
- # @return [Net::HTTPResponse] Returns the `response` unmodified if
244
- # no Retry-After header was present or the Retry-After header could
245
- # not be parsed as an integer or RFC 2822 date.
246
- def handle_retry_after(response)
247
- retry_after = response['Retry-After']
248
- return response if retry_after.nil?
249
-
250
- retry_sleep = parse_retry_after_header(retry_after)
251
- # Recover remote hostname if Net::HTTPResponse was generated by a
252
- # method that fills in the uri attribute.
253
- #
254
- server_hostname = if response.uri.is_a?(URI)
255
- response.uri.host
256
- else
257
- # TRANSLATORS: Used in the phrase:
258
- # "Received a response from the remote server."
259
- _('the remote server')
260
- end
261
-
262
- if retry_sleep.nil?
263
- Puppet.err(_('Received a %{status_code} response from %{server_hostname}, but the Retry-After header value of "%{retry_after}" could not be converted to an integer or RFC 2822 date.') %
264
- {status_code: response.code,
265
- server_hostname: server_hostname,
266
- retry_after: retry_after.inspect})
267
-
268
- return response
269
- end
270
-
271
- # Cap maximum sleep at the run interval of the Puppet agent.
272
- retry_sleep = [retry_sleep, Puppet[:runinterval]].min
184
+ def request_head(*args, &block)
185
+ path, headers = *args
186
+ headers ||= {}
187
+ options = {
188
+ ssl_context: resolve_ssl_context,
189
+ redirect_limit: @redirect_limit
190
+ }
273
191
 
274
- Puppet.warning(_('Received a %{status_code} response from %{server_hostname}. Sleeping for %{retry_sleep} seconds before retrying the request.') %
275
- {status_code: response.code,
276
- server_hostname: server_hostname,
277
- retry_sleep: retry_sleep})
192
+ response = @client.head(to_url(path), headers: headers, options: options)
193
+ ruby_response = to_ruby_response(response)
194
+ yield ruby_response if block_given?
195
+ ruby_response
196
+ end
278
197
 
279
- ::Kernel.sleep(retry_sleep)
198
+ def request_post(*args, &block)
199
+ path, data, headers = *args
200
+ headers ||= {}
201
+ headers['Content-Type'] ||= "application/x-www-form-urlencoded"
202
+ options = {
203
+ ssl_context: resolve_ssl_context,
204
+ redirect_limit: @redirect_limit
205
+ }
280
206
 
281
- return nil
207
+ ruby_response = nil
208
+ @client.post(to_url(path), data, headers: headers, options: options) do |response|
209
+ ruby_response = to_ruby_response(response)
210
+ yield ruby_response if block_given?
282
211
  end
212
+ ruby_response
213
+ end
283
214
 
284
- # Parse the value of a Retry-After header
285
- #
286
- # Parses a string containing an Integer or RFC 2822 datestamp and returns
287
- # an integer number of seconds before a request can be retried.
288
- #
289
- # @param header_value [String] The value of the Retry-After header.
290
- #
291
- # @return [Integer] Number of seconds to wait before retrying the
292
- # request. Will be equal to 0 for the case of date that has already
293
- # passed.
294
- # @return [nil] Returns `nil` when the `header_value` can't be
295
- # parsed as an Integer or RFC 2822 date.
296
- def parse_retry_after_header(header_value)
297
- retry_after = begin
298
- Integer(header_value)
299
- rescue TypeError, ArgumentError
300
- begin
301
- DateTime.rfc2822(header_value)
302
- rescue ArgumentError
303
- return nil
304
- end
305
- end
306
-
307
- case retry_after
308
- when Integer
309
- retry_after
310
- when DateTime
311
- sleep = (retry_after.to_time - DateTime.now.to_time).to_i
312
- (sleep > 0) ? sleep : 0
313
- end
215
+ private
216
+
217
+ # Resolve the ssl_context based on the verifier associated with this
218
+ # connection or load the available set of certs and key on disk.
219
+ # Don't try to bootstrap the agent, as we only want that to be triggered
220
+ # when running `puppet ssl` or `puppet agent`.
221
+ def resolve_ssl_context
222
+ # don't need an ssl context for http connections
223
+ return nil unless @site.use_ssl?
224
+
225
+ # if our verifier has an ssl_context, use that
226
+ ctx = @verifier.ssl_context
227
+ return ctx if ctx
228
+
229
+ # load available certs
230
+ cert = Puppet::X509::CertProvider.new
231
+ ssl = Puppet::SSL::SSLProvider.new
232
+ begin
233
+ password = cert.load_private_key_password
234
+ ssl.load_context(certname: Puppet[:certname], password: password)
235
+ rescue Puppet::SSL::SSLError => e
236
+ Puppet.log_exception(e)
237
+
238
+ # if we don't have cacerts, then create a root context that doesn't
239
+ # trust anything. The old code used to fallback to VERIFY_NONE,
240
+ # which we don't want to emulate.
241
+ ssl.create_root_context(cacerts: [])
314
242
  end
243
+ end
315
244
 
316
- def apply_options_to(request, options)
317
- request["User-Agent"] = Puppet[:http_user_agent]
318
-
319
- if options[:basic_auth]
320
- request.basic_auth(options[:basic_auth][:user], options[:basic_auth][:password])
321
- end
245
+ def to_url(path)
246
+ if path =~ /^https?:\/\//
247
+ # The old Connection class accepts a URL as the request path, and sends
248
+ # it in "absolute-form" in the request line, e.g. GET https://puppet:8140/.
249
+ # See https://httpwg.org/specs/rfc7230.html#absolute-form. It just so happens
250
+ # to work because HTTP 1.1 servers are required to accept absolute-form even
251
+ # though clients are only supposed to send them to proxies, so the proxy knows
252
+ # what upstream server to CONNECT to. This method creates a URL using the
253
+ # scheme/host/port that the connection was created with, and appends the path
254
+ # and query portions of the absolute-form. The resulting request will use "origin-form"
255
+ # as it should have done all along.
256
+ abs_form = URI(path)
257
+ url = URI("#{@site.addr}/#{normalize_path(abs_form.path)}")
258
+ url.query = abs_form.query if abs_form.query
259
+ url
260
+ else
261
+ URI("#{@site.addr}/#{normalize_path(path)}")
322
262
  end
263
+ end
323
264
 
324
- def execute_request(connection, request)
325
- start = Time.now
326
- resp = connection.request(request)
327
- Puppet.debug("HTTP #{request.method.upcase} #{@site}#{request.path.split('?').first} returned #{resp.code} #{resp.message}")
328
- resp
329
- rescue => exception
330
- elapsed = (Time.now - start).to_f.round(3)
331
- uri = [@site.addr, request.path.split('?')[0]].join('/')
332
-
333
- case exception
334
- when EOFError
335
- Puppet.log_exception(exception, _('request %{uri} interrupted after %{elapsed} seconds') % {uri: uri, elapsed: elapsed})
336
- when Timeout::Error
337
- Puppet.log_exception(exception, _('request %{uri} timed out after %{elapsed} seconds') % {uri: uri, elapsed: elapsed})
338
- else
339
- Puppet.log_exception(exception, _('request %{uri} failed: %{msg}') % {uri: uri, msg: exception.message})
340
- end
341
-
342
- raise exception
265
+ def normalize_path(path)
266
+ if path[0] == '/'
267
+ path[1..-1]
268
+ else
269
+ path
343
270
  end
271
+ end
344
272
 
345
- def with_connection(site, &block)
346
- Puppet.deprecation_warning(_('Puppet::Network::HTTP::Connection is deprecated. Please use Puppet::Network::HTTP::ConnectionAdapter instead.'))
347
-
348
- response = nil
349
- @pool.with_connection(site, @verifier) do |conn|
350
- response = yield conn
351
- end
352
- response
273
+ def with_error_handling(&block)
274
+ yield
275
+ rescue Puppet::HTTP::TooManyRedirects => e
276
+ raise Puppet::Network::HTTP::RedirectionLimitExceededException.new(_("Too many HTTP redirections for %{host}:%{port}") % { host: @host, port: @port }, e)
277
+ rescue Puppet::HTTP::HTTPError => e
278
+ Puppet.log_exception(e, e.message)
279
+ case e.cause
280
+ when Net::OpenTimeout, Net::ReadTimeout, Net::HTTPError, EOFError
281
+ raise e.cause
282
+ else
283
+ raise e
353
284
  end
354
285
  end
355
286
  end