puppet 4.3.0 → 4.4.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 (560) hide show
  1. checksums.yaml +7 -0
  2. data/COMMITTERS.md +2 -2
  3. data/CONTRIBUTING.md +6 -6
  4. data/LICENSE +1 -1
  5. data/README.md +8 -9
  6. data/conf/auth.conf +2 -2
  7. data/ext/README.environment +1 -1
  8. data/ext/build_defaults.yaml +1 -1
  9. data/ext/debian/README.source +1 -1
  10. data/ext/debian/control +1 -1
  11. data/ext/debian/copyright +4 -4
  12. data/ext/debian/puppetmaster.README.debian +11 -9
  13. data/ext/emacs/puppet-mode.el +1 -1
  14. data/ext/envpuppet +2 -2
  15. data/ext/ips/puppetagent.xml +1 -1
  16. data/ext/ips/puppetmaster.xml +1 -1
  17. data/ext/project_data.yaml +8 -0
  18. data/ext/puppet-test +3 -3
  19. data/ext/rack/example-passenger-vhost.conf +1 -1
  20. data/ext/redhat/puppet.spec.erb +2 -2
  21. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  22. data/ext/solaris/pkginfo +1 -1
  23. data/ext/solaris/smf/puppet.xml +1 -1
  24. data/ext/suse/puppet.spec +2 -2
  25. data/ext/upload_facts.rb +1 -1
  26. data/ext/windows/puppet_interactive.bat +6 -0
  27. data/ext/windows/puppet_shell.bat +9 -0
  28. data/ext/windows/run_puppet_interactive.bat +9 -0
  29. data/ext/yaml_nodes.rb +1 -1
  30. data/install.rb +30 -20
  31. data/lib/hiera/scope.rb +1 -1
  32. data/lib/puppet/agent.rb +1 -1
  33. data/lib/puppet/application/agent.rb +4 -2
  34. data/lib/puppet/application/apply.rb +7 -4
  35. data/lib/puppet/application/cert.rb +1 -1
  36. data/lib/puppet/application/device.rb +1 -1
  37. data/lib/puppet/application/filebucket.rb +1 -1
  38. data/lib/puppet/application/inspect.rb +1 -1
  39. data/lib/puppet/application/lookup.rb +45 -47
  40. data/lib/puppet/application/master.rb +2 -2
  41. data/lib/puppet/application/resource.rb +1 -1
  42. data/lib/puppet/configurer.rb +100 -22
  43. data/lib/puppet/data_providers/hiera_config.rb +28 -3
  44. data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
  45. data/lib/puppet/data_providers/hiera_support.rb +1 -1
  46. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
  47. data/lib/puppet/data_providers/lookup_adapter.rb +73 -26
  48. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
  49. data/lib/puppet/defaults.rb +69 -22
  50. data/lib/puppet/environments.rb +3 -1
  51. data/lib/puppet/face/config.rb +1 -1
  52. data/lib/puppet/face/epp.rb +1 -1
  53. data/lib/puppet/face/help/man.erb +1 -1
  54. data/lib/puppet/face/module/install.rb +6 -6
  55. data/lib/puppet/face/parser.rb +12 -9
  56. data/lib/puppet/face/status.rb +2 -1
  57. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  58. data/lib/puppet/feature/telnet.rb +9 -0
  59. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  60. data/lib/puppet/file_serving/metadata.rb +18 -2
  61. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  62. data/lib/puppet/file_system/file_impl.rb +2 -2
  63. data/lib/puppet/file_system/memory_impl.rb +1 -1
  64. data/lib/puppet/file_system/uniquefile.rb +1 -1
  65. data/lib/puppet/file_system.rb +2 -2
  66. data/lib/puppet/forge/repository.rb +1 -31
  67. data/lib/puppet/forge.rb +1 -1
  68. data/lib/puppet/functions/assert_type.rb +9 -9
  69. data/lib/puppet/functions/each.rb +5 -13
  70. data/lib/puppet/functions/filter.rb +5 -14
  71. data/lib/puppet/functions/lookup.rb +126 -150
  72. data/lib/puppet/functions/map.rb +6 -14
  73. data/lib/puppet/functions/match.rb +1 -0
  74. data/lib/puppet/functions/reduce.rb +5 -13
  75. data/lib/puppet/functions/reverse_each.rb +82 -0
  76. data/lib/puppet/functions/scanf.rb +15 -18
  77. data/lib/puppet/functions/slice.rb +22 -36
  78. data/lib/puppet/functions/split.rb +2 -2
  79. data/lib/puppet/functions/step.rb +88 -0
  80. data/lib/puppet/functions/type.rb +70 -0
  81. data/lib/puppet/functions.rb +45 -6
  82. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  83. data/lib/puppet/indirector/catalog/compiler.rb +188 -5
  84. data/lib/puppet/indirector/facts/facter.rb +2 -13
  85. data/lib/puppet/indirector/file_content/http.rb +15 -0
  86. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  87. data/lib/puppet/indirector/generic_http.rb +16 -0
  88. data/lib/puppet/indirector/hiera.rb +3 -1
  89. data/lib/puppet/indirector/indirection.rb +6 -2
  90. data/lib/puppet/indirector/json.rb +2 -2
  91. data/lib/puppet/indirector/node/exec.rb +1 -1
  92. data/lib/puppet/indirector/node/ldap.rb +1 -1
  93. data/lib/puppet/indirector/rest.rb +2 -1
  94. data/lib/puppet/info_service/class_information_service.rb +13 -12
  95. data/lib/puppet/loaders.rb +1 -0
  96. data/lib/puppet/module.rb +6 -2
  97. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
  98. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
  99. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
  100. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  101. data/lib/puppet/network/http/pool.rb +9 -0
  102. data/lib/puppet/node/environment.rb +11 -2
  103. data/lib/puppet/node.rb +11 -2
  104. data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
  105. data/lib/puppet/parser/compiler.rb +4 -11
  106. data/lib/puppet/parser/environment_compiler.rb +0 -1
  107. data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
  108. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  109. data/lib/puppet/parser/functions/lookup.rb +128 -149
  110. data/lib/puppet/parser/functions/map.rb +1 -1
  111. data/lib/puppet/parser/functions/match.rb +1 -0
  112. data/lib/puppet/parser/functions/scanf.rb +15 -26
  113. data/lib/puppet/parser/functions/slice.rb +17 -24
  114. data/lib/puppet/parser/functions/split.rb +1 -1
  115. data/lib/puppet/parser/functions.rb +28 -16
  116. data/lib/puppet/parser/resource.rb +19 -17
  117. data/lib/puppet/parser/scope.rb +176 -5
  118. data/lib/puppet/plugins/data_providers/data_provider.rb +56 -14
  119. data/lib/puppet/pops/adaptable.rb +4 -1
  120. data/lib/puppet/pops/adapters.rb +80 -12
  121. data/lib/puppet/pops/binder/binder.rb +21 -17
  122. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  123. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  124. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  125. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  126. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  127. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  128. data/lib/puppet/pops/binder/injector.rb +53 -48
  129. data/lib/puppet/pops/binder/key_factory.rb +10 -6
  130. data/lib/puppet/pops/binder/producers.rb +67 -62
  131. data/lib/puppet/pops/evaluator/access_operator.rb +98 -96
  132. data/lib/puppet/pops/evaluator/closure.rb +122 -106
  133. data/lib/puppet/pops/evaluator/collector_transformer.rb +34 -14
  134. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
  135. data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
  136. data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
  137. data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
  138. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
  139. data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
  140. data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
  141. data/lib/puppet/pops/evaluator/runtime3_support.rb +47 -42
  142. data/lib/puppet/pops/functions/function.rb +6 -2
  143. data/lib/puppet/pops/issue_reporter.rb +6 -4
  144. data/lib/puppet/pops/issues.rb +50 -11
  145. data/lib/puppet/pops/loader/base_loader.rb +1 -1
  146. data/lib/puppet/pops/loader/loader.rb +1 -1
  147. data/lib/puppet/pops/loader/loader_paths.rb +15 -0
  148. data/lib/puppet/pops/loader/module_loaders.rb +17 -13
  149. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +18 -13
  150. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
  151. data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
  152. data/lib/puppet/pops/loaders.rb +51 -9
  153. data/lib/puppet/pops/lookup/explainer.rb +73 -3
  154. data/lib/puppet/pops/lookup/invocation.rb +21 -19
  155. data/lib/puppet/pops/lookup.rb +17 -12
  156. data/lib/puppet/pops/merge_strategy.rb +16 -19
  157. data/lib/puppet/pops/model/factory.rb +179 -157
  158. data/lib/puppet/pops/model/model.rb +17 -8
  159. data/lib/puppet/pops/model/model_label_provider.rb +14 -7
  160. data/lib/puppet/pops/model/model_meta.rb +17 -0
  161. data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
  162. data/lib/puppet/pops/parser/egrammar.ra +38 -14
  163. data/lib/puppet/pops/parser/eparser.rb +1353 -1276
  164. data/lib/puppet/pops/parser/epp_support.rb +11 -7
  165. data/lib/puppet/pops/parser/evaluating_parser.rb +17 -13
  166. data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
  167. data/lib/puppet/pops/parser/lexer2.rb +428 -403
  168. data/lib/puppet/pops/parser/lexer_support.rb +85 -7
  169. data/lib/puppet/pops/parser/locator.rb +21 -0
  170. data/lib/puppet/pops/parser/parser_support.rb +19 -16
  171. data/lib/puppet/pops/parser/slurp_support.rb +16 -8
  172. data/lib/puppet/pops/types/class_loader.rb +23 -19
  173. data/lib/puppet/pops/types/enumeration.rb +9 -26
  174. data/lib/puppet/pops/types/iterable.rb +308 -0
  175. data/lib/puppet/pops/types/recursion_guard.rb +82 -0
  176. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  177. data/lib/puppet/pops/types/type_asserter.rb +10 -9
  178. data/lib/puppet/pops/types/type_calculator.rb +140 -387
  179. data/lib/puppet/pops/types/type_factory.rb +91 -57
  180. data/lib/puppet/pops/types/type_formatter.rb +334 -0
  181. data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
  182. data/lib/puppet/pops/types/type_parser.rb +159 -112
  183. data/lib/puppet/pops/types/types.rb +2057 -1253
  184. data/lib/puppet/pops/utils.rb +11 -10
  185. data/lib/puppet/pops/validation/checker4_0.rb +115 -63
  186. data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
  187. data/lib/puppet/pops/validation.rb +11 -9
  188. data/lib/puppet/pops.rb +0 -8
  189. data/lib/puppet/provider/aixobject.rb +1 -1
  190. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  191. data/lib/puppet/provider/cron/crontab.rb +1 -1
  192. data/lib/puppet/provider/exec/windows.rb +1 -1
  193. data/lib/puppet/provider/group/windows_adsi.rb +2 -2
  194. data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
  195. data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
  196. data/lib/puppet/provider/package/appdmg.rb +3 -2
  197. data/lib/puppet/provider/package/dnf.rb +1 -1
  198. data/lib/puppet/provider/package/pip.rb +16 -9
  199. data/lib/puppet/provider/package/pip3.rb +1 -1
  200. data/lib/puppet/provider/package/pkg.rb +1 -1
  201. data/lib/puppet/provider/package/pkgdmg.rb +3 -2
  202. data/lib/puppet/provider/package/pkgng.rb +13 -4
  203. data/lib/puppet/provider/package/rpm.rb +0 -1
  204. data/lib/puppet/provider/package/windows.rb +1 -1
  205. data/lib/puppet/provider/package/yum.rb +2 -2
  206. data/lib/puppet/provider/package/zypper.rb +19 -0
  207. data/lib/puppet/provider/service/debian.rb +7 -20
  208. data/lib/puppet/provider/service/init.rb +7 -0
  209. data/lib/puppet/provider/service/launchd.rb +6 -12
  210. data/lib/puppet/provider/service/systemd.rb +9 -2
  211. data/lib/puppet/provider/sshkey/parsed.rb +1 -1
  212. data/lib/puppet/provider/user/aix.rb +1 -1
  213. data/lib/puppet/provider/user/directoryservice.rb +33 -58
  214. data/lib/puppet/provider/user/windows_adsi.rb +2 -2
  215. data/lib/puppet/provider/yumrepo/inifile.rb +6 -3
  216. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  217. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  218. data/lib/puppet/reference/configuration.rb +1 -1
  219. data/lib/puppet/reference/providers.rb +1 -1
  220. data/lib/puppet/resource/capability_finder.rb +20 -13
  221. data/lib/puppet/resource/catalog.rb +60 -3
  222. data/lib/puppet/resource/status.rb +11 -2
  223. data/lib/puppet/resource/type.rb +33 -42
  224. data/lib/puppet/resource.rb +15 -12
  225. data/lib/puppet/settings/config_file.rb +1 -1
  226. data/lib/puppet/settings/environment_conf.rb +13 -5
  227. data/lib/puppet/settings.rb +1 -1
  228. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  229. data/lib/puppet/ssl/certificate_request.rb +4 -4
  230. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  231. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  232. data/lib/puppet/test/test_helper.rb +16 -4
  233. data/lib/puppet/transaction/additional_resource_generator.rb +23 -5
  234. data/lib/puppet/transaction/report.rb +31 -1
  235. data/lib/puppet/transaction/resource_harness.rb +0 -25
  236. data/lib/puppet/transaction.rb +15 -2
  237. data/lib/puppet/type/augeas.rb +1 -1
  238. data/lib/puppet/type/cron.rb +12 -12
  239. data/lib/puppet/type/file/checksum_value.rb +53 -0
  240. data/lib/puppet/type/file/content.rb +26 -111
  241. data/lib/puppet/type/file/data_sync.rb +84 -0
  242. data/lib/puppet/type/file/ensure.rb +17 -14
  243. data/lib/puppet/type/file/selcontext.rb +1 -1
  244. data/lib/puppet/type/file/source.rb +103 -18
  245. data/lib/puppet/type/file.rb +91 -39
  246. data/lib/puppet/type/filebucket.rb +1 -1
  247. data/lib/puppet/type/group.rb +6 -2
  248. data/lib/puppet/type/interface.rb +8 -3
  249. data/lib/puppet/type/macauthorization.rb +1 -1
  250. data/lib/puppet/type/package.rb +6 -0
  251. data/lib/puppet/type/schedule.rb +1 -1
  252. data/lib/puppet/type/stage.rb +1 -1
  253. data/lib/puppet/type/user.rb +19 -17
  254. data/lib/puppet/type/yumrepo.rb +20 -0
  255. data/lib/puppet/type.rb +11 -11
  256. data/lib/puppet/util/autoload.rb +16 -11
  257. data/lib/puppet/util/checksums.rb +74 -31
  258. data/lib/puppet/util/execution.rb +1 -1
  259. data/lib/puppet/util/http_proxy.rb +72 -0
  260. data/lib/puppet/util/log.rb +2 -0
  261. data/lib/puppet/util/logging.rb +43 -1
  262. data/lib/puppet/util/monkey_patches.rb +2 -2
  263. data/lib/puppet/util/multi_match.rb +51 -0
  264. data/lib/puppet/util/network_device/cisco/device.rb +10 -2
  265. data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
  266. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  267. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  268. data/lib/puppet/util/plist.rb +130 -0
  269. data/lib/puppet/util/resource_template.rb +1 -1
  270. data/lib/puppet/util/run_mode.rb +2 -2
  271. data/lib/puppet/util/skip_tags.rb +9 -0
  272. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  273. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  274. data/lib/puppet/util/windows/adsi.rb +65 -28
  275. data/lib/puppet/util/windows/api_types.rb +24 -18
  276. data/lib/puppet/util/windows/com.rb +3 -3
  277. data/lib/puppet/util/windows/error.rb +1 -1
  278. data/lib/puppet/util/windows/file.rb +8 -8
  279. data/lib/puppet/util/windows/principal.rb +190 -0
  280. data/lib/puppet/util/windows/process.rb +78 -11
  281. data/lib/puppet/util/windows/registry.rb +22 -16
  282. data/lib/puppet/util/windows/root_certs.rb +5 -5
  283. data/lib/puppet/util/windows/security.rb +33 -35
  284. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  285. data/lib/puppet/util/windows/sid.rb +84 -15
  286. data/lib/puppet/util/windows/taskscheduler.rb +15 -15
  287. data/lib/puppet/util/windows/user.rb +10 -10
  288. data/lib/puppet/util/windows.rb +4 -0
  289. data/lib/puppet/util.rb +109 -22
  290. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  291. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  292. data/lib/puppet/vendor/pathspec/README.md +1 -1
  293. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  294. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
  295. data/lib/puppet/version.rb +1 -1
  296. data/lib/puppet.rb +17 -0
  297. data/lib/semver.rb +17 -1
  298. data/man/man5/puppet.conf.5 +12 -12
  299. data/man/man8/extlookup2hiera.8 +1 -1
  300. data/man/man8/puppet-agent.8 +2 -2
  301. data/man/man8/puppet-apply.8 +2 -2
  302. data/man/man8/puppet-ca.8 +2 -2
  303. data/man/man8/puppet-catalog.8 +2 -2
  304. data/man/man8/puppet-cert.8 +2 -2
  305. data/man/man8/puppet-certificate.8 +2 -2
  306. data/man/man8/puppet-certificate_request.8 +2 -2
  307. data/man/man8/puppet-certificate_revocation_list.8 +2 -2
  308. data/man/man8/puppet-config.8 +3 -3
  309. data/man/man8/puppet-describe.8 +1 -1
  310. data/man/man8/puppet-device.8 +1 -1
  311. data/man/man8/puppet-doc.8 +1 -1
  312. data/man/man8/puppet-epp.8 +2 -2
  313. data/man/man8/puppet-facts.8 +2 -2
  314. data/man/man8/puppet-file.8 +2 -2
  315. data/man/man8/puppet-filebucket.8 +2 -2
  316. data/man/man8/puppet-help.8 +2 -2
  317. data/man/man8/puppet-inspect.8 +2 -2
  318. data/man/man8/puppet-key.8 +2 -2
  319. data/man/man8/puppet-man.8 +2 -2
  320. data/man/man8/puppet-master.8 +2 -2
  321. data/man/man8/puppet-module.8 +9 -9
  322. data/man/man8/puppet-node.8 +2 -2
  323. data/man/man8/puppet-parser.8 +2 -2
  324. data/man/man8/puppet-plugin.8 +2 -2
  325. data/man/man8/puppet-report.8 +2 -2
  326. data/man/man8/puppet-resource.8 +2 -2
  327. data/man/man8/puppet-resource_type.8 +2 -2
  328. data/man/man8/puppet-status.8 +3 -3
  329. data/man/man8/puppet.8 +1 -1
  330. data/spec/fixtures/module.tar.gz +0 -0
  331. data/spec/fixtures/unit/application/environments/production/data/common.yaml +4 -0
  332. data/spec/fixtures/unit/application/environments/production/manifests/site.pp +1 -0
  333. data/spec/fixtures/unit/application/environments/puppet_func_provider/environment.conf +1 -0
  334. data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/data.pp +10 -0
  335. data/spec/fixtures/unit/application/environments/puppet_func_provider/manifests/site.pp +1 -0
  336. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/common.yaml +4 -0
  337. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/specific.yaml +4 -0
  338. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/hiera.yaml +7 -0
  339. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/common.yaml +4 -0
  340. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/specific.yaml +4 -0
  341. data/spec/fixtures/unit/data_providers/environments/hiera_modules/environment.conf +2 -0
  342. data/spec/fixtures/unit/data_providers/environments/hiera_modules/hiera.yaml +7 -0
  343. data/spec/fixtures/unit/data_providers/environments/hiera_modules/manifests/site.pp +1 -0
  344. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/data/common.yaml +6 -0
  345. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/hiera.yaml +5 -0
  346. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/manifests/init.pp +2 -0
  347. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/metadata.json +9 -0
  348. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +4 -0
  349. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/hiera.yaml +5 -0
  350. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/manifests/init.pp +3 -0
  351. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/metadata.json +9 -0
  352. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  353. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
  354. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
  355. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
  356. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
  357. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
  358. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  359. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  360. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  361. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
  362. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
  363. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  364. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/functions/usee_puppet.pp +3 -0
  365. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/functions/usee/usee_ruby.rb +6 -0
  366. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +8 -0
  367. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  368. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee2/lib/puppet/functions/usee2/callee.rb +5 -0
  369. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet.pp +5 -0
  370. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet_init.pp +5 -0
  371. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_ruby.pp +5 -0
  372. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/caller2.rb +5 -0
  373. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet.rb +5 -0
  374. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet_init.rb +5 -0
  375. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_ruby.rb +5 -0
  376. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +81 -0
  377. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/metadata.json +2 -1
  378. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  379. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  380. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  381. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  382. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +205 -0
  383. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +213 -0
  384. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  385. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +205 -0
  386. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  387. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +205 -0
  388. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +205 -0
  389. data/spec/integration/defaults_spec.rb +14 -2
  390. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  391. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  392. data/spec/integration/node/environment_spec.rb +13 -0
  393. data/spec/integration/parser/collection_spec.rb +8 -0
  394. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  395. data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
  396. data/spec/integration/parser/undef_param_spec.rb +8 -0
  397. data/spec/integration/provider/yumrepo_spec.rb +1 -1
  398. data/spec/integration/test/test_helper_spec.rb +28 -0
  399. data/spec/integration/transaction/report_spec.rb +16 -0
  400. data/spec/integration/transaction_spec.rb +11 -0
  401. data/spec/integration/type/file_spec.rb +194 -4
  402. data/spec/integration/type/package_spec.rb +5 -1
  403. data/spec/integration/type/tidy_spec.rb +21 -9
  404. data/spec/integration/util/execution_spec.rb +22 -0
  405. data/spec/integration/util/windows/principal_spec.rb +201 -0
  406. data/spec/integration/util/windows/process_spec.rb +31 -0
  407. data/spec/{unit → integration}/util/windows/registry_spec.rb +91 -1
  408. data/spec/integration/util/windows/security_spec.rb +8 -8
  409. data/spec/integration/util/windows/user_spec.rb +1 -1
  410. data/spec/integration/util_spec.rb +49 -27
  411. data/spec/lib/puppet_spec/compiler.rb +17 -0
  412. data/spec/lib/puppet_spec/files.rb +2 -2
  413. data/spec/lib/puppet_spec/pops.rb +13 -0
  414. data/spec/shared_behaviours/iterative_functions.rb +1 -1
  415. data/spec/shared_contexts/types_setup.rb +96 -0
  416. data/spec/unit/agent_spec.rb +1 -0
  417. data/spec/unit/application/agent_spec.rb +10 -0
  418. data/spec/unit/application/apply_spec.rb +9 -0
  419. data/spec/unit/application/lookup_spec.rb +138 -28
  420. data/spec/unit/configurer/downloader_spec.rb +5 -5
  421. data/spec/unit/configurer_spec.rb +271 -39
  422. data/spec/unit/data_providers/hiera_data_provider_spec.rb +182 -5
  423. data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
  424. data/spec/unit/defaults_spec.rb +15 -0
  425. data/spec/unit/environments_spec.rb +24 -4
  426. data/spec/unit/face/epp_face_spec.rb +2 -2
  427. data/spec/unit/face/parser_spec.rb +43 -2
  428. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  429. data/spec/unit/file_serving/metadata_spec.rb +50 -0
  430. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  431. data/spec/unit/file_system_spec.rb +26 -0
  432. data/spec/unit/functions/assert_type_spec.rb +36 -2
  433. data/spec/unit/functions/defined_spec.rb +2 -2
  434. data/spec/unit/functions/epp_spec.rb +17 -9
  435. data/spec/unit/functions/inline_epp_spec.rb +4 -4
  436. data/spec/unit/functions/lookup_spec.rb +88 -16
  437. data/spec/unit/functions/regsubst_spec.rb +1 -1
  438. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  439. data/spec/unit/functions/step_spec.rb +113 -0
  440. data/spec/unit/functions/type_spec.rb +35 -0
  441. data/spec/unit/functions4_spec.rb +62 -6
  442. data/spec/unit/hiera/scope_spec.rb +5 -2
  443. data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
  444. data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
  445. data/spec/unit/indirector/indirection_spec.rb +1 -1
  446. data/spec/unit/indirector/json_spec.rb +1 -1
  447. data/spec/unit/info_service_spec.rb +94 -32
  448. data/spec/unit/module_spec.rb +14 -0
  449. data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
  450. data/spec/unit/network/authstore_spec.rb +1 -1
  451. data/spec/unit/network/http/connection_spec.rb +1 -0
  452. data/spec/unit/network/http/pool_spec.rb +30 -0
  453. data/spec/unit/node_spec.rb +8 -0
  454. data/spec/unit/parser/compiler_spec.rb +16 -18
  455. data/spec/unit/parser/scope_spec.rb +28 -11
  456. data/spec/unit/pops/evaluator/access_ops_spec.rb +7 -7
  457. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  458. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -2
  459. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
  460. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  461. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
  462. data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
  463. data/spec/unit/pops/loaders/loaders_spec.rb +127 -2
  464. data/spec/unit/pops/parser/lexer2_spec.rb +118 -3
  465. data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
  466. data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
  467. data/spec/unit/pops/parser/parser_spec.rb +10 -0
  468. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  469. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  470. data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
  471. data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
  472. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  473. data/spec/unit/pops/types/type_calculator_spec.rb +275 -390
  474. data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
  475. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
  476. data/spec/unit/pops/types/type_parser_spec.rb +58 -13
  477. data/spec/unit/pops/types/types_spec.rb +241 -0
  478. data/spec/unit/pops/validator/validator_spec.rb +159 -15
  479. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  480. data/spec/unit/provider/group/windows_adsi_spec.rb +8 -8
  481. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  482. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  483. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  484. data/spec/unit/provider/package/dnf_spec.rb +16 -0
  485. data/spec/unit/provider/package/pip3_spec.rb +60 -42
  486. data/spec/unit/provider/package/pip_spec.rb +88 -47
  487. data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
  488. data/spec/unit/provider/package/pkgng_spec.rb +4 -2
  489. data/spec/unit/provider/package/rpm_spec.rb +2 -25
  490. data/spec/unit/provider/package/yum_spec.rb +12 -1
  491. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  492. data/spec/unit/provider/service/debian_spec.rb +6 -24
  493. data/spec/unit/provider/service/init_spec.rb +11 -1
  494. data/spec/unit/provider/service/launchd_spec.rb +18 -25
  495. data/spec/unit/provider/service/systemd_spec.rb +25 -12
  496. data/spec/unit/provider/service/upstart_spec.rb +57 -0
  497. data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
  498. data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
  499. data/spec/unit/provider/user/windows_adsi_spec.rb +5 -5
  500. data/spec/unit/provider/yumrepo/inifile_spec.rb +16 -0
  501. data/spec/unit/resource/capability_finder_spec.rb +28 -15
  502. data/spec/unit/resource/catalog_spec.rb +33 -1
  503. data/spec/unit/resource/type_spec.rb +149 -7
  504. data/spec/unit/resource_spec.rb +99 -50
  505. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  506. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  507. data/spec/unit/transaction/report_spec.rb +27 -0
  508. data/spec/unit/transaction/resource_harness_spec.rb +0 -47
  509. data/spec/unit/transaction_spec.rb +5 -0
  510. data/spec/unit/type/file/checksum_spec.rb +6 -0
  511. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  512. data/spec/unit/type/file/content_spec.rb +12 -193
  513. data/spec/unit/type/file/source_spec.rb +211 -119
  514. data/spec/unit/type/file_spec.rb +133 -34
  515. data/spec/unit/type/interface_spec.rb +32 -0
  516. data/spec/unit/type/macauthorization_spec.rb +4 -1
  517. data/spec/unit/type/yumrepo_spec.rb +2 -2
  518. data/spec/unit/util/filetype_spec.rb +1 -1
  519. data/spec/unit/util/http_proxy_spec.rb +2 -2
  520. data/spec/unit/util/log/destinations_spec.rb +0 -2
  521. data/spec/unit/util/logging_spec.rb +69 -0
  522. data/spec/unit/util/multi_match_spec.rb +39 -0
  523. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  524. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  525. data/spec/unit/util/plist_spec.rb +110 -0
  526. data/spec/unit/util/resource_template_spec.rb +2 -2
  527. data/spec/unit/util/run_mode_spec.rb +27 -3
  528. data/spec/unit/util/windows/adsi_spec.rb +46 -38
  529. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  530. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  531. data/spec/unit/util/windows/sid_spec.rb +48 -11
  532. data/spec/unit/util_spec.rb +123 -13
  533. data/tasks/cfpropertylist.rake +15 -0
  534. metadata +3342 -3195
  535. data/lib/puppet/vendor/load_plist.rb +0 -1
  536. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  537. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  538. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  539. data/lib/puppet/vendor/plist/README +0 -36
  540. data/lib/puppet/vendor/plist/Rakefile +0 -144
  541. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  542. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  543. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  544. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  545. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  546. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  547. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  548. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  549. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  550. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  551. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  552. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  553. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  554. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  555. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  556. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  557. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  558. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
  559. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{usee → modules/usee}/lib/puppet/functions/usee/callee.rb +0 -0
  560. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/lib/puppet/functions/user/caller.rb +0 -0
