puppet 6.19.1-x64-mingw32 → 6.23.0-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 (293) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -16
  3. data/Gemfile +3 -1
  4. data/Gemfile.lock +51 -40
  5. data/ext/osx/puppet.plist +2 -0
  6. data/ext/project_data.yaml +2 -2
  7. data/lib/puppet/application.rb +10 -6
  8. data/lib/puppet/application/agent.rb +12 -4
  9. data/lib/puppet/application/apply.rb +4 -2
  10. data/lib/puppet/application/device.rb +2 -0
  11. data/lib/puppet/application/filebucket.rb +2 -2
  12. data/lib/puppet/application/resource.rb +2 -1
  13. data/lib/puppet/application/script.rb +2 -0
  14. data/lib/puppet/application/ssl.rb +11 -0
  15. data/lib/puppet/application_support.rb +7 -0
  16. data/lib/puppet/configurer.rb +28 -18
  17. data/lib/puppet/configurer/downloader.rb +2 -1
  18. data/lib/puppet/defaults.rb +51 -23
  19. data/lib/puppet/environments.rb +54 -55
  20. data/lib/puppet/face/config.rb +10 -0
  21. data/lib/puppet/face/epp.rb +12 -2
  22. data/lib/puppet/face/facts.rb +158 -0
  23. data/lib/puppet/ffi/posix.rb +10 -0
  24. data/lib/puppet/ffi/posix/constants.rb +14 -0
  25. data/lib/puppet/ffi/posix/functions.rb +24 -0
  26. data/lib/puppet/file_serving/fileset.rb +14 -2
  27. data/lib/puppet/file_system/memory_file.rb +8 -1
  28. data/lib/puppet/file_system/windows.rb +2 -0
  29. data/lib/puppet/functions/all.rb +1 -1
  30. data/lib/puppet/functions/camelcase.rb +1 -1
  31. data/lib/puppet/functions/capitalize.rb +2 -2
  32. data/lib/puppet/functions/downcase.rb +2 -2
  33. data/lib/puppet/functions/epp.rb +1 -0
  34. data/lib/puppet/functions/get.rb +5 -5
  35. data/lib/puppet/functions/group_by.rb +13 -5
  36. data/lib/puppet/functions/inline_epp.rb +1 -0
  37. data/lib/puppet/functions/lest.rb +1 -1
  38. data/lib/puppet/functions/new.rb +100 -100
  39. data/lib/puppet/functions/partition.rb +12 -4
  40. data/lib/puppet/functions/require.rb +5 -5
  41. data/lib/puppet/functions/sort.rb +3 -3
  42. data/lib/puppet/functions/tree_each.rb +7 -9
  43. data/lib/puppet/functions/type.rb +4 -4
  44. data/lib/puppet/functions/upcase.rb +2 -2
  45. data/lib/puppet/http/resolver/server_list.rb +15 -4
  46. data/lib/puppet/http/service/compiler.rb +69 -0
  47. data/lib/puppet/http/service/file_server.rb +2 -1
  48. data/lib/puppet/indirector/catalog/compiler.rb +1 -0
  49. data/lib/puppet/indirector/fact_search.rb +60 -0
  50. data/lib/puppet/indirector/facts/facter.rb +24 -3
  51. data/lib/puppet/indirector/facts/json.rb +27 -0
  52. data/lib/puppet/indirector/facts/yaml.rb +3 -58
  53. data/lib/puppet/indirector/file_metadata/rest.rb +1 -0
  54. data/lib/puppet/indirector/json.rb +5 -1
  55. data/lib/puppet/indirector/node/json.rb +8 -0
  56. data/lib/puppet/indirector/report/json.rb +34 -0
  57. data/lib/puppet/module_tool/applications/installer.rb +48 -2
  58. data/lib/puppet/module_tool/errors/shared.rb +17 -2
  59. data/lib/puppet/network/formats.rb +69 -1
  60. data/lib/puppet/network/http/factory.rb +4 -0
  61. data/lib/puppet/pal/pal_impl.rb +70 -17
  62. data/lib/puppet/parser/ast/leaf.rb +3 -2
  63. data/lib/puppet/parser/functions/fqdn_rand.rb +14 -6
  64. data/lib/puppet/parser/templatewrapper.rb +1 -1
  65. data/lib/puppet/pops/evaluator/deferred_resolver.rb +5 -3
  66. data/lib/puppet/pops/evaluator/evaluator_impl.rb +22 -3
  67. data/lib/puppet/pops/model/ast_transformer.rb +1 -1
  68. data/lib/puppet/pops/types/p_sem_ver_type.rb +8 -2
  69. data/lib/puppet/pops/types/p_sensitive_type.rb +10 -0
  70. data/lib/puppet/property/list.rb +1 -1
  71. data/lib/puppet/provider/group/groupadd.rb +13 -8
  72. data/lib/puppet/provider/package/apt.rb +34 -2
  73. data/lib/puppet/provider/package/aptitude.rb +6 -0
  74. data/lib/puppet/provider/package/dnfmodule.rb +1 -1
  75. data/lib/puppet/provider/package/nim.rb +11 -6
  76. data/lib/puppet/provider/service/debian.rb +2 -0
  77. data/lib/puppet/provider/service/systemd.rb +14 -4
  78. data/lib/puppet/provider/service/windows.rb +38 -0
  79. data/lib/puppet/provider/user/aix.rb +2 -2
  80. data/lib/puppet/provider/user/directoryservice.rb +25 -12
  81. data/lib/puppet/provider/user/useradd.rb +62 -8
  82. data/lib/puppet/reference/configuration.rb +7 -6
  83. data/lib/puppet/settings.rb +33 -28
  84. data/lib/puppet/settings/alias_setting.rb +37 -0
  85. data/lib/puppet/settings/base_setting.rb +26 -2
  86. data/lib/puppet/settings/environment_conf.rb +1 -0
  87. data/lib/puppet/transaction/additional_resource_generator.rb +1 -1
  88. data/lib/puppet/type/file.rb +19 -1
  89. data/lib/puppet/type/file/selcontext.rb +1 -1
  90. data/lib/puppet/type/package.rb +3 -3
  91. data/lib/puppet/type/service.rb +18 -38
  92. data/lib/puppet/type/tidy.rb +21 -2
  93. data/lib/puppet/type/user.rb +38 -20
  94. data/lib/puppet/util/autoload.rb +1 -8
  95. data/lib/puppet/util/fact_dif.rb +81 -0
  96. data/lib/puppet/util/monkey_patches.rb +7 -0
  97. data/lib/puppet/util/posix.rb +54 -5
  98. data/lib/puppet/util/rubygems.rb +5 -1
  99. data/lib/puppet/util/selinux.rb +30 -4
  100. data/lib/puppet/util/windows/adsi.rb +46 -0
  101. data/lib/puppet/util/windows/api_types.rb +1 -1
  102. data/lib/puppet/util/windows/principal.rb +9 -2
  103. data/lib/puppet/util/windows/service.rb +1 -1
  104. data/lib/puppet/util/windows/sid.rb +4 -2
  105. data/lib/puppet/version.rb +1 -1
  106. data/locales/puppet.pot +372 -288
  107. data/man/man5/puppet.conf.5 +282 -254
  108. data/man/man8/puppet-agent.8 +2 -2
  109. data/man/man8/puppet-apply.8 +2 -2
  110. data/man/man8/puppet-catalog.8 +1 -1
  111. data/man/man8/puppet-config.8 +1 -1
  112. data/man/man8/puppet-describe.8 +1 -1
  113. data/man/man8/puppet-device.8 +2 -2
  114. data/man/man8/puppet-doc.8 +1 -1
  115. data/man/man8/puppet-epp.8 +1 -1
  116. data/man/man8/puppet-facts.8 +90 -1
  117. data/man/man8/puppet-filebucket.8 +3 -3
  118. data/man/man8/puppet-generate.8 +1 -1
  119. data/man/man8/puppet-help.8 +1 -1
  120. data/man/man8/puppet-key.8 +1 -1
  121. data/man/man8/puppet-lookup.8 +1 -1
  122. data/man/man8/puppet-man.8 +1 -1
  123. data/man/man8/puppet-module.8 +1 -1
  124. data/man/man8/puppet-node.8 +4 -1
  125. data/man/man8/puppet-parser.8 +1 -1
  126. data/man/man8/puppet-plugin.8 +1 -1
  127. data/man/man8/puppet-report.8 +4 -1
  128. data/man/man8/puppet-resource.8 +1 -1
  129. data/man/man8/puppet-script.8 +2 -2
  130. data/man/man8/puppet-ssl.8 +5 -1
  131. data/man/man8/puppet-status.8 +1 -1
  132. data/man/man8/puppet.8 +2 -2
  133. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +91 -0
  134. data/spec/fixtures/ssl/127.0.0.1-key.pem +107 -57
  135. data/spec/fixtures/ssl/127.0.0.1.pem +52 -31
  136. data/spec/fixtures/ssl/bad-basic-constraints.pem +57 -35
  137. data/spec/fixtures/ssl/bad-int-basic-constraints.pem +57 -35
  138. data/spec/fixtures/ssl/ca.pem +57 -35
  139. data/spec/fixtures/ssl/crl.pem +28 -18
  140. data/spec/fixtures/ssl/ec-key.pem +11 -11
  141. data/spec/fixtures/ssl/ec.pem +33 -24
  142. data/spec/fixtures/ssl/encrypted-ec-key.pem +12 -12
  143. data/spec/fixtures/ssl/encrypted-key.pem +108 -58
  144. data/spec/fixtures/ssl/intermediate-agent-crl.pem +28 -19
  145. data/spec/fixtures/ssl/intermediate-agent.pem +57 -36
  146. data/spec/fixtures/ssl/intermediate-crl.pem +31 -21
  147. data/spec/fixtures/ssl/intermediate.pem +57 -36
  148. data/spec/fixtures/ssl/pluto-key.pem +107 -57
  149. data/spec/fixtures/ssl/pluto.pem +52 -30
  150. data/spec/fixtures/ssl/request-key.pem +107 -57
  151. data/spec/fixtures/ssl/request.pem +47 -26
  152. data/spec/fixtures/ssl/revoked-key.pem +107 -57
  153. data/spec/fixtures/ssl/revoked.pem +52 -30
  154. data/spec/fixtures/ssl/signed-key.pem +107 -57
  155. data/spec/fixtures/ssl/signed.pem +52 -30
  156. data/spec/fixtures/ssl/tampered-cert.pem +52 -30
  157. data/spec/fixtures/ssl/tampered-csr.pem +47 -26
  158. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +107 -57
  159. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +50 -29
  160. data/spec/fixtures/ssl/unknown-ca-key.pem +107 -57
  161. data/spec/fixtures/ssl/unknown-ca.pem +55 -33
  162. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services_vendor_preset +9 -0
  163. data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
  164. data/spec/integration/application/agent_spec.rb +160 -3
  165. data/spec/integration/application/apply_spec.rb +19 -0
  166. data/spec/integration/application/plugin_spec.rb +1 -1
  167. data/spec/integration/application/resource_spec.rb +30 -0
  168. data/spec/integration/defaults_spec.rb +0 -7
  169. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  170. data/spec/integration/http/client_spec.rb +12 -0
  171. data/spec/integration/indirector/direct_file_server_spec.rb +1 -3
  172. data/spec/integration/resource/type_collection_spec.rb +2 -6
  173. data/spec/integration/transaction_spec.rb +4 -9
  174. data/spec/integration/util/windows/adsi_spec.rb +21 -1
  175. data/spec/integration/util/windows/principal_spec.rb +21 -0
  176. data/spec/integration/util/windows/registry_spec.rb +6 -10
  177. data/spec/lib/puppet/test_ca.rb +2 -2
  178. data/spec/lib/puppet_spec/settings.rb +6 -1
  179. data/spec/spec_helper.rb +12 -5
  180. data/spec/unit/agent_spec.rb +8 -6
  181. data/spec/unit/application/agent_spec.rb +7 -3
  182. data/spec/unit/application/config_spec.rb +224 -4
  183. data/spec/unit/application/facts_spec.rb +482 -3
  184. data/spec/unit/application/filebucket_spec.rb +0 -2
  185. data/spec/unit/application/ssl_spec.rb +23 -0
  186. data/spec/unit/application_spec.rb +51 -9
  187. data/spec/unit/configurer/downloader_spec.rb +6 -0
  188. data/spec/unit/configurer_spec.rb +23 -0
  189. data/spec/unit/confine/feature_spec.rb +1 -1
  190. data/spec/unit/confine_spec.rb +8 -2
  191. data/spec/unit/defaults_spec.rb +36 -1
  192. data/spec/unit/environments_spec.rb +221 -68
  193. data/spec/unit/face/config_spec.rb +27 -32
  194. data/spec/unit/face/facts_spec.rb +4 -0
  195. data/spec/unit/face/node_spec.rb +0 -11
  196. data/spec/unit/file_serving/configuration/parser_spec.rb +0 -1
  197. data/spec/unit/file_serving/fileset_spec.rb +60 -0
  198. data/spec/unit/file_serving/metadata_spec.rb +3 -3
  199. data/spec/unit/file_serving/terminus_helper_spec.rb +11 -4
  200. data/spec/unit/file_system_spec.rb +9 -0
  201. data/spec/unit/forge/module_release_spec.rb +2 -7
  202. data/spec/unit/functions/inline_epp_spec.rb +26 -1
  203. data/spec/unit/gettext/config_spec.rb +12 -0
  204. data/spec/unit/http/service/compiler_spec.rb +172 -0
  205. data/spec/unit/http/service_spec.rb +1 -1
  206. data/spec/unit/indirector/catalog/compiler_spec.rb +14 -10
  207. data/spec/unit/indirector/face_spec.rb +0 -1
  208. data/spec/unit/indirector/facts/facter_spec.rb +95 -1
  209. data/spec/unit/indirector/facts/json_spec.rb +255 -0
  210. data/spec/unit/indirector/file_bucket_file/selector_spec.rb +26 -8
  211. data/spec/unit/indirector/indirection_spec.rb +8 -12
  212. data/spec/unit/indirector/key/file_spec.rb +0 -1
  213. data/spec/unit/indirector/node/json_spec.rb +33 -0
  214. data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
  215. data/spec/unit/indirector/report/yaml_spec.rb +72 -8
  216. data/spec/unit/indirector_spec.rb +2 -2
  217. data/spec/unit/module_tool/applications/installer_spec.rb +66 -0
  218. data/spec/unit/network/authconfig_spec.rb +0 -3
  219. data/spec/unit/network/formats_spec.rb +41 -0
  220. data/spec/unit/network/http/api/indirected_routes_spec.rb +0 -9
  221. data/spec/unit/network/http/factory_spec.rb +19 -0
  222. data/spec/unit/network/http/handler_spec.rb +0 -5
  223. data/spec/unit/parser/compiler_spec.rb +3 -19
  224. data/spec/unit/parser/functions/fqdn_rand_spec.rb +15 -1
  225. data/spec/unit/parser/resource_spec.rb +14 -8
  226. data/spec/unit/parser/templatewrapper_spec.rb +4 -3
  227. data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +20 -0
  228. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +18 -0
  229. data/spec/unit/pops/types/p_sensitive_type_spec.rb +18 -0
  230. data/spec/unit/property_spec.rb +1 -0
  231. data/spec/unit/provider/group/groupadd_spec.rb +5 -2
  232. data/spec/unit/provider/nameservice_spec.rb +66 -65
  233. data/spec/unit/provider/package/apt_spec.rb +28 -23
  234. data/spec/unit/provider/package/aptitude_spec.rb +1 -1
  235. data/spec/unit/provider/package/base_spec.rb +6 -5
  236. data/spec/unit/provider/package/dnfmodule_spec.rb +10 -1
  237. data/spec/unit/provider/package/nim_spec.rb +42 -0
  238. data/spec/unit/provider/package/pacman_spec.rb +18 -12
  239. data/spec/unit/provider/package/pip_spec.rb +6 -11
  240. data/spec/unit/provider/package/pkgdmg_spec.rb +0 -4
  241. data/spec/unit/provider/service/init_spec.rb +1 -0
  242. data/spec/unit/provider/service/openwrt_spec.rb +3 -1
  243. data/spec/unit/provider/service/systemd_spec.rb +53 -8
  244. data/spec/unit/provider/service/windows_spec.rb +202 -0
  245. data/spec/unit/provider/user/aix_spec.rb +5 -0
  246. data/spec/unit/provider/user/directoryservice_spec.rb +67 -35
  247. data/spec/unit/provider/user/hpux_spec.rb +1 -1
  248. data/spec/unit/provider/user/pw_spec.rb +2 -0
  249. data/spec/unit/provider/user/useradd_spec.rb +71 -3
  250. data/spec/unit/provider_spec.rb +8 -10
  251. data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
  252. data/spec/unit/resource/capability_finder_spec.rb +6 -1
  253. data/spec/unit/resource/catalog_spec.rb +1 -1
  254. data/spec/unit/resource/type_spec.rb +1 -1
  255. data/spec/unit/resource_spec.rb +11 -10
  256. data/spec/unit/settings_spec.rb +419 -242
  257. data/spec/unit/ssl/base_spec.rb +0 -1
  258. data/spec/unit/ssl/host_spec.rb +0 -5
  259. data/spec/unit/ssl/ssl_provider_spec.rb +14 -8
  260. data/spec/unit/ssl/state_machine_spec.rb +19 -5
  261. data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -9
  262. data/spec/unit/transaction/event_manager_spec.rb +14 -11
  263. data/spec/unit/transaction_spec.rb +18 -11
  264. data/spec/unit/type/file/content_spec.rb +0 -1
  265. data/spec/unit/type/file/selinux_spec.rb +3 -5
  266. data/spec/unit/type/file_spec.rb +0 -6
  267. data/spec/unit/type/group_spec.rb +13 -6
  268. data/spec/unit/type/resources_spec.rb +7 -7
  269. data/spec/unit/type/service_spec.rb +60 -189
  270. data/spec/unit/type/tidy_spec.rb +17 -8
  271. data/spec/unit/type/user_spec.rb +45 -0
  272. data/spec/unit/type_spec.rb +2 -2
  273. data/spec/unit/util/at_fork_spec.rb +2 -2
  274. data/spec/unit/util/autoload_spec.rb +5 -1
  275. data/spec/unit/util/backups_spec.rb +1 -2
  276. data/spec/unit/util/execution_spec.rb +15 -11
  277. data/spec/unit/util/inifile_spec.rb +6 -14
  278. data/spec/unit/util/log_spec.rb +8 -7
  279. data/spec/unit/util/logging_spec.rb +3 -3
  280. data/spec/unit/util/posix_spec.rb +363 -15
  281. data/spec/unit/util/rubygems_spec.rb +2 -2
  282. data/spec/unit/util/selinux_spec.rb +163 -68
  283. data/spec/unit/util/storage_spec.rb +3 -1
  284. data/spec/unit/util/suidmanager_spec.rb +44 -41
  285. data/spec/unit/util/windows/sid_spec.rb +6 -0
  286. data/spec/unit/util_spec.rb +13 -6
  287. data/tasks/generate_cert_fixtures.rake +2 -2
  288. metadata +33 -16
  289. data/spec/integration/application/config_spec.rb +0 -74
  290. data/spec/lib/matchers/include.rb +0 -27
  291. data/spec/lib/matchers/include_spec.rb +0 -32
  292. data/spec/unit/face/catalog_spec.rb +0 -6
  293. data/spec/unit/face/module_spec.rb +0 -3
