masquerade 0.7.0 → 0.8.0

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.
@@ -1,5 +1,11 @@
1
1
  = Changelog
2
2
 
3
+ == Release 0.8.0 - May 26, 2011
4
+
5
+ * NEW: Setting the right supplemental groups.
6
+ * CHANGE: Setting the group to the user's primary group when a :group is not specified in the call.
7
+ * CHANGE: The block sent to the as method now gets the user_struct and group_struct as returned by Etc methods, instead of the original hash sent to the block
8
+
3
9
  == Relase 0.7.0 - May 03, 2011
4
10
 
5
11
  * FIX: Catching an invalid user or group error also catching the block's ArgumentErrors
data/Manifest CHANGED
@@ -3,3 +3,6 @@ Manifest
3
3
  README.rdoc
4
4
  Rakefile
5
5
  lib/masquerade.rb
6
+ lib/masquerade/bad_user_or_group_error.rb
7
+ lib/masquerade/permission_error.rb
8
+ test/as_test.rb
@@ -1,3 +1,4 @@
1
+ =begin rdoc
1
2
  = Masquerade
2
3
 
3
4
  Run a block of code as another user/group.
@@ -8,6 +9,7 @@ Run a block of code as another user/group.
8
9
 
9
10
  == Usage
10
11
 
12
+ === To run a block of ruby code as another user/group
11
13
  To run a block of code as user "roger" and group "developer":
12
14
  Masquerade.as :user => "roger", :group => "developer" do
13
15
  puts "Hello world"
@@ -18,9 +20,11 @@ Alternatively, you can use the uid and gid directly:
18
20
  puts "Hello world"
19
21
  end
20
22
 
21
- The block of code accepts the user hash as a paramter. So you can do things like:
23
+ The block of code gets a user_info parameter.
24
+ This paramter can have a user and a group object depending on what was passed to the as method. So you can do things like:
22
25
  Masquerade.as :user => "roger", :group => "developer" do |user_info|
23
- puts "Hello #{user_info[:user]}"
26
+ puts user_info[:user].inspect
27
+ puts user_info[:group].inspect
24
28
  end
25
29
 
26
30
  Both :user and :group params are optional and you can choose to give one of the two or both:
@@ -28,17 +32,19 @@ Both :user and :group params are optional and you can choose to give one of the
28
32
  puts "Hello #{user_info[:user]}"
29
33
  end
30
34
 
35
+ If a :user is given without a corresponding :group, the primary group of the user is used.
36
+
37
+ ==== Return value
38
+ Returns the result of the block call. So you can do:
39
+ response = Masquerade.as :user => "roger", :group => "developer" do |user_info|
40
+ "Hello world #{user_info[:user]}"
41
+ end
42
+
31
43
  === Exceptions thrown
32
44
  ==== Masquerade::PermissionsError
33
-
34
45
  If the user running the script does not have the privileges to masquerade as the given user.
35
46
 
36
47
  ==== Masquerade::BadUserOrGroupError
37
48
  If the given user or group does not exist
38
49
 
39
- === Return value
40
-
41
- Returns the result of the block call. So you can do:
42
- response = Masquerade.as :user => "roger", :group => "developer" do |user_info|
43
- "Hello world #{user_info[:user]}"
44
- end
50
+ =end
data/Rakefile CHANGED
@@ -2,12 +2,12 @@ require "rubygems"
2
2
  require "rake"
3
3
  require "echoe"
4
4
 
5
- Echoe.new("masquerade", "0.7.0") do |p|
6
- p.description = "A user/group impersonator. Allows you to run a block of code as another user or group."
7
- p.summary = "A user/group impersonator. Allows you to run a block of code as another user or group"
5
+ Echoe.new("masquerade", "0.8.0") do |p|
6
+ p.description = "A user/group impersonator. Allows you to run a block of code as another user or group. *NIX only."
7
+ p.summary = "A user/group impersonator. Allows you to run a block of code as another user or group. *NIX only."
8
8
  p.url = "http://rubygems.org/gems/masquerade"
9
9
  p.author = "Nitesh Goel"
