chef 18.0.185-x64-mingw-ucrt → 18.1.29-x64-mingw-ucrt

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +0 -3
  3. data/chef.gemspec +3 -2
  4. data/lib/chef/application/base.rb +18 -2
  5. data/lib/chef/chef_fs/file_system.rb +21 -7
  6. data/lib/chef/client.rb +23 -6
  7. data/lib/chef/http/authenticator.rb +117 -34
  8. data/lib/chef/mixin/proxified_socket.rb +1 -1
  9. data/lib/chef/property.rb +8 -3
  10. data/lib/chef/provider/launchd.rb +1 -0
  11. data/lib/chef/provider/package/yum/yum_helper.py +5 -17
  12. data/lib/chef/provider/yum_repository.rb +13 -1
  13. data/lib/chef/resource/apt_repository.rb +20 -2
  14. data/lib/chef/resource/bash.rb +13 -0
  15. data/lib/chef/resource/dsc_script.rb +1 -1
  16. data/lib/chef/resource/launchd.rb +4 -1
  17. data/lib/chef/resource/macos_userdefaults.rb +3 -3
  18. data/lib/chef/resource/rhsm_register.rb +2 -1
  19. data/lib/chef/resource/selinux_fcontext.rb +1 -1
  20. data/lib/chef/resource/selinux_permissive.rb +1 -1
  21. data/lib/chef/resource/selinux_port.rb +1 -1
  22. data/lib/chef/resource/selinux_state.rb +1 -1
  23. data/lib/chef/resource/service.rb +1 -1
  24. data/lib/chef/resource/user.rb +2 -2
  25. data/lib/chef/resource/windows_user_privilege.rb +14 -10
  26. data/lib/chef/resource/yum_repository.rb +4 -0
  27. data/lib/chef/version.rb +1 -1
  28. data/spec/functional/assets/yumrepo-empty/repodata/01a3b489a465bcac22a43492163df43451dc6ce47d27f66de289756b91635523-filelists.sqlite.bz2 +0 -0
  29. data/spec/functional/assets/yumrepo-empty/repodata/401dc19bda88c82c403423fb835844d64345f7e95f5b9835888189c03834cc93-filelists.xml.gz +0 -0
  30. data/spec/functional/assets/yumrepo-empty/repodata/5dc1e6e73c84803f059bb3065e684e56adfc289a7e398946574d79dac6643945-primary.sqlite.bz2 +0 -0
  31. data/spec/functional/assets/yumrepo-empty/repodata/6bf9672d0862e8ef8b8ff05a2fd0208a922b1f5978e6589d87944c88259cb670-other.xml.gz +0 -0
  32. data/spec/functional/assets/yumrepo-empty/repodata/7c36572015e075add2b38b900837bcdbb8a504130ddff49b2351a7fc0affa3d4-other.sqlite.bz2 +0 -0
  33. data/spec/functional/assets/yumrepo-empty/repodata/dabe2ce5481d23de1f4f52bdcfee0f9af98316c9e0de2ce8123adeefa0dd08b9-primary.xml.gz +0 -0
  34. data/spec/functional/assets/yumrepo-empty/repodata/repomd.xml +55 -0
  35. data/spec/functional/resource/yum_package_spec.rb +16 -0
  36. data/spec/integration/client/client_spec.rb +22 -16
  37. data/spec/integration/client/fips_spec.rb +20 -0
  38. data/spec/spec_helper.rb +4 -0
  39. data/spec/support/platform_helpers.rb +4 -0
  40. data/spec/unit/chef_fs/file_system_spec.rb +2 -0
  41. data/spec/unit/client_spec.rb +26 -2
  42. data/spec/unit/compliance/runner_spec.rb +8 -0
  43. data/spec/unit/http/authenticator_spec.rb +64 -11
  44. data/spec/unit/property/validation_spec.rb +30 -0
  45. data/spec/unit/provider/apt_repository_spec.rb +26 -5
  46. data/spec/unit/resource/yum_repository_spec.rb +4 -0
  47. metadata +21 -14
  48. data/distro/powershell/chef/chef.psm1 +0 -459
@@ -43,6 +43,19 @@ class Chef
43
43
  end
