win32-file-security 1.0.4 → 1.0.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d0cbba9bdb2c474a89f0c9a7bfd316d11f5340ed
4
- data.tar.gz: fe8f1a9b21770c3adefd4753bd1dde13e3b126ed
3
+ metadata.gz: d234ea5f580422f9afe3ca568dca698212b4c31c
4
+ data.tar.gz: a3bee9399b1407bc23609a44315194cb361ef9c3
5
5
  SHA512:
6
- metadata.gz: ed0b4e85d4864cace4bd070483b4c7efbfd131c15a9c35236494ca1142d4b4cd674f31a2d2dd46f06970a8b6bb73f83b204737dab63f5775ef2ebfea1f5120d4
7
- data.tar.gz: 31d4bec21d22a52d3f889c8631b1cf63eb61cc52317ee5356ca1816195a0b11dbdab1c379dab25d29496afe5a960a78b4d0611ecb212fbb373f971ea4f212e86
6
+ metadata.gz: 3e119edd6768169b2b37995be0656b59d3dbf304eedc2ba7f1ddffa4d3f130d3519e6cbf1cbe6e918813a04cf0049820630c3c71c23093603f5f2be19b7308ec
7
+ data.tar.gz: f3e9124fdd6acaea83dfd678ad150ea057695e2e600cfa443047776efa4877ae0b59c3c40975be6404dd0e59eb72e5f96696230f99d020754a2c78ec3e8b18f7
data/CHANGES CHANGED
@@ -1,3 +1,9 @@
1
+ = 1.0.5 - 2-May-2015
2
+ * Added the File.supports_acls? singleton method.
3
+ * The File.get_permissions and File.set_permissions methods now explicitly
4
+ raise an error if the filesystem does not support ACL's.
5
+ * Fixed some deprecation warnings in the test suite.
6
+
1
7
  = 1.0.4 - 2-May-2014
2
8
  * All methods that accept a filename argument now honor objects that implement
3
9
  either to_str or to_path.
data/MANIFEST CHANGED
@@ -7,6 +7,10 @@
7
7
  * lib/win32/file/windows/constants.rb
8
8
  * lib/win32/file/windows/functions.rb
9
9
  * lib/win32/file/windows/structs.rb
10
+ * test/test_win32_file_security_acls.rb
11
+ * test/test_win32_file_security_constants.rb
10
12
  * test/test_win32_file_security_encryption.rb
13
+ * test/test_win32_file_security_ffi.rb
14
+ * test/test_win32_file_security_ownership.rb
11
15
  * test/test_win32_file_security_permissions.rb
12
16
  * test/test_win32_file_security_version.rb
@@ -12,7 +12,7 @@ class File
12
12
  extend Windows::File::Functions
13
13
 
14
14
  # The version of the win32-file library
15
- WIN32_FILE_SECURITY_VERSION = '1.0.4'
15
+ WIN32_FILE_SECURITY_VERSION = '1.0.5'
16
16
 
17
17
  class << self
18
18
  remove_method(:chown)
@@ -61,15 +61,15 @@ class File
61
61
  end
62
62
 
63
63
  # Returns whether or not the root path of the specified file is
64
- # encryptable. If a relative path is specified, it will check against
65
- # the root of the current directory.
64
+ # encryptable. If no path or a relative path is specified, it will
65
+ # check against the root of the current directory.
66
66
  #
67
67
  # Be sure to include a trailing slash if specifying a root path.
68
68
  #
69
69
  # Examples:
70
70
  #
71
71
  # p File.encryptable?
72
- # p File.encryptable?("D:\\")
72
+ # p File.encryptable?("D:/")
73
73
  # p File.encryptable?("C:/foo/bar.txt") # Same as 'C:\'
74
74
  #
75
75
  def encryptable?(file = nil)
@@ -102,6 +102,49 @@ class File
102
102
  bool
103
103
  end
104
104
 