@@ -50,6 +50,22 @@ Puppet::Type.newtype(:tidy) do
50
50
  end
51
51
  end
52
52
 
53
+ newparam(:max_files) do
54
+ desc "In case the resource is a directory and the recursion is enabled, puppet will
55
+ generate a new resource for each file file found, possible leading to
56
+ an excessive number of resources generated without any control.
57
+
58
+ Setting `max_files` will check the number of file resources that
59
+ will eventually be created and will raise a resource argument error if the
60
+ limit will be exceeded.
61
+
62
+ Use value `0` to disable the check. In this case, a warning is logged if
63
+ the number of files exceeds 1000."
64
+
65
+ defaultto 0
66
+ newvalues(/^[0-9]+$/)
67
+ end
68
+
53
69
  newparam(:matches) do
54
70
  desc <<-'EOT'
55
71
  One or more (shell type) file glob patterns, which restrict
@@ -256,9 +272,12 @@ Puppet::Type.newtype(:tidy) do
256
272
 
257
273
  case self[:recurse]
258
274
  when Integer, /^\d+$/
259
- parameter = { :recurse => true, :recurselimit => self[:recurse] }
275
+ parameter = { :max_files => self[:max_files],
276
+ :recurse => true,
277
+ :recurselimit => self[:recurse] }
260
278
  when true, :true, :inf
