win32-security 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES CHANGED
@@ -1,3 +1,8 @@
1
+ = 0.1.2 - 2-Aug-2009
2
+ * Now compatible with Ruby 1.9.x.
3
+ * Switched test-unit and sys-admin from standard dependencies to development
4
+ dependencies.
5
+
1
6
  = 0.1.1 - 14-Jul-2009
2
7
  * Added some well known SID's as constants to the Win32::Security::SID class
3
8
  for convenience, e.g. SID::World, SID::Everyone.
data/README CHANGED
@@ -27,7 +27,7 @@
27
27
  Ruby's
28
28
 
29
29
  == Copyright
30
- (C) 2003-2008 Daniel J. Berger
30
+ (C) 2003-2009 Daniel J. Berger
31
31
  All Rights Reserved
32
32
 
33
33
  == Authors
@@ -25,7 +25,7 @@ module Win32
25
25
  extend Windows::Error
26
26
 
27
27
  # The version of the win32-security library
28
- VERSION = '0.1.1'
28
+ VERSION = '0.1.2'
29
29
 
30
30
  # Returns whether or not the owner of the current process is running
31
31
  # with elevated security privileges.
@@ -0,0 +1,39 @@
1
+ # The Win32 module serves as a namespace only.
2
+ module Win32
3
+
4
+ # The Security class serves as a toplevel class namespace.
5
+ class Security
6
+
7
+ # The ACE class encapsulates an Access Control Entry, an element within
8
+ # an Access Control List.
9
+ class ACE
10
+ # The version of the Win32::Security::ACE class.
11
+ VERSION = '0.1.0'
12
+
13
+ # The ACE type, e.g. ACCESS_ALLOWED, ACCESS_DENIED, etc.
14
+ attr_accessor :ace_type
15
+
16
+ # The ACE mask, e.g. INHERITED_ACE
17
+ attr_accessor :ace_mask
18
+
19
+ # Standard access rights, e.g. GENERIC_READ, GENERIC_WRITE, etc
20
+ attr_accessor :access_mask
21
+
22
+ # Bit flags that indicate whether the ObjectType and
23
+ # InheritedObjectType members are present. This value is set
24
+ # internally based on the values passed to the ACE#object_type or
25
+ # ACE#inherited_object_type methods, if any.
26
+ attr_reader :flags
27
+
28
+ # A Win32::Security::GUID object that identifies the type of child
29
+ # object that can inherit the ACE.
30
+ attr_accessor :object_type
31
+
32
+ attr_accessor :inherited_object_type
33
+
34
+ def initialize
35
+ yield self if block_given?
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,148 @@
1
+ require 'windows/security'
2
+ require 'windows/error'
3
+ require 'windows/limits'
4
+ require 'windows/msvcrt/buffer'
5
+
6
+ # The Win32 module serves as a namespace only.
7
+ module Win32
8
+
9
+ # The Security class serves as a toplevel class namespace.
10
+ class Security
11
+
12
+ # The ACL class encapsulates an Access Control List.
13
+ class ACL
14
+ include Windows::Error
15
+ include Windows::Security
16
+ include Windows::Limits
17
+ include Windows::MSVCRT::Buffer
18
+
19
+ # The version of the Win32::Security::ACL class.
20
+ VERSION = '0.1.0'
21
+
22
+ # The binary representation of the ACL structure
23
+ attr_reader :acl
24
+
25
+ # The revision level.
26
+ attr_reader :revision
27
+
28
+ # Creates and returns a new Win32::Security::ACL object. This object
29
+ # encapsulates an ACL structure, including a binary representation of
30
+ # the ACL itself, and the revision information.
31
+ #
32
+ def initialize(revision = ACL_REVISION)
33
+ acl = 0.chr * 8 # This can be increased later as needed
34
+
35
+ unless InitializeAcl(acl, acl.size, revision)
36
+ raise Error, get_last_error
37
+ end
38
+
39
+ @acl = acl
40
+ @revision = revision
41
+ end
42
+
43
+ # Returns the number of ACE's in the ACL object.
44
+ #
45
+ def ace_count
46
+ buf = 0.chr * 12 # sizeof(ACL_SIZE_INFORMATION)
47
+
48
+ unless GetAclInformation(@acl, buf, buf.size, AclSizeInformation)
49
+ raise Error, get_last_error
50
+ end
51
+
52
+ buf[0, 4].unpack('L')[0]
53
+ end
54
+
55
+ # Adds an access allowed ACE to the given +sid+. The +mask+ is a
56
+ # bitwise OR'd value of access rights.
57
+ #
58
+ def add_access_allowed_ace(sid, mask=0)
59
+ unless AddAccessAllowedAce(@acl, @revision, mask, sid)
60
+ raise Error, get_last_error
61
+ end
62
+ end
63
+
64
+ # Adds an access denied ACE to the given +sid+.
65
+ #
66
+ def add_access_denied_ace(sid, mask=0)
67
+ unless AddAccessDeniedAce(@acl, @revision, mask, sid)
68
+ raise Error, get_last_error
69
+ end
70
+ end
71
+
72
+ # Adds an ACE to the ACL object with the given +revision+ at +index+
73
+ # or the end of the chain if no index is specified.
74
+ #
75
+ # Returns the index if successful.
76
+ #--
77
+ # This is untested and will require an actual implementation of
78
+ # Win32::Security::Ace before it can work properly.
79
+ #
80
+ def add_ace(ace, index=MAXDWORD)
81
+ unless AddAce(@acl, @revision, index, ace, ace.length)
82
+ raise Error, get_last_error
83
+ end
84
+
85
+ index
86
+ end
87
+
88
+ # Deletes an ACE from the ACL object at +index+, or from the end of
89
+ # the chain if no index is specified.
90
+ #
91
+ # Returns the index if successful.
92
+ #--
93
+ # This is untested and will require an actual implementation of
94
+ # Win32::Security::Ace before it can work properly.
95
+ #
96
+ def delete_ace(index=MAXDWORD)
97
+ unless DeleteAce(@ace, index)
98
+ raise Error, get_last_error
99
+ end
100
+
101
+ index
102
+ end
103
+
104
+ # Finds and returns a pointer (address) to an ACE in the ACL at the
105
+ # given +index+. If no index is provided, then an address to the
106
+ # first free byte of the ACL is returned.
107
+ #
108
+ def find_ace(index = nil)
109
+ ptr = [0].pack('L')
110
+
111
+ if index.nil?
112
+ unless FindFirstFreeAce(@acl, ptr)
113
+ raise Error, get_last_error
114
+ end
115
+ else
116
+ unless GetAce(@acl, index, ptr)
117
+ raise Error, get_last_error
118
+ end
119
+ end
120
+
121
+ [ptr].pack('p*').unpack('L')[0]
122
+ end
123
+
124
+ # Sets the revision information level, where the +revision_level+
125
+ # can be ACL_REVISION1, ACL_REVISION2, ACL_REVISION3 or ACL_REVISION4.
126
+ #
127
+ # Returns the revision level if successful.
128
+ #
129
+ def revision=(revision_level)
130
+ buf = [revision_level].pack('L')
131
+
132
+ unless SetAclInformation(@acl, buf, buf.size, AclRevisionInformation)
133
+ raise Error, get_last_error
134
+ end
135
+
136
+ @revision = revision_level
137
+
138
+ revision_level
139
+ end
140
+
141
+ # Returns whether or not the ACL is a valid ACL.
142
+ #
143
+ def valid?
144
+ IsValidAcl(@acl)
145
+ end
146
+ end
147
+ end
148
+ end
@@ -25,7 +25,7 @@ module Win32
25
25
  class Error < StandardError; end