@@ -0,0 +1,190 @@
1
+ require 'puppet/util/windows'
2
+
3
+ module Puppet::Util::Windows::SID
4
+ class Principal
5
+ extend FFI::Library
6
+ attr_reader :account, :sid_bytes, :sid, :domain, :domain_account, :account_type
7
+
8
+ def initialize(account, sid_bytes, sid, domain, account_type)
9
+ # This is only ever called from lookup_account_sid which has already
10
+ # removed the potential for passing in an account like host\user
11
+ @account = account
12
+ @sid_bytes = sid_bytes
13
+ @sid = sid
14
+ @domain = domain
15
+ @account_type = account_type
16
+ # When domain is available and it is a Domain principal, use domain only
17
+ # otherwise if domain is available then combine it with parsed account
18
+ # otherwise when the domain is not available, use the account value directly
19
+ # WinNT naming standard https://msdn.microsoft.com/en-us/library/windows/desktop/aa746534(v=vs.85).aspx
20
+ if (domain && !domain.empty? && @account_type == :SidTypeDomain)
21
+ @domain_account = @domain
22
+ elsif (domain && !domain.empty?)
23
+ @domain_account = "#{domain}\\#{@account}"
24
+ else
25
+ @domain_account = account
26
+ end
27
+ end
28
+
29
+ # added for backward compatibility
30
+ def ==(compare)
31
+ compare.is_a?(Puppet::Util::Windows::SID::Principal) &&
32
+ @sid_bytes == compare.sid_bytes
33
+ end
34
+
35
+ # added for backward compatibility
36
+ def to_s
37
+ @sid
38
+ end
39
+
40
+ # = 8 + max sub identifiers (15) * 4
41
+ MAXIMUM_SID_BYTE_LENGTH = 68
42
+
43
+ ERROR_INSUFFICIENT_BUFFER = 122
44
+
45
+ def self.lookup_account_name(system_name = nil, account_name)
46
+ system_name_ptr = FFI::Pointer::NULL
47
+ begin
48
+ if system_name
49
+ system_name_wide = Puppet::Util::Windows::String.wide_string(system_name)
50
+ # uchar here is synonymous with byte
51
+ system_name_ptr = FFI::MemoryPointer.new(:byte, system_name_wide.bytesize)
52
+ system_name_ptr.put_array_of_uchar(0, system_name_wide.bytes.to_a)
53
+ end
54
+
55
+ FFI::MemoryPointer.from_string_to_wide_string(account_name) do |account_name_ptr|
56
+ FFI::MemoryPointer.new(:byte, MAXIMUM_SID_BYTE_LENGTH) do |sid_ptr|
57
+ FFI::MemoryPointer.new(:dword, 1) do |sid_length_ptr|
58
+ FFI::MemoryPointer.new(:dword, 1) do |domain_length_ptr|
59
+ FFI::MemoryPointer.new(:uint32, 1) do |name_use_enum_ptr|
60
+
61
+ sid_length_ptr.write_dword(MAXIMUM_SID_BYTE_LENGTH)
62
+ success = LookupAccountNameW(system_name_ptr, account_name_ptr, sid_ptr, sid_length_ptr,
63
+ FFI::Pointer::NULL, domain_length_ptr, name_use_enum_ptr)
64
+ last_error = FFI.errno
65
+
66
+ if (success == FFI::WIN32_FALSE && last_error != ERROR_INSUFFICIENT_BUFFER)
67
+ raise Puppet::Util::Windows::Error.new('Failed to call LookupAccountNameW', last_error)
68
+ end
69
+
70
+ FFI::MemoryPointer.new(:lpwstr, domain_length_ptr.read_dword) do |domain_ptr|
71
+ if LookupAccountNameW(system_name_ptr, account_name_ptr,
72
+ sid_ptr, sid_length_ptr,
73
+ domain_ptr, domain_length_ptr, name_use_enum_ptr) == FFI::WIN32_FALSE
74
+ raise Puppet::Util::Windows::Error.new('Failed to call LookupAccountNameW')
75
+ end
76
+
77
+ # with a SID returned, loop back through lookup_account_sid to retrieve official name
78
+ # necessary when accounts like . or '' are passed in
79
+ return lookup_account_sid(
80
+ system_name,
81
+ sid_ptr.read_bytes(sid_length_ptr.read_dword).unpack('C*'))
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ ensure
89
+ system_name_ptr.free if system_name_ptr != FFI::Pointer::NULL
90
+ end
91
+ end
92
+
93
+ def self.lookup_account_sid(system_name = nil, sid_bytes)
94
+ system_name_ptr = FFI::Pointer::NULL
95
+ if (sid_bytes.nil? || (!sid_bytes.is_a? Array) || (sid_bytes.length == 0))
96
+ raise Puppet::Util::Windows::Error.new('Byte array for lookup_account_sid must not be nil and must be at least 1 byte long')
97
+ end
98
+
99
+ begin
100
+ if system_name
101
+ system_name_wide = Puppet::Util::Windows::String.wide_string(system_name)
102
+ # uchar here is synonymous with byte
103
+ system_name_ptr = FFI::MemoryPointer.new(:byte, system_name_wide.bytesize)
104
+ system_name_ptr.put_array_of_uchar(0, system_name_wide.bytes.to_a)
105
+ end
106
+
107
+ FFI::MemoryPointer.new(:byte, sid_bytes.length) do |sid_ptr|
108
+ FFI::MemoryPointer.new(:dword, 1) do |name_length_ptr|
109
+ FFI::MemoryPointer.new(:dword, 1) do |domain_length_ptr|
110
+ FFI::MemoryPointer.new(:uint32, 1) do |name_use_enum_ptr|
111
+
112
+ sid_ptr.write_array_of_uchar(sid_bytes)
113
+ success = LookupAccountSidW(system_name_ptr, sid_ptr, FFI::Pointer::NULL, name_length_ptr,
114
+ FFI::Pointer::NULL, domain_length_ptr, name_use_enum_ptr)
115
+ last_error = FFI.errno
116
+
117
+ if (success == FFI::WIN32_FALSE && last_error != ERROR_INSUFFICIENT_BUFFER)
118
+ raise Puppet::Util::Windows::Error.new('Failed to call LookupAccountSidW', last_error)
119
+ end
120
+
121
+ FFI::MemoryPointer.new(:lpwstr, name_length_ptr.read_dword) do |name_ptr|
122
+ FFI::MemoryPointer.new(:lpwstr, domain_length_ptr.read_dword) do |domain_ptr|
123
+ if LookupAccountSidW(system_name_ptr, sid_ptr, name_ptr, name_length_ptr,
124
+ domain_ptr, domain_length_ptr, name_use_enum_ptr) == FFI::WIN32_FALSE
125
+ raise Puppet::Util::Windows::Error.new('Failed to call LookupAccountSidW')
126
+ end
127
+
128
+ return new(
129
+ name_ptr.read_wide_string(name_length_ptr.read_dword),
130
+ sid_bytes,
131
+ Puppet::Util::Windows::SID.sid_ptr_to_string(sid_ptr),
132
+ domain_ptr.read_wide_string(domain_length_ptr.read_dword),
133
+ SID_NAME_USE[name_use_enum_ptr.read_uint32])
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
140
+ ensure
141
+ system_name_ptr.free if system_name_ptr != FFI::Pointer::NULL
142
+ end
143
+ end
144
+
145
+ ffi_convention :stdcall
146
+
147
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa379601(v=vs.85).aspx
148
+ SID_NAME_USE = enum(
149
+ :SidTypeUser, 1,
150
+ :SidTypeGroup, 2,
151
+ :SidTypeDomain, 3,
152
+ :SidTypeAlias, 4,
153
+ :SidTypeWellKnownGroup, 5,
154
+ :SidTypeDeletedAccount, 6,
155
+ :SidTypeInvalid, 7,
156
+ :SidTypeUnknown, 8,
157
+ :SidTypeComputer, 9,
158
+ :SidTypeLabel, 10
159
+ )
160
+
161
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa379159(v=vs.85).aspx
162
+ # BOOL WINAPI LookupAccountName(
163
+ # _In_opt_ LPCTSTR lpSystemName,
164
+ # _In_ LPCTSTR lpAccountName,
165
+ # _Out_opt_ PSID Sid,
166
+ # _Inout_ LPDWORD cbSid,
167
+ # _Out_opt_ LPTSTR ReferencedDomainName,
168
+ # _Inout_ LPDWORD cchReferencedDomainName,
169
+ # _Out_ PSID_NAME_USE peUse
170
+ # );
171
+ ffi_lib :advapi32
172
+ attach_function_private :LookupAccountNameW,
173
+ [:lpcwstr, :lpcwstr, :pointer, :lpdword, :lpwstr, :lpdword, :pointer], :win32_bool
174
+
175
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa379166(v=vs.85).aspx
176
+ # BOOL WINAPI LookupAccountSid(
177
+ # _In_opt_ LPCTSTR lpSystemName,
178
+ # _In_ PSID lpSid,
179
+ # _Out_opt_ LPTSTR lpName,
180
+ # _Inout_ LPDWORD cchName,
181
+ # _Out_opt_ LPTSTR lpReferencedDomainName,
182
+ # _Inout_ LPDWORD cchReferencedDomainName,
183
+ # _Out_ PSID_NAME_USE peUse
184
+ # );
185
+ ffi_lib :advapi32
186
+ attach_function_private :LookupAccountSidW,
187
+ [:lpcwstr, :pointer, :lpwstr, :lpdword, :lpwstr, :lpdword, :pointer], :win32_bool
188
+ end
189
+ end
190
+
@@ -224,6 +224,51 @@ module Puppet::Util::Windows::Process
224
224
  end