261
- parameter = { :recurse => true }
279
+ parameter = { :max_files => self[:max_files],
280
+ :recurse => true }
262
281
  end
263
282
 
264
283
  if parameter
@@ -67,6 +67,7 @@ module Puppet
67
67
  newproperty(:ensure, :parent => Puppet::Property::Ensure) do
68
68
  newvalue(:present, :event => :user_created) do
69
69
  provider.create
70
+ @resource.generate
70
71
  end
71
72
 
72
73
  newvalue(:absent, :event => :user_removed) do
@@ -695,6 +696,7 @@ module Puppet
695
696
 
696
697
  def generate
697
698
  if !self[:purge_ssh_keys].empty?
699
+ return [] if self[:ensure] == :present && !provider.exists?
698
700
  if Puppet::Type.type(:ssh_authorized_key).nil?
699
701
  warning _("Ssh_authorized_key type is not available. Cannot purge SSH keys.")
700
702
  else
@@ -743,25 +745,6 @@ module Puppet
743
745
  end
744
746
  raise ArgumentError, _("purge_ssh_keys must be true, false, or an array of file names, not %{value}") % { value: value.inspect }
745
747
  end
746
-
747
- munge do |value|
748
- # Resolve string, boolean and symbol forms of true and false to a
749
- # single representation.
750
- test_sym = value.to_s.intern
751
- value = test_sym if [:true, :false].include? test_sym
752
-
753
- return [] if value == :false
754
- home = resource[:home] || Dir.home(resource[:name])
755
-
756
- return [ "#{home}/.ssh/authorized_keys" ] if value == :true
757
- # value is an array - munge each value
758
- [ value ].flatten.map do |entry|
759
- # make sure frozen value is duplicated by using a gsub, second mutating gsub! is then ok
760
- entry = entry.gsub(/^~\//, "#{home}/")
761
- entry.gsub!(/^%h\//, "#{home}/")
762
- entry
763
- end
764
- end
765
748
  end
766
749
 
767
750
  newproperty(:loginclass, :required_features => :manages_loginclass) do
@@ -783,7 +766,7 @@ module Puppet
783
766
  # @see generate
784
767
  # @api private
785
768
  def find_unmanaged_keys
786
- self[:purge_ssh_keys].
769
+ munged_unmanaged_keys.
787
770
  select { |f| File.readable?(f) }.
788
771
  map { |f| unknown_keys_in_file(f) }.
789
772
  flatten.each do |res|
@@ -795,6 +778,41 @@ module Puppet
795
778
  end
796
779
  end
797
780
 
781
+ def munged_unmanaged_keys
782
+ value = self[:purge_ssh_keys]
783
+
784
+ # Resolve string, boolean and symbol forms of true and false to a
785
+ # single representation.
786
+ test_sym = value.to_s.intern
787
+ value = test_sym if [:true, :false].include? test_sym
788
+
789
+ return [] if value == :false
790
+
791
+ home = self[:home]
792
+ begin
793
+ home ||= provider.home
794
+ rescue
795
+ Puppet.debug("User '#{self[:name]}' does not exist")
796
+ end
797
+
798
+ if home.to_s.empty? || !Dir.exist?(home.to_s)
799
+ if value == :true || [ value ].flatten.any? { |v| v.start_with?('~/', '%h/') }
800
+ Puppet.debug("User '#{self[:name]}' has no home directory set to purge ssh keys from.")
801
+ return []
802
+ end
803
+ end
804
+
805
+ return [ "#{home}/.ssh/authorized_keys" ] if value == :true
806
+
807
+ # value is an array - munge each value
808
+ [ value ].flatten.map do |entry|
809
+ # make sure frozen value is duplicated by using a gsub, second mutating gsub! is then ok
810
+ entry = entry.gsub(/^~\//, "#{home}/")
811
+ entry.gsub!(/^%h\//, "#{home}/")
812
+ entry
813
+ end
814
+ end
815
+
798
816
  # Parse an ssh authorized keys file superficially, extract the comments
799
817
  # on the keys. These are considered names of possible ssh_authorized_keys
800
818
  # resources. Keys that are managed by the present catalog are ignored.
@@ -166,14 +166,7 @@ class Puppet::Util::Autoload
166
166
  # Normalize a path. This converts ALT_SEPARATOR to SEPARATOR on Windows
167
167
  # and eliminates unnecessary parts of a path.
168
168
  def cleanpath(path)
169
- # There are two cases here because cleanpath does not handle absolute
170
- # paths correctly on windows (c:\ and c:/ are treated as distinct) but
171
- # we don't want to convert relative paths to absolute
172
- if Puppet::Util.absolute_path?(path)
173
- File.expand_path(path)
174
- else
175
- Pathname.new(path).cleanpath.to_s
176
- end
169
+ Pathname.new(path).cleanpath.to_s
177
170
  end
178
171
  end
179
172
 
@@ -0,0 +1,81 @@
1
+ require 'json'
2
+
3
+ class FactDif
4
+ def initialize(old_output, new_output, exclude_list, save_structured)
5
+ @c_facter = JSON.parse(old_output)
6
+ @next_facter = JSON.parse(new_output)
7
+ @exclude_list = exclude_list
8
+ @save_structured = save_structured
9
+ @flat_diff = []
10
+ @diff = {}
11
+ end
12
+
13
+ def difs
14
+ search_hash(((@c_facter.to_a - @next_facter.to_a) | (@next_facter.to_a - @c_facter.to_a)).to_h)
15
+
16
+ @flat_diff.sort_by { |a| a[0] }.each do |pair|
17
+ fact_path = pair[0]
18
+ value = pair[1]
19
+ compare(fact_path, value, @c_facter)
20
+ compare(fact_path, value, @next_facter)
21
+ end
22
+
23
+ @diff
24
+ end
25
+
26
+ private
27
+
28
+ def search_hash(sh, path = [])
29
+ if sh.is_a?(Hash)
30
+ sh.each do |k, v|
31
+ search_hash(v, path.push(k))
32
+ path.pop
33
+ end
34
+ elsif sh.is_a?(Array)
35
+ sh.each_with_index do |v, index|
36
+ search_hash(v, path.push(index))
37
+ path.pop
38
+ end
39
+ else
40
+ @flat_diff.push([path.dup, sh])
41
+ end
42
+ end
43
+
44
+ def compare(fact_path, given_value, compared_hash)
45
+ compared_value = compared_hash.dig(*fact_path)
46
+ if different?(compared_value, given_value) && !excluded?(fact_path.join('.'))
47
+ fact_path = fact_path.map{|f| f.to_s.include?('.') ? "\"#{f}\"" : f}.join('.') unless @save_structured
48
+ if compared_hash == @c_facter
49
+ bury(*fact_path, { :new_value => given_value, :old_value => compared_value }, @diff)
50
+ else
51
+ bury(*fact_path, { :new_value => compared_value, :old_value => given_value }, @diff)
52
+ end
53
+ end
54
+ end
55
+
56
+ def bury(*paths, value, hash)
57
+ if paths.count > 1
58
+ path = paths.shift
59
+ hash[path] = Hash.new unless hash.key?(path)
60
+ bury(*paths, value, hash[path])
61
+ else
62
+ hash[*paths] = value
63
+ end
64
+ end
65
+
66
+ def different?(new, old)
67
+ if old.is_a?(String) && new.is_a?(String) && (old.include?(',') || new.include?(','))
68
+ old_values = old.split(',')
69
+ new_values = new.split(',')
70
+
71
+ diff = (old_values - new_values) | (new_values - old_values)
72
+ return diff.size.positive?
73
+ end
74
+
75
+ old != new
76
+ end
77
+
78
+ def excluded?(fact_name)
79
+ @exclude_list.any? {|excluded_fact| fact_name =~ /#{excluded_fact}/}
80
+ end
81
+ end
@@ -32,6 +32,13 @@ end
32
32
  # (#19151) Reject all SSLv2 ciphers and handshakes
33
33
  require 'puppet/ssl/openssl_loader'
34
34
  unless Puppet::Util::Platform.jruby_fips?
35
+ unless defined?(OpenSSL::SSL::TLS1_VERSION)
36
+ module OpenSSL::SSL
37
+ # see https://github.com/ruby/ruby/commit/609103dbb5fb182eec12f052226c43e39b907682#diff-09f822c26289f5347111795ca22ed7ed1cfadd6ebd28f987991d1d414eef565aR2755-R2759
38
+ OpenSSL::SSL::TLS1_VERSION = 0x301
39
+ end
40
+ end
41
+
35
42
  class OpenSSL::SSL::SSLContext
36
43
  if DEFAULT_PARAMS[:options]
37
44
  DEFAULT_PARAMS[:options] |= OpenSSL::SSL::OP_NO_SSLv2 | OpenSSL::SSL::OP_NO_SSLv3
@@ -12,11 +12,18 @@ module Puppet::Util::POSIX
12
12
  class << self
13
13
  # Returns an array of all the groups that the user's a member of.
14
14
  def groups_of(user)
15
- groups = []
16
- Puppet::Etc.group do |group|
17
- groups << group.name if group.mem.include?(user)
15
+ begin
16
+ require 'puppet/ffi/posix'
17
+ groups = get_groups_list(user)
18
+ rescue StandardError, LoadError => e
19
+ Puppet.debug("Falling back to Puppet::Etc.group: #{e.message}")
20
+
21
+ groups = []
22
+ Puppet::Etc.group do |group|
23
+ groups << group.name if group.mem.include?(user)
24
+ end
18
25
  end
19
-
26
+
20
27
  uniq_groups = groups.uniq
21
28
  if uniq_groups != groups
22
29
  Puppet.debug(_('Removing any duplicate group entries'))
@@ -24,6 +31,39 @@ module Puppet::Util::POSIX
24
31
 
25
32
  uniq_groups
26
33
  end
34
+
35
+ private
36
+ def get_groups_list(user)
37
+ raise LoadError, "The 'getgrouplist' method is not available" unless Puppet::FFI::POSIX::Functions.respond_to?(:getgrouplist)
38
+
39
+ user_gid = Puppet::Etc.getpwnam(user).gid
40
+ ngroups = Puppet::FFI::POSIX::Constants::MAXIMUM_NUMBER_OF_GROUPS
41
+
42
+ while true do # rubocop:disable Lint/LiteralInCondition
43
+ FFI::MemoryPointer.new(:int) do |ngroups_ptr|
44
+ FFI::MemoryPointer.new(:uint, ngroups) do |groups_ptr|
45
+ old_ngroups = ngroups
46
+ ngroups_ptr.write_int(ngroups)
47
+
48
+ if Puppet::FFI::POSIX::Functions::getgrouplist(user, user_gid, groups_ptr, ngroups_ptr) != -1
49
+ groups_gids = groups_ptr.get_array_of_uint(0, ngroups_ptr.read_int)
50
+
51
+ result = []
52
+ groups_gids.each do |group_gid|
53
+ group_info = Puppet::Etc.getgrgid(group_gid)
54
+ result |= [group_info.name] if group_info.mem.include?(user)
55
+ end
56
+ return result
57
+ end
58
+
59
+ ngroups = ngroups_ptr.read_int
60
+ if ngroups <= old_ngroups
61
+ ngroups *= 2
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
27
67
  end
28
68
 
29
69
  # Retrieve a field from a POSIX Etc object. The id can be either an integer
@@ -144,8 +184,17 @@ module Puppet::Util::POSIX
144
184
  name = get_posix_field(location, :name, id)
145
185
  check_value = name
146
186
  end
187
+
147
188
  if check_value != field
148
- return search_posix_field(location, id_field, field)
189
+ check_value_id = get_posix_field(location, id_field, check_value) if check_value
190
+
191
+ if id == check_value_id
192
+ Puppet.debug("Multiple entries found for resource: '#{location}' with #{id_field}: #{id}")
193
+ return id
194
+ else
195
+ Puppet.debug("The value retrieved: '#{check_value}' is different than the required state: '#{field}', searching in all entries")
196
+ return search_posix_field(location, id_field, field)
197
+ end
149
198
  else
150
199
  return id
151
200
  end
@@ -41,7 +41,11 @@ module Puppet::Util::RubyGems
41
41
  def directories
42
42
  # `require 'mygem'` will consider and potentially load
43
43
  # prerelease gems, so we need to match that behavior.
44
- Gem::Specification.latest_specs(true).collect do |spec|
44
+ #
45
+ # Just load the stub which points to the gem path, and
46
+ # delay loading the full specification until if/when the
47
+ # gem is required.
48
+ Gem::Specification.stubs.collect do |spec|
45
49
  File.join(spec.full_gem_path, 'lib')
46
50
  end
47
51
  end
@@ -13,6 +13,10 @@ require 'pathname'
13
13
 
14
14
  module Puppet::Util::SELinux
15
15
 
16
+ S_IFREG = 0100000
17
+ S_IFDIR = 0040000
18
+ S_IFLNK = 0120000
19
+
16
20
  def self.selinux_support?
17
21
  return false unless defined?(Selinux)
18
22
  if Selinux.is_selinux_enabled == 1
@@ -38,7 +42,7 @@ module Puppet::Util::SELinux
38
42
 
39
43
  # Retrieve and return the default context of the file. If we don't have
40
44
  # SELinux support or if the SELinux call fails to file a default then return nil.
41
- def get_selinux_default_context(file)
45
+ def get_selinux_default_context(file, resource_ensure=nil)
42
46
  return nil unless selinux_support?
43
47
  # If the filesystem has no support for SELinux labels, return a default of nil
44
48
  # instead of what matchpathcon would return
@@ -48,8 +52,14 @@ module Puppet::Util::SELinux
48
52
  begin
49
53
  filestat = file_lstat(file)
50
54
  mode = filestat.mode
51
- rescue Errno::EACCES, Errno::ENOENT
55
+ rescue Errno::EACCES
52
56
  mode = 0
57
+ rescue Errno::ENOENT
58
+ if resource_ensure
59
+ mode = get_create_mode(resource_ensure)
60
+ else
61
+ mode = 0
62
+ end
53
63
  end
54
64
 
55
65
  retval = Selinux.matchpathcon(file, mode)
@@ -136,8 +146,8 @@ module Puppet::Util::SELinux
136
146
  # Puppet uses. This will set the file's SELinux context to the policy's
137
147
  # default context (if any) if it differs from the context currently on
138
148
  # the file.
139
- def set_selinux_default_context(file)
140
- new_context = get_selinux_default_context(file)
149
+ def set_selinux_default_context(file, resource_ensure=nil)
150
+ new_context = get_selinux_default_context(file, resource_ensure)
141
151
  return nil unless new_context
142
152
  cur_context = get_selinux_current_context(file)
143
153
  if new_context != cur_context
@@ -198,6 +208,22 @@ module Puppet::Util::SELinux
198
208
  filesystems.include?(fstype)
199
209
  end
200
210
 
211
+ # Get mode file type bits set based on ensure on
212
+ # the file resource. This helps SELinux determine
213
+ # what context a new resource being created should have.
214
+ def get_create_mode(resource_ensure)
215
+ mode = 0
216
+ case resource_ensure
217
+ when :present, :file
218
+ mode |= S_IFREG
219
+ when :directory
220
+ mode |= S_IFDIR
221
+ when :link
222
+ mode |= S_IFLNK
223
+ end
224
+ mode
225
+ end
226
+
201
227
  # Internal helper function to read and parse /proc/mounts
202
228
  def read_mounts
203
229
  mounts = ""
@@ -504,6 +504,43 @@ module Puppet::Util::Windows::ADSI
504
504
  user_name
505
505
  end
506
506
 
507
+ # https://docs.microsoft.com/en-us/windows/win32/api/secext/ne-secext-extended_name_format
508
+ NameUnknown = 0
509
+ NameFullyQualifiedDN = 1
510
+ NameSamCompatible = 2
511
+ NameDisplay = 3
512
+ NameUniqueId = 6
513
+ NameCanonical = 7
514
+ NameUserPrincipal = 8
515
+ NameCanonicalEx = 9
516
+ NameServicePrincipal = 10
517
+ NameDnsDomain = 12
518
+ NameGivenName = 13
519
+ NameSurname = 14
520
+
521
+ def self.current_user_name_with_format(format)
522
+ user_name = ''
523
+ max_length = 1024
524
+
525
+ FFI::MemoryPointer.new(:lpwstr, max_length * 2 + 1) do |buffer|
526
+ FFI::MemoryPointer.new(:dword, 1) do |buffer_size|
527
+ buffer_size.write_dword(max_length + 1)
528
+
529
+ if GetUserNameExW(format.to_i, buffer, buffer_size) == FFI::WIN32_FALSE
530
+ raise Puppet::Util::Windows::Error.new(_("Failed to get user name"), FFI.errno)
531
+ end
532
+
533
+ user_name = buffer.read_wide_string(buffer_size.read_dword).chomp
534
+ end
535
+ end
536
+
537
+ user_name
538
+ end
539
+
540
+ def self.current_sam_compatible_user_name
541
+ current_user_name_with_format(NameSamCompatible)
542
+ end
543
+
507
544
  def self.current_user_sid
508
545
  Puppet::Util::Windows::SID.name_to_principal(current_user_name)
509
546
  end
@@ -518,6 +555,15 @@ module Puppet::Util::Windows::ADSI
518
555
  ffi_lib :advapi32
519
556
  attach_function_private :GetUserNameW,
520
557
  [:lpwstr, :lpdword], :win32_bool
558
+
559
+ # https://docs.microsoft.com/en-us/windows/win32/api/secext/nf-secext-getusernameexa
560
+ # BOOLEAN SEC_ENTRY GetUserNameExA(
561
+ # EXTENDED_NAME_FORMAT NameFormat,
562
+ # LPSTR lpNameBuffer,
563
+ # PULONG nSize
564
+ # );type
565
+ ffi_lib :secur32
566
+ attach_function_private :GetUserNameExW, [:uint16, :lpwstr, :pointer], :win32_bool
521
567
  end
522
568
 
523
569
  class UserProfile