capng_c 0.1.6 → 0.1.7

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.
@@ -13,21 +13,50 @@
13
13
 
14
14
  #include <capng.h>
15
15
 
16
- struct CapNG {};
17
-
18
- static void capng_free(void* capng);
19
-
20
- static const rb_data_type_t rb_capng_type = {
21
- "capng/capng",
22
- {
23
- 0,
24
- capng_free,
25
- 0,
26
- },
27
- NULL,
28
- NULL,
29
- RUBY_TYPED_FREE_IMMEDIATELY
30
- };
16
+ /* clang-format off */
17
+ /*
18
+ * Document-class: CapNG
19
+ *
20
+ * CapNG class.
21
+ *
22
+ * @example
23
+ * # Current process capability example
24
+ * require 'capng'
25
+ *
26
+ * @capng = CapNG.new(:current_process)
27
+ * @capng.have_capability?(:effective, :dac_read_search)
28
+ *
29
+ * @example
30
+ * # Other process capability example
31
+ * require 'capng'
32
+ *
33
+ * @capng = CapNG.new(:other_process, 12345)
34
+ * @capng.have_capability?(:effective, :dac_override)
35
+ *
36
+ * @example
37
+ * # File capability example
38
+ * require 'capng'
39
+ *
40
+ * @capng = CapNG.new(:file, "/path/to/file")
41
+ * @capng.have_capability?(:effective, :chown)
42
+ */
43
+ /* clang-format on */
44
+
45
+ struct CapNG
46
+ {};
47
+
48
+ static void
49
+ capng_free(void* capng);
50
+
51
+ static const rb_data_type_t rb_capng_type = { "capng/capng",
52
+ {
53
+ 0,
54
+ capng_free,
55
+ 0,
56
+ },
57
+ NULL,
58
+ NULL,
59
+ RUBY_TYPED_FREE_IMMEDIATELY };
31
60
 
32
61
  static void
33
62
  capng_free(void* ptr)
@@ -40,19 +69,27 @@ rb_capng_alloc(VALUE klass)
40
69
  {
41
70
  VALUE obj;
42
71
  struct CapNG* capng;
43
- obj = TypedData_Make_Struct(
44
- klass, struct CapNG, &rb_capng_type, capng);
72
+ obj = TypedData_Make_Struct(klass, struct CapNG, &rb_capng_type, capng);
45
73
  return obj;
46
74
  }
47
75
 
76
+ /*
77
+ * Initalize CapNG class.
78
+ *
79
+ * @overload initialize(target=nil, pid_or_file=nil)
80
+ * @option param target [String or Symbol] Specify capability target.
81
+ * @option param pid_or_file [String or Symbol] Querying XPath.
82
+ * @return [nil]
83
+ *
84
+ */
48
85
  static VALUE
49
- rb_capng_initialize(int argc, VALUE *argv, VALUE self)
86
+ rb_capng_initialize(int argc, VALUE* argv, VALUE self)
50
87
  {
51
88
  VALUE rb_target, rb_pid_or_file;
52
89
  int result = 0;
53
- char *target = NULL;
90
+ char* target = NULL;
54
91
  int pid = 0, fd = 0;
55
- rb_io_t *fptr = NULL;
92
+ rb_io_t* fptr = NULL;
56
93
 
57
94
  rb_scan_args(argc, argv, "02", &rb_target, &rb_pid_or_file);
58
95
 
@@ -96,29 +133,46 @@ rb_capng_initialize(int argc, VALUE *argv, VALUE self)
96
133
  return Qnil;
97
134
  }
98
135
 
136
+ /*
137
+ * Retrieve capability API status code on [CapNG#initialize] and file capability target.
138
+ *
139
+ * @return [@return_code]
140
+ *
141
+ */
99
142
  static VALUE
100
143
  rb_capng_return_code(VALUE self)
101
144
  {
102
145
  return rb_iv_get(self, "@return_code");
103
146
  }
104
147
 
148
+ /*
149
+ * Clear capabilities on specified target.
150
+ *
151
+ * @param rb_select_name_or_enum [Symbol or String or Fixnum] targets are CAPS, BOUNDS,
152
+ * BOTH, and AMBIENT for supported platform.
153
+ *
154
+ * @return [nil]
155
+ *
156
+ */
105
157
  static VALUE
