/** * Get fields values of a virtual platform. * @param string $user The calling user. * @param string $table The table to read. * @param string $fields The fileds to retrieve. * @param mixed $select The value of id or alternative field. */ function mnetadmin_rpc_get_fields($user, $table, $fields, $select) { global $CFG, $USER, $DB; // Invoke local user and check his rights. invoke_local_user($user, 'local/vmoodle:execute'); // Creating response. $response = new StdClass(); $response->status = RPC_SUCCESS; // Getting record. ob_clean(); ob_start(); // Used to prevent HTML output from dmllib methods and capture errors. $field = array_keys($select); $record = $DB->get_record($table, array($field[0] => $select[$field[0]], isset($select[1]) ? $field[1] : '' => isset($select[1]) ? $select[1] : '', isset($select[2]) ? $field[2] : '' => isset($select[2]) ? $select[2] : ''), implode(',', $fields)); if (!$record) { $error = parse_wlerror(); if (empty($error)) { $error = 'Unable to retrieve record.'; } $response->status = RPC_FAILURE_RECORD; $response->errors[] = $error; return json_encode($response); } ob_end_clean(); // Setting value. $response->value = $record; // Returning response. return json_encode($response); }
/** * Set role capabilities of a virtual platform. * @param string $user The calling user. * @param string $role The role to set capabilities. * @param mixed $role_capabilities The role capabilities (array or object due to xmlrpc failures). * @param bool $clear True if the role capabilities should be cleared before, false otherwise. */ function mnetadmin_rpc_set_role_capabilities($user, $role, $role_capabilities, $clear = false, $json_response = true) { global $CFG, $USER, $DB; // Creating response. $response = new stdclass(); $response->status = RPC_SUCCESS; $response->errors = array(); $response->error = ''; // Invoke local user and check his rights. if ($auth_response = invoke_local_user((array) $user, 'local/vmoodle:execute')) { if ($json_response) { // We could not have a credential. return $auth_response; } else { return json_decode($auth_response); } } // Getting role. $record_role = $DB->get_record('role', array('shortname' => $role)); if (!$record_role) { $response->status = RPC_FAILURE_RECORD; $response->errors[] = 'Set role capability : Unable to retrieve role.'; $response->error = 'Set role capability : Unable to retrieve role.'; if ($json_response) { return json_encode($response); } else { return $response; } } // Formatting role capabilities. foreach ($role_capabilities as $role_capability_name => $role_capability) { $role_capabilities[$role_capability_name] = $role_capability ? (object) $role_capability : null; } // Getting capabilities. $records_capabilities = $DB->get_records('capabilities', null, '', 'name,id,captype,contextlevel,component,riskbitmask'); if (!$records_capabilities) { $response->status = RPC_FAILURE_RECORD; $response->errors[] = 'Set role capability : Unable to retrieve capabilities.'; $response->error = 'Set role capability : Unable to retrieve capabilities.'; if ($json_response) { return json_encode($response); } else { return $response; } } if ($clear) { // Removing current role capabilities. $DB->delete_records('role_capabilities', array('roleid' => $record_role->id)); } else { // Getting current role capabilities. $records_current_role_capabilities = $DB->get_records('role_capabilities', array('roleid' => $record_role->id)); $current_role_capabilities = array(); // Removing other role capabilities. foreach ($records_current_role_capabilities as $id => $record_current_role_capability) { foreach ($role_capabilities as $role_capability_name => $role_capability) { if ($record_current_role_capability->capability == $role_capability_name) { $current_role_capabilities[$record_current_role_capability->capability] = $record_current_role_capability; break; } } } } // Setting role capabilities. @ob_clean(); ob_start(); // Used to prevent HTML output from dmllib methods and capture errors foreach ($role_capabilities as $role_capability_name => $role_capability) { // Checking if capability exists. if (!array_key_exists($role_capability_name, $records_capabilities)) { $response->status = RPC_FAILURE_RECORD; $response->errors[] = 'Set role capability : Capability "' . $role_capability_name . '" does not exist.'; $response->error = 'Set role capability : Capability "' . $role_capability_name . '" does not exist.'; continue; } // Checking if role capability should be removed. if (is_null($role_capability)) { @ob_clean(); if (!$DB->delete_records('role_capabilities', array('roleid' => $record_role->id, 'capability' => $role_capability_name))) { $response->status = RPC_FAILURE_RECORD; $sql_error = parse_wlerror(); $response->errors[] = 'Set role capability : Unable to remove role capability "' . $role_capability_name . '"' . (empty($sql_error) ? '.' : ': ' . $sql_error . '.'); $response->error = 'Set role capability : Unable to remove role capability "' . $role_capability_name . '"' . (empty($sql_error) ? '.' : ': ' . $sql_error . '.'); } continue; } // Checking capability contextlevel. $capability = $records_capabilities[$role_capability_name]; if ($capability->contextlevel != $role_capability->contextlevel) { @ob_clean(); $capability->contextlevel = $role_capability->contextlevel; if (!$DB->update_record('capabilities', $capability)) { $response->status = RPC_FAILURE_RECORD; $sql_error = parse_wlerror(); $response->errors[] = 'Set role capability : Unable to fix contextlevel of capability "' . $capability->name . '"' . (empty($sql_error) ? '.' : ': ' . $sql_error); $response->error = 'Set role capability : Unable to fix contextlevel of capability "' . $capability->name . '"' . (empty($sql_error) ? '.' : ': ' . $sql_error); continue; } } // Checking if role capability should be created. if ($clear || !array_key_exists($role_capability->capability, $current_role_capabilities)) { // Creating record. $record = $role_capability; $record->roleid = $record_role->id; $record->timemodified = time(); $record->modifierid = $USER->id; unset($record->contextlevel); // Inserting role capability. @ob_clean(); if (!$DB->insert_record('role_capabilities', $record)) { $response->status = RPC_FAILURE_RECORD; $sql_error = parse_wlerror(); $response->errors[] = 'Set role capability : Unable to insert role capability "' . $record->capability . '"' . (empty($sql_error) ? '.' : ': ' . $sql_error); $response->error = 'Set role capability : Unable to insert role capability "' . $record->capability . '"' . (empty($sql_error) ? '.' : ': ' . $sql_error); } } elseif (!$clear && array_key_exists($role_capability_name, $current_role_capabilities) && $current_role_capabilities[$role_capability_name]->permission != $role_capability->permission) { // Modifying record. $record = $current_role_capabilities[$role_capability->capability]; $record->permission = $role_capability->permission; // Updating record. @ob_clean(); if (!$DB->update_record('role_capabilities', $record)) { $response->status = RPC_FAILURE_RECORD; $sql_error = parse_wlerror(); $response->errors[] = 'Set role capability : Unable to update role capability "' . $record->capability . '"' . (empty($sql_error) ? '.' : ': ' . $sql_error); $response->error = 'Set role capability : Unable to update role capability "' . $record->capability . '"' . (empty($sql_error) ? '.' : ': ' . $sql_error); } } } // Returning response. if ($json_response) { return json_encode($response); } else { return $response; } }