225
225
  module_function :windows_major_version
226
226
 
227
+ # Returns a hash of the current environment variables encoded as UTF-8
228
+ # The memory block returned from GetEnvironmentStringsW is double-null terminated and the vars are paired as below;
229
+ # Var1=Value1\0
230
+ # Var2=Value2\0
231
+ # VarX=ValueX\0\0
232
+ # Note - Some env variable names start with '=' and are excluded from the return value
233
+ # Note - The env_ptr MUST be freed using the FreeEnvironmentStringsW function
234
+ # Note - There is no technical limitation to the size of the environment block returned.
235
+ # However a pracitcal limit of 64K is used as no single environment variable can exceed 32KB
236
+ def get_environment_strings
237
+ env_ptr = GetEnvironmentStringsW()
238
+
239
+ pairs = env_ptr.read_arbitrary_wide_string_up_to(65534, :double_null)
240
+ .split(?\x00)
241
+ .reject { |env_str| env_str.nil? || env_str.empty? || env_str[0] == '=' }
242
+ .map { |env_pair| env_pair.split('=', 2) }
243
+ Hash[ pairs ]
244
+ ensure
245
+ if env_ptr && ! env_ptr.null?
246
+ if FreeEnvironmentStringsW(env_ptr) == FFI::WIN32_FALSE
247
+ Puppet.debug "FreeEnvironmentStringsW memory leak"
248
+ end
249
+ end
250
+ end
251
+ module_function :get_environment_strings
252
+
253
+ def set_environment_variable(name, val)
254
+ raise Puppet::Util::Windows::Error('environment variable name must not be nil or empty') if ! name || name.empty?
255
+
256
+ FFI::MemoryPointer.from_string_to_wide_string(name) do |name_ptr|
257
+ if (val.nil?)
258
+ if SetEnvironmentVariableW(name_ptr, FFI::MemoryPointer::NULL) == FFI::WIN32_FALSE
259
+ raise Puppet::Util::Windows::Error.new("Failed to remove environment variable: #{name}")
260
+ end
261
+ else
262
+ FFI::MemoryPointer.from_string_to_wide_string(val) do |val_ptr|
263
+ if SetEnvironmentVariableW(name_ptr, val_ptr) == FFI::WIN32_FALSE
264
+ raise Puppet::Util::Windows::Error.new("Failed to set environment variable: #{name}")
265
+ end
266
+ end
267
+ end
268
+ end
269
+ end
270
+ module_function :set_environment_variable
271
+
227
272
  # Returns whether or not the OS has the ability to set elevated