10
- p.email = "nitesh@wikinvest.com"
10
+ p.email = "nitesh@sigfig.com"
11
11
  p.ignore_pattern = ["tmp/*", "script/*"]
12
12
  end
13
13
 
@@ -1,4 +1,3 @@
1
- require "etc"
2
1
  =begin rdoc
3
2
  = Masquerade
4
3
 
@@ -10,6 +9,7 @@ Run a block of code as another user/group.
10
9
 
11
10
  == Usage
12
11
 
12
+ === To run a block of ruby code as another user/group
13
13
  To run a block of code as user "roger" and group "developer":
14
14
  Masquerade.as :user => "roger", :group => "developer" do
15
15
  puts "Hello world"
@@ -20,9 +20,11 @@ Alternatively, you can use the uid and gid directly:
20
20
  puts "Hello world"
21
21
  end
22
22
 
23
- The block of code accepts the user hash as a paramter. So you can do things like:
23
+ The block of code gets a user_info parameter.
24
+ This paramter can have a user and a group object depending on what was passed to the as method. So you can do things like:
24
25
  Masquerade.as :user => "roger", :group => "developer" do |user_info|
25
- puts "Hello #{user_info[:user]}"
26
+ puts user_info[:user].inspect
27
+ puts user_info[:group].inspect
26
28
  end
27
29
 
28
30
  Both :user and :group params are optional and you can choose to give one of the two or both:
@@ -30,72 +32,115 @@ Both :user and :group params are optional and you can choose to give one of the
30
32
  puts "Hello #{user_info[:user]}"
31
33
  end
32
34
 
35
+ If a :user is given without a corresponding :group, the primary group of the user is used.
36
+
37
+ ==== Return value
38
+ Returns the result of the block call. So you can do:
39
+ response = Masquerade.as :user => "roger", :group => "developer" do |user_info|
40
+ "Hello world #{user_info[:user]}"
41
+ end
42
+
33
43
  === Exceptions thrown
34
44
  ==== Masquerade::PermissionsError
35
-
36
45
  If the user running the script does not have the privileges to masquerade as the given user.
37
46
 
38
47
  ==== Masquerade::BadUserOrGroupError
39
48
  If the given user or group does not exist
40
49
 
41
- === Return value
42
-
43
- Returns the result of the block call. So you can do:
44
- response = Masquerade.as :user => "roger", :group => "developer" do |user_info|
45
- "Hello world #{user_info[:user]}"
46
- end
47
50
  =end
51
+
52
+ require "etc"
53
+ require "masquerade/bad_user_or_group_error"
54
+ require "masquerade/permission_error"
55
+
48
56
  module Masquerade
57
+ # Run a block of ruby code as another user/group
49
58
  def self.as(who)
50
59
  current_euid = Process.euid
51
60
  current_egid = Process.egid
52
61
  current_uid = Process.uid
53
62
  current_gid = Process.gid
54
- begin
55
- if who.include? :group
56
- group_struct = nil
57
- if who[:group].kind_of? String
58
- # get group info by name
59
- group_struct = Etc.getgrnam(who[:group])
60
- elsif who[:group].kind_of? Numeric
61
- # get group info by gid
62
- group_struct = Etc.getgrgid(who[:group])
63
- end
64
- # set the gid of the current process to that of the chosen group
65
- Process.egid = group_struct.gid
66
- Process.gid = group_struct.gid
67
- end
68
- if who.include? :user
69
- user_struct = nil
70
- if who[:user].kind_of? String
71
- # get user info by name
72
- user_struct = Etc.getpwnam(who[:user])
73
- elsif who[:user].kind_of? Numeric
74
- # get user info by uid
75
- user_struct = Etc.getpwuid(who[:user])
76
- end
77
- # set the uid of the current process to that of the chosen user
78
- Process.euid = user_struct.uid
79
- Process.uid = user_struct.uid
63
+ current_groups = Process.groups
64
+ group_struct = nil
65
+ user_struct = nil
66
+
67
+ if who.include? :group
68
+ group_struct = self.system_group(who[:group])
69
+ # set the gid of the current process to that of the chosen group
70
+ Process.egid = group_struct.gid
71
+ Process.gid = group_struct.gid
72
+ end
73
+ if who.include? :user
74
+ user_struct = self.system_user(who[:user])
75
+ unless who.include? :group
76
+ Process.egid = user_struct.gid
77
+ Process.gid = user_struct.gid
80
78
  end