26
26
 
27
27
  # The version of the Win32::Security::SID class.
28
- VERSION = '0.1.1'
28
+ VERSION = '0.1.2'
29
29
 
30
30
  # Some constant SID's for your convenience, in string format.
31
31
  # See http://support.microsoft.com/kb/243330 for details.
@@ -108,7 +108,11 @@ module Win32
108
108
  raise Error, get_last_error
109
109
  end
110
110
 
111
- sid_buf.strip
111
+ if RUBY_VERSION.to_f < 1.9
112
+ sid_buf.strip
113
+ else
114
+ sid_buf.force_encoding('ASCII-8BIT').strip
115
+ end
112
116
  end
113
117
 
114
118
  # Creates a new SID with +authority+ and up to 8 +subauthorities+,
@@ -182,9 +186,11 @@ module Win32
182
186
  domain_cch = [domain_buf.size].pack('L')
183
187
 
184
188
  sid_name_use = 0.chr * 4
189
+ ordinal_val = account[0]
190
+ ordinal_val = ordinal_val.ord if RUBY_VERSION.to_f >= 1.9
185
191
 
186
192
  # If characters in the 0-10 range, assume it's a binary SID.
187
- if account[0] < 10
193
+ if ordinal_val < 10
188
194
  bool = LookupAccountSid(
189
195
  host,
190
196
  [account].pack('p*').unpack('L')[0],
@@ -211,7 +217,7 @@ module Win32
211
217
  end
212
218
 
213
219
  # The arguments are flipped if the account argument is binary
214
- if account[0] < 10
220
+ if ordinal_val < 10
215
221
  @sid = account
216
222
  @account = sid.strip
217
223
  else
@@ -12,7 +12,7 @@ require 'win32/security'
12
12
 
13
13
  class TC_Win32_Security < Test::Unit::TestCase
14
14
  def test_version
15
- assert_equal('0.1.1', Win32::Security::VERSION)
15
+ assert_equal('0.1.2', Win32::Security::VERSION)
16
16
  end
17
17
 
18
18
  def test_elevated_security
data/test/test_sid.rb CHANGED
@@ -23,7 +23,7 @@ class TC_Win32_Security_Sid < Test::Unit::TestCase
23
23
  end
24
24
 
25
25
  def test_version
26
- assert_equal('0.1.1', Security::SID::VERSION)
26
+ assert_equal('0.1.2', Security::SID::VERSION)
27
27
  end
28
28
 
29
29
  def test_sid
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
 
3
3
  spec = Gem::Specification.new do |gem|
4
4
  gem.name = 'win32-security'
5
- gem.version = '0.1.1'
5
+ gem.version = '0.1.2'
6
6
  gem.authors = ['Daniel J. Berger', 'Park Heesob']
7
7
  gem.email = 'djberg96@gmail.com'
8
8
  gem.homepage = 'http://www.rubyforge.org/projects/win32utils'
@@ -17,8 +17,9 @@ spec = Gem::Specification.new do |gem|
17
17
  gem.rubyforge_project = 'win32utils'
18
18
 
19
19
  gem.add_dependency('windows-pr', '>= 0.9.8')
20
- gem.add_dependency('test-unit', '>= 2.0.1')
21
- gem.add_dependency('sys-admin', '>= 1.4.4')
20
+
21
+ gem.add_development_dependency('test-unit', '>= 2.0.1')
22
+ gem.add_development_dependency('sys-admin', '>= 1.4.4')
22
23
 
23
24
  gem.description = <<-EOF
24
25
  The win32-security library provides an interface for dealing with
@@ -27,5 +28,4 @@ spec = Gem::Specification.new do |gem|
27
28
  EOF
28
29
  end
29
30
 
30
- Gem.manage_gems if Gem::RubyGemsVersion.to_f < 1.0
31
31
  Gem::Builder.new(spec).build
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: win32-security
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel J. Berger
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-07-14 00:00:00 -06:00
13
+ date: 2009-08-02 00:00:00 -06:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -25,7 +25,7 @@ dependencies:
25
25
  version:
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: test-unit
28
- type: :runtime
28
+ type: :development
29
29
  version_requirement:
30
30
  version_requirements: !ruby/object:Gem::Requirement
31
31
  requirements:
@@ -35,7 +35,7 @@ dependencies:
35
35
  version:
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: sys-admin
38
- type: :runtime
38
+ type: :development
39
39
  version_requirement:
40
40
  version_requirements: !ruby/object:Gem::Requirement
41
41
  requirements:
@@ -55,6 +55,8 @@ extra_rdoc_files:
55
55
  - MANIFEST
56
56
  files:
57
57
  - CHANGES
58
+ - lib/win32/security/ace.rb
59
+ - lib/win32/security/acl.rb
58
60
  - lib/win32/security/sid.rb
59
61
  - lib/win32/security.rb
60
62
  - MANIFEST
@@ -88,7 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
88
90
  requirements: []
89
91
 
90
92
  rubyforge_project: win32utils
91
- rubygems_version: 1.3.4
93
+ rubygems_version: 1.3.5
92
94
  signing_key:
93
95
  specification_version: 3
94
96
  summary: A library for dealing with aspects of Windows security.