106
158
  rb_capng_clear(VALUE self, VALUE rb_select_name_or_enum)
107
159
  {
108
160
  capng_select_t select = 0;
109
161
 
110
162
  switch (TYPE(rb_select_name_or_enum)) {
111
- case T_SYMBOL:
112
- select = select_name_to_select_type(RSTRING_PTR(rb_sym2str(rb_select_name_or_enum)));
113
- break;
114
- case T_STRING:
115
- select = select_name_to_select_type(StringValuePtr(rb_select_name_or_enum));
116
- break;
117
- case T_FIXNUM:
118
- select = NUM2INT(rb_select_name_or_enum);
119
- break;
120
- default:
121
- rb_raise(rb_eArgError, "Expected a String or a Symbol instance, or a capability type constant");
163
+ case T_SYMBOL:
164
+ select =
165
+ select_name_to_select_type(RSTRING_PTR(rb_sym2str(rb_select_name_or_enum)));
166
+ break;
167
+ case T_STRING:
168
+ select = select_name_to_select_type(StringValuePtr(rb_select_name_or_enum));
169
+ break;
170
+ case T_FIXNUM:
171
+ select = NUM2INT(rb_select_name_or_enum);
172
+ break;
173
+ default:
174
+ rb_raise(rb_eArgError,
175
+ "Expected a String or a Symbol instance, or a capability type constant");
122
176
  }
123
177
 
124
178
  capng_clear(select);
@@ -126,23 +180,34 @@ rb_capng_clear(VALUE self, VALUE rb_select_name_or_enum)
126
180
  return Qnil;
127
181
  }
128
182
 
183
+ /*
184
+ * Fill capabilities on specified target.
185
+ *
186
+ * @param rb_select_name_or_enum [Symbol or String or Fixnum] targets are CAPS, BOUNDS,
187
+ * BOTH, and AMBIENT for supported platform.
188
+ *
189
+ * @return [nil]
190
+ *
191
+ */
129
192
  static VALUE
130
193
  rb_capng_fill(VALUE self, VALUE rb_select_name_or_enum)
131
194
  {
132
195
  capng_select_t select = 0;
133
196
 
134
197
  switch (TYPE(rb_select_name_or_enum)) {
135
- case T_SYMBOL:
136
- select = select_name_to_select_type(RSTRING_PTR(rb_sym2str(rb_select_name_or_enum)));
137
- break;
138
- case T_STRING:
139
- select = select_name_to_select_type(StringValuePtr(rb_select_name_or_enum));
140
- break;
141
- case T_FIXNUM:
142
- select = NUM2INT(rb_select_name_or_enum);
143
- break;
144
- default:
145
- rb_raise(rb_eArgError, "Expected a String or a Symbol instance, or a capability type constant");
198
+ case T_SYMBOL:
199
+ select =
200
+ select_name_to_select_type(RSTRING_PTR(rb_sym2str(rb_select_name_or_enum)));
201
+ break;
202
+ case T_STRING:
203
+ select = select_name_to_select_type(StringValuePtr(rb_select_name_or_enum));
204
+ break;
205
+ case T_FIXNUM:
206
+ select = NUM2INT(rb_select_name_or_enum);
207
+ break;
208
+ default:
209
+ rb_raise(rb_eArgError,
210
+ "Expected a String or a Symbol instance, or a capability type constant");
146
211
  }
147
212
 
148
213
  capng_fill(select);
@@ -150,6 +215,14 @@ rb_capng_fill(VALUE self, VALUE rb_select_name_or_enum)
150
215
  return Qnil;
151
216
  }
152
217
 
218
+ /*
219
+ * Specify process ID to retrieve other process capabilities.
220
+ *
221
+ * @param rb_pid [Fixnum] Process ID.
222
+ *
223
+ * @return [nil]
224
+ *
225
+ */
153
226
  static VALUE
154
227
  rb_capng_setpid(VALUE self, VALUE rb_pid)
155
228
  {
@@ -160,6 +233,13 @@ rb_capng_setpid(VALUE self, VALUE rb_pid)
160
233
  return Qnil;
161
234
  }