44
44
  ```
45
45
 
46
+ **Using escape characters in a string of code**
47
+
48
+ In the following example, the `find` command uses an escape character (`\`). Use a second escape character (`\\`) to preserve the escape character in the code string:
49
+
50
+ ```ruby
51
+ bash 'delete some archives ' do
52
+ code <<-EOH
53
+ find ./ -name "*.tar.Z" -mtime +180 -exec rm -f {} \\;
54
+ EOH
55
+ ignore_failure true
56
+ end
57
+ ```
58
+
46
59
  **Install a file from a remote location**
47
60
 
48
61
  The following is an example of how to install the foo123 module for Nginx. This module adds shell-style functionality to an Nginx configuration file and does the following:
@@ -34,7 +34,7 @@ class Chef
34
34
  resource in #{ChefUtils::Dist::Infra::PRODUCT}, such as the Archive resource, a custom DSC resource, an existing DSC script that performs an important
35
35
  task, and so on. Use the dsc_script resource to embed the code that defines a DSC configuration directly within a #{ChefUtils::Dist::Infra::PRODUCT} recipe.
36
36
 
37
- Warning: The **dsc_script** resource may not be used with the 32 bit Chef Infra client. It must be executed from a 64 bit Chef Infra client.
37
+ Warning: The **dsc_script** resource is only available on 64-bit Chef Infra Client.
38
38
  DESC
39
39
 
40
40
  default_action :run
@@ -21,7 +21,7 @@ require_relative "../resource"
21
21
  class Chef
22
22
  class Resource
23
23
  class Launchd < Chef::Resource
24
- provides :launchd
24
+ provides :launchd, os: "darwin"
25
25
 
26
26
  description "Use the **launchd** resource to manage system-wide services (daemons) and per-user services (agents) on the macOS platform."
27
27
  introduced "12.8"
@@ -129,6 +129,9 @@ class Chef
129
129
  property :abandon_process_group, [ TrueClass, FalseClass ],
130
130
  description: "If a job dies, all remaining processes with the same process ID may be kept running. Set to true to kill all remaining processes."
131
131
 
132
+ property :associated_bundle_identifiers, Array,
133
+ description: "This optional key indicates which bundles the Login Items Added by Apps panel associates with the helper executable."
134
+
132
135
  property :debug, [ TrueClass, FalseClass ],
133
136
  description: "Sets the log mask to `LOG_DEBUG` for this job."
134
137
 
@@ -69,7 +69,7 @@ class Chef
69
69
 
70
70
  property :global, [TrueClass, FalseClass],
71
71
  description: "Determines whether or not the domain is global.",
72
- deprecated: true,
72
+ deprecated: "As of Chef Infra Client 17.8 the `global` property is no longer necessary.",
73
73
  default: false,
74
74
  desired_state: false
75
75
 
@@ -90,7 +90,7 @@ class Chef
90
90
  description: "The value type of the preference key.",
91
91
  equal_to: %w{bool string int float array dict},
92
92
  desired_state: false,
93
- deprecated: true
93
+ deprecated: "As of Chef Infra Client 17.8 the `type` property is no longer necessary."
94
94
 
95
95
  property :user, [String, Symbol],
96
96
  description: "The system user that the default will be applied to. Set :current for current user, :all for all users or pass a valid username",
@@ -100,7 +100,7 @@ class Chef
100
100
  description: "Set to true if the setting you wish to modify requires privileged access. This requires passwordless sudo for the `/usr/bin/defaults` command to be setup for the user running #{ChefUtils::Dist::Infra::PRODUCT}.",
101
101
  default: false,
102
102
  desired_state: false,
103
- deprecated: true
103
+ deprecated: "As of Chef Infra Client 17.8 the `sudo` property is no longer necessary."
104
104
 
105
105
  load_current_value do |new_resource|
106
106
  Chef::Log.debug "#load_current_value: attempting to read \"#{new_resource.domain}\" value from preferences to determine state"
@@ -92,7 +92,7 @@ class Chef
92
92
 
93
93
  property :release,
94
94
  [Float, String],
95
- description: "Sets the operating system minor release to use for subscriptions for the system. Products and updates are limited to the specified minor release version. This is used only used with the `auto_attach` option. For example, `release '6.4'` will append `--release=6.4` to the register command.",
95
+ description: "Sets the operating system minor release to use for subscriptions for the system. Products and updates are limited to the specified minor release version. This is used with the `auto_attach` or `activation_key` options. For example, `release '6.4'` will append `--release=6.4` to the register command.",
96
96
  introduced: "17.8"
97
97
 
98
98
  action :register, description: "Register the node with RHSM." do
@@ -205,6 +205,7 @@ class Chef
205
205
  command << "--name=#{Shellwords.shellescape(new_resource.system_name)}" if new_resource.system_name
206
206
  command << "--serverurl=#{Shellwords.shellescape(new_resource.server_url)}" if new_resource.server_url
207
207
  command << "--baseurl=#{Shellwords.shellescape(new_resource.base_url)}" if new_resource.base_url
208
+ command << "--release=#{Shellwords.shellescape(new_resource.release)}" if new_resource.release
208
209
  command << "--force" if new_resource.force
209
210
 
210
211
  return command.join(" ")
@@ -22,7 +22,7 @@ class Chef
22
22
 
23
23
  provides :selinux_fcontext
24
24
 
25
- description "Use **selinux_fcontext** resource to set the SELinux context of files with semanage fcontext."
25
+ description "Use the **selinux_fcontext** resource to set the SELinux context of files using the `semanage fcontext` command."
26
26
  introduced "18.0"
27
27
  examples <<~DOC
28
28
  **Allow http servers (e.g. nginx/apache) to modify moodle files**:
@@ -20,7 +20,7 @@ class Chef
20
20
 
21
21
  provides :selinux_permissive
22
22
 
23
- description "Use **selinux_permissive** resource to allows some types to misbehave without stopping them. Not as good as specific policies, but better than disabling SELinux entirely."
23
+ description "Use the **selinux_permissive** resource to allow some domains to misbehave without stopping them. This is not as good as setting specific policies, but better than disabling SELinux entirely."
24
24
  introduced "18.0"
25
25
  examples <<~DOC
26
26
  **Disable enforcement on Apache**:
@@ -21,7 +21,7 @@ class Chef
21
21
 
22
22
  provides :selinux_port
23
23
 
24
- description "Use **selinux_port** resource to allows assigning a network port to a certain SELinux context, e.g. for running a webserver on a non-standard port."
24
+ description "Use the **selinux_port** resource to assign a network port to a specific SELinux context. For example, running a web server on a non-standard port."
25
25
  introduced "18.0"
26
26
  examples <<~DOC
27
27
  **Allow nginx/apache to bind to port 5678 by giving it the http_port_t context**:
@@ -56,7 +56,7 @@ class Chef
56
56
 
57
57
  property :persistent, [true, false],
58
58
  default: true,
59
- description: "Persist status update to the selinux configuration file."
59
+ description: "Set the status update in the SELinux configuration file."
60
60
 
61
61
  property :policy, String,
62
62
  default: lazy { default_policy_platform },
@@ -81,7 +81,7 @@ class Chef
81
81
  # specify overrides for the start_command, stop_command and
82
82
  # restart_command properties.
83
83
  property :init_command, String,
84
- description: "The path to the init script that is associated with the service. Use init_command to prevent the need to specify overrides for the start_command, stop_command, and restart_command properties. When this property is not specified, the #{ChefUtils::Dist::Infra::PRODUCT} will use the default init command for the service provider being used.",
84
+ description: "The path to the init script that is associated with the service. Use `init_command` to prevent the need to specify overrides for the `start_command`, `stop_command`, and `restart_command` properties. When this property is not specified, the #{ChefUtils::Dist::Infra::PRODUCT} will use the default init command for the service provider being used.",
85
85
  desired_state: false
86
86
 
87
87
  # if the service is enabled or not
@@ -74,12 +74,12 @@ class Chef
74
74
  alias_method :group, :gid
75
75
 
76
76
  property :expire_date, [ String, NilClass ],
77
- description: "(Linux) The date on which the user account will be disabled. The date is specified in the format YYYY-MM-DD.",
77
+ description: "(Linux) The date on which the user account will be disabled. The date is specified in YYYY-MM-DD format.",
78
78
  introduced: "18.0",
79
79
  desired_state: false
80
80
 
81
81
  property :inactive, [ String, Integer, NilClass ],
82
- description: "(Linux) The number of days after a password expires until the account is permanently disabled. A value of 0 disables the account as soon as the password has expired, and a value of -1 disables the feature.",
82
+ description: "(Linux) The number of days after a password expires until the account is permanently disabled. A value of `0` disables the account as soon as the password has expired, and a value of `-1` disables the feature.",
83
83
  introduced: "18.0",
84
84
  desired_state: false
85
85
  end
@@ -23,12 +23,14 @@ class Chef
23
23
  class WindowsUserPrivilege < Chef::Resource
24
24
 
25
25
  provides :windows_user_privilege
26
- description "The windows_user_privilege resource allows to add a privilege to a principal or (User/Group).\n Ref: https://docs.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/user-rights-assignment"
26
+ description "Use the **windows_user_privilege** resource to set privileges for a principal, user, or group.\n See [Microsoft's user rights assignment documentation](https://learn.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/user-rights-assignment) for more information."
27
27
 
28
28
  introduced "16.0"
29
29
 
30
30
  examples <<~DOC
31
- **Set the SeNetworkLogonRight Privilege for the Builtin Administrators Group and Authenticated Users**:
31
+ **Set the SeNetworkLogonRight privilege for the Builtin Administrators and Authenticated Users groups**:
32
+
33
+ The `:set` action will add this privilege for these two groups and remove this privilege from all other groups or users.
32
34
 
33
35
  ```ruby