105
+
106
+ # Returns whether or not the root path of the specified file supports
107
+ # ACL's. If no path or a relative path is specified, it will check against
108
+ # the root of the current directory.
109
+ #
110
+ # Be sure to include a trailing slash if specifying a root path.
111
+ #
112
+ # Examples:
113
+ #
114
+ # p File.supports_acls?
115
+ # p File.supports_acls?("D:/")
116
+ # p File.supports_acls?("C:/foo/bar.txt") # Same as 'C:\'
117
+ #
118
+ def supports_acls?(file = nil)
119
+ bool = false
120
+ flags_ptr = FFI::MemoryPointer.new(:ulong)
121
+
122
+ if file
123
+ file = File.expand_path(string_check(file))
124
+ wide_file = file.wincode
125
+
126
+ if !PathIsRootW(wide_file)
127
+ unless PathStripToRootW(wide_file)
128
+ raise SystemCallError.new("PathStripToRoot", FFI.errno)
129
+ end
130
+ end
131
+ else
132
+ wide_file = nil
133
+ end
134
+
135
+ unless GetVolumeInformationW(wide_file, nil, 0, nil, nil, flags_ptr, nil, 0)
136
+ raise SystemCallError.new("GetVolumeInformation", FFI.errno)
137
+ end
138
+
139
+ flags = flags_ptr.read_ulong
140
+
141
+ if flags & FILE_PERSISTENT_ACLS > 0
142
+ bool = true
143
+ end
144
+
145
+ bool
146
+ end
147
+
105
148
  # Encrypts a file or directory. All data streams in a file are encrypted.
106
149
  # All new files created in an encrypted directory are encrypted.
107
150
  #
@@ -159,6 +202,14 @@ class File
159
202
  # }
160
203
  #
161
204
  def get_permissions(file, host=nil)
205
+ # Check local filesystem to see if it supports ACL's. If not, bail early
206
+ # because the GetFileSecurity function will not fail on an unsupported FS.
207
+ if host.nil?
208
+ unless supports_acls?(file)
209
+ raise ArgumentError, "Filesystem does not implement ACL support"
210
+ end
211
+ end
212
+
162
213
  wide_file = string_check(file).wincode
163
214
  wide_host = host ? host.wincode : nil
164
215
 
@@ -321,6 +372,12 @@ class File
321
372
  # File.set_permissions(file, "host\\userid" => File::GENERIC_ALL)
322
373
  #
323
374
  def set_permissions(file, perms)
375
+ # Check local filesystem to see if it supports ACL's. If not, bail early
376
+ # because the GetFileSecurity function will not fail on an unsupported FS.
377
+ unless supports_acls?(file)
378
+ raise ArgumentError, "Filesystem does not implement ACL support"
379
+ end
380
+
324
381
  wide_file = string_check(file).wincode
325
382
  raise TypeError unless perms.kind_of?(Hash)
326
383
 
@@ -16,6 +16,9 @@ module Windows
16
16
  TOKEN_QUERY = 0x00000008
17
17
  TOKEN_ADJUST_PRIVILEGES = 0x0020
18
18
 
19
+ ERROR_NOT_SUPPORTED = 50
20
+ ERROR_NO_SECURITY_ON_OBJECT = 1350
21
+
19
22
  TokenUser = 1
20
23
  TokenGroups = 2
21
24
 
@@ -0,0 +1,28 @@
1
+ ##############################################################################
2
+ # test_win32_file_acls.rb
3
+ #
4
+ # Test case for the File.supports_acls? method.
5
+ ##############################################################################
6
+ require 'test-unit'
7
+ require 'win32/file/security'
8
+ require 'socket'
9
+ require 'etc'
10
+
11
+ class TC_Win32_File_Security_ACLS < Test::Unit::TestCase
12
+ def setup
13
+ @dir = "C:/"
14
+ end
15
+
16
+ test "supports_acls? basic functionality" do
17
+ assert_respond_to(File, :supports_acls?)
18
+ assert_boolean(File.supports_acls?(@dir))
19
+ end
20
+
21
+ test "supports_acls? returns the expected results" do
22
+ assert_true(File.supports_acls?(@dir))
23
+ end
24
+
25
+ def teardown
26
+ @perms = nil
27
+ end
28
+ end
@@ -83,7 +83,7 @@ class TC_Win32_File_Security_Encryption < Test::Unit::TestCase
83
83
  end
84
84
 
85
85
  def self.shutdown
86
- File.delete(@@file) if File.exists?(@@file)
86
+ File.delete(@@file) if File.exist?(@@file)
87
87
  @@file = nil
88
88
  @@host = nil
89
89
  end
@@ -145,7 +145,7 @@ class TC_Win32_File_Security_Ownership < Test::Unit::TestCase
145
145
 
