rcaps 0.9.10 → 0.9.20

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.
Files changed (5) hide show
  1. data/extconf.rb +0 -0
  2. data/rcaps.c +76 -40
  3. data/rcaps.h +3 -3
  4. data/test/all_tests.rb +0 -0
  5. metadata +41 -34
data/extconf.rb CHANGED
File without changes
data/rcaps.c CHANGED
@@ -49,6 +49,15 @@
49
49
  *
50
50
  * c.set_proc
51
51
  *
52
+ * === Fetch running capabilities from another process and clear them.
53
+ * require 'rcaps'
54
+ *
55
+ * c = Caps.get_proc(1234)
56
+ *
57
+ * c.clear
58
+ *
59
+ * c.set_proc(1234)
60
+ *
52
61
  * === Fetch running capabilities and ensure a certain capability is not set.
53
62
  * require 'rcaps'
54
63
  *
@@ -78,6 +87,8 @@
78
87
  */
79
88
 
80
89
  #include "ruby.h"
90
+ //so that we get _cap_names.
91
+ #undef _POSIX_SOURCE
81
92
  #include <sys/capability.h>
82
93
 
83
94
  #include "rcaps.h"
@@ -90,13 +101,13 @@ Init_rcaps()
90
101
 
91
102
  /* Caps class methods */
92
103
  rb_define_singleton_method(rb_cCaps, "new", caps_new, -1);
93
- rb_define_singleton_method(rb_cCaps, "get_proc", caps_get_proc, 0);
104
+ rb_define_singleton_method(rb_cCaps, "get_proc", caps_get_proc, -1);
94
105
 
95
106
  /* Caps instance methods */
96
107
  rb_define_method(rb_cCaps, "initialize", caps_init, -1);
97
108
  rb_define_method(rb_cCaps, "to_s", caps_to_string, 0);
98
109
  rb_define_method(rb_cCaps, "clear", caps_clear, 0);
99
- rb_define_method(rb_cCaps, "set_proc", caps_set_proc, 0);
110
+ rb_define_method(rb_cCaps, "set_proc", caps_set_proc, -1);
100
111
  rb_define_method(rb_cCaps, "set_effective", caps_SET_EFFECTIVE, 1);
101
112
  rb_define_method(rb_cCaps, "clear_effective", caps_CLEAR_EFFECTIVE, 1);
102
113
  rb_define_method(rb_cCaps, "set_permitted", caps_SET_PERMITTED, 1);