228
273
  # token information.
229
274
  #
@@ -243,7 +288,7 @@ module Puppet::Util::Windows::Process
243
288
 
244
289
  ffi_convention :stdcall
245
290
 
246
- # http://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx
291
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx
247
292
  # DWORD WINAPI WaitForSingleObject(
248
293
  # _In_ HANDLE hHandle,
249
294
  # _In_ DWORD dwMilliseconds
@@ -252,7 +297,7 @@ module Puppet::Util::Windows::Process
252
297
  attach_function_private :WaitForSingleObject,
253
298
  [:handle, :dword], :dword
254
299
 
255
- # http://msdn.microsoft.com/en-us/library/windows/desktop/ms683189(v=vs.85).aspx
300
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/ms683189(v=vs.85).aspx
256
301
  # BOOL WINAPI GetExitCodeProcess(
257
302
  # _In_ HANDLE hProcess,
258
303
  # _Out_ LPDWORD lpExitCode
@@ -261,12 +306,34 @@ module Puppet::Util::Windows::Process
261
306
  attach_function_private :GetExitCodeProcess,
262
307
  [:handle, :lpdword], :win32_bool
263
308
 
264
- # http://msdn.microsoft.com/en-us/library/windows/desktop/ms683179(v=vs.85).aspx
309
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/ms683179(v=vs.85).aspx
265
310
  # HANDLE WINAPI GetCurrentProcess(void);