146
146
  def teardown
147
147
  @elevated = nil
148
- File.delete(@@file) if File.exists?(@@file)
148
+ File.delete(@@file) if File.exist?(@@file)
149
149
  end
150
150
 
151
151
  def self.shutdown
@@ -5,7 +5,6 @@
5
5
  # use the 'rake test' or 'rake test:perms' task to run this.
6
6
  ##############################################################################
7
7
  require 'test-unit'
8
- require 'test/unit'
9
8
  require 'win32/file/security'
10
9
  require 'socket'
11
10
  require 'etc'
@@ -80,7 +79,7 @@ class TC_Win32_File_Security_Permissions < Test::Unit::TestCase
80
79
  end
81
80
 
82
81
  def self.shutdown
83
- File.delete(@@file) if File.exists?(@@file)
82
+ File.delete(@@file) if File.exist?(@@file)
84
83
  @@file = nil
85
84
  @@host = nil
86
85
  @@user = nil
@@ -8,6 +8,6 @@ require 'win32/file/security'
8
8
 
9
9
  class TC_Win32_File_Security_Version < Test::Unit::TestCase
10
10
  test "version is set to expected value" do
11
- assert_equal('1.0.4', File::WIN32_FILE_SECURITY_VERSION)
11
+ assert_equal('1.0.5', File::WIN32_FILE_SECURITY_VERSION)
12
12
  end
13
13
  end
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = 'win32-file-security'
5
- spec.version = '1.0.4'
5
+ spec.version = '1.0.5'
6
6
  spec.authors = ['Daniel J. Berger', 'Park Heesob']
7
7
  spec.license = 'Artistic 2.0'
8
8
  spec.email = 'djberg96@gmail.com'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: win32-file-security
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel J. Berger
@@ -9,62 +9,62 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-05-03 00:00:00.000000000 Z
12
+ date: 2015-05-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ffi
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - '>='
18
+ - - ">="
19
19
  - !ruby/object:Gem::Version
20
20
  version: '0'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - '>='
25
+ - - ">="
26
26
  - !ruby/object:Gem::Version
27
27
  version: '0'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: test-unit
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - '>='
32
+ - - ">="
33
33
  - !ruby/object:Gem::Version
34
34
  version: '0'
35
35
  type: :development
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - '>='
39
+ - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: win32-security
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - '>='
46
+ - - ">="
47
47
  - !ruby/object:Gem::Version
48
48
  version: '0'
49
49
  type: :development
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
- - - '>='
53
+ - - ">="
54
54
  - !ruby/object:Gem::Version
55
55
  version: '0'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: sys-admin
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - '>='
60
+ - - ">="
61
61
  - !ruby/object:Gem::Version
62
62
  version: '0'
63
63
  type: :development
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - '>='
67
+ - - ">="
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0'
70
70
  description: |2
@@ -88,6 +88,7 @@ files:
88
88
  - lib/win32/file/security/functions.rb
89
89
  - lib/win32/file/security/helper.rb
90
90
  - lib/win32/file/security/structs.rb
91
+ - test/test_win32_file_security_acls.rb
91
92
  - test/test_win32_file_security_constants.rb
92
93
  - test/test_win32_file_security_encryption.rb
93
94
  - test/test_win32_file_security_ffi.rb
@@ -105,21 +106,22 @@ require_paths:
105
106
  - lib
106
107
  required_ruby_version: !ruby/object:Gem::Requirement
107
108
  requirements:
108
- - - '>='
109
+ - - ">="
109
110
  - !ruby/object:Gem::Version
110
111
  version: '0'
111
112
  required_rubygems_version: !ruby/object:Gem::Requirement
112
113
  requirements:
113
- - - '>='
114
+ - - ">="
114
115
  - !ruby/object:Gem::Version
115
116
  version: '0'
116
117
  requirements: []
117
118
  rubyforge_project: win32utils
118
- rubygems_version: 2.2.2
119
+ rubygems_version: 2.4.7
119
120
  signing_key:
120
121
  specification_version: 4
121
122
  summary: File security methods for the File class on MS Windows
122
123
  test_files:
124
+ - test/test_win32_file_security_acls.rb
123
125
  - test/test_win32_file_security_constants.rb
124
126
  - test/test_win32_file_security_encryption.rb
125
127
  - test/test_win32_file_security_ffi.rb