microwave 1.0.4 → 11.400.2
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.
- data/CONTRIBUTING.md +155 -0
- data/README.md +89 -0
- data/Rakefile +2 -2
- data/bin/chef-apply +25 -0
- data/bin/chef-shell +34 -0
- data/bin/chef-solo +0 -2
- data/bin/shef +6 -5
- data/lib/chef.rb +2 -4
- data/spec/data/big_json.json +2 -1
- data/spec/data/big_json_plus_one.json +2 -1
- data/spec/data/cookbooks/chefignore +2 -0
- data/spec/data/cookbooks/openldap/attributes/default.rb +10 -9
- data/spec/data/cookbooks/openldap/attributes/smokey.rb +1 -1
- data/spec/data/git_bundles/sinatra-test-app-with-callback-files.gitbundle +0 -0
- data/spec/data/git_bundles/sinatra-test-app-with-symlinks.gitbundle +0 -0
- data/spec/data/git_bundles/sinatra-test-app.gitbundle +0 -0
- data/spec/data/lwrp/providers/inline_compiler.rb +26 -0
- data/spec/data/nodes/default.rb +3 -3
- data/spec/data/nodes/test.example.com.rb +3 -3
- data/spec/data/nodes/test.rb +3 -3
- data/spec/data/partial_one.erb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep1/attributes/default.rb +4 -0
- data/spec/data/run_context/cookbooks/circular-dep1/definitions/circular_dep1_res.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep1/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep1/metadata.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep1/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep1/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/circular-dep1/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep2/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/circular-dep2/definitions/circular_dep2_res.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep2/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep2/metadata.rb +2 -0
- data/spec/data/run_context/cookbooks/circular-dep2/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/circular-dep2/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/circular-dep2/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency1/attributes/aa_first.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency1/attributes/default.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency1/attributes/zz_last.rb +3 -0
- data/spec/data/run_context/cookbooks/dependency1/definitions/dependency1_res.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency1/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency1/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency1/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/dependency1/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency2/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/dependency2/definitions/dependency2_res.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency2/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/dependency2/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/dependency2/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/dependency2/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/no-default-attr/attributes/server.rb +3 -0
- data/spec/data/run_context/cookbooks/no-default-attr/definitions/no_default-attr_res.rb +1 -0
- data/spec/data/run_context/cookbooks/no-default-attr/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/no-default-attr/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/no-default-attr/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/definitions/test_with-circular-deps_res.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/libraries/lib.rb +2 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/metadata.rb +2 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/test-with-circular-deps/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/attributes/default.rb +3 -0
- data/spec/data/run_context/cookbooks/test-with-deps/definitions/test_with-deps_res.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/libraries/lib.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/metadata.rb +3 -0
- data/spec/data/run_context/cookbooks/test-with-deps/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/test-with-deps/recipes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/test-with-deps/recipes/server.rb +0 -0
- data/spec/data/run_context/cookbooks/test-with-deps/resources/resource.rb +1 -0
- data/spec/data/run_context/cookbooks/test/attributes/default.rb +0 -0
- data/spec/data/run_context/cookbooks/test/attributes/george.rb +1 -1
- data/spec/data/run_context/cookbooks/test/definitions/test_res.rb +1 -0
- data/spec/data/run_context/cookbooks/test/providers/provider.rb +1 -0
- data/spec/data/run_context/cookbooks/test/resources/resource.rb +1 -0
- data/spec/data/shef-config.rb +10 -0
- data/spec/functional/dsl/registry_helper_spec.rb +63 -0
- data/spec/functional/knife/cookbook_delete_spec.rb +0 -2
- data/spec/functional/knife/exec_spec.rb +4 -6
- data/spec/functional/knife/smoke_test.rb +34 -0
- data/spec/functional/knife/ssh_spec.rb +64 -3
- data/spec/functional/resource/cookbook_file_spec.rb +33 -2
- data/spec/functional/resource/deploy_revision_spec.rb +515 -0
- data/spec/functional/resource/directory_spec.rb +4 -0
- data/spec/functional/resource/file_spec.rb +56 -22
- data/spec/functional/resource/link_spec.rb +12 -10
- data/spec/functional/resource/registry_spec.rb +572 -0
- data/spec/functional/resource/remote_directory_spec.rb +142 -36
- data/spec/functional/resource/remote_file_spec.rb +28 -3
- data/spec/functional/resource/template_spec.rb +23 -2
- data/spec/functional/run_lock_spec.rb +238 -0
- data/spec/functional/shell_spec.rb +101 -0
- data/spec/functional/tiny_server_spec.rb +5 -4
- data/spec/functional/win32/registry_helper_spec.rb +632 -0
- data/spec/functional/win32/security_spec.rb +37 -0
- data/spec/spec_helper.rb +15 -3
- data/spec/stress/win32/security_spec.rb +5 -5
- data/spec/support/chef_helpers.rb +14 -3
- data/spec/support/lib/chef/resource/cat.rb +3 -5
- data/spec/support/lib/chef/resource/one_two_three_four.rb +8 -10
- data/spec/support/lib/chef/resource/zen_master.rb +8 -10
- data/spec/support/matchers/leak.rb +1 -1
- data/spec/support/platform_helpers.rb +18 -0
- data/spec/support/shared/functional/directory_resource.rb +85 -23
- data/spec/support/shared/functional/file_resource.rb +198 -53
- data/spec/support/shared/functional/securable_resource.rb +140 -105
- data/spec/support/shared/functional/securable_resource_with_reporting.rb +375 -0
- data/spec/support/shared/unit/file_system_support.rb +110 -0
- data/spec/support/shared/unit/platform_introspector.rb +162 -0
- data/spec/tiny_server.rb +29 -10
- data/spec/unit/api_client/registration_spec.rb +172 -0
- data/spec/unit/api_client_spec.rb +156 -103
- data/spec/unit/application/apply.rb +84 -0
- data/spec/unit/application/knife_spec.rb +5 -0
- data/spec/unit/application_spec.rb +57 -2
- data/spec/unit/chef_fs/diff_spec.rb +329 -0
- data/spec/unit/chef_fs/file_pattern_spec.rb +526 -0
- data/spec/unit/chef_fs/file_system/chef_server_root_dir_spec.rb +237 -0
- data/spec/unit/chef_fs/file_system/cookbooks_dir_spec.rb +568 -0
- data/spec/unit/chef_fs/file_system/data_bags_dir_spec.rb +220 -0
- data/spec/unit/chef_fs/file_system_spec.rb +136 -0
- data/spec/unit/client_spec.rb +188 -16
- data/spec/unit/config_spec.rb +54 -4
- data/spec/unit/cookbook/chefignore_spec.rb +2 -1
- data/spec/unit/cookbook/syntax_check_spec.rb +48 -109
- data/spec/unit/cookbook_loader_spec.rb +153 -91
- data/spec/unit/cookbook_manifest_spec.rb +81 -81
- data/spec/unit/cookbook_spec.rb +3 -20
- data/spec/unit/cookbook_version_spec.rb +23 -122
- data/spec/unit/digester_spec.rb +50 -0
- data/spec/unit/dsl/data_query_spec.rb +66 -0
- data/spec/unit/dsl/platform_introspection_spec.rb +130 -0
- data/spec/unit/dsl/regsitry_helper_spec.rb +55 -0
- data/spec/unit/encrypted_data_bag_item_spec.rb +126 -10
- data/spec/unit/environment_spec.rb +0 -130
- data/spec/unit/exceptions_spec.rb +2 -3
- data/spec/unit/formatters/error_inspectors/resource_failure_inspector_spec.rb +23 -3
- data/spec/unit/json_compat_spec.rb +69 -0
- data/spec/unit/knife/bootstrap_spec.rb +81 -28
- data/spec/unit/knife/client_reregister_spec.rb +23 -22
- data/spec/unit/knife/configure_spec.rb +29 -26
- data/spec/unit/knife/cookbook_metadata_spec.rb +11 -4
- data/spec/unit/knife/cookbook_site_install_spec.rb +12 -2
- data/spec/unit/knife/cookbook_test_spec.rb +1 -0
- data/spec/unit/knife/cookbook_upload_spec.rb +41 -2
- data/spec/unit/knife/core/bootstrap_context_spec.rb +8 -1
- data/spec/unit/knife/core/ui_spec.rb +156 -7
- data/spec/unit/knife/data_bag_create_spec.rb +14 -0
- data/spec/unit/knife/data_bag_edit_spec.rb +14 -4
- data/spec/unit/knife/data_bag_from_file_spec.rb +17 -5
- data/spec/unit/knife/data_bag_show_spec.rb +11 -4
- data/spec/unit/knife/index_rebuild_spec.rb +96 -33
- data/spec/unit/knife/knife_help.rb +7 -7
- data/spec/unit/knife/node_run_list_remove_spec.rb +2 -1
- data/spec/unit/knife/ssh_spec.rb +121 -15
- data/spec/unit/knife/status_spec.rb +2 -2
- data/spec/unit/knife/user_create_spec.rb +86 -0
- data/spec/unit/knife/user_delete_spec.rb +39 -0
- data/spec/unit/knife/user_edit_spec.rb +42 -0
- data/spec/unit/knife/user_list_spec.rb +32 -0
- data/spec/unit/knife/user_reregister_spec.rb +53 -0
- data/spec/unit/knife/user_show_spec.rb +41 -0
- data/spec/unit/knife_spec.rb +53 -0
- data/spec/unit/lwrp_spec.rb +59 -17
- data/spec/unit/mixin/checksum_spec.rb +2 -2
- data/spec/unit/mixin/deep_merge_spec.rb +56 -491
- data/spec/unit/mixin/deprecation_spec.rb +23 -0
- data/spec/unit/mixin/enforce_ownership_and_permissions_spec.rb +6 -1
- data/spec/unit/mixin/params_validate_spec.rb +4 -2
- data/spec/unit/mixin/securable_spec.rb +5 -3
- data/spec/unit/mixin/template_spec.rb +119 -0
- data/spec/unit/node/attribute_spec.rb +272 -137
- data/spec/unit/node/immutable_collections_spec.rb +139 -0
- data/spec/unit/node_spec.rb +411 -339
- data/spec/unit/platform_spec.rb +8 -8
- data/spec/unit/provider/breakpoint_spec.rb +8 -8
- data/spec/unit/provider/cookbook_file_spec.rb +4 -8
- data/spec/unit/provider/deploy/revision_spec.rb +2 -8
- data/spec/unit/provider/deploy_spec.rb +6 -40
- data/spec/unit/provider/directory_spec.rb +103 -68
- data/spec/unit/provider/erl_call_spec.rb +0 -2
- data/spec/unit/provider/file_spec.rb +69 -59
- data/spec/unit/provider/git_spec.rb +0 -10
- data/spec/unit/provider/group/groupadd_spec.rb +1 -1
- data/spec/unit/provider/group/usermod_spec.rb +2 -2
- data/spec/unit/provider/http_request_spec.rb +28 -69
- data/spec/unit/provider/ifconfig_spec.rb +2 -2
- data/spec/unit/provider/link_spec.rb +1 -1
- data/spec/unit/provider/ohai_spec.rb +4 -4
- data/spec/unit/provider/package/apt_spec.rb +0 -1
- data/spec/unit/provider/package/ips_spec.rb +0 -1
- data/spec/unit/provider/package/rubygems_spec.rb +0 -18
- data/spec/unit/provider/package/yum_spec.rb +79 -15
- data/spec/unit/provider/package_spec.rb +7 -5
- data/spec/unit/provider/registry_key_spec.rb +269 -0
- data/spec/unit/provider/remote_directory_spec.rb +24 -7
- data/spec/unit/provider/remote_file_spec.rb +36 -0
- data/spec/unit/provider/route_spec.rb +3 -6
- data/spec/unit/provider/ruby_block_spec.rb +8 -0
- data/spec/unit/provider/service/arch_service_spec.rb +4 -4
- data/spec/unit/provider/service/debian_service_spec.rb +1 -1
- data/spec/unit/provider/service/freebsd_service_spec.rb +4 -4
- data/spec/unit/provider/service/init_service_spec.rb +26 -3
- data/spec/unit/provider/service/insserv_service_spec.rb +1 -1
- data/spec/unit/provider/service/invokercd_service_spec.rb +3 -3
- data/spec/unit/provider/service/redhat_spec.rb +1 -1
- data/spec/unit/provider/service/simple_service_spec.rb +3 -3
- data/spec/unit/provider/service/upstart_service_spec.rb +7 -7
- data/spec/unit/provider/service_spec.rb +2 -2
- data/spec/unit/provider/subversion_spec.rb +1 -1
- data/spec/unit/provider/template_spec.rb +35 -11
- data/spec/unit/provider/user/dscl_spec.rb +57 -31
- data/spec/unit/provider/user_spec.rb +7 -16
- data/spec/unit/provider_spec.rb +4 -3
- data/spec/unit/recipe_spec.rb +10 -8
- data/spec/unit/registry_helper_spec.rb +376 -0
- data/spec/unit/resource/log_spec.rb +9 -0
- data/spec/unit/resource/registry_key_spec.rb +171 -0
- data/spec/unit/resource/remote_file_spec.rb +21 -23
- data/spec/unit/resource/ruby_block_spec.rb +7 -3
- data/spec/unit/resource/service_spec.rb +11 -0
- data/spec/unit/resource_spec.rb +27 -4
- data/spec/unit/rest/auth_credentials_spec.rb +2 -14
- data/spec/unit/rest_spec.rb +122 -187
- data/spec/unit/run_context/cookbook_compiler_spec.rb +181 -0
- data/spec/unit/run_context_spec.rb +18 -4
- data/spec/unit/run_list_spec.rb +0 -209
- data/spec/unit/run_lock_spec.rb +37 -0
- data/spec/unit/runner_spec.rb +101 -2
- data/spec/unit/scan_access_control_spec.rb +4 -4
- data/spec/unit/{shef → shell}/model_wrapper_spec.rb +5 -5
- data/spec/unit/{shef/shef_ext_spec.rb → shell/shell_ext_spec.rb} +21 -21
- data/spec/unit/{shef/shef_session_spec.rb → shell/shell_session_spec.rb} +12 -12
- data/spec/unit/shell_out_spec.rb +18 -0
- data/spec/unit/{shef_spec.rb → shell_spec.rb} +20 -20
- data/spec/unit/user_spec.rb +255 -0
- metadata +162 -157
- data/README.rdoc +0 -177
- data/spec/unit/certificate_spec.rb +0 -76
- data/spec/unit/checksum_cache_spec.rb +0 -209
- data/spec/unit/checksum_spec.rb +0 -94
- data/spec/unit/couchdb_spec.rb +0 -274
- data/spec/unit/index_queue_spec.rb +0 -391
- data/spec/unit/json_compat_spect.rb +0 -53
- data/spec/unit/mixin/language_spec.rb +0 -305
- data/spec/unit/openid_registration_spec.rb +0 -153
- data/spec/unit/solr_query/query_transform_spec.rb +0 -454
- data/spec/unit/solr_query/solr_http_request_spec.rb +0 -244
- data/spec/unit/solr_query_spec.rb +0 -203
- data/spec/unit/webui_user_spec.rb +0 -238
@@ -24,41 +24,106 @@
|
|
24
24
|
require 'etc'
|
25
25
|
|
26
26
|
shared_context "setup correct permissions" do
|
27
|
-
context "on unix", :unix_only do
|
28
|
-
context "with root", :requires_root do
|
29
|
-
before :each do
|
30
|
-
File.chown(Etc.getpwnam('nobody').uid, 1337, path)
|
31
|
-
File.chmod(0776, path)
|
32
|
-
end
|
33
|
-
end
|
34
27
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
28
|
+
# I could not get this to work with :requires_unprivileged_user for whatever
|
29
|
+
# reason. The setup when running as root is the same as non-root, except we
|
30
|
+
# also do a chown, so this sets up correct context for either case.
|
31
|
+
before :each, :unix_only do
|
32
|
+
File.chmod(0776, path)
|
33
|
+
now = Time.now.to_i
|
34
|
+
File.utime(now - 9000, now - 9000, path)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Root only context.
|
38
|
+
before :each, :unix_only, :requires_root do
|
39
|
+
File.chown(Etc.getpwnam('nobody').uid, 1337, path)
|
40
40
|
end
|
41
41
|
|
42
42
|
# FIXME: windows
|
43
43
|
end
|
44
44
|
|
45
45
|
shared_context "setup broken permissions" do
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
46
|
+
|
47
|
+
before :each, :unix_only do
|
48
|
+
File.chmod(0644, path)
|
49
|
+
end
|
50
|
+
|
51
|
+
before :each, :unix_only, :requires_root do
|
52
|
+
File.chown(0, 0, path)
|
53
|
+
end
|
54
|
+
|
55
|
+
# FIXME: windows
|
56
|
+
end
|
57
|
+
|
58
|
+
shared_context "use Windows permissions", :windows_only do
|
59
|
+
if windows?
|
60
|
+
SID ||= Chef::ReservedNames::Win32::Security::SID
|
61
|
+
ACE ||= Chef::ReservedNames::Win32::Security::ACE
|
62
|
+
end
|
63
|
+
|
64
|
+
def get_security_descriptor(path)
|
65
|
+
Chef::ReservedNames::Win32::Security.get_named_security_info(path)
|
66
|
+
end
|
67
|
+
|
68
|
+
def explicit_aces
|
69
|
+
descriptor.dacl.select { |ace| ace.explicit? }
|
70
|
+
end
|
71
|
+
|
72
|
+
def extract_ace_properties(aces)
|
73
|
+
hashes = []
|
74
|
+
aces.each do |ace|
|
75
|
+
hashes << { :mask => ace.mask, :type => ace.type, :flags => ace.flags }
|
52
76
|
end
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
77
|
+
hashes
|
78
|
+
end
|
79
|
+
|
80
|
+
# Standard expected rights
|
81
|
+
let(:expected_read_perms) do
|
82
|
+
{
|
83
|
+
:generic => Chef::ReservedNames::Win32::API::Security::GENERIC_READ,
|
84
|
+
:specific => Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_READ,
|
85
|
+
}
|
86
|
+
end
|
87
|
+
|
88
|
+
let(:expected_read_execute_perms) do
|
89
|
+
{
|
90
|
+
:generic => Chef::ReservedNames::Win32::API::Security::GENERIC_READ | Chef::ReservedNames::Win32::API::Security::GENERIC_EXECUTE,
|
91
|
+
:specific => Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_READ | Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_EXECUTE
|
92
|
+
}
|
93
|
+
end
|
94
|
+
|
95
|
+
let(:expected_write_perms) do
|
96
|
+
{
|
97
|
+
:generic => Chef::ReservedNames::Win32::API::Security::GENERIC_WRITE,
|
98
|
+
:specific => Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_WRITE
|
99
|
+
}
|
100
|
+
end
|
101
|
+
|
102
|
+
let(:expected_modify_perms) do
|
103
|
+
{
|
104
|
+
:generic => Chef::ReservedNames::Win32::API::Security::GENERIC_READ | Chef::ReservedNames::Win32::API::Security::GENERIC_WRITE | Chef::ReservedNames::Win32::API::Security::GENERIC_EXECUTE | Chef::ReservedNames::Win32::API::Security::DELETE,
|
105
|
+
:specific => Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_READ | Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_WRITE | Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_EXECUTE | Chef::ReservedNames::Win32::API::Security::DELETE
|
106
|
+
}
|
107
|
+
end
|
108
|
+
|
109
|
+
let(:expected_full_control_perms) do
|
110
|
+
{
|
111
|
+
:generic => Chef::ReservedNames::Win32::API::Security::GENERIC_ALL,
|
112
|
+
:specific => Chef::ReservedNames::Win32::API::Security::FILE_ALL_ACCESS
|
113
|
+
}
|
114
|
+
end
|
115
|
+
|
116
|
+
RSpec::Matchers.define :have_expected_properties do |mask, type, flags|
|
117
|
+
match do |ace|
|
118
|
+
ace.mask == mask
|
119
|
+
ace.type == type
|
120
|
+
ace.flags == flags
|
58
121
|
end
|
59
122
|
end
|
60
123
|
|
61
|
-
|
124
|
+
def descriptor
|
125
|
+
get_security_descriptor(path)
|
126
|
+
end
|
62
127
|
end
|
63
128
|
|
64
129
|
shared_examples_for "a securable resource" do
|
@@ -71,107 +136,77 @@ shared_examples_for "a securable resource" do
|
|
71
136
|
pending "should set an owner (Rerun specs under root)", :requires_unprivileged_user => true
|
72
137
|
pending "should set a group (Rerun specs under root)", :requires_unprivileged_user => true
|
73
138
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
139
|
+
describe "when setting the owner", :requires_root do
|
140
|
+
before do
|
141
|
+
resource.owner expected_user_name
|
142
|
+
resource.run_action(:create)
|
143
|
+
end
|
79
144
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
File.lstat(path).gid.should == expected_gid
|
84
|
-
end
|
145
|
+
it "should set an owner" do
|
146
|
+
File.lstat(path).uid.should == expected_uid
|
147
|
+
end
|
85
148
|
|
86
|
-
|
87
|
-
|
88
|
-
resource.mode mode_string
|
89
|
-
resource.run_action(:create)
|
90
|
-
pending('Linux does not support lchmod', :if => resource.instance_of?(Chef::Resource::Link) && !os_x? && !freebsd?) do
|
91
|
-
(File.lstat(path).mode & 007777).should == (mode_string.oct & 007777)
|
149
|
+
it "is marked as updated only if changes are made" do
|
150
|
+
resource.updated_by_last_action?.should == expect_updated?
|
92
151
|
end
|
152
|
+
|
93
153
|
end
|
94
154
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
pending('Linux does not support lchmod', :if => resource.instance_of?(Chef::Resource::Link) && !os_x? && !freebsd?) do
|
100
|
-
(File.lstat(path).mode & 007777).should == (mode_integer & 007777)
|
155
|
+
describe "when setting the group", :requires_root do
|
156
|
+
before do
|
157
|
+
resource.group desired_gid
|
158
|
+
resource.run_action(:create)
|
101
159
|
end
|
102
|
-
end
|
103
|
-
end
|
104
160
|
|
105
|
-
|
161
|
+
it "should set a group" do
|
162
|
+
File.lstat(path).gid.should == expected_gid
|
163
|
+
end
|
106
164
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
end
|
165
|
+
it "is marked as updated only if changes are made" do
|
166
|
+
resource.updated_by_last_action?.should == expect_updated?
|
167
|
+
end
|
111
168
|
|
112
|
-
def get_security_descriptor(path)
|
113
|
-
Chef::ReservedNames::Win32::Security.get_named_security_info(path)
|
114
169
|
end
|
115
170
|
|
116
|
-
|
117
|
-
|
118
|
-
|
171
|
+
describe "when setting the permissions from octal given as a String" do
|
172
|
+
before do
|
173
|
+
@mode_string = '776'
|
174
|
+
resource.mode @mode_string
|
175
|
+
resource.run_action(:create)
|
176
|
+
end
|
119
177
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
hashes << { :mask => ace.mask, :type => ace.type, :flags => ace.flags }
|
178
|
+
it "should set permissions as specified" do
|
179
|
+
pending('Linux does not support lchmod', :if => resource.instance_of?(Chef::Resource::Link) && !os_x? && !freebsd?) do
|
180
|
+
(File.lstat(path).mode & 007777).should == (@mode_string.oct & 007777)
|
124
181
|
end
|
125
|
-
|
126
|
-
end
|
127
|
-
|
128
|
-
# Standard expected rights
|
129
|
-
let(:expected_read_perms) do
|
130
|
-
{
|
131
|
-
:generic => Chef::ReservedNames::Win32::API::Security::GENERIC_READ,
|
132
|
-
:specific => Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_READ,
|
133
|
-
}
|
134
|
-
end
|
135
|
-
|
136
|
-
let(:expected_read_execute_perms) do
|
137
|
-
{
|
138
|
-
:generic => Chef::ReservedNames::Win32::API::Security::GENERIC_READ | Chef::ReservedNames::Win32::API::Security::GENERIC_EXECUTE,
|
139
|
-
:specific => Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_READ | Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_EXECUTE
|
140
|
-
}
|
141
|
-
end
|
182
|
+
end
|
142
183
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
:specific => Chef::ReservedNames::Win32::API::Security::FILE_GENERIC_WRITE
|
147
|
-
}
|
184
|
+
it "is marked as updated only if changes are made" do
|
185
|
+
resource.updated_by_last_action?.should == expect_updated?
|
186
|
+
end
|
148
187
|
end
|
149
188
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
189
|
+
describe "when setting permissions from a literal octal Integer" do
|
190
|
+
before do
|
191
|
+
@mode_integer = 0776
|
192
|
+
resource.mode @mode_integer
|
193
|
+
resource.run_action(:create)
|
194
|
+
end
|
156
195
|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
end
|
196
|
+
it "should set permissions in numeric form as a ruby-interpreted octal" do
|
197
|
+
pending('Linux does not support lchmod', :if => resource.instance_of?(Chef::Resource::Link) && !os_x? && !freebsd?) do
|
198
|
+
(File.lstat(path).mode & 007777).should == (@mode_integer & 007777)
|
199
|
+
end
|
200
|
+
end
|
163
201
|
|
164
|
-
|
165
|
-
|
166
|
-
ace.mask == mask
|
167
|
-
ace.type == type
|
168
|
-
ace.flags == flags
|
202
|
+
it "is marked as updated only if changes are made" do
|
203
|
+
resource.updated_by_last_action?.should == expect_updated?
|
169
204
|
end
|
170
205
|
end
|
206
|
+
end
|
171
207
|
|
172
|
-
|
173
|
-
|
174
|
-
end
|
208
|
+
context "on Windows", :windows_only do
|
209
|
+
include_context "use Windows permissions"
|
175
210
|
|
176
211
|
before(:each) do
|
177
212
|
resource.run_action(:delete)
|
@@ -321,7 +356,7 @@ shared_examples_for "a securable resource" do
|
|
321
356
|
|
322
357
|
context "with a mode attribute" do
|
323
358
|
if windows?
|
324
|
-
Security
|
359
|
+
Security ||= Chef::ReservedNames::Win32::API::Security
|
325
360
|
end
|
326
361
|
|
327
362
|
it "respects mode in string form as an octal number" do
|
@@ -0,0 +1,375 @@
|
|
1
|
+
|
2
|
+
shared_examples_for "a securable resource with reporting" do
|
3
|
+
|
4
|
+
let(:current_resource) do
|
5
|
+
provider = resource.provider_for_action(resource.action)
|
6
|
+
provider.load_current_resource
|
7
|
+
provider.current_resource
|
8
|
+
end
|
9
|
+
|
10
|
+
# Default mode varies based on implementation. Providers that use a tempfile
|
11
|
+
# will default to 0600. Providers that use File.open will default to 0666 -
|
12
|
+
# umask
|
13
|
+
# let(:default_mode) { ((0100666 - File.umask) & 07777).to_s(8) }
|
14
|
+
|
15
|
+
describe "reading file security metadata for reporting on unix", :unix_only => true do
|
16
|
+
context "when the target file doesn't exist" do
|
17
|
+
before do
|
18
|
+
resource.action(:create)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "has empty values for file metadata in 'current_resource'" do
|
22
|
+
current_resource.owner.should be_nil
|
23
|
+
current_resource.group.should be_nil
|
24
|
+
current_resource.mode.should be_nil
|
25
|
+
end
|
26
|
+
|
27
|
+
context "and no security metadata is specified in new_resource" do
|
28
|
+
it "sets the metadata values on the new_resource as strings after creating" do
|
29
|
+
resource.run_action(:create)
|
30
|
+
# TODO: most stable way to specify?
|
31
|
+
resource.owner.should == Etc.getpwuid(Process.uid).name
|
32
|
+
resource.group.should == Etc.getgrgid(Process.gid).name
|
33
|
+
resource.mode.should == "0#{default_mode}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "and owner is specified with a String (username) in new_resource", :requires_root => true do
|
38
|
+
|
39
|
+
# TODO/bug: duplicated from the "securable resource" tests
|
40
|
+
let(:expected_user_name) { 'nobody' }
|
41
|
+
|
42
|
+
before do
|
43
|
+
resource.owner(expected_user_name)
|
44
|
+
resource.run_action(:create)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "sets the owner on new_resource to the username (String) of the desired owner" do
|
48
|
+
resource.owner.should == expected_user_name
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
context "and owner is specified with an Integer (uid) in new_resource", :requires_root => true do
|
54
|
+
|
55
|
+
# TODO: duplicated from "securable resource"
|
56
|
+
let(:expected_user_name) { 'nobody' }
|
57
|
+
let(:expected_uid) { Etc.getpwnam(expected_user_name).uid }
|
58
|
+
let(:desired_gid) { 1337 }
|
59
|
+
let(:expected_gid) { 1337 }
|
60
|
+
|
61
|
+
before do
|
62
|
+
resource.owner(expected_uid)
|
63
|
+
resource.run_action(:create)
|
64
|
+
end
|
65
|
+
|
66
|
+
it "sets the owner on new_resource to the uid (Integer) of the desired owner" do
|
67
|
+
resource.owner.should == expected_uid
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context "and group is specified with a String (group name)", :requires_root => true do
|
72
|
+
|
73
|
+
let(:expected_group_name) { Etc.getgrent.name }
|
74
|
+
|
75
|
+
before do
|
76
|
+
resource.group(expected_group_name)
|
77
|
+
resource.run_action(:create)
|
78
|
+
end
|
79
|
+
|
80
|
+
it "sets the group on new_resource to the group name (String) of the group" do
|
81
|
+
resource.group.should == expected_group_name
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
context "and group is specified with an Integer (gid)", :requires_root => true do
|
87
|
+
let(:expected_gid) { Etc.getgrent.gid }
|
88
|
+
|
89
|
+
before do
|
90
|
+
resource.group(expected_gid)
|
91
|
+
resource.run_action(:create)
|
92
|
+
end
|
93
|
+
|
94
|
+
it "sets the group on new_resource to the gid (Integer)" do
|
95
|
+
resource.group.should == expected_gid
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
context "and mode is specified as a String" do
|
101
|
+
# Need full permission for owner here or else remote directory gets
|
102
|
+
# into trouble trying to manage nested directories
|
103
|
+
let(:set_mode) { "0740" }
|
104
|
+
let(:expected_mode) { "0740" }
|
105
|
+
|
106
|
+
before do
|
107
|
+
resource.mode(set_mode)
|
108
|
+
resource.run_action(:create)
|
109
|
+
end
|
110
|
+
|
111
|
+
it "sets mode on the new_resource as a String" do
|
112
|
+
resource.mode.should == expected_mode
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
context "and mode is specified as an Integer" do
|
117
|
+
let(:set_mode) { 00740 }
|
118
|
+
|
119
|
+
let(:expected_mode) { "0740" }
|
120
|
+
before do
|
121
|
+
resource.mode(set_mode)
|
122
|
+
resource.run_action(:create)
|
123
|
+
end
|
124
|
+
|
125
|
+
it "sets mode on the new resource as a String" do
|
126
|
+
resource.mode.should == expected_mode
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
context "when the target file exists" do
|
132
|
+
before do
|
133
|
+
FileUtils.touch(resource.path)
|
134
|
+
resource.action(:create)
|
135
|
+
end
|
136
|
+
|
137
|
+
context "and no security metadata is specified in new_resource" do
|
138
|
+
it "sets the current values on current resource as strings" do
|
139
|
+
# TODO: most stable way to specify?
|
140
|
+
current_resource.owner.should == Etc.getpwuid(Process.uid).name
|
141
|
+
current_resource.group.should == Etc.getgrgid(Process.gid).name
|
142
|
+
current_resource.mode.should == "0#{((0100666 - File.umask) & 07777).to_s(8)}"
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
context "and owner is specified with a String (username) in new_resource" do
|
147
|
+
|
148
|
+
let(:expected_user_name) { Etc.getpwuid(Process.uid).name }
|
149
|
+
|
150
|
+
before do
|
151
|
+
resource.owner(expected_user_name)
|
152
|
+
end
|
153
|
+
|
154
|
+
it "sets the owner on new_resource to the username (String) of the desired owner" do
|
155
|
+
current_resource.owner.should == expected_user_name
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
159
|
+
|
160
|
+
context "and owner is specified with an Integer (uid) in new_resource" do
|
161
|
+
|
162
|
+
let(:expected_uid) { Process.uid }
|
163
|
+
|
164
|
+
before do
|
165
|
+
resource.owner(expected_uid)
|
166
|
+
end
|
167
|
+
|
168
|
+
it "sets the owner on new_resource to the uid (Integer) of the desired owner" do
|
169
|
+
current_resource.owner.should == expected_uid
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
context "and group is specified with a String (group name)" do
|
174
|
+
|
175
|
+
let(:expected_group_name) { Etc.getgrgid(Process.gid).name }
|
176
|
+
|
177
|
+
before do
|
178
|
+
resource.group(expected_group_name)
|
179
|
+
end
|
180
|
+
|
181
|
+
it "sets the group on new_resource to the group name (String) of the group" do
|
182
|
+
current_resource.group.should == expected_group_name
|
183
|
+
end
|
184
|
+
|
185
|
+
end
|
186
|
+
|
187
|
+
context "and group is specified with an Integer (gid)" do
|
188
|
+
let(:expected_gid) { Process.gid }
|
189
|
+
|
190
|
+
before do
|
191
|
+
resource.group(expected_gid)
|
192
|
+
end
|
193
|
+
|
194
|
+
it "sets the group on new_resource to the gid (Integer)" do
|
195
|
+
current_resource.group.should == expected_gid
|
196
|
+
end
|
197
|
+
|
198
|
+
end
|
199
|
+
|
200
|
+
context "and mode is specified as a String" do
|
201
|
+
let(:default_create_mode) { (0100666 - File.umask) }
|
202
|
+
let(:expected_mode) { "0#{(default_create_mode & 07777).to_s(8)}" }
|
203
|
+
|
204
|
+
before do
|
205
|
+
resource.mode(expected_mode)
|
206
|
+
end
|
207
|
+
|
208
|
+
it "sets mode on the new_resource as a String" do
|
209
|
+
current_resource.mode.should == expected_mode
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
context "and mode is specified as an Integer" do
|
214
|
+
let(:set_mode) { (0100666 - File.umask) & 07777 }
|
215
|
+
let(:expected_mode) { "0#{set_mode.to_s(8)}" }
|
216
|
+
|
217
|
+
before do
|
218
|
+
resource.mode(set_mode)
|
219
|
+
end
|
220
|
+
|
221
|
+
it "sets mode on the new resource as a String" do
|
222
|
+
current_resource.mode.should == expected_mode
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
describe "reading file security metadata for reporting on windows", :windows_only do
|
229
|
+
|
230
|
+
before do
|
231
|
+
pending "windows reporting not yet fully supported"
|
232
|
+
end
|
233
|
+
|
234
|
+
ALL_EXPANDED_PERMISSIONS = ["generic read",
|
235
|
+
"generic write",
|
236
|
+
"generic execute",
|
237
|
+
"generic all",
|
238
|
+
"delete",
|
239
|
+
"read permissions",
|
240
|
+
"change permissions",
|
241
|
+
"take ownership",
|
242
|
+
"synchronize",
|
243
|
+
"access system security",
|
244
|
+
"read data / list directory",
|
245
|
+
"write data / add file",
|
246
|
+
"append data / add subdirectory",
|
247
|
+
"read extended attributes",
|
248
|
+
"write extended attributes",
|
249
|
+
"execute / traverse",
|
250
|
+
"delete child",
|
251
|
+
"read attributes",
|
252
|
+
"write attributes"]
|
253
|
+
|
254
|
+
|
255
|
+
context "when the target file doesn't exist" do
|
256
|
+
|
257
|
+
# Windows reporting data should look like this (+/- ish):
|
258
|
+
# { "owner" => "bob", "checksum" => "ffff", "access control" => { "bob" => { "permissions" => ["perm1", "perm2", ...], "flags" => [] }}}
|
259
|
+
|
260
|
+
|
261
|
+
before do
|
262
|
+
resource.action(:create)
|
263
|
+
end
|
264
|
+
|
265
|
+
it "has empty values for file metadata in 'current_resource'" do
|
266
|
+
current_resource.owner.should be_nil
|
267
|
+
current_resource.expanded_rights.should be_nil
|
268
|
+
end
|
269
|
+
|
270
|
+
context "and no security metadata is specified in new_resource" do
|
271
|
+
it "sets the metadata values on the new_resource as strings after creating" do
|
272
|
+
resource.run_action(:create)
|
273
|
+
# TODO: most stable way to specify?
|
274
|
+
resource.owner.should == etc.getpwuid(process.uid).name
|
275
|
+
resource.state[:expanded_rights].should == { "CURRENTUSER" => { "permissions" => ALL_EXPANDED_PERMISSIONS, "flags" => [] }}
|
276
|
+
resource.state[:expanded_deny_rights].should == {}
|
277
|
+
resource.state[:inherits].should be_true
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
|
282
|
+
context "and owner is specified with a string (username) in new_resource" do
|
283
|
+
|
284
|
+
# TODO/bug: duplicated from the "securable resource" tests
|
285
|
+
let(:expected_user_name) { 'Guest' }
|
286
|
+
|
287
|
+
before do
|
288
|
+
resource.owner(expected_user_name)
|
289
|
+
resource.run_action(:create)
|
290
|
+
end
|
291
|
+
|
292
|
+
it "sets the owner on new_resource to the username (string) of the desired owner" do
|
293
|
+
resource.owner.should == expected_user_name
|
294
|
+
end
|
295
|
+
|
296
|
+
end
|
297
|
+
|
298
|
+
context "and owner is specified with a fully qualified domain user" do
|
299
|
+
|
300
|
+
# TODO: duplicated from "securable resource"
|
301
|
+
let(:expected_user_name) { 'domain\user' }
|
302
|
+
|
303
|
+
before do
|
304
|
+
resource.owner(expected_user_name)
|
305
|
+
resource.run_action(:create)
|
306
|
+
end
|
307
|
+
|
308
|
+
it "sets the owner on new_resource to the fully qualified name of the desired owner" do
|
309
|
+
resource.owner.should == expected_user_name
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
end
|
314
|
+
|
315
|
+
context "when the target file exists" do
|
316
|
+
before do
|
317
|
+
FileUtils.touch(resource.path)
|
318
|
+
resource.action(:create)
|
319
|
+
end
|
320
|
+
|
321
|
+
context "and no security metadata is specified in new_resource" do
|
322
|
+
it "sets the current values on current resource as strings" do
|
323
|
+
# TODO: most stable way to specify?
|
324
|
+
current_resource.owner.should == etc.getpwuid(process.uid).name
|
325
|
+
current_resource.expanded_rights.should == { "CURRENTUSER" => ALL_EXPANDED_PERMISSIONS }
|
326
|
+
end
|
327
|
+
end
|
328
|
+
|
329
|
+
context "and owner is specified with a string (username) in new_resource" do
|
330
|
+
|
331
|
+
let(:expected_user_name) { etc.getpwuid(process.uid).name }
|
332
|
+
|
333
|
+
before do
|
334
|
+
resource.owner(expected_user_name)
|
335
|
+
end
|
336
|
+
|
337
|
+
it "sets the owner on current_resource to the username (string) of the desired owner" do
|
338
|
+
current_resource.owner.should == expected_user_name
|
339
|
+
end
|
340
|
+
|
341
|
+
end
|
342
|
+
|
343
|
+
context "and owner is specified as a fully qualified 'domain\\user' in new_resource" do
|
344
|
+
|
345
|
+
let(:expected_user_name) { 'domain\user' }
|
346
|
+
|
347
|
+
before do
|
348
|
+
resource.owner(expected_user_name)
|
349
|
+
end
|
350
|
+
|
351
|
+
it "sets the owner on current_resource to the fully qualified name of the desired owner" do
|
352
|
+
current_resource.owner.should == expected_uid
|
353
|
+
end
|
354
|
+
end
|
355
|
+
|
356
|
+
context "and access rights are specified on the new_resource" do
|
357
|
+
# TODO: before do blah
|
358
|
+
|
359
|
+
it "sets the expanded_rights on the current resource" do
|
360
|
+
pending
|
361
|
+
end
|
362
|
+
end
|
363
|
+
|
364
|
+
context "and no access rights are specified on the current resource" do
|
365
|
+
# TODO: before do blah
|
366
|
+
|
367
|
+
it "sets the expanded rights on the current resource" do
|
368
|
+
pending
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
|
373
|
+
end
|
374
|
+
end
|
375
|
+
end
|