class CapNG
CapNG class.
@example
# Current process capability example require 'capng' @capng = CapNG.new(:current_process) @capng.have_capability?(:effective, :dac_read_search)
@example
# Other process capability example require 'capng' @capng = CapNG.new(:other_process, 12345) @capng.have_capability?(:effective, :dac_override)
Constants
- VERSION
Public Class Methods
Initalize CapNG class.
@overload initialize(target=nil, pid_or_file=nil)
@option param target [String or Symbol] Specify capability target. @option param pid_or_file [String or Symbol] Querying XPath.
@return [nil]
static VALUE
rb_capng_initialize(int argc, VALUE* argv, VALUE self)
{
VALUE rb_target, rb_pid;
int result = 0;
char* target = NULL;
int pid = 0;
rb_scan_args(argc, argv, "02", &rb_target, &rb_pid);
if (NIL_P(rb_target)) {
return Qnil;
}
if (RB_TYPE_P(rb_target, T_SYMBOL)) {
target = RSTRING_PTR(rb_sym2str(rb_target));
} else if (RB_TYPE_P(rb_target, T_STRING)) {
target = StringValuePtr(rb_target);
} else {
rb_raise(rb_eArgError, "Expected a String or a Symbol instance for tagret argument");
}
if (strcmp(target, "current_process") == 0) {
result = capng_get_caps_process();
if (result != 0) {
rb_raise(rb_eRuntimeError, "Couldn't get current process' capability");
}
} else if (strcmp(target, "other_process") == 0) {
Check_Type(rb_pid, T_FIXNUM);
pid = NUM2INT(rb_pid);
capng_setpid(pid);
result = capng_get_caps_process();
if (result != 0) {
rb_raise(rb_eRuntimeError, "Couldn't get current process' capability");
}
}
return Qnil;
}
Public Instance Methods
Apply capabilities on specified target.
@param rb_select_name_or_enum [Symbol or String or Fixnum]
targets are CAPS, BOUNDS, BOTH, and AMBIENT for supported platform.
@return [Boolean]
static VALUE
rb_capng_apply(VALUE self, VALUE rb_select_name_or_enum)
{
int result = 0;
capng_select_t select = 0;
switch (TYPE(rb_select_name_or_enum)) {
case T_SYMBOL:
select =
select_name_to_select_type(RSTRING_PTR(rb_sym2str(rb_select_name_or_enum)));
break;
case T_STRING:
select = select_name_to_select_type(StringValuePtr(rb_select_name_or_enum));
break;
case T_FIXNUM:
select = NUM2INT(rb_select_name_or_enum);
break;
default:
rb_raise(rb_eArgError,
"Expected a String or a Symbol instance, or a capability type constant");
}
result = capng_apply(select);
if (result == 0)
return Qtrue;
else
return Qfalse;
}
Apply capabilities on specified target (file specific version).
@param rb_file [File] target file object
@return [Boolean]
static VALUE
rb_capng_apply_caps_file(VALUE self, VALUE rb_file)
{
int result = 0, fd = 0;
rb_io_t* fptr = NULL;
Check_Type(rb_file, T_FILE);
if (NIL_P(rb_file)) {
return Qfalse;
}
fptr = RFILE(rb_file)->fptr;
fd = fptr->fd;
result = capng_apply_caps_fd(fd);
if (result == 0)
return Qtrue;
else
return Qfalse;
}
Retrieve capabilities from file.
@param rb_file [File] target file object
@return [Boolean]
Specify process ID to retrieve process capabilities. If not calling setpid before, it returns current process’ capabilities.
@return [Boolean]
static VALUE
rb_capng_get_caps_process(VALUE self)
{
int result = 0;
result = capng_get_caps_process();
if (result == 0)
return Qtrue;
else
return Qfalse;
}
Change the credentials retaining capabilities.
@param rb_uid [Fixnum] User ID. @param rb_gid [Fixnum] Group ID. @param rb_flags [Fixnum] CapNG::Flags constants.
@see: capng_change_id(3)
static VALUE
rb_capng_change_id(VALUE self, VALUE rb_uid, VALUE rb_gid, VALUE rb_flags)
{
int result = 0;
result = capng_change_id(NUM2INT(rb_uid), NUM2INT(rb_gid), NUM2INT(rb_flags));
if (result == 0)
return Qtrue;
else
rb_raise(rb_eRuntimeError,
"Calling capng_change_id is failed with: (exitcode: %d)\n",
result);
}
Clear capabilities on specified target.
@param rb_select_name_or_enum [Symbol or String or Fixnum] targets are CAPS, BOUNDS,
BOTH, and AMBIENT for supported platform.
@return [nil]
static VALUE
rb_capng_clear(VALUE self, VALUE rb_select_name_or_enum)
{
capng_select_t select = 0;
switch (TYPE(rb_select_name_or_enum)) {
case T_SYMBOL:
select =
select_name_to_select_type(RSTRING_PTR(rb_sym2str(rb_select_name_or_enum)));
break;
case T_STRING:
select = select_name_to_select_type(StringValuePtr(rb_select_name_or_enum));
break;
case T_FIXNUM:
select = NUM2INT(rb_select_name_or_enum);
break;
default:
rb_raise(rb_eArgError,
"Expected a String or a Symbol instance, or a capability type constant");
}
capng_clear(select);
return Qnil;
}
Fill capabilities on specified target.
@param rb_select_name_or_enum [Symbol or String or Fixnum] targets are CAPS, BOUNDS,
BOTH, and AMBIENT for supported platform.
@return [nil]
static VALUE
rb_capng_fill(VALUE self, VALUE rb_select_name_or_enum)
{
capng_select_t select = 0;
switch (TYPE(rb_select_name_or_enum)) {
case T_SYMBOL:
select =
select_name_to_select_type(RSTRING_PTR(rb_sym2str(rb_select_name_or_enum)));
break;
case T_STRING:
select = select_name_to_select_type(StringValuePtr(rb_select_name_or_enum));
break;
case T_FIXNUM:
select = NUM2INT(rb_select_name_or_enum);
break;
default:
rb_raise(rb_eArgError,
"Expected a String or a Symbol instance, or a capability type constant");
}
capng_fill(select);
return Qnil;
}
Retrieve capabilities from file.
@param rb_file [File] target file object
@return [Boolean]
static VALUE
rb_capng_get_caps_file(VALUE self, VALUE rb_file)
{
int result = 0, fd = 0;
rb_io_t* fptr = NULL;
Check_Type(rb_file, T_FILE);
if (NIL_P(rb_file)) {
return Qfalse;
}
fptr = RFILE(rb_file)->fptr;
fd = fptr->fd;
result = capng_get_caps_fd(fd);
if (result == 0)
return Qtrue;
else
return Qfalse;
}
Specify process ID to retrieve process capabilities. If not calling setpid before, it returns current process’ capabilities.
@return [Boolean]
Check whether capabilities on specified target or not.
@param rb_select_name_or_enum [Symbol or String or Fixnum]
targets are CAPS, BOUNDS, BOTH, and AMBIENT for supported platform.
@return [Integer]
static VALUE
rb_capng_have_capabilities_p(VALUE self, VALUE rb_select_name_or_enum)
{
int result = 0;
capng_select_t select = 0;
switch (TYPE(rb_select_name_or_enum)) {
case T_SYMBOL:
select =
select_name_to_select_type(RSTRING_PTR(rb_sym2str(rb_select_name_or_enum)));
break;
case T_STRING:
select = select_name_to_select_type(StringValuePtr(rb_select_name_or_enum));
break;
case T_FIXNUM:
select = NUM2INT(rb_select_name_or_enum);
break;
default:
rb_raise(rb_eArgError,
"Expected a String or a Symbol instance, or a capability type constant");
}
result = capng_have_capabilities(select);
return INT2NUM(result);
}
Check whether capabilities on specified target or not.
@param rb_capability_name_or_type [Symbol or String or Fixnum] types are EFFECTIVE,
INHERITABLE, PERMITTED, and AMBIENT for supported platform.
@param rb_capability_or_name [Symbol or String or Fixnum]
Capability name or constants.
@see: [CapNG::Capability]
@return [Boolean]
static VALUE
rb_capng_have_capability_p(VALUE self, VALUE rb_capability_name_or_type,
VALUE rb_capability_or_name)
{
int result = 0;
unsigned int capability = 0;
capng_type_t capability_type = 0;
switch (TYPE(rb_capability_name_or_type)) {
case T_SYMBOL:
capability_type = capability_type_name_to_capability_type(
RSTRING_PTR(rb_sym2str(rb_capability_name_or_type)));
break;
case T_STRING:
capability_type = capability_type_name_to_capability_type(
StringValuePtr(rb_capability_name_or_type));
break;
case T_FIXNUM:
capability_type = NUM2INT(rb_capability_name_or_type);
break;
default:
rb_raise(rb_eArgError,
"Expected a String or a Symbol instance, or a capability type constant");
}
switch (TYPE(rb_capability_or_name)) {
case T_SYMBOL:
capability =
capng_name_to_capability(RSTRING_PTR(rb_sym2str(rb_capability_or_name)));
break;
case T_STRING:
capability = capng_name_to_capability(StringValuePtr(rb_capability_or_name));
break;
case T_FIXNUM:
capability = NUM2INT(rb_capability_or_name);
break;
default:
rb_raise(rb_eArgError,
"Expected a String or a Symbol instance, or a capability constant");
}
result = capng_have_capability(capability_type, capability);
if (result == 1)
return Qtrue;
else
return Qfalse;
}
Lock capabilities.
@return [Boolean]
static VALUE
rb_capng_lock(VALUE self)
{
int result = 0;
result = capng_lock();
if (result == 0)
return Qtrue;
else
return Qfalse;
}
Specify process ID to retrieve other process capabilities.
@param rb_pid [Fixnum] Process ID.
@return [nil]
static VALUE
rb_capng_setpid(VALUE self, VALUE rb_pid)
{
Check_Type(rb_pid, T_FIXNUM);
capng_setpid(NUM2INT(rb_pid));
return Qnil;
}
Update capabilities.
@param rb_action_name_or_action [Symbol or String or Fixnum] ADD or DROP. @param rb_capability_name_or_type [Symbol or String or Fixnum]
Effective/Inheritable/Permitted/Ambient (If supported) or their combinations
@param rb_capability_or_name [Symbol or String or Fixnum] Capability name or constants.
@see: [CapNG::Capability])
@return [Boolean]
static VALUE
rb_capng_update(VALUE self, VALUE rb_action_name_or_action,
VALUE rb_capability_name_or_type, VALUE rb_capability_or_name)
{
int result = 0;
int capability = 0;
capng_type_t capability_type = 0;
capng_act_t action = 0;
switch (TYPE(rb_action_name_or_action)) {
case T_SYMBOL:
action =
action_name_to_action_type(RSTRING_PTR(rb_sym2str(rb_action_name_or_action)));
break;
case T_STRING:
action = action_name_to_action_type(StringValuePtr(rb_action_name_or_action));
break;
case T_FIXNUM:
action = NUM2INT(rb_action_name_or_action);
break;
default:
rb_raise(rb_eArgError,
"Expected a String or a Symbol instance, or a capability type constant");
}
switch (TYPE(rb_capability_name_or_type)) {
case T_SYMBOL:
capability_type = capability_type_name_to_capability_type(
RSTRING_PTR(rb_sym2str(rb_capability_name_or_type)));
break;
case T_STRING:
capability_type = capability_type_name_to_capability_type(
StringValuePtr(rb_capability_name_or_type));
break;
case T_FIXNUM:
capability_type = NUM2INT(rb_capability_name_or_type);
break;
default:
rb_raise(rb_eArgError,
"Expected a String or a Symbol instance, or a capability type constant");
}
switch (TYPE(rb_capability_or_name)) {
case T_SYMBOL:
capability =
capng_name_to_capability(RSTRING_PTR(rb_sym2str(rb_capability_or_name)));
if (capability == -1) {
rb_raise(rb_eRuntimeError, "Unknown capability: %s",
RSTRING_PTR(rb_sym2str(rb_capability_or_name)));
}
break;
case T_STRING:
capability = capng_name_to_capability(StringValuePtr(rb_capability_or_name));
if (capability == -1) {
rb_raise(rb_eRuntimeError, "Unknown capability: %s",
StringValuePtr(rb_capability_or_name));
}
break;
case T_FIXNUM:
capability = NUM2INT(rb_capability_or_name);
break;
default:
rb_raise(rb_eArgError,
"Expected a String or a Symbol instance, or a capability constant");
}
result = capng_update(action, capability_type, capability);
if (result == 0)
return Qtrue;
else
return Qfalse;
}