162
235
 
236
+ /*
237
+ * Specify process ID to retrieve process capabilities. If not
238
+ * calling #setpid before, it returns current process' capabilities.
239
+ *
240
+ * @return [Boolean]
241
+ *
242
+ */
163
243
  static VALUE
164
244
  rb_capng_get_caps_process(VALUE self)
165
245
  {
@@ -172,9 +252,21 @@ rb_capng_get_caps_process(VALUE self)
172
252
  return Qfalse;
173
253
  }
174
254
 
255
+ /*
256
+ * Update capabilities.
257
+ *
258
+ * @param rb_action_name_or_action [Symbol or String or Fixnum] ADD or DROP.
259
+ * @param rb_capability_name_or_type [Symbol or String or Fixnum]
260
+ * Effective/Inheritable/Permitted/Ambient (If supported) or their combinations
261
+ * @param rb_capability_or_name [Symbol or String or Fixnum] Capability name or constants.
262
+ *
263
+ * @see: [CapNG::Capability])
264
+ *
265
+ * @return [Boolean]
266
+ */
175
267
  static VALUE
176
- rb_capng_update(VALUE self,
177
- VALUE rb_action_name_or_action, VALUE rb_capability_name_or_type, VALUE rb_capability_or_name)
268
+ rb_capng_update(VALUE self, VALUE rb_action_name_or_action,
269
+ VALUE rb_capability_name_or_type, VALUE rb_capability_or_name)
178
270
  {
179
271
  int result = 0;
180
272
  unsigned int capability = 0;
@@ -182,45 +274,52 @@ rb_capng_update(VALUE self,
182
274
  capng_act_t action = 0;
183
275
 
184
276
  switch (TYPE(rb_action_name_or_action)) {
185
- case T_SYMBOL:
186
- action = action_name_to_action_type(RSTRING_PTR(rb_sym2str(rb_action_name_or_action)));
187
- break;
188
- case T_STRING:
189
- action = action_name_to_action_type(StringValuePtr(rb_action_name_or_action));
190
- break;
191
- case T_FIXNUM:
192
- action = NUM2INT(rb_action_name_or_action);
193
- break;
194
- default:
195
- rb_raise(rb_eArgError, "Expected a String or a Symbol instance, or a capability type constant");
277
+ case T_SYMBOL:
278
+ action =
279
+ action_name_to_action_type(RSTRING_PTR(rb_sym2str(rb_action_name_or_action)));
280
+ break;
281
+ case T_STRING:
282
+ action = action_name_to_action_type(StringValuePtr(rb_action_name_or_action));
283
+ break;
284
+ case T_FIXNUM:
285
+ action = NUM2INT(rb_action_name_or_action);
286
+ break;
287
+ default:
288
+ rb_raise(rb_eArgError,
289
+ "Expected a String or a Symbol instance, or a capability type constant");
196
290
  }
197
291
 
198
292
  switch (TYPE(rb_capability_name_or_type)) {
199
- case T_SYMBOL:
200
- capability_type = capability_type_name_to_capability_type(RSTRING_PTR(rb_sym2str(rb_capability_name_or_type)));
201
- break;
202
- case T_STRING:
203
- capability_type = capability_type_name_to_capability_type(StringValuePtr(rb_capability_name_or_type));
204
- break;
205
- case T_FIXNUM:
206
- capability_type = NUM2INT(rb_capability_name_or_type);
207
- break;
208
- default:
209
- rb_raise(rb_eArgError, "Expected a String or a Symbol instance, or a capability type constant");
293
+ case T_SYMBOL:
294
+ capability_type = capability_type_name_to_capability_type(
295
+ RSTRING_PTR(rb_sym2str(rb_capability_name_or_type)));
296
+ break;
297
+ case T_STRING:
298
+ capability_type = capability_type_name_to_capability_type(
299
+ StringValuePtr(rb_capability_name_or_type));
300
+ break;
301
+ case T_FIXNUM:
302
+ capability_type = NUM2INT(rb_capability_name_or_type);
303
+ break;
304
+ default:
305
+ rb_raise(rb_eArgError,
306
+ "Expected a String or a Symbol instance, or a capability type constant");
210
307
  }
211
308
 
212
309
  switch (TYPE(rb_capability_or_name)) {
213
- case T_SYMBOL:
214
- capability = capng_name_to_capability(RSTRING_PTR(rb_sym2str(rb_capability_or_name)));
215
- break;
216
- case T_STRING:
217
- capability = capng_name_to_capability(StringValuePtr(rb_capability_or_name));
218
- break;
219
- case T_FIXNUM:
220
- capability = NUM2INT(rb_capability_or_name);
221
- break;
222
- default:
223
- rb_raise(rb_eArgError, "Expected a String or a Symbol instance, or a capability constant");
310
+ case T_SYMBOL:
311
+ capability =
312
+ capng_name_to_capability(RSTRING_PTR(rb_sym2str(rb_capability_or_name)));
313
+ break;
314
+ case T_STRING:
315
+ capability = capng_name_to_capability(StringValuePtr(rb_capability_or_name));
316
+ break;
317
+ case T_FIXNUM:
318
+ capability = NUM2INT(rb_capability_or_name);
319
+ break;
320
+ default:
321
+ rb_raise(rb_eArgError,
322
+ "Expected a String or a Symbol instance, or a capability constant");
224
323
  }
225
324
 
226
325
  result = capng_update(action, capability_type, capability);
@@ -231,6 +330,15 @@ rb_capng_update(VALUE self,
231
330
  return Qfalse;
232
331
  }
233
332
 
333
+ /*
334
+ * Apply capabilities on specified target.
335
+ *
336
+ * @param rb_select_name_or_enum [Symbol or String or Fixnum]
337
+ * targets are CAPS, BOUNDS, BOTH, and AMBIENT for supported platform.
338
+ *
339
+ * @return [Boolean]
340
+ *
341
+ */
234
342
  static VALUE
235
343
  rb_capng_apply(VALUE self, VALUE rb_select_name_or_enum)
236
344
  {
@@ -238,17 +346,19 @@ rb_capng_apply(VALUE self, VALUE rb_select_name_or_enum)
238
346
  capng_select_t select = 0;
239
347
 
240
348
  switch (TYPE(rb_select_name_or_enum)) {
241
- case T_SYMBOL:
242
- select = select_name_to_select_type(RSTRING_PTR(rb_sym2str(rb_select_name_or_enum)));
243
- break;
244
- case T_STRING:
245
- select = select_name_to_select_type(StringValuePtr(rb_select_name_or_enum));
246
- break;
247
- case T_FIXNUM:
248
- select = NUM2INT(rb_select_name_or_enum);
249
- break;
250
- default:
251
- rb_raise(rb_eArgError, "Expected a String or a Symbol instance, or a capability type constant");
349
+ case T_SYMBOL:
350
+ select =
351
+ select_name_to_select_type(RSTRING_PTR(rb_sym2str(rb_select_name_or_enum)));
352
+ break;
353
+ case T_STRING:
354
+ select = select_name_to_select_type(StringValuePtr(rb_select_name_or_enum));
355
+ break;
356
+ case T_FIXNUM:
357
+ select = NUM2INT(rb_select_name_or_enum);
358
+ break;
359
+ default:
360
+ rb_raise(rb_eArgError,
361
+ "Expected a String or a Symbol instance, or a capability type constant");
252
362
  }
253
363
 
254
364
  result = capng_apply(select);
@@ -259,6 +369,12 @@ rb_capng_apply(VALUE self, VALUE rb_select_name_or_enum)
259
369
  return Qfalse;
260
370
  }
261
371
 
372
+ /*
373
+ * Lock capabilities.
374
+ *
375
+ * @return [Boolean]
376
+ *
377
+ */
262
378
  static VALUE
263
379
  rb_capng_lock(VALUE self)
264
380
  {
@@ -272,6 +388,14 @@ rb_capng_lock(VALUE self)
272
388
  return Qfalse;
273
389
  }
274
390
 
391
+ /*
392
+ * Change the credentials retaining capabilities.
393
+ * @param rb_uid [Fixnum] User ID.
394
+ * @param rb_gid [Fixnum] Group ID.
395
+ * @param rb_flags [Fixnum] CapNG::Flags constants.
396
+ *
397
+ * @see: capng_change_id(3)
398
+ */
275
399
  static VALUE
276
400
  rb_capng_change_id(VALUE self, VALUE rb_uid, VALUE rb_gid, VALUE rb_flags)
277
401
  {
@@ -282,9 +406,20 @@ rb_capng_change_id(VALUE self, VALUE rb_uid, VALUE rb_gid, VALUE rb_flags)
282
406
  if (result == 0)
283
407
  return Qtrue;
284
408
  else
285
- rb_raise(rb_eRuntimeError, "Calling capng_change_id is failed with: (exitcode: %d)\n", result);
409
+ rb_raise(rb_eRuntimeError,
410
+ "Calling capng_change_id is failed with: (exitcode: %d)\n",
411
+ result);
286
412
  }
287
413
 
414
+ /*
415
+ * Check whether capabilities on specified target or not.
416
+ *
417
+ * @param rb_select_name_or_enum [Symbol or String or Fixnum]
418
+ * targets are CAPS, BOUNDS, BOTH, and AMBIENT for supported platform.
419
+ *
420
+ * @return [Integer]
421
+ *
422
+ */
288
423
  static VALUE
289
424
  rb_capng_have_capabilities_p(VALUE self, VALUE rb_select_name_or_enum)
290
425
  {
@@ -292,56 +427,77 @@ rb_capng_have_capabilities_p(VALUE self, VALUE rb_select_name_or_enum)
292
427
  capng_select_t select = 0;
293
428
 
294
429
  switch (TYPE(rb_select_name_or_enum)) {
295
- case T_SYMBOL:
296
- select = select_name_to_select_type(RSTRING_PTR(rb_sym2str(rb_select_name_or_enum)));
297
- break;
298
- case T_STRING:
299
- select = select_name_to_select_type(StringValuePtr(rb_select_name_or_enum));
300
- break;
301
- case T_FIXNUM:
302
- select = NUM2INT(rb_select_name_or_enum);
303
- break;
304
- default:
305
- rb_raise(rb_eArgError, "Expected a String or a Symbol instance, or a capability type constant");
430
+ case T_SYMBOL:
431
+ select =
432
+ select_name_to_select_type(RSTRING_PTR(rb_sym2str(rb_select_name_or_enum)));
433
+ break;
434
+ case T_STRING:
435
+ select = select_name_to_select_type(StringValuePtr(rb_select_name_or_enum));
436
+ break;
437
+ case T_FIXNUM:
438
+ select = NUM2INT(rb_select_name_or_enum);
439
+ break;
440
+ default:
441
+ rb_raise(rb_eArgError,
442
+ "Expected a String or a Symbol instance, or a capability type constant");
306
443
  }
307
444
  result = capng_have_capabilities(select);
308
445
 
309
446
  return INT2NUM(result);
310
447
  }
311
448
 
449
+ /*
450
+ * Check whether capabilities on specified target or not.
451
+ *
452
+ * @param rb_capability_name_or_type [Symbol or String or Fixnum] types are EFFECTIVE,
453
+ * INHERITABLE, PERMITTED, and AMBIENT for supported platform.
454
+ * @param rb_capability_or_name [Symbol or String or Fixnum]
455
+ * Capability name or constants.
456
+ *
457
+ * @see: [CapNG::Capability]
458
+ *
459
+ * @return [Boolean]
460
+ *
461
+ */
312
462
  static VALUE
313
- rb_capng_have_capability_p(VALUE self, VALUE rb_capability_name_or_type, VALUE rb_capability_or_name)
463
+ rb_capng_have_capability_p(VALUE self, VALUE rb_capability_name_or_type,
464
+ VALUE rb_capability_or_name)
314
465
  {
315
466
  int result = 0;
316
467
  unsigned int capability = 0;
317
468
  capng_type_t capability_type = 0;
318
469
 
319
470
  switch (TYPE(rb_capability_name_or_type)) {
320
- case T_SYMBOL:
321
- capability_type = capability_type_name_to_capability_type(RSTRING_PTR(rb_sym2str(rb_capability_name_or_type)));
322
- break;
323
- case T_STRING:
324
- capability_type = capability_type_name_to_capability_type(StringValuePtr(rb_capability_name_or_type));
325
- break;
326
- case T_FIXNUM:
327
- capability_type = NUM2INT(rb_capability_name_or_type);
328
- break;
329
- default:
330
- rb_raise(rb_eArgError, "Expected a String or a Symbol instance, or a capability type constant");
471
+ case T_SYMBOL:
472
+ capability_type = capability_type_name_to_capability_type(
473
+ RSTRING_PTR(rb_sym2str(rb_capability_name_or_type)));
474
+ break;
475
+ case T_STRING:
476
+ capability_type = capability_type_name_to_capability_type(
477
+ StringValuePtr(rb_capability_name_or_type));
478
+ break;
479
+ case T_FIXNUM:
480
+ capability_type = NUM2INT(rb_capability_name_or_type);
481
+ break;
482
+ default:
483
+ rb_raise(rb_eArgError,
484
+ "Expected a String or a Symbol instance, or a capability type constant");
331
485
  }
332
486
 
333
487
  switch (TYPE(rb_capability_or_name)) {
334
- case T_SYMBOL:
335
- capability = capng_name_to_capability(RSTRING_PTR(rb_sym2str(rb_capability_or_name)));
336
- break;
337
- case T_STRING:
338
- capability = capng_name_to_capability(StringValuePtr(rb_capability_or_name));
339
- break;
340
- case T_FIXNUM:
341
- capability = NUM2INT(rb_capability_or_name);
342
- break;
343
- default:
344
- rb_raise(rb_eArgError, "Expected a String or a Symbol instance, or a capability constant");
488
+ case T_SYMBOL:
489
+ capability =
490
+ capng_name_to_capability(RSTRING_PTR(rb_sym2str(rb_capability_or_name)));
491
+ break;
492
+ case T_STRING:
493
+ capability = capng_name_to_capability(StringValuePtr(rb_capability_or_name));
494
+ break;
495
+ case T_FIXNUM:
496
+ capability = NUM2INT(rb_capability_or_name);
497
+ break;
498
+ default:
499
+ rb_raise(rb_eArgError,
500
+ "Expected a String or a Symbol instance, or a capability constant");
345
501
  }
346
502
 
347
503
  result = capng_have_capability(capability_type, capability);
@@ -352,11 +508,19 @@ rb_capng_have_capability_p(VALUE self, VALUE rb_capability_name_or_type, VALUE r
352
508
  return Qfalse;
353
509
  }
354
510
 
511
+ /*
512
+ * Retrieve capabilities from file.
513
+ *
514
+ * @param rb_file [File] target file object
515
+ *
516
+ * @return [Boolean]
517
+ *
518
+ */
355
519
  static VALUE
356
520
  rb_capng_get_caps_file(VALUE self, VALUE rb_file)
357
521
  {
358
522
  int result = 0, fd = 0;
359
- rb_io_t *fptr = NULL;
523
+ rb_io_t* fptr = NULL;
360
524
 
361
525
  Check_Type(rb_file, T_FILE);
362
526
 
@@ -373,11 +537,19 @@ rb_capng_get_caps_file(VALUE self, VALUE rb_file)
373
537
  return Qfalse;
374
538
  }
375
539
 
540
+ /*
541
+ * Apply capabilities on specified target (file specific version).
542
+ *
543
+ * @param rb_file [File] target file object
544
+ *
545
+ * @return [Boolean]
546
+ *
547
+ */
376
548
  static VALUE
377
549
  rb_capng_apply_caps_file(VALUE self, VALUE rb_file)
378
550
  {
379
551
  int result = 0, fd = 0;
380
- rb_io_t *fptr = NULL;
552
+ rb_io_t* fptr = NULL;
381
553
 
382
554
  Check_Type(rb_file, T_FILE);
383
555
 
@@ -395,7 +567,6 @@ rb_capng_apply_caps_file(VALUE self, VALUE rb_file)
395
567
  return Qfalse;
396
568
  }
397
569
 
398
-
399
570
  void
400
571
  Init_capng(void)
401
572
  {