@@ -148,20 +159,38 @@ static VALUE caps_new (int argc, VALUE *argv, VALUE klass) {
148
159
  /*
149
160
  * Returns a new Caps object initialized with the set of capabilities from
150
161
  * the currently running process.
162
+ * If passed a pid, the capabilities for that process will be retrieved
163
+ * instead.
151
164
  */
152
- static VALUE caps_get_proc (VALUE klass) {
165
+ static VALUE caps_get_proc (int argc, VALUE *argv, VALUE klass) {
153
166
  cap_t caps;
154
- VALUE cdata;
155
- VALUE argv[1];
167
+ VALUE cdata, optional_pid;
168
+ pid_t pid;
156
169
 
157
- if ((caps = cap_get_proc()) == NULL)
158
- rb_sys_fail("Error retrieving active capabilties");
170
+ rb_scan_args(argc, argv, "01", &optional_pid);
171
+
172
+ switch(TYPE(optional_pid)) {
173
+ case T_NIL:
174
+ //without an argument, we'll fetch our own current capabilities.
175
+ pid = getpid();
176
+ break;
177
+ case T_FIXNUM:
178
+ pid = (pid_t) FIX2INT(optional_pid);
179
+ break;
180
+ default:
181
+ rb_raise(rb_eTypeError, "Invalid value passed as PID to retrieve capabilities from.");
182
+ break;
183
+ }
184
+
185
+ if ((caps = cap_init()) == NULL)
186
+ rb_sys_fail("Error initializing empty capability set");
187
+ else if (capgetp(pid, caps) != 0)
188
+ rb_sys_fail("Error retrieving capabilities from active process");
159
189
 
160
190
  //as this is just a convenience wrapper instead of new(), we still
161
191
  //want to call initialize.
162
192
  cdata = Data_Wrap_Struct(klass, 0, caps_free, caps);
163
- argv[0] = rb_funcall(cdata, rb_intern("to_s"), 0);
164
- rb_obj_call_init(cdata, 1, argv);
193
+ rb_obj_call_init(cdata, argc, argv);
165
194
 
166
195
  return cdata;
167
196
  }
@@ -212,14 +241,32 @@ static VALUE caps_clear (VALUE self) {
212
241
  /*
213
242
  * Install the Caps object into the kernel. This is analogous to the C level
214
243
  * function cap_set_proc.
244
+ * If a pid is given, the capabilities will be installed for that process
245
+ * instead. [Note: This likely won't work, but we support it anyway]
215
246
  */
216
- static VALUE caps_set_proc (VALUE self) {
247
+ static VALUE caps_set_proc (int argc, VALUE *argv, VALUE self) {
217
248
  cap_t caps;
249
+ VALUE optional_pid;
250
+ pid_t pid;
218
251
 
219
252
  Data_Get_Struct(self, struct _cap_struct, caps);
253
+ rb_scan_args(argc, argv, "01", &optional_pid);
220
254
 
221
- if (cap_set_proc(caps) != 0)
222
- rb_sys_fail("Error activating capabilities.");
255
+ switch(TYPE(optional_pid)) {
256
+ case T_NIL:
257
+ //without an argument, we'll fetch our own current capabilities.
258
+ pid = getpid();
259
+ break;
260
+ case T_FIXNUM:
261
+ pid = (pid_t) FIX2INT(optional_pid);
262
+ break;
263
+ default:
264
+ rb_raise(rb_eTypeError, "Invalid value passed as PID to retrieve capabilities from.");
265
+ break;
266
+ }
267
+
268
+ if (capsetp(pid, caps) != 0)
269
+ rb_sys_fail("Error setting capabilities for process");
223
270
 
224
271
  return self;
225
272
  }
@@ -384,34 +431,23 @@ static VALUE caps_INHERITABLE (VALUE self, VALUE cap) {\
384
431
  }
385
432
 
386
433
  static void caps_setup_constants (void) {
434
+ int i;
435
+ char *sname, *x;
436
+
387
437
  /* these constants represent capabilities that may be toggled on/off
388
438
  * in one of the sets of cap_flag_t enumerated list */
389
- rb_define_const(rb_cCaps, "CHOWN", INT2FIX(CAP_CHOWN));
390
- rb_define_const(rb_cCaps, "DAC_OVERRIDE", INT2FIX(CAP_DAC_OVERRIDE));
391
- rb_define_const(rb_cCaps, "DAC_READ_SEARCH", INT2FIX(CAP_DAC_READ_SEARCH));
392
- rb_define_const(rb_cCaps, "FOWNER", INT2FIX(CAP_FOWNER));
393
- rb_define_const(rb_cCaps, "FSETID", INT2FIX(CAP_FSETID));
394
- rb_define_const(rb_cCaps, "KILL", INT2FIX(CAP_KILL));
395
- rb_define_const(rb_cCaps, "SETGID", INT2FIX(CAP_SETGID));
396
- rb_define_const(rb_cCaps, "SETUID", INT2FIX(CAP_SETUID));
397
- rb_define_const(rb_cCaps, "LINUX_IMMUTABLE", INT2FIX(CAP_LINUX_IMMUTABLE));
398
- rb_define_const(rb_cCaps, "NET_BIND_SERVICE", INT2FIX(CAP_NET_BIND_SERVICE));
399
- rb_define_const(rb_cCaps, "NET_BROADCAST", INT2FIX(CAP_NET_BROADCAST));
400
- rb_define_const(rb_cCaps, "NET_ADMIN", INT2FIX(CAP_NET_ADMIN));
401
- rb_define_const(rb_cCaps, "NET_RAW", INT2FIX(CAP_NET_RAW));
402
- rb_define_const(rb_cCaps, "IPC_LOCK", INT2FIX(CAP_IPC_LOCK));
403
- rb_define_const(rb_cCaps, "IPC_OWNER", INT2FIX(CAP_IPC_OWNER));
404
- rb_define_const(rb_cCaps, "SYS_MODULE", INT2FIX(CAP_SYS_MODULE));
405
- rb_define_const(rb_cCaps, "SYS_RAWIO", INT2FIX(CAP_SYS_RAWIO));
406
- rb_define_const(rb_cCaps, "SYS_CHROOT", INT2FIX(CAP_SYS_CHROOT));
407
- rb_define_const(rb_cCaps, "SYS_PTRACE", INT2FIX(CAP_SYS_PTRACE));
408
- rb_define_const(rb_cCaps, "SYS_PACCT", INT2FIX(CAP_SYS_PACCT));
409
- rb_define_const(rb_cCaps, "SYS_ADMIN", INT2FIX(CAP_SYS_ADMIN));
410
- rb_define_const(rb_cCaps, "SYS_BOOT", INT2FIX(CAP_SYS_BOOT));
411
- rb_define_const(rb_cCaps, "SYS_NICE", INT2FIX(CAP_SYS_NICE));
412
- rb_define_const(rb_cCaps, "SYS_RESOURCE", INT2FIX(CAP_SYS_RESOURCE));
413
- rb_define_const(rb_cCaps, "SYS_TIME", INT2FIX(CAP_SYS_TIME));
414
- rb_define_const(rb_cCaps, "SYS_TTY_CONFIG", INT2FIX(CAP_SYS_TTY_CONFIG));
415
- rb_define_const(rb_cCaps, "MKNOD", INT2FIX(CAP_MKNOD));
416
- rb_define_const(rb_cCaps, "LEASE", INT2FIX(CAP_LEASE));
439
+
440
+ /* This makes us Linux specific, as _cap_names is not part of the POSIX
441
+ * spec. */
442
+ for (i = 0; _cap_names[i]; i++) {
443
+ sname = strdup((char *)(_cap_names[i] + 4)); //strip off the cap_ part.
444
+ x = sname;
445
+ while (*x) {
446
+ *x = toupper(*x);
447
+ x++;
448
+ }
449
+
450
+ rb_define_const(rb_cCaps, sname, INT2FIX(i));
451
+ free(sname);
452
+ }
417
453
  }
data/rcaps.h CHANGED
@@ -7,14 +7,14 @@ static void caps_setup_constants (void); //define names for capabilities
7
7
  static void caps_free (cap_t);
8
8
 
9
9
  /* Caps class methods */
10
- static VALUE caps_init (int, VALUE *, VALUE);
11
10
  static VALUE caps_new (int, VALUE *, VALUE);
12
- static VALUE caps_get_proc (VALUE);
11
+ static VALUE caps_get_proc (int, VALUE *, VALUE);
13
12
 
14
13
  /* Caps instance methods */
14
+ static VALUE caps_init (int, VALUE *, VALUE);
15
15
  static VALUE caps_to_string (VALUE);
16
16
  static VALUE caps_clear (VALUE);
17
- static VALUE caps_set_proc (VALUE);
17
+ static VALUE caps_set_proc (int, VALUE *, VALUE);
18
18
  static VALUE captoggle (VALUE, VALUE, cap_flag_t, cap_flag_value_t);
19
19
  // functions to toggle capabilities in the various sets.
20
20
  static VALUE caps_SET_EFFECTIVE (VALUE, VALUE);
data/test/all_tests.rb CHANGED
File without changes
metadata CHANGED
@@ -1,49 +1,56 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.4
3
- specification_version: 1
4
2
  name: rcaps
5
3
  version: !ruby/object:Gem::Version
6
- version: 0.9.10
7
- date: 2008-09-27 00:00:00 -04:00
8
- summary: A library for manipulating capabilities using the POSIX 1003.1e interfaces
9
- require_paths:
10
- - lib
11
- email: bdwalton@gmail.com
12
- homepage: http://rcaps.rubyforge.org/
13
- rubyforge_project: http://rubyforge.org/projects/rcaps
14
- description:
15
- autorequire:
16
- default_executable:
17
- bindir: bin
18
- has_rdoc: true
19
- required_ruby_version: !ruby/object:Gem::Version::Requirement
20
- requirements:
21
- - - ">"
22
- - !ruby/object:Gem::Version
23
- version: 0.0.0
24
- version:
4
+ version: 0.9.20
25
5
  platform: ruby
26
- signing_key:
27
- cert_chain:
28
- post_install_message:
29
6
  authors:
30
7
  - Ben Walton
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-10-09 00:00:00 -04:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email: bdwalton@gmail.com
18
+ executables: []
19
+
20
+ extensions:
21
+ - extconf.rb
22
+ extra_rdoc_files: []
23
+
31
24
  files:
32
25
  - COPYING
33
26
  - gpl.txt
34
27
  - rcaps.c
35
28
  - rcaps.h
36
- test_files:
37
- - test/all_tests.rb
29
+ has_rdoc: true
30
+ homepage: http://rcaps.rubyforge.org/
31
+ post_install_message:
38
32
  rdoc_options:
39
33
  - -x test/
40
- extra_rdoc_files: []
41
-
42
- executables: []
43
-
44
- extensions:
45
- - extconf.rb
34
+ require_paths:
35
+ - lib
36
+ required_ruby_version: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: "0"
41
+ version:
42
+ required_rubygems_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: "0"
47
+ version:
46
48
  requirements: []
47
49
 
48
- dependencies: []
49
-
50
+ rubyforge_project: http://rubyforge.org/projects/rcaps
51
+ rubygems_version: 1.1.1
52
+ signing_key:
53
+ specification_version: 2
54
+ summary: A library for manipulating capabilities using the POSIX 1003.1e interfaces
55
+ test_files:
56
+ - test/all_tests.rb