34
36
  windows_user_privilege 'Network Logon Rights' do
@@ -38,7 +40,9 @@ class Chef
38
40
  end
39
41
  ```
40
42
 
41
- **Provide only the Builtin Guests and Administrator Groups with the SeCreatePageFile Privilege**:
43
+ **Set the SeCreatePagefilePrivilege privilege for the Builtin Guests and Administrator groups**:
44
+
45
+ The `:set` action will add this privilege for these two groups and remove this privilege from all other groups or users.
42
46
 
43
47
  ```ruby
44
48
  windows_user_privilege 'Create Pagefile' do
@@ -48,7 +52,7 @@ class Chef
48
52
  end
49
53
  ```
50
54
 
51
- **Add the SeDenyRemoteInteractiveLogonRight Privilege to the 'Remote interactive logon' principal**:
55
+ **Add the SeDenyRemoteInteractiveLogonRight privilege to the 'Remote interactive logon' principal**:
52
56
 
53
57
  ```ruby
54
58
  windows_user_privilege 'Remote interactive logon' do
@@ -57,7 +61,7 @@ class Chef
57
61
  end
58
62
  ```
59
63
 
60
- **Add to the Builtin Guests Group the SeCreatePageFile Privilege**:
64
+ **Add the SeCreatePageFilePrivilege privilege to the Builtin Guests group**:
61
65
 
62
66
  ```ruby