81
- rescue Errno::EPERM
82
- raise PermissionsError, "You do not have permissions to impersonate this user or group"
83
- rescue ArgumentError
84
- raise BadUserOrGroupError, "The user or group does not exist"
79
+ # set the supplemental groups
80
+ Process.initgroups(user_struct.name, user_struct.gid)
81
+ # set the uid of the current process to that of the chosen user
82
+ Process.euid = user_struct.uid
83
+ Process.uid = user_struct.uid
85
84
  end
85
+
86
86
  # run the block
87
- response = yield who
88
- # restore process uid and gid
87
+ yield_who = {}
88
+ yield_who[:user] = user_struct unless user_struct.nil?
89
+ yield_who[:group] = group_struct unless group_struct.nil?
90
+ response = yield yield_who
91
+
92
+ # restore process user and groups
89
93
  Process.uid = current_uid
90
94
  Process.euid = current_euid
91
95
  Process.gid = current_gid
92
96
  Process.egid = current_egid
97
+ begin
98
+ Process.groups = current_groups
99
+ rescue Errno::EINVAL
100
+ #on macs, groups like com.apple.screen_sharing cannot be set
101
+ end
93
102
  return response
94
103
  end
95
104
 
96
- class PermissionsError < StandardError
105
+ private
106
+
107
+ def self.system_user(user_name_or_id)
108
+ begin
109
+ user_struct = {}
110
+ if user_name_or_id.kind_of? String
111
+ # get user info by name
112
+ user_struct = Etc.getpwnam(user_name_or_id)
113
+ elsif user_name_or_id.kind_of? Numeric
114
+ # get user info by uid
115
+ user_struct = Etc.getpwuid(user_name_or_id)
116
+ else
117
+ raise Masquerade::BadUserOrGroupError, "The user must be a string (username) or a number (uid)"
118
+ end
119
+ return user_struct
120
+ rescue Errno::EPERM
121
+ raise Masquerade::PermissionsError, "You do not have permissions to impersonate this user or group"
122
+ rescue ArgumentError
123
+ raise Masquerade::BadUserOrGroupError, "The user or group does not exist"
124
+ end
97
125
  end
98
126
 
99
- class BadUserOrGroupError < StandardError
127
+ def self.system_group(group_name_or_id)
128
+ begin
129
+ group_struct = {}
130
+ if group_name_or_id.kind_of? String
131
+ # get group info by name
132
+ group_struct = Etc.getgrnam(group_name_or_id)
133
+ elsif group_name_or_id.kind_of? Numeric
134
+ # get group info by gid
135
+ group_struct = Etc.getgrgid(group_name_or_id)
136
+ else
137
+ raise Masquerade::BadUserOrGroupError, "The group must be a string (group name) or a number (gid)"
138
+ end
139
+ return group_struct
140
+ rescue Errno::EPERM
141
+ raise Masquerade::PermissionsError, "You do not have permissions to impersonate this user or group"
142
+ rescue ArgumentError
143
+ raise Masquerade::BadUserOrGroupError, "The user or group does not exist"
144
+ end
100
145
  end
101
146
  end