266
311
  ffi_lib :kernel32
267
312
  attach_function_private :GetCurrentProcess, [], :handle
268
313
 
269
- # http://msdn.microsoft.com/en-us/library/windows/desktop/aa379295(v=vs.85).aspx
314
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/ms683187(v=vs.85).aspx
315
+ # LPTCH GetEnvironmentStrings(void);
316
+ ffi_lib :kernel32
317
+ attach_function_private :GetEnvironmentStringsW, [], :pointer
318
+
319
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/ms683151(v=vs.85).aspx
320
+ # BOOL FreeEnvironmentStrings(
321
+ # _In_ LPTCH lpszEnvironmentBlock
322
+ # );
323
+ ffi_lib :kernel32
324
+ attach_function_private :FreeEnvironmentStringsW,
325
+ [:pointer], :win32_bool
326
+
327
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/ms686206(v=vs.85).aspx
328
+ # BOOL WINAPI SetEnvironmentVariableW(
329
+ # _In_ LPCTSTR lpName,
330
+ # _In_opt_ LPCTSTR lpValue
331
+ # );
332
+ ffi_lib :kernel32
333
+ attach_function_private :SetEnvironmentVariableW,
334
+ [:lpcwstr, :lpcwstr], :win32_bool
335
+
336
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa379295(v=vs.85).aspx
270
337
  # BOOL WINAPI OpenProcessToken(
