Пример #1
0
/**
 * 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);
}
Пример #2
0
/**
 * 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;
    }
}