63
67
  windows_user_privilege 'Guests add Create Pagefile' do
@@ -67,7 +71,7 @@ class Chef
67
71
  end
68
72
  ```
69
73
 
70
- **Remove the SeCreatePageFile Privilege from the Builtin Guests Group**:
74
+ **Remove the SeCreatePageFilePrivilege privilege from the Builtin Guests group**:
71
75
 
72
76
  ```ruby
73
77
  windows_user_privilege 'Create Pagefile' do
@@ -77,7 +81,7 @@ class Chef
77
81
  end
78
82
  ```
79
83
 
80
- **Clear all users from the SeDenyNetworkLogonRight Privilege**:
84
+ **Clear the SeDenyNetworkLogonRight privilege from all users**:
81
85
 
82
86
  ```ruby
83
87
  windows_user_privilege 'Allow any user the Network Logon right' do
@@ -135,15 +139,15 @@ class Chef
135
139
  }.freeze
136
140
 
137
141
  property :principal, String,
138
- description: "An optional property to add the privilege for given principal. Use only with add and remove action. Principal can either be a User/Group or one of special identities found here Ref: https://docs.microsoft.com/en-us/windows/security/identity-protection/access-control/special-identities",
142
+ description: "An optional property to add the privilege for given principal. Use only with add and remove action. Principal can either be a user, group, or [special identity](https://docs.microsoft.com/en-us/windows/security/identity-protection/access-control/special-identities).",
139
143
  name_property: true
140
144
 
141
145
  property :users, [Array, String],
142
- description: "An optional property to set the privilege for given users. Use only with set action.",
146
+ description: "An optional property to set the privilege for the specified users. Use only with `:set` action",
143
147
  coerce: proc { |v| Array(v) }
144
148
 
145
149
  property :privilege, [Array, String],