271
338
  # _In_ HANDLE ProcessHandle,
272
339
  # _In_ DWORD DesiredAccess,
@@ -277,7 +344,7 @@ module Puppet::Util::Windows::Process
277
344
  [:handle, :dword, :phandle], :win32_bool
278
345
 
279
346
 
280
- # http://msdn.microsoft.com/en-us/library/windows/desktop/aa379261(v=vs.85).aspx
347
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa379261(v=vs.85).aspx
281
348
  # typedef struct _LUID {
282
349
  # DWORD LowPart;
283
350
  # LONG HighPart;
@@ -287,7 +354,7 @@ module Puppet::Util::Windows::Process
287
354
  :HighPart, :win32_long
288
355
  end
289
356
 
290
- # http://msdn.microsoft.com/en-us/library/Windows/desktop/aa379180(v=vs.85).aspx
357
+ # https://msdn.microsoft.com/en-us/library/Windows/desktop/aa379180(v=vs.85).aspx
291
358
  # BOOL WINAPI LookupPrivilegeValue(
292
359
  # _In_opt_ LPCTSTR lpSystemName,
293
360
  # _In_ LPCTSTR lpName,
@@ -297,7 +364,7 @@ module Puppet::Util::Windows::Process
297
364
  attach_function_private :LookupPrivilegeValueW,