@@ -0,0 +1,5 @@
1
+ module Masquerade
2
+ # Error raised when the user or group to be impersonated does not exist.
3
+ class BadUserOrGroupError < StandardError
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ module Masquerade
2
+ # Error raised when the user calling masquerade does not have privileges to
3
+ # impersonate another user.
4
+ class PermissionsError < StandardError
5
+ end
6
+ end
@@ -2,21 +2,22 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{masquerade}
5
- s.version = "0.7.0"
5
+ s.version = "0.8.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Nitesh Goel"]
9
- s.date = %q{2011-05-03}
10
- s.description = %q{A user/group impersonator. Allows you to run a block of code as another user or group.}
11
- s.email = %q{nitesh@wikinvest.com}
12
- s.extra_rdoc_files = ["CHANGELOG.rdoc", "README.rdoc", "lib/masquerade.rb"]
13
- s.files = ["CHANGELOG.rdoc", "Manifest", "README.rdoc", "Rakefile", "lib/masquerade.rb", "masquerade.gemspec"]
9
+ s.date = %q{2011-05-26}
10
+ s.description = %q{A user/group impersonator. Allows you to run a block of code as another user or group. *NIX only.}
11
+ s.email = %q{nitesh@sigfig.com}
12
+ s.extra_rdoc_files = ["CHANGELOG.rdoc", "README.rdoc", "lib/masquerade.rb", "lib/masquerade/bad_user_or_group_error.rb", "lib/masquerade/permission_error.rb"]
13
+ s.files = ["CHANGELOG.rdoc", "Manifest", "README.rdoc", "Rakefile", "lib/masquerade.rb", "lib/masquerade/bad_user_or_group_error.rb", "lib/masquerade/permission_error.rb", "test/as_test.rb", "masquerade.gemspec"]
14
14
  s.homepage = %q{http://rubygems.org/gems/masquerade}
15
15
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Masquerade", "--main", "README.rdoc"]
16
16
  s.require_paths = ["lib"]
17
17
  s.rubyforge_project = %q{masquerade}
18
18
  s.rubygems_version = %q{1.7.2}
19
- s.summary = %q{A user/group impersonator. Allows you to run a block of code as another user or group}
19
+ s.summary = %q{A user/group impersonator. Allows you to run a block of code as another user or group. *NIX only.}
20
+ s.test_files = ["test/as_test.rb"]
20
21
 
21
22
  if s.respond_to? :specification_version then
22
23
  s.specification_version = 3
@@ -0,0 +1,6 @@
1
+ require "rubygems"
2
+ require "masquerade"
3
+ username = ARGV.shift
4
+ Masquerade.as :user => username do
5
+ %x[env > /tmp/test_as.txt]
6
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: masquerade
3
3
  version: !ruby/object:Gem::Version
4
- hash: 3
4
+ hash: 63
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 7
8
+ - 8
9
9
  - 0
10
- version: 0.7.0
10
+ version: 0.8.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Nitesh Goel
@@ -15,11 +15,11 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-05-03 00:00:00 Z
18
+ date: 2011-05-26 00:00:00 Z
19
19
  dependencies: []
20
20
 
21
- description: A user/group impersonator. Allows you to run a block of code as another user or group.
22
- email: nitesh@wikinvest.com
21
+ description: A user/group impersonator. Allows you to run a block of code as another user or group. *NIX only.
22
+ email: nitesh@sigfig.com
23
23
  executables: []
24
24
 
25
25
  extensions: []
@@ -28,12 +28,17 @@ extra_rdoc_files:
28
28
  - CHANGELOG.rdoc
29
29
  - README.rdoc
30
30
  - lib/masquerade.rb
31
+ - lib/masquerade/bad_user_or_group_error.rb
32
+ - lib/masquerade/permission_error.rb
31
33
  files:
32
34
  - CHANGELOG.rdoc
33
35
  - Manifest
34
36
  - README.rdoc
35
37
  - Rakefile
36
38
  - lib/masquerade.rb
39
+ - lib/masquerade/bad_user_or_group_error.rb
40
+ - lib/masquerade/permission_error.rb
41
+ - test/as_test.rb
37
42
  - masquerade.gemspec
38
43
  homepage: http://rubygems.org/gems/masquerade
39
44
  licenses: []
@@ -73,6 +78,6 @@ rubyforge_project: masquerade
73
78
  rubygems_version: 1.7.2
74
79
  signing_key:
75
80
  specification_version: 3
76
- summary: A user/group impersonator. Allows you to run a block of code as another user or group
77
- test_files: []
78
-
81
+ summary: A user/group impersonator. Allows you to run a block of code as another user or group. *NIX only.
82
+ test_files:
83
+ - test/as_test.rb