add_error_msg(get_string('invalidservice', 'auth.webservice'));
redirect('/webservice/admin/index.php?open=webservices_function_groups');
}
$enabled = $dbservice->enabled;
$restrictedusers = ($dbservice->restrictedusers <= 0 ? 0 : 1);
$tokenusers = ($dbservice->tokenusers <= 0 ? 0 : 1);
$ispluginservice = ('' !== $dbservice->component);
$functions = array(
'elements' => array(
'enabledname' => array(
'title' => ' ',
'class' => 'heading',
'type' => 'html',
'value' => get_string('enabled'),
),
'classname' => array(
'title' => ' ',
'class' => 'heading',
'type' => 'html',
'value' => get_string('classname', 'auth.webservice'),
),
'methodname' => array(
'title' => ' ',
'class' => 'heading',
'type' => 'html',
'value' => get_string('methodname', 'auth.webservice'),
),
),
);
if (!$ispluginservice) {
// Custom service - let the user add/remove functions
$dbfunctions = get_records_array('external_functions', null, null, 'name');
}
else {
// In a non-custom service, the list of functions can't be changed. So
// only display the ones that are actually included in this service.
$dbfunctions = get_records_sql_array(
'SELECT ef.*
FROM
{external_services_functions} esf
INNER JOIN {external_functions} ef
ON esf.functionname = ef.name
WHERE esf.externalserviceid = ?
ORDER BY ef.name',
array($dbservice->id)
);
}
foreach ($dbfunctions as $function) {
$sfexists = record_exists('external_services_functions', 'externalserviceid', $dbservice->id, 'functionname', $function->name);
$functions['elements']['id' . $function->id . '_enabled'] = array(
'defaultvalue' => ($sfexists ? 'checked' : ''),
'type' => 'switchbox',
'disabled' => $ispluginservice,
'title' => $function->name,
);
$functions['elements']['id' . $function->id . '_class'] = array(
'value' => $function->classname,
'type' => 'html',
'title' => $function->name,
);
$functions['elements']['id' . $function->id . '_method'] = array(
'value' => '' . $function->methodname . '',
'type' => 'html',
'title' => $function->name,
);
}
$functions['elements']['submit'] = array(
'type' => 'submitcancel',
'class' => 'btn-primary submitcancel',
'value' => array(get_string('save'), get_string('back')),
'goto' => get_config('wwwroot') . 'webservice/admin/index.php?open=webservices_function_groups',
);
$heading = get_string('servicegroup', 'auth.webservice', $dbservice->name);
$elements = array(
'service' => array(
'type' => 'hidden',
'value' => $dbservice->id
),
// fieldset of name & shortname
'namefieldset' => array(
'legend' => $heading,
'type' => 'fieldset',
'elements' => array(
'name' => array(
'type' => 'text',
'title' => get_string('servicenamelabel', 'auth.webservice'),
'rules' => array(
'required' => !$ispluginservice,
'maxlength' => 200
),
'description' => get_string('servicenamedesc', 'auth.webservice'),
'defaultvalue' => $dbservice->name,
'disabled' => $ispluginservice,
),
'shortname' => array(
'type' => 'text',
'title' => get_string('serviceshortnamelabel', 'auth.webservice'),
'rules' => array(
'maxlength' => 200
),
'description' => get_string('serviceshortnamedesc', 'auth.webservice'),
'defaultvalue' => $dbservice->shortname,
'disabled' => $ispluginservice,
),
),
'collapsible' => true,
'collapsed' => false,
),
// fieldset of master switch
'webservicesmaster' => array(
'type' => 'fieldset',
'legend' => get_string('enableservice', 'auth.webservice'),
'elements' => array(
'enabled' => array(
'type' => 'switchbox',
'defaultvalue' => $enabled,
'on_label' => get_string('enabled'),
'off_label' => get_string('disabled'),
'wrapperclass' => 'switch-wrapper-inline',
'labelhtml' => '' . get_string('servicename', 'auth.webservice') .'',
),
'restrictedusers' => array(
'type' => 'switchbox',
'defaultvalue' => $restrictedusers,
'on_label' => get_string('usersonly', 'auth.webservice'),
'off_label' => get_string('tokensonly', 'auth.webservice'),
'wrapperclass' => 'switch-wrapper-inline',
'labelhtml' => '' . get_string('restrictedusers', 'auth.webservice') .'',
),
'tokenusers' => array(
'type' => 'switchbox',
'defaultvalue' => $tokenusers,
'on_label' => get_string('enabled'),
'off_label' => get_string('disabled'),
'wrapperclass' => 'switch-wrapper-inline',
'labelhtml' => '' . get_string('fortokenusers', 'auth.webservice') .'',
),
),
'collapsible' => true,
'collapsed' => false,
),
// fieldset for managing service function list
'functions' => array(
'type' => 'fieldset',
'class' => 'last',
'renderer' => 'multicolumnfieldsettable',
'columns' => array('enabledname', 'classname', 'methodname'),
'footer' => array('submit'),
'legend' => get_string('servicefunctionlist', 'auth.webservice'),
'comment' => get_string('sfldescription', 'auth.webservice'),
'elements' => $functions['elements'],
'collapsible' => true,
'collapsed' => false,
),
);
if ($ispluginservice) {
$elements['namefieldset']['elements']['component'] = array(
'type' => 'html',
'value' => get_string('servicecomponentnote', 'auth.webservice', $dbservice->component)
);
}
$form = array(
'renderer' => 'div',
'type' => 'div',
'id' => 'maintable',
'elements' => $elements,
'jsform' => false,
);
$heading = get_string('servicegroup', 'auth.webservice', $dbservice->name);
$form['name'] = 'serviceconfig';
$form['successcallback'] = 'serviceconfig_submit';
$form = pieform($form);
$inlinejs = <<
jQuery(function($) {
$(".dialogue").click(function(e) {
e.preventDefault();
e.stopPropagation();
// fetch the info for the method
$.ajax({
url: e.currentTarget.href + '&dialog=1',
}).done(function(data) {
// close any open dialogs
$(".js-page-modal .modal-body").html(data).css("max-height", "80vh");
$(".js-page-modal .modal-dialog").css("width", "80vw");
$(".js-page-modal").modal('show');
});
});
});
EOF;
$headers[] = $inlinejs;
$smarty = smarty(array(), $headers, array('Close' => 'mahara', 'wsdoc' => 'auth.webservice'));
safe_require('auth', 'webservice');
$smarty->assign('form', $form);
$smarty->assign('PAGEHEADING', $heading);
$smarty->display('form.tpl');
function serviceconfig_validate(Pieform $form, $values) {
// Some fields can't be edited on a plugin's service. So don't bother validating
// any inputs relating to them.
$ispluginservice = ('' !== get_field('external_services', 'component', 'id', $values['service']));
if (!$ispluginservice) {
// name must be unique
if (
isset($values['name'])
&& record_exists_select(
'external_services',
'name = ? AND id <> ?',
array($values['name'], $values['service'])
)
) {
$form->set_error('name', get_string('servicenamemustbeunique', 'auth.webservice'));
}
// component and shortname together must be unique
if (
isset($values['shortname'])
&& $values['shortname'] !== ''
&& record_exists_select(
'external_services',
'shortname = ? AND (component = \'\' OR component IS NULL) AND id <> ?',
array($values['shortname'], $values['service'])
)
) {
$form->set_error('shortname', get_string('serviceshortnamemustbeunique', 'auth.webservice'));
}
}
}
/**
* HACK: This function was not written following normal Mahara coding standards.
* The following things should be cleaned up at some point:
*
* 1. It mixes submission and validation (throwing exceptions in the case of
* a validation failure). The validation should be moved to a separate
* Pieforms validation handler.
*
* 2. Remove the global $service. Instead, use $values['service'].
*
* 3. Use a clean "$todb" object to update only the changed fields in the
* database (instead of using the global $dbservice, which is a whole-row record.
*
* 4. Remove the global $dbservice once it's not needed.
*
* 5. Instead of the backwards check for form fields that look like function
* names and then checking the DB to see if each one exists; just do one
* query to get all the functions, then check for a form field that looks like
* each one.
*
* 6. Do one "update_record()" call at the end of the function, instead
* of a separate one for each form field.
*
* @param Pieform $form
* @param array $values
*/
function serviceconfig_submit(Pieform $form, $values) {
global $SESSION, $service, $dbservice;
// Indicates whether this service was generated by a plugin (in which case
// the admin can change access to it, but can't change its function list
// or its name & shortname
$ispluginservice = ('' !== $dbservice->component);
// Can't edit name of plugin-provided services
if (!$ispluginservice && isset($values['name'])) {
$dbservice->name = $values['name'];
update_record('external_services', $dbservice);
}
// Can't edit shortname of plugin-provided services
if (!$ispluginservice && isset($values['shortname'])) {
$dbservice->shortname = $values['shortname'];
update_record('external_services', $dbservice);
}
if (isset($values['enabled'])) {
$enabled = $values['enabled'] ? 1 : 0;
$dbservice->enabled = $enabled;
update_record('external_services', $dbservice);
}
$tokenwarning = false;
if (isset($values['tokenusers'])) {
$tokenusers = $values['tokenusers'] ? 1 : 0;
// We may need to issue a warning that this will cut off some users' access
if ($dbservice->tokenusers && !$tokenusers) {
$tokenwarning = true;
}
$dbservice->tokenusers = $tokenusers;
update_record('external_services', $dbservice);
}
$restrictwarning = false;
if (isset($values['restrictedusers'])) {
// flip flop
$restrict = ($values['restrictedusers'] <= 0 ? 0 : 1);
// We may need to issue a warning that this will cut off some users' access
if (!$dbservice->restrictedusers && $restrict) {
$restrictwarning = true;
}
$dbservice->restrictedusers = $restrict;
update_record('external_services', $dbservice);
}
if ($tokenwarning || $restrictwarning) {
// Warn if disabling token users
$cnt = count_records('external_tokens', 'externalserviceid', $service);
if ($cnt > 0) {
if ($tokenwarning) {
$SESSION->add_error_msg(get_string('tokenuserswarning', 'auth.webservice', get_string('fortokenusers', 'auth.webservice')));
}
if ($restrictwarning) {
$SESSION->add_error_msg(get_string('restricteduserswarning', 'auth.webservice', get_string('restrictedusers', 'auth.webservice')));
}
}
}
// Can't add/remove functions from a plugin's service
if (!$ispluginservice) {
foreach (array_keys($values) as $key) {
if (preg_match('/^id(\d+)\_enabled$/', $key, $matches)) {
$function = $matches[1];
$dbfunction = get_record('external_functions', 'id', $function);
if (empty($dbfunction)) {
$SESSION->add_error_msg(get_string('invalidinput', 'auth.webservice'));
redirect('/webservice/admin/serviceconfig.php?service=' . $service);
}
$service_function = record_exists('external_services_functions', 'externalserviceid', $service, 'functionname',$dbfunction->name);
// record should exist - so create if necessary
if ($values[$key]) {
if (!$service_function) {
$service_function = array('externalserviceid' => $service, 'functionname' => $dbfunction->name);
insert_record('external_services_functions', $service_function);
$dbservice->mtime = db_format_timestamp(time());
update_record('external_services', $dbservice);
}
}
else {
// disabled - record should not exist
if ($service_function) {
delete_records('external_services_functions', 'externalserviceid', $service, 'functionname',$dbfunction->name);
$dbservice->mtime = db_format_timestamp(time());
update_record('external_services', $dbservice);
}
}
}
}
}
$SESSION->add_ok_msg(get_string('configsaved', 'auth.webservice'));
redirect('/webservice/admin/serviceconfig.php?service=' . $service);
}