298
365
  [:lpcwstr, :lpcwstr, :pointer], :win32_bool
299
366
 
300
- # http://msdn.microsoft.com/en-us/library/windows/desktop/aa379626(v=vs.85).aspx
367
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa379626(v=vs.85).aspx
301
368
  TOKEN_INFORMATION_CLASS = enum(
302
369
  :TokenUser, 1,
303
370
  :TokenGroups,
@@ -342,7 +409,7 @@ module Puppet::Util::Windows::Process
342
409
  :MaxTokenInfoClass
343
410
  )
344
411
 
345
- # http://msdn.microsoft.com/en-us/library/windows/desktop/aa379263(v=vs.85).aspx
412
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa379263(v=vs.85).aspx
346
413
  # typedef struct _LUID_AND_ATTRIBUTES {
347
414
  # LUID Luid;
348
415
  # DWORD Attributes;
@@ -352,7 +419,7 @@ module Puppet::Util::Windows::Process
352
419
  :Attributes, :dword
353
420
  end
354
421
 
355
- # http://msdn.microsoft.com/en-us/library/windows/desktop/aa379630(v=vs.85).aspx
422
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa379630(v=vs.85).aspx
356
423
  # typedef struct _TOKEN_PRIVILEGES {
357
424
  # DWORD PrivilegeCount;