146
- description: "One or more privileges to set for principal or users/groups. For more information on what each privilege does Ref: https://learn.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/user-rights-assignment",
150
+ description: "One or more privileges to set for principal or users/groups. For more information, see [Microsoft's documentation on what each privilege does](https://learn.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/user-rights-assignment).",
147
151
  required: true,
148
152
  coerce: proc { |v| Array(v) },
149
153
  callbacks: {
@@ -114,6 +114,10 @@ class Chef
114
114
  description: "Determines whether package files downloaded by Yum stay in cache directories. By using cached data, you can carry out certain operations without a network connection.",
115
115
  default: true
116
116
 
117
+ property :makecache_fast, [TrueClass, FalseClass],
118
+ description: "if make_cache is true, uses `yum makecache fast`, which downloads only the minimum amount of data required. Useful over slower connections and when disk space is at a premium.",
119
+ default: false
120
+
117
121
  property :max_retries, [String, Integer],
118
122
  description: "Number of times any attempt to retrieve a file should retry before returning an error. Setting this to `0` makes Yum try forever."
119
123
 
data/lib/chef/version.rb CHANGED
@@ -23,7 +23,7 @@ require_relative "version_string"
23
23
 
24
24
  class Chef
25
25
  CHEF_ROOT = File.expand_path("..", __dir__)
26
- VERSION = Chef::VersionString.new("18.0.185")
26
+ VERSION = Chef::VersionString.new("18.1.29")
27
27
  end
28
28
 
29
29
  #
@@ -0,0 +1,55 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <repomd xmlns="http://linux.duke.edu/metadata/repo" xmlns:rpm="http://linux.duke.edu/metadata/rpm">
3
+ <revision>1667508211</revision>
4
+ <data type="filelists">
5
+ <checksum type="sha256">401dc19bda88c82c403423fb835844d64345f7e95f5b9835888189c03834cc93</checksum>
6
+ <open-checksum type="sha256">bf9808b81cb2dbc54b4b8e35adc584ddcaa73bd81f7088d73bf7dbbada961310</open-checksum>
7
+ <location href="repodata/401dc19bda88c82c403423fb835844d64345f7e95f5b9835888189c03834cc93-filelists.xml.gz"/>
8
+ <timestamp>1667508211</timestamp>
9
+ <size>123</size>
10
+ <open-size>125</open-size>
11
+ </data>
12
+ <data type="primary">
13
+ <checksum type="sha256">dabe2ce5481d23de1f4f52bdcfee0f9af98316c9e0de2ce8123adeefa0dd08b9</checksum>
14
+ <open-checksum type="sha256">e1e2ffd2fb1ee76f87b70750d00ca5677a252b397ab6c2389137a0c33e7b359f</open-checksum>
15
+ <location href="repodata/dabe2ce5481d23de1f4f52bdcfee0f9af98316c9e0de2ce8123adeefa0dd08b9-primary.xml.gz"/>
16
+ <timestamp>1667508211</timestamp>
17
+ <size>134</size>
18
+ <open-size>167</open-size>
19
+ </data>
20
+ <data type="primary_db">
21
+ <checksum type="sha256">5dc1e6e73c84803f059bb3065e684e56adfc289a7e398946574d79dac6643945</checksum>
22
+ <open-checksum type="sha256">f0d550414e8f2e960e82e704549364299ca9e3e8664ad4faffd208262c3b6d12</open-checksum>
23
+ <location href="repodata/5dc1e6e73c84803f059bb3065e684e56adfc289a7e398946574d79dac6643945-primary.sqlite.bz2"/>
24
+ <timestamp>1667508211</timestamp>
25
+ <database_version>10</database_version>
26
+ <size>1131</size>
27
+ <open-size>21504</open-size>
28
+ </data>
29
+ <data type="other_db">
30
+ <checksum type="sha256">7c36572015e075add2b38b900837bcdbb8a504130ddff49b2351a7fc0affa3d4</checksum>
31
+ <open-checksum type="sha256">4de0fe7c5dd2674849a7c63c326e42f33af0a0f46219bc6dd59f51dfa2ac8c68</open-checksum>
32
+ <location href="repodata/7c36572015e075add2b38b900837bcdbb8a504130ddff49b2351a7fc0affa3d4-other.sqlite.bz2"/>
33
+ <timestamp>1667508211</timestamp>
34
+ <database_version>10</database_version>
35
+ <size>575</size>
36
+ <open-size>6144</open-size>
37
+ </data>
38
+ <data type="other">
39
+ <checksum type="sha256">6bf9672d0862e8ef8b8ff05a2fd0208a922b1f5978e6589d87944c88259cb670</checksum>
40
+ <open-checksum type="sha256">e0ed5e0054194df036cf09c1a911e15bf2a4e7f26f2a788b6f47d53e80717ccc</open-checksum>
41
+ <location href="repodata/6bf9672d0862e8ef8b8ff05a2fd0208a922b1f5978e6589d87944c88259cb670-other.xml.gz"/>
42
+ <timestamp>1667508211</timestamp>
43
+ <size>123</size>
44
+ <open-size>121</open-size>
45
+ </data>
46
+ <data type="filelists_db">
47
+ <checksum type="sha256">01a3b489a465bcac22a43492163df43451dc6ce47d27f66de289756b91635523</checksum>
48
+ <open-checksum type="sha256">c4211f57bdcbb142c9f93a6d32401539f775eb6a670ab7a423e13f435ce94689</open-checksum>
49
+ <location href="repodata/01a3b489a465bcac22a43492163df43451dc6ce47d27f66de289756b91635523-filelists.sqlite.bz2"/>
50
+ <timestamp>1667508211</timestamp>
51
+ <database_version>10</database_version>
52
+ <size>586</size>
53
+ <open-size>7168</open-size>
54
+ </data>
55
+ </repomd>
@@ -57,6 +57,12 @@ describe Chef::Resource::YumPackage, :requires_root, external: exclude_test do
57
57
  baseurl=file://#{CHEF_SPEC_ASSETS}/yumrepo
58
58
  enable=1
59
59
  gpgcheck=0
60
+ [chef-yum-empty]
61
+ name=Chef DNF spec empty repo
62
+ baseurl=file://#{CHEF_SPEC_ASSETS}/yumrepo-empty
63
+ enable=1
64
+ gpgcheck=0
65
+
60
66
  EOF
61
67
  end
62
68
  # ensure we don't have any stray chef_rpms installed
@@ -1095,6 +1101,16 @@ describe Chef::Resource::YumPackage, :requires_root, external: exclude_test do
1095
1101
  end.should_not_be_updated
1096
1102
  end
1097
1103
 
1104
+ it "should work to disable a repo" do
1105
+ flush_cache
1106
+ expect {
1107
+ yum_package "chef_rpm" do
1108
+ options "--disablerepo=chef-yum-localtesting --enablerepo=chef-yum-empty"
1109
+ action :install
1110
+ end
1111
+ }.to raise_error(Chef::Exceptions::Package, /No candidate version available/)
1112
+ end
1113
+
1098
1114
  it "when an idempotent install action is run, does not leave repos disabled" do
1099
1115
  flush_cache
1100
1116
  # this is a bit tricky -- we need this action to be idempotent, so that it doesn't recycle any
@@ -35,14 +35,14 @@ describe "chef-client" do
35
35
  @server = @api = nil
36
36
  end
37
37
 
38
- def install_certificate_in_store(client_name)
38
+ def install_certificate_in_store(client_name, store_location)
39
39
  if ChefUtils.windows?
40
40
  powershell_exec! <<~EOH
41
41
  if (-not (($PSVersionTable.PSVersion.Major -ge 5) -and ($PSVersionTable.PSVersion.Build -ge 22000)) ) {
42
- New-SelfSignedCertificate -CertStoreLocation Cert:\\LocalMachine\\My -DnsName "#{client_name}"
42
+ New-SelfSignedCertificate -CertStoreLocation Cert:\\#{store_location}\\My -DnsName "#{client_name}"
43
43
  }
44
44
  else {
45
- New-SelfSignedCertificate -CertStoreLocation Cert:\\LocalMachine\\My -Subject "#{client_name}" -FriendlyName "#{client_name}" -KeyExportPolicy Exportable
45
+ New-SelfSignedCertificate -CertStoreLocation Cert:\\#{store_location}\\My -Subject "#{client_name}" -FriendlyName "#{client_name}" -KeyExportPolicy Exportable
46
46
  }
47
47
  EOH
48
48
  end
@@ -50,14 +50,6 @@ describe "chef-client" do
50
50
 
51
51
  def create_registry_key
52
52
  ::Chef::HTTP::Authenticator.get_cert_password
53
- # @win32registry = Chef::Win32::Registry.new
54
- # path = "HKEY_LOCAL_MACHINE\\Software\\Progress\\Authentication"
55
- # unless @win32registry.key_exists?(path)
56
- # @win32registry.create_key(path, true)
57
- # end
58
- # password = SOME_CHARS.sample(1 + rand(SOME_CHARS.count)).join[0...14]
59
- # values = { name: "PfxPass", type: :string, data: password }
60
- # @win32registry.set_value(path, values)
61
53
  end
62
54
 
63
55
  def remove_certificate_from_store
@@ -111,6 +103,9 @@ describe "chef-client" do
111
103
  tempfile.close
112
104
  @path = tempfile.path
113
105
  Chef::Config.validation_key = @path
106
+ if ChefUtils.windows?
107
+ create_registry_key
108
+ end
114
109
 
115
110
  file "config/client.rb", <<~EOM
116
111
  local_mode true
@@ -201,17 +196,27 @@ describe "chef-client" do
201
196
 
202
197
  if ChefUtils.windows?
203
198
  context "and the private key is in the Windows CertStore" do
204
- before do
205
- install_certificate_in_store(client_name)
199
+
200
+ it "should verify that the cert is loaded in the \\LocalMachine\\My store" do
201
+ Chef::Config[:auth_key_registry_type] = "machine"
202
+ install_certificate_in_store(client_name, "LocalMachine")
206
203
  create_registry_key
204
+ expect(Chef::HTTP::Authenticator.check_certstore_for_key(hostname)).to eq(true)
207
205
  end
208
206
 
209
- after do
207
+ it "should verify that the export password for the pfx is loaded in the Registry" do
208
+ expect(verify_export_password_exists.result).to eq(true)
209
+ end
210
+
211
+ it "should verify that a private key is returned to me" do
212
+ expect(Chef::HTTP::Authenticator.retrieve_certificate_key(client_name)).not_to be nil
210
213
  remove_certificate_from_store
211
- remove_registry_key
212
214
  end
213
215
 
214
- it "should verify that the cert is loaded in the LocalMachine\\My" do
216
+ it "should verify that the cert is loaded in the \\CurrentUser\\My store" do
217
+ Chef::Config[:auth_key_registry_type] = "user"
218
+ install_certificate_in_store(client_name, "CurrentUser")
219
+ create_registry_key
215
220
  expect(Chef::HTTP::Authenticator.check_certstore_for_key(hostname)).to eq(true)
216
221
  end
217
222
 
@@ -221,6 +226,7 @@ describe "chef-client" do
221
226
 
222
227
  it "should verify that a private key is returned to me" do
223
228
  expect(Chef::HTTP::Authenticator.retrieve_certificate_key(client_name)).not_to be nil
229
+ remove_certificate_from_store
224
230
  end
225
231
  end
226
232
  end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+
3
+ describe "chef-client fips" do
4
+ def enable_fips
5
+ OpenSSL.fips_mode = true
6
+ end
7
+
8
+ # All tests assume fips mode is off at present
9
+ after { OpenSSL.fips_mode = false }
10
+
11
+ # For non-FIPS OSes/builds of Ruby, enabling FIPS should error
12
+ example "Error enabling fips_mode if FIPS not linked", fips_mode: false do
13
+ expect { enable_fips }.to raise_error(OpenSSL::OpenSSLError)
14
+ end
15
+
16
+ # For FIPS OSes/builds of Ruby, enabling FIPS should not error
17
+ example "Do not error enabling fips_mode if FIPS linked", fips_mode: true do
18
+ expect { enable_fips }.not_to raise_error
19
+ end
20
+ end
data/spec/spec_helper.rb CHANGED
@@ -138,6 +138,10 @@ RSpec.configure do |config|
138
138
 
139
139
  config.filter_run_excluding skip_buildkite: true if ENV["BUILDKITE"]
140
140
 
141
+ config.filter_run_excluding fips_mode: !fips_mode_build?
142
+ # Skip fips on windows
143
+ # config.filter_run_excluding :fips_mode if windows?
144
+
141
145
  config.filter_run_excluding windows_only: true unless windows?
142
146
  config.filter_run_excluding not_supported_on_windows: true if windows?
143
147
  config.filter_run_excluding not_supported_on_macos: true if macos?
@@ -223,6 +223,10 @@ def aes_256_gcm?
223
223
  OpenSSL::Cipher.ciphers.include?("aes-256-gcm")
224
224
  end
225
225
 
226
+ def fips_mode_build?
227
+ OpenSSL::OPENSSL_FIPS
228
+ end
229
+
226
230
  def fips?
227
231
  ENV["CHEF_FIPS"] == "1"
228
232
  end
@@ -145,4 +145,6 @@ describe Chef::ChefFS::FileSystem, ruby: ">= 3.0" do
145
145
  end
146
146
  end
147
147
  end
148
+
149
+ # Need to add the test case for copy_to method - not able to do the implimentation with Dir.mktmpdir
148
150
  end
@@ -310,25 +310,49 @@ describe Chef::Client, :windows_only do
310
310
  end
311
311
 
312
312
  context "when the client intially boots the first time" do
313
- it "verfies that a certificate was correctly created and exists in the Cert Store" do
313
+ it "verfies that a certificate was correctly created and exists in the LocalMachine Cert Store" do
314
+ Chef::Config[:node_name] = "test"
314
315
  new_pfx = my_client.generate_pfx_package(cert_name, end_date)
315
316
  my_client.import_pfx_to_store(new_pfx)
316
317
  expect(my_client.check_certstore_for_key(cert_name)).not_to be false
318
+ delete_certificate(cert_name)
317
319
  end
318
320
 
319
321
  it "correctly returns a new Publc Key" do
320
322
  new_pfx = my_client.generate_pfx_package(cert_name, end_date)
321
323
  cert_object = new_pfx.certificate.public_key.to_pem
322
324
  expect(cert_object.to_s).to match(/PUBLIC KEY/)
325
+ delete_certificate(cert_name)
326
+ end
327
+
328
+ end
329
+
330
+ context "when the client intially boots the first time and auth_key_registry_type is set to 'user' " do
331
+ it "verfies that a certificate was correctly created and exists in the CurrentUser Cert Store" do
332
+ Chef::Config[:node_name] = "test"
333
+ Chef::Config[:auth_key_registry_type] = "user"
334
+ new_pfx = my_client.generate_pfx_package(cert_name, end_date)
335
+ my_client.import_pfx_to_store(new_pfx)
336
+ expect(my_client.check_certstore_for_key(cert_name)).not_to be false
337
+ delete_certificate(cert_name)
338
+ end
339
+
340
+ it "correctly returns a new Publc Key" do
341
+ Chef::Config[:auth_key_registry_type] = "user"
342
+ new_pfx = my_client.generate_pfx_package(cert_name, end_date)
343
+ cert_object = new_pfx.certificate.public_key.to_pem
344
+ expect(cert_object.to_s).to match(/PUBLIC KEY/)
345
+ delete_certificate(cert_name)
323
346
  end
324
347
 
325
348
  end
326
349
 
327
350
  def delete_certificate(cert_name)
351
+ Chef::Config[:auth_key_registry_type] == "user" ? store = "CurrentUser" : store = "LocalMachine"
328
352
  require "chef/mixin/powershell_exec"
329
353
  extend Chef::Mixin::PowershellExec
330
354
  powershell_code = <<~CODE
331
- Get-ChildItem -path cert:\\LocalMachine\\My -Recurse -Force | Where-Object { $_.Subject -Match "#{cert_name}" } | Remove-item
355
+ Get-ChildItem -path cert:\\#{store}\\My -Recurse -Force | Where-Object { $_.Subject -Match "#{cert_name}" } | Remove-item
332
356
  CODE
333
357
  powershell_exec!(powershell_code)
334
358
  end
@@ -49,6 +49,14 @@ describe Chef::Compliance::Runner do
49
49
  expect(runner).not_to be_enabled
50
50
  end
51
51
 
52
+ it "is false if the node attributes have audit profiles and the audit cookbook is present, and the complince mode attribute is false" do
53
+ stub_const("::Reporter::ChefAutomate", true)
54
+ node.normal["audit"]["profiles"]["ssh"] = { 'compliance': "base/ssh" }
55
+ node.normal["audit"]["compliance_phase"] = false
56
+
57
+ expect(runner).not_to be_enabled
58
+ end
59
+
52
60
  it "is true if the node attributes have audit profiles and the audit cookbook is present, and the complince mode attribute is true" do
53
61
  stub_const("::Reporter::ChefAutomate", true)
54
62
  node.normal["audit"]["profiles"]["ssh"] = { 'compliance': "base/ssh" }