358
425
  # LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];
@@ -362,7 +429,7 @@ module Puppet::Util::Windows::Process
362
429
  :Privileges, [LUID_AND_ATTRIBUTES, 1] # placeholder for offset
363
430
  end
364
431
 
365
- # http://msdn.microsoft.com/en-us/library/windows/desktop/bb530717(v=vs.85).aspx
432
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/bb530717(v=vs.85).aspx
366
433
  # typedef struct _TOKEN_ELEVATION {
367
434
  # DWORD TokenIsElevated;
368
435
  # } TOKEN_ELEVATION, *PTOKEN_ELEVATION;
@@ -370,7 +437,7 @@ module Puppet::Util::Windows::Process
370
437
  layout :TokenIsElevated, :dword
371
438
  end
372
439
 
373
- # http://msdn.microsoft.com/en-us/library/windows/desktop/aa446671(v=vs.85).aspx
440
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa446671(v=vs.85).aspx
374
441
  # BOOL WINAPI GetTokenInformation(
375
442
  # _In_ HANDLE TokenHandle,
376
443
  # _In_ TOKEN_INFORMATION_CLASS TokenInformationClass,
@@ -5,7 +5,7 @@ module Puppet::Util::Windows
5
5
  require 'ffi'
6
6
  extend FFI::Library
7
7
 
8
- # http://msdn.microsoft.com/en-us/library/windows/desktop/aa384129(v=vs.85).aspx
8
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa384129(v=vs.85).aspx
9
9
  KEY64 = 0x100
10
10
  KEY32 = 0x200
11
11
 
@@ -207,21 +207,27 @@ module Puppet::Util::Windows
207
207
  # buffer is raw bytes, *not* chars - less a NULL terminator
208
208
  string_length = (byte_length / FFI.type_size(:wchar)) - 1 if byte_length > 0
209
209
 
210
- case type
211
- when Win32::Registry::REG_SZ, Win32::Registry::REG_EXPAND_SZ
212
- result = [ type, data_ptr.read_wide_string(string_length) ]
213
- when Win32::Registry::REG_MULTI_SZ
214
- result = [ type, data_ptr.read_wide_string(string_length).split(/\0/) ]
215
- when Win32::Registry::REG_BINARY
216
- result = [ type, data.read_bytes(0, byte_length) ]
217
- when Win32::Registry::REG_DWORD
218
- result = [ type, data_ptr.read_dword ]
219
- when Win32::Registry::REG_DWORD_BIG_ENDIAN
220
- result = [ type, data_ptr.order(:big).read_dword ]
221
- when Win32::Registry::REG_QWORD
222
- result = [ type, data_ptr.read_qword ]
223
- else
224
- raise TypeError, "Type #{type} is not supported."
210
+ begin
211
+ case type
212
+ when Win32::Registry::REG_SZ, Win32::Registry::REG_EXPAND_SZ
213
+ result = [ type, data_ptr.read_wide_string(string_length) ]
214
+ when Win32::Registry::REG_MULTI_SZ
215
+ result = [ type, data_ptr.read_wide_string(string_length).split(/\0/) ]
216
+ when Win32::Registry::REG_BINARY
217
+ result = [ type, data_ptr.read_bytes(byte_length) ]
218
+ when Win32::Registry::REG_DWORD
219
+ result = [ type, data_ptr.read_dword ]
220
+ when Win32::Registry::REG_DWORD_BIG_ENDIAN
221
+ result = [ type, data_ptr.order(:big).read_dword ]
222
+ when Win32::Registry::REG_QWORD
223
+ result = [ type, data_ptr.read_qword ]
224
+ else
225
+ raise TypeError, "Type #{type} is not supported."
226
+ end
227
+ rescue IndexError => ex
228
+ raise if (ex.message !~ /^Memory access .* is out of bounds$/i)
229
+ parent_key_name = key.parent ? "#{key.parent.keyname}\\" : ""
230
+ Puppet.warning "A value in the registry key #{parent_key_name}#{key.keyname} is corrupt or invalid"
225
231
  end
226
232
  end
227
233
 
@@ -34,7 +34,7 @@ class Puppet::Util::Windows::RootCerts
34
34
  certs = []
35
35
 
36
36
  # This is based on a patch submitted to openssl:
37
- # http://www.mail-archive.com/openssl-dev@openssl.org/msg26958.html
37
+ # https://www.mail-archive.com/openssl-dev@openssl.org/msg26958.html
38
38
  ptr = FFI::Pointer::NULL
39
39
  store = CertOpenSystemStoreA(nil, "ROOT")
40
40
  begin
@@ -57,7 +57,7 @@ class Puppet::Util::Windows::RootCerts
57
57
  ffi_convention :stdcall
58
58
  # typedef void *HCERTSTORE;
59
59
 
60
- # http://msdn.microsoft.com/en-us/library/windows/desktop/aa377189(v=vs.85).aspx
60
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa377189(v=vs.85).aspx
61
61
  # typedef struct _CERT_CONTEXT {
62
62
  # DWORD dwCertEncodingType;
63
63
  # BYTE *pbCertEncoded;
@@ -75,7 +75,7 @@ class Puppet::Util::Windows::RootCerts
75
75
  )
76
76
  end
77
77
 
78
- # http://msdn.microsoft.com/en-us/library/windows/desktop/aa376560(v=vs.85).aspx
78
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa376560(v=vs.85).aspx
79
79
  # HCERTSTORE
80
80
  # WINAPI
81
81
  # CertOpenSystemStoreA(
@@ -86,7 +86,7 @@ class Puppet::Util::Windows::RootCerts
86
86
  ffi_lib :crypt32
87
87
  attach_function_private :CertOpenSystemStoreA, [:ulong_ptr, :lpcstr], :handle
88
88
 
89
- # http://msdn.microsoft.com/en-us/library/windows/desktop/aa376050(v=vs.85).aspx
89
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa376050(v=vs.85).aspx
90
90
  # PCCERT_CONTEXT
91
91
  # WINAPI
92
92
  # CertEnumCertificatesInStore(
@@ -96,7 +96,7 @@ class Puppet::Util::Windows::RootCerts
96
96
  ffi_lib :crypt32
97
97
  attach_function_private :CertEnumCertificatesInStore, [:handle, :pointer], :pointer
98
98
 
99
- # http://msdn.microsoft.com/en-us/library/windows/desktop/aa376026(v=vs.85).aspx
99
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa376026(v=vs.85).aspx
100
100
  # BOOL
101
101
  # WINAPI
102
102
  # CertCloseStore(