');
}
if (!$('#needprotocolspro').length) {
$('#webservice_provider_enabled_form_enabled_container').append('');
}
function update_warning_message(){
var target = $('.webservice-provider-protocol-form').find('input:checkbox');
var masterreq = $('#webservice_requester_enabled_form').find('input:checkbox');//requester
var masterpro = $('#webservice_provider_enabled_form').find('input:checkbox');//provider
if ($(masterreq).filter(':checked').length) {
if (target.filter(':checked').length === 0) {
$('#needprotocolsreq').removeClass('text-success').addClass('text-danger').text(webservicesnotenabled);
}
else {
$('#needprotocolsreq').removeClass('text-danger').addClass('text-success').text(webservicesenabled);
}
}
else {
$('#needprotocolsreq').removeClass('text-danger').removeClass('text-success').text('');
}
if ($(masterpro).filter(':checked').length) {
if (target.filter(':checked').length === 0) {
$('#needprotocolspro').removeClass('text-success').addClass('text-danger').text(webservicesnotenabled);
}
else {
$('#needprotocolspro').removeClass('text-danger').addClass('text-success').text(webservicesenabled);
}
}
else {
$('#needprotocolspro').removeClass('text-danger').removeClass('text-success').text('');
}
}
function save_protos_switch(name) {
// at least one of the master switches is on
update_warning_message()
// Save new state
if (!$('#ajax_' + name).length) {
$('#webservice_provider_protocols_' + name).append('');
}
$.post('index.php', $('#webservice_provider_protocols_' + name).serialize());
}
// saving the form when switching the protocols
$('#webservice_provider_protocols_soap_enabled').change(function() {
save_protos_switch('soap');
});
$('#webservice_provider_protocols_xmlrpc_enabled').change(function() {
save_protos_switch('xmlrpc');
});
$('#webservice_provider_protocols_rest_enabled').change(function() {
save_protos_switch('rest');
});
$('#webservice_provider_protocols_oauth_enabled').change(function() {
save_protos_switch('oauth');
});
$('#webservice_provider_enabled_form_enabled').on('change', function(){
update_webservice_status();
// save master switch form
$('#webservice_provider_enabled_form').append('');
$.post('index.php', $('#webservice_provider_enabled_form').serialize());
});
$('#webservice_requester_enabled_form_enabled').on('change', function() {
update_webservice_status();
// save master connection switch form
$('#webservice_requester_enabled_form').append('');
$.post('index.php', $('#webservice_requester_enabled_form').serialize());
});
function update_webservice_status() {
var target = $('.webservice-provider-protocol-form').find('input:checkbox');
if ($('#webservice_requester_enabled_form_enabled').is(':checked') ||
$('#webservice_provider_enabled_form_enabled').is(':checked')) {
// enable all protocols
target.prop('disabled', false);
// alert user to switch protocols on if none are active
update_warning_message();
}
else {
// turn all protocols off
target.prop('checked', false);
// if main switch is off, remove message
$('#webservice_provider_enabled_form_pseudofieldset .form-message-inline').text('');
// disable all protocols
target.prop('disabled', true);
// remove the needprotocols error message
$('#needprotocolsreq').removeClass('text-danger').text('');
$('#needprotocolspro').removeClass('text-danger').text('');
}
}
update_webservice_status();
});
JS;
$smarty = smarty();
setpageicon($smarty, 'icon-puzzle-piece');
$smarty->assign('form', $form);
$smarty->assign('opened', param_alphanumext('open', ''));
$smarty->assign('PAGEHEADING', $heading);
$smarty->assign('INLINEJAVASCRIPT', $inlinejs);
$smarty->assign('pagedescription', get_string('webservicesconfigdesc', 'auth.webservice'));
$smarty->display('auth:webservice:configform.tpl');
/**
* Custom webservices config page
* - activate/deactivate webservices comletely
* - activate/deactivat protocols - SOAP/XML-RPC/REST
* - manage service clusters
* - manage users and access tokens
*
* @return pieforms $element array
*/
function webservice_admin_main_form() {
$protosform = array(
'name' => 'webservice_provider_protocols_form',
'elements' => webservice_provider_protocols_form(),
);
$protos = pieform_instance($protosform);
// certificate values from MNet
$openssl = OpenSslRepo::singleton();
$elements = array(
// fieldset of master switch
'webservicesmaster' => array(
'name' => 'webservice_master_switches',
'type' => 'fieldset',
'legend' => get_string('webservice_master_switches', 'auth.webservice'),
'elements' => array(
'webservice_requester_enabled_label' => array(
'type' => 'html',
'value' => '
' . get_string('webservice_requester_enabled_label', 'auth.webservice') . '
',
),
'webservice_requester_enabled_fieldset' => webservice_requester_enabled_form(),
'webservice_provider_enabled_label' => array(
'type' => 'html',
'value' => '' . get_string('webservice_provider_enabled_label', 'auth.webservice') . '
',
),
'webservice_provider_enabled_fieldset' => webservice_provider_enabled_form(),
'protos_help' => array(
'type' => 'html',
'value' => '' . get_string('manage_protocols1', 'auth.webservice') . '
',
),
'webservice_provider_protocols_form' => array(
'type' => 'html',
'value' => $protos->build(false),
)
),
'collapsible' => true,
'collapsed' => true,
),
// System Certificates
'certificates' => array(
'name' => 'activate_webservices_networking',
'type' => 'fieldset',
'legend' => get_string('certificates', 'auth.webservice'),
'elements' => array(
'protos_help' => array(
'type' => 'html',
'value' => '' . get_string('manage_certificates', 'auth.webservice', get_config('wwwroot') . 'admin/site/networking.php') . '
',
),
'pubkey' => array(
'type' => 'html',
'value' => '' . get_string('publickey','admin') . '
'
. '' . get_string('publickeydescription2', 'admin', 365) . '
'
. '' . $openssl->certificate . '
'
),
'sha1fingerprint' => array(
'type' => 'html',
'value' => '' . get_string('sha1fingerprint', 'auth.webservice', $openssl->sha1_fingerprint) . '
',
),
'md5fingerprint' => array(
'type' => 'html',
'value' => '' . get_string('md5fingerprint', 'auth.webservice', $openssl->md5_fingerprint) . '
',
),
'expires' => array(
'type' => 'html',
'value' => '' . get_string('publickeyexpireson','auth.webservice', format_date($openssl->expires)) . '
'
),
),
'collapsible' => true,
'collapsed' => true,
),
// fieldset for managing service function groups
'servicefunctiongroups' => array(
'name' => 'webservices_function_groups',
'type' => 'fieldset',
'legend' => get_string('servicefunctiongroups', 'auth.webservice'),
'elements' => array(
'sfgdescription' => array(
'value' => '' . get_string('sfgdescription', 'auth.webservice') . '
'
),
'webservicesservicecontainer' => array(
'type' => 'html',
'value' => webservice_function_groups_form(),
)
),
'collapsible' => true,
'collapsed' => true,
),
// fieldset for managing service tokens
'servicetokens' => array(
'name' => 'webservices_token',
'type' => 'fieldset',
'legend' => get_string('servicetokens', 'auth.webservice'),
'elements' => array(
'stdescription' => array(
'value' => '' . get_string('stdescription', 'auth.webservice') . '
'
),
'webservicestokenscontainer' => array(
'type' => 'html',
'value' => webservice_tokens_form()
)
),
'collapsible' => true,
'collapsed' => false,
),
// fieldset for managing service tokens
'serviceusers' => array(
'name' => 'webservices_user',
'type' => 'fieldset',
'legend' => get_string('manageserviceusers', 'auth.webservice'),
'elements' => array(
'sudescription' => array(
'value' => '' . get_string('sudescription', 'auth.webservice') . '
'
),
'webservicesuserscontainer' => array(
'type' => 'html',
'value' => webservice_users_form(),
)
),
'collapsible' => true,
'collapsed' => false,
),
);
$form = array(
'renderer' => 'div',
'type' => 'div',
'elements' => $elements,
);
return $form;
}
/**
* Form layout for the master switch to control whether this site can
* use webservices provided by an external server.
*
* @return pieforms $element array
*/
function webservice_requester_enabled_form() {
// enable/disable webservices completely
$enabled = (get_config('webservice_requester_enabled') || 0);
$element = array(
'type' => 'html',
'value' =>
pieform(
array(
'name' => 'webservice_requester_enabled_form',
'elementclasses' => false,
'class' => 'form-switch form-group',
'successcallback' => 'webservice_requester_enabled_submit',
'renderer' => 'div',
'jsform' => false,
'checkdirtychange' => false,
'elements' => array(
'plugintype' => array('type' => 'hidden', 'value' => 'auth'),
'type' => array('type' => 'hidden', 'value' => 'webservice'),
'pluginname' => array('type' => 'hidden', 'value' => 'webservice'),
'enabled' => array('type' => 'switchbox',
'class' => 'switchbox last',
'value' => $enabled,
'labelhtml' => ''. get_string('webservice_requester_enabled_label2', 'auth.webservice') .'',
),
),
)
),
);
return $element;
}
/**
* Pieforms submit callback for Webservices Requester form
*/
function webservice_requester_enabled_submit(Pieform $form, $values) {
$enabled = $values['enabled'] ? 0 : 1;
set_config('webservice_requester_enabled', $enabled);
// Don't reload the page if this was submitted via ajax.
if (param_boolean('ajax')) {
if (!get_config('webservice_provider_enabled')) {
$protos = array('soap','xmlrpc','rest','oauth');
foreach ($protos as $proto) {
set_config('webservice_provider_'.$proto.'_enabled', 0);
}
}
exit;
}
redirect('/webservice/admin/index.php');
}
/**
* Pieform for the master switch that controls whether Mahara will
* be a webservices provider (i.e. allow incoming webservices requests
* from other systems.)
*/
function webservice_provider_enabled_form() {
// enable/disable webservices completely
$enabled = (get_config('webservice_provider_enabled') || 0);
$element = array(
'type' => 'html',
'value' =>
pieform(
array(
'name' => 'webservice_provider_enabled_form',
'elementclasses' => false,
'class' => 'form-switch',
'successcallback' => 'webservice_provider_enabled_submit',
'renderer' => 'div',
'jsform' => false,
'checkdirtychange' => false,
'elements' => array(
'plugintype' => array('type' => 'hidden', 'value' => 'auth'),
'type' => array('type' => 'hidden', 'value' => 'webservice'),
'pluginname' => array('type' => 'hidden', 'value' => 'webservice'),
'enabled' => array('type' => 'switchbox',
'class' => 'switchbox last',
'value' => $enabled,
'labelhtml' => ''. get_string('webservice_provider_enabled_label2', 'auth.webservice') .'',
),
),
)
),
);
return $element;
}
/**
* Pieform callback function for the "Publish webservices" master switch
*/
function webservice_provider_enabled_submit(Pieform $form, $values) {
$enabled = $values['enabled'] ? 0 : 1;
set_config('webservice_provider_enabled', $enabled);
// reload/upgrade the web services configuration
if ($enabled) {
// ensure that we have a webservice auth_instance
$authinstance = get_record('auth_instance', 'institution', 'mahara', 'authname', 'webservice');
if (empty($authinstance)) {
$authinstance = (object)array(
'instancename' => 'webservice',
'priority' => 2,
'institution' => 'mahara',
'authname' => 'webservice',
);
insert_record('auth_instance', $authinstance);
}
external_reload_webservices();
}
if (param_boolean('ajax')) {
if (!get_config('webservice_requester_enabled')) {
$protos = array('soap','xmlrpc','rest','oauth');
foreach ($protos as $proto) {
set_config('webservice_provider_'.$proto.'_enabled', 0);
}
}
exit;
}
redirect('/webservice/admin/index.php');
}
/**
* Form layout for webservices protocol switch fieldset
*
* @return pieforms $element array
*/
function webservice_provider_protocols_form() {
// enable/disable separate protocols of SOAP/XML-RPC/REST
$elements = array();
$elements['label'] = array(
'title' => ' ',
'type' => 'html',
'class' => 'fake-form',
'value' => '' . get_string('protocol', 'auth.webservice') . '
'
);
foreach (array('soap', 'xmlrpc', 'rest', 'oauth') as $proto) {
$enabled = (get_config('webservice_provider_' . $proto . '_enabled') || 0);
$elements[$proto] = array(
'title' => ' ',
'type' => 'html',
'class' => 'fake-form',
'value' => pieform(array(
'name' => 'webservice_provider_protocols_' . $proto,
'elementclasses' => false,
'class' => 'form-switch webservice-provider-protocol-form',
'renderer' => 'div',
'successcallback' => 'webservice_provider_protocols_submit',
'jsform' => false,
'checkdirtychange' => false,
'elements' => array(
'plugintype' => array('type' => 'hidden', 'value' => 'auth'),
'type' => array('type' => 'hidden', 'value' => 'webservice'),
'pluginname' => array('type' => 'hidden', 'value' => 'webservice'),
'protocol' => array('type' => 'hidden', 'value' => $proto),
'enabled' => array('type' => 'switchbox',
'class' => 'switchbox',
'value' => $enabled,
'labelhtml' => '' .get_string($proto, 'auth.webservice') . ': ',
),
),
))
);
}
return $elements;
}
/**
* Pieform callback function for the per-protocol master switches
*/
function webservice_provider_protocols_submit(Pieform $form, $values) {
$enabled = $values['enabled'] ? 0 : 1;
$proto = $values['protocol'];
set_config('webservice_provider_'.$proto.'_enabled', $enabled);
// Show/hide the account settings webservice tokens page
clear_menu_cache();
if (param_boolean('ajax')) {
exit;
}
redirect('/webservice/admin/index.php');
}
/**
* Service Function Groups edit form
*
* @return html
*/
function webservice_function_groups_form() {
global $THEME;
$editicon = 'icon icon-pencil left';
$deleteicon = 'icon icon-trash left text-danger';
$form = array(
'name' => 'webservices_function_groups',
'elementclasses' => false,
'successcallback' => 'webservice_function_groups_submit',
'renderer' => 'multicolumntable',
'elements' => array(
'servicegroup' => array(
'title' => ' ',
'datatable' => true,
'type' => 'html',
'value' => get_string('service', 'auth.webservice'),
),
'component' => array(
'title' => ' ',
'datatable' => true,
'type' => 'html',
'value' => get_string('component', 'auth.webservice'),
),
'enabled' => array(
'title' => ' ',
'datatable' => true,
'type' => 'html',
'value' => get_string('enabled'),
),
'restricted' => array(
'title' => ' ',
'datatable' => true,
'type' => 'html',
'value' => get_string('restrictedusers', 'auth.webservice'),
),
'tokenusers' => array(
'title' => ' ',
'datatable' => true,
'type' => 'html',
'value' => get_string('fortokenusers', 'auth.webservice'),
),
'functions' => array(
'title' => ' ',
'datatable' => true,
'type' => 'html',
'value' => get_string('functions', 'auth.webservice'),
),
'actions' => array(
'title' => ' ',
'datatable' => true,
'type' => 'html',
'value' => '',
),
),
);
$dbservices = get_records_array(
'external_services',
null,
null,
'component, name',
'id, name, shortname, component, enabled, restrictedusers, tokenusers'
);
if ($dbservices) {
foreach ($dbservices as $service) {
$iscustomservice = ($service->component === '');
$form['elements']['id'. $service->id . '_service'] = array(
'value' => $service->name .
($service->shortname ? ' (' . $service->shortname . ')' : ''),
'type' => 'html',
'key' => $service->name,
);
$form['elements']['id'. $service->id . '_component'] = array(
'value' => ($iscustomservice ? get_string('customservicegroup', 'auth.webservice') : $service->component),
'type' => 'html',
'key' => $service->name,
);
$form['elements']['id'. $service->id . '_enabled'] = array(
'value' => (($service->enabled == 1) ? display_icon('enabled') : display_icon('disabled')),
'type' => 'html',
'class' => 'center',
'key' => $service->name,
);
$form['elements']['id'. $service->id . '_restricted'] = array(
'value' => (($service->restrictedusers == 1) ? display_icon('enabled') : display_icon('disabled')),
'type' => 'html',
'class' => 'center',
'key' => $service->name,
);
$form['elements']['id'. $service->id . '_tokenusers'] = array(
'value' => (($service->tokenusers == 1) ? display_icon('enabled') : display_icon('disabled')),
'type' => 'html',
'class' => 'center',
'key' => $service->name,
);
$functions = get_records_array('external_services_functions', 'externalserviceid', $service->id);
$function_list = array();
if ($functions) {
foreach ($functions as $function) {
$dbfunction = get_record('external_functions', 'name', $function->functionname);
$function_list[]= '' . $function->functionname . '';
}
}
$form['elements']['id'. $service->id . '_functions'] = array(
'value' => implode(', ', $function_list),
'type' => 'html',
'key' => $service->name,
);
// edit and delete buttons
$form['elements']['id'. $service->id . '_actions'] = array(
'value' => pieform(array(
'name' => 'webservices_function_groups_edit_' . $service->id,
'renderer' => 'div',
'class' => 'form-as-button pull-left',
'successcallback' => 'webservice_function_groups_submit',
'jsform' => false,
'action' => get_config('wwwroot') . 'webservice/admin/index.php',
'elements' => array(
'service' => array('type' => 'hidden', 'value' => $service->id),
'action' => array('type' => 'hidden', 'value' => 'edit'),
'submit' => array(
'type' => 'button',
'class' => 'btn-default btn-sm',
'usebuttontag' => true,
'value' => '' . get_string('edit', 'mahara'),
'elementtitle' => get_string('edit'),
),
),
))
. (
$iscustomservice ?
pieform(array(
'name' => 'webservices_function_groups_delete_' . $service->id,
'renderer' => 'div',
'class' => 'form-as-button pull-left',
'successcallback' => 'webservice_function_groups_submit',
'jsform' => false,
'action' => get_config('wwwroot') . 'webservice/admin/index.php',
'elements' => array(
'service' => array('type' => 'hidden', 'value' => $service->id),
'action' => array('type' => 'hidden', 'value' => 'delete'),
'submit' => array(
'type' => 'button',
'usebuttontag' => true,
'class' => 'btn-default btn-sm',
'value' => '' . get_string('delete', 'mahara'),
'elementtitle' => get_string('delete'),
),
),
))
: ''
),
'type' => 'html',
'key' => $service->name,
'class' => 'webserviceconfigcontrols btn-group',
);
}
}
$pieform = pieform_instance($form);
return $pieform->build(false) . '' .
pieform(array(
'name' => 'webservices_function_groups_add',
'renderer' => 'div',
'successcallback' => 'webservice_function_groups_submit',
'class' => 'form-inline',
'jsform' => false,
'action' => get_config('wwwroot') . 'webservice/admin/index.php',
'elements' => array(
'service' => array(
'type' => 'text',
'class' => 'last'
),
'action' => array('type' => 'hidden', 'value' => 'add'),
'submit' => array(
'type' => 'submit',
'class' => 'submit btn-primary last',
'value' => get_string('add')
),
),
)) .
'
';
}
/**
* Pieform callback for the "function groups" section
*/
function webservice_function_groups_submit(Pieform $form, $values) {
global $SESSION;
if ($values['action'] == 'add') {
$service = preg_replace('/[^a-zA-Z0-9_ ]+/', '', $values['service']);
$service = trim($service);
if (empty($service) || record_exists('external_services', 'name', $service)) {
$SESSION->add_error_msg(get_string('invalidinput', 'auth.webservice'));
}
else {
$service = array('name' => $service, 'restrictedusers' => 0, 'enabled' => 0, 'tokenusers' => 0, 'component' => '', 'ctime' => db_format_timestamp(time()));
insert_record('external_services', $service);
$SESSION->add_ok_msg(get_string('configsaved', 'auth.webservice'));
}
}
else {
$service = get_record('external_services', 'id', $values['service']);
if (!empty($service)) {
if ($values['action'] == 'edit') {
redirect('/webservice/admin/serviceconfig.php?service=' . $values['service']);
}
else if ($values['action'] == 'delete') {
$component = get_field('external_services', 'component', 'id', $values['service']);
// Can't manually delete plugin-provided services; only disable them.
if ($component === '') {
// remove everything associated with a service
$params = array($values['service']);
delete_records_select('external_tokens', "externalserviceid = ?", $params);
delete_records_select('external_services_users', "externalserviceid = ?", $params);
delete_records_select('external_services_functions', "externalserviceid = ?", $params);
delete_records('external_services', 'id', $values['service']);
$SESSION->add_ok_msg(get_string('configsaved', 'auth.webservice'));
}
}
}
}
// default back to where we came from
redirect('/webservice/admin/index.php?open=webservices_function_groups');
}
/**
* Service Tokens Groups edit form
*
* @return html
*/
function webservice_tokens_form() {
global $THEME, $USER;
$editicon = 'icon icon-pencil left';
$deleteicon = 'icon icon-trash left text-danger';
$form = array(
'name' => 'webservices_tokens',
'elementclasses' => false,
'successcallback' => 'webservice_tokens_submit',
'renderer' => 'multicolumntable',
'elements' => array(
'token' => array(
'title' => ' ',
'datatable' => true,
'type' => 'html',
'value' => get_string('token', 'auth.webservice'),
),
'institution' => array(
'title' => ' ',
'datatable' => true,
'type' => 'html',
'value' => get_string('institution'),
),
'username' => array(
'title' => ' ',
'datatable' => true,
'type' => 'html',
'value' => get_string('username', 'auth.webservice'),
),
'servicename' => array(
'title' => ' ',
'datatable' => true,
'type' => 'html',
'value' => get_string('servicename', 'auth.webservice'),
),
'enabled' => array(
'title' => ' ',
'datatable' => true,
'type' => 'html',
'value' => get_string('enabled'),
),
'wssigenc' => array(
'title' => ' ',
'datatable' => true,
'type' => 'html',
'value' => get_string('titlewssigenc', 'auth.webservice'),
),
'functions' => array(
'title' => ' ',
'datatable' => true,
'type' => 'html',
'value' => get_string('functions', 'auth.webservice'),
),
'actions' => array(
'title' => ' ',
'datatable' => true,
'type' => 'html',
'value' => '',
),
),
);
$dbtokens = get_records_sql_array('SELECT et.id as tokenid, et.wssigenc AS wssigenc, et.externalserviceid as externalserviceid, et.institution as institution, u.id as userid, u.username as username, et.token as token, es.name as name, es.enabled as enabled FROM {external_tokens} AS et LEFT JOIN {usr} AS u ON et.userid = u.id LEFT JOIN {external_services} AS es ON et.externalserviceid = es.id WHERE et.tokentype = ? ORDER BY u.username', array(EXTERNAL_TOKEN_PERMANENT));
if (!empty($dbtokens)) {
foreach ($dbtokens as $token) {
$form['elements']['id'. $token->tokenid . '_token'] = array(
'value' => $token->token,
'type' => 'html',
'key' => $token->token,
);
$dbinstitution = get_record('institution', 'name', $token->institution);
$form['elements']['id'. $token->tokenid . '_institution'] = array(
'value' => $dbinstitution->displayname,
'type' => 'html',
'key' => $token->token,
);
if ($USER->is_admin_for_user($token->userid)) {
$user_url = get_config('wwwroot') . 'admin/users/edit.php?id=' . $token->userid;
}
else {
$user_url = get_config('wwwroot') . 'user/view.php?id=' . $token->userid;
}
$form['elements']['id'. $token->tokenid . '_username'] = array(
'value' => '' . $token->username . '',
'type' => 'html',
'key' => $token->token,
);
$form['elements']['id'. $token->tokenid . '_servicename'] = array(
'value' => $token->name,
'type' => 'html',
'key' => $token->token,
);
$form['elements']['id'. $token->tokenid . '_enabled'] = array(
'value' => (($token->enabled == 1) ? display_icon('enabled') : display_icon('disabled')),
'type' => 'html',
'class' => 'center',
'key' => $token->token,
);
$form['elements']['id'. $token->tokenid . '_wssigenc'] = array(
'value' => (($token->wssigenc == 1) ? display_icon('enabled') : display_icon('disabled')),
'type' => 'html',
'class' => 'center',
'key' => $token->token,
);
$functions = get_records_array('external_services_functions', 'externalserviceid', $token->externalserviceid);
$function_list = array();
if ($functions) {
foreach ($functions as $function) {
$dbfunction = get_record('external_functions', 'name', $function->functionname);
$function_list[]= '' . $function->functionname . '';
}
}
$form['elements']['id'. $token->tokenid . '_functions'] = array(
'value' => implode(', ', $function_list),
'type' => 'html',
'key' => $token->token,
);
// edit and delete buttons
$form['elements']['id'. $token->tokenid . '_actions'] = array(
'value' => pieform(array(
'name' => 'webservices_token_edit_' . $token->tokenid,
'renderer' => 'div',
'elementclasses' => false,
'successcallback' => 'webservice_token_submit',
'class' => 'form-as-button pull-left',
'jsform' => false,
'elements' => array(
'token' => array('type' => 'hidden', 'value' => $token->tokenid),
'action' => array('type' => 'hidden', 'value' => 'edit'),
'submit' => array(
'type' => 'button',
'usebuttontag' => true,
'class' => 'btn-default btn-sm',
'value' => '' . get_string('edit'),
'elementtitle' => get_string('editspecific', 'mahara', $token->tokenid),
),
),
))
. pieform(array(
'name' => 'webservices_token_delete_' . $token->tokenid,
'renderer' => 'div',
'elementclasses' => false,
'successcallback' => 'webservice_token_submit',
'class' => 'form-as-button pull-left',
'jsform' => false,
'elements' => array(
'token' => array('type' => 'hidden', 'value' => $token->tokenid),
'action' => array('type' => 'hidden', 'value' => 'delete'),
'submit' => array(
'type' => 'button',
'usebuttontag' => true,
'class' => 'btn-default btn-sm',
'value' => '' . get_string('delete'),
'elementtitle' => get_string('deletespecific', 'mahara', $token->tokenid),
),
),
)),
'type' => 'html',
'key' => $token->token,
'class' => 'webserviceconfigcontrols btn-group',
);
}
}
else {
// no results so hide headings
$form['elements'] = array();
}
$username = '';
if ($user = param_integer('user', 0)) {
$dbuser = get_record('usr', 'id', $user);
if (!empty($dbuser)) {
$username = $dbuser->username;
}
}
else {
$username = param_alphanum('username', '');
}
$pieform = pieform_instance($form);
return $pieform->build(false) . ''
. pieform(array(
'name' => 'webservices_token_generate',
'renderer' => 'div',
'successcallback' => 'webservice_token_submit',
'jsform' => false,
'action' => get_config('wwwroot') . 'webservice/admin/index.php',
'elements' => array(
'userid' => array(
'type' => 'autocomplete',
'title' => get_string('username') . ': ',
'ajaxurl' => get_config('wwwroot') . 'webservice/admin/users.json.php',
'multiple' => true,
'allowclear' => true,
'ajaxextraparams' => array(),
'extraparams' => array(
'maximumSelectionLength' => 1
),
'width' => '280px',
),
'action' => array('type' => 'hidden', 'value' => 'generate'),
'submit' => array(
'type' => 'submit',
'class' => 'submit btn-primary last',
'value' => get_string('generate', 'auth.webservice')
),
),
))
. '
';
}
/**
* Pieform callback for the webservices token management form
*/
function webservice_token_submit(Pieform $form, $values) {
global $SESSION, $USER;
if ($values['action'] == 'generate') {
if (!empty($values['userid'][0])) {
$dbuser = get_record('usr', 'id', $values['userid'][0]);
if (!empty($dbuser)) {
$services = get_records_array('external_services', 'restrictedusers', 0);
if (empty($services)) {
$SESSION->add_error_msg(get_string('noservices', 'auth.webservice'));
}
else {
// just pass the first one for the moment
$service = array_shift($services);
$token = webservice_generate_token(EXTERNAL_TOKEN_PERMANENT, $service, $dbuser->id);
$dbtoken = get_record('external_tokens', 'token', $token);
redirect('/webservice/admin/tokenconfig.php?token=' . $dbtoken->id);
}
}
else {
$SESSION->add_error_msg(get_string('invaliduserselected', 'auth.webservice'));
}
}
else {
$SESSION->add_error_msg(get_string('nouser', 'auth.webservice'));
}
}
else {
$token = get_record('external_tokens', 'id', $values['token']);
if (!empty($token)) {
if ($values['action'] == 'edit') {
redirect('/webservice/admin/tokenconfig.php?token=' . $values['token']);
}
else if ($values['action'] == 'delete') {
// remove everything associated with a service
$params = array($values['token']);
delete_records_select('external_tokens', "id = ?", $params);
$SESSION->add_ok_msg(get_string('configsaved', 'auth.webservice'));
}
}
}
// default back to where we came from
redirect('/webservice/admin/index.php?open=webservices_token');
}
/**
* Service Users edit form
*
* @return html
*/
function webservice_users_form() {
global $THEME, $USER;
$editicon = 'icon icon-pencil left';
$deleteicon = 'icon icon-trash left text-danger';
$form = array(
'name' => 'webservices_users',
'elementclasses' => false,
'successcallback' => 'webservice_users_submit',
'renderer' => 'multicolumntable',
'elements' => array(
'username' => array(
'title' => ' ',
'datatable' => true,
'type' => 'html',
'value' => get_string('username', 'auth.webservice'),
),
'institution' => array(
'title' => ' ',
'datatable' => true,
'type' => 'html',
'value' => get_string('institution'),
),
'servicename' => array(
'title' => ' ',
'datatable' => true,
'type' => 'html',
'value' => get_string('servicename', 'auth.webservice'),
),
'enabled' => array(
'title' => ' ',
'datatable' => true,
'type' => 'html',
'value' => get_string('enabled'),
),
'wssigenc' => array(
'title' => ' ',
'datatable' => true,
'type' => 'html',
'value' => get_string('titlewssigenc', 'auth.webservice'),
),
'functions' => array(
'title' => ' ',
'datatable' => true,
'type' => 'html',
'value' => get_string('functions', 'auth.webservice'),
),
'actions' => array(
'title' => ' ',
'datatable' => true,
'type' => 'html',
'value' => '',
),
),
);
$dbusers = get_records_sql_array('SELECT eu.id as id, eu.userid as userid, eu.wssigenc AS wssigenc, eu.externalserviceid as externalserviceid, eu.institution as institution, u.username as username, es.name as name, es.enabled as enabled FROM {external_services_users} AS eu LEFT JOIN {usr} AS u ON eu.userid = u.id LEFT JOIN {external_services} AS es ON eu.externalserviceid = es.id ORDER BY eu.id', array());
if (!empty($dbusers)) {
foreach ($dbusers as $user) {
$dbinstitution = get_record('institution', 'name', $user->institution);
if ($USER->is_admin_for_user($user->id)) {
$user_url = get_config('wwwroot') . 'admin/users/edit.php?id=' . $user->userid;
}
else {
$user_url = get_config('wwwroot') . 'user/view.php?id=' . $user->userid;
}
$form['elements']['id'. $user->id . '_username'] = array(
'value' => '' . $user->username . '',
'type' => 'html',
'key' => $user->id,
);
$form['elements']['id'. $user->id . '_institution'] = array(
'value' => $dbinstitution->displayname,
'type' => 'html',
'key' => $user->id,
);
$form['elements']['id'. $user->id . '_servicename'] = array(
'value' => $user->name,
'type' => 'html',
'key' => $user->id,
);
$form['elements']['id'. $user->id . '_enabled'] = array(
'value' => (($user->enabled == 1) ? display_icon('enabled') : display_icon('disabled')),
'type' => 'html',
'class' => 'center',
'key' => $user->id,
);
$form['elements']['id'. $user->id . '_wssigenc'] = array(
'value' => (($user->wssigenc == 1) ? display_icon('enabled') : display_icon('disabled')),
'type' => 'html',
'class' => 'center',
'key' => $user->id,
);
$functions = get_records_array('external_services_functions', 'externalserviceid', $user->externalserviceid);
$function_list = array();
if ($functions) {
foreach ($functions as $function) {
$dbfunction = get_record('external_functions', 'name', $function->functionname);
$function_list[]= '' . $function->functionname . '';
}
}
$form['elements']['id'. $user->id . '_functions'] = array(
'value' => implode(', ', $function_list),
'type' => 'html',
'key' => $user->id,
);
// edit and delete buttons
$form['elements']['id'. $user->id . '_actions'] = array(
'value' => pieform(array(
'name' => 'webservices_user_edit_' . $user->id,
'renderer' => 'div',
'elementclasses' => false,
'successcallback' => 'webservice_users_submit',
'class' => 'form-as-button pull-left',
'jsform' => false,
'elements' => array(
'suid' => array('type' => 'hidden', 'value' => $user->id),
'action' => array('type' => 'hidden', 'value' => 'edit'),
'submit' => array(
'type' => 'button',
'usebuttontag' => true,
'class' => 'btn-default btn-sm',
'value' => '' . get_string('edit'),
'elementtitle' => get_string('editspecific', 'mahara', $user->username),
),
),
))
. pieform(array(
'name' => 'webservices_user_delete_' . $user->id,
'renderer' => 'div',
'elementclasses' => false,
'successcallback' => 'webservice_users_submit',
'class' => 'form-as-button pull-left',
'jsform' => false,
'elements' => array(
'suid' => array('type' => 'hidden', 'value' => $user->id),
'action' => array('type' => 'hidden', 'value' => 'delete'),
'submit' => array(
'type' => 'button',
'usebuttontag' => true,
'class' => 'btn-default btn-sm',
'value' => '' . get_string('delete'),
'elementtitle' => get_string('deletespecific', 'mahara', $user->username),
),
),
)),
'type' => 'html',
'key' => $user->id,
'class' => 'webserviceconfigcontrols btn-group',
);
}
}
else {
// no results so hide headings
$form['elements'] = array();
}
$username = '';
if ($user = param_integer('user', 0)) {
$dbuser = get_record('usr', 'id', $user);
if (!empty($dbuser)) {
$username = $dbuser->username;
}
}
else {
$username = param_alphanum('username', '');
}
$pieform = pieform_instance($form);
return $pieform->build(false) . '' .
pieform(array(
'name' => 'webservices_user_generate',
'renderer' => 'div',
'successcallback' => 'webservice_users_submit',
'jsform' => false,
'action' => get_config('wwwroot') . 'webservice/admin/index.php',
'elements' => array(
'userid' => array(
'type' => 'autocomplete',
'title' => get_string('username') . ': ',
'ajaxurl' => get_config('wwwroot') . 'webservice/admin/users.json.php',
'multiple' => true,
'allowclear' => true,
'ajaxextraparams' => array(),
'extraparams' => array(
'maximumSelectionLength' => 1
),
'width' => '280px',
),
'action' => array('type' => 'hidden', 'value' => 'add'),
'submit' => array(
'type' => 'submit',
'class' => 'submit btn-primary last',
'value' => get_string('add')
),
),
))
. '
';
}
/**
* Pieform callback for the user permissions section
*/
function webservice_users_submit(Pieform $form, $values) {
global $SESSION, $USER;
if ($values['action'] == 'add') {
if (!empty($values['userid'][0])) {
$dbuser = get_record('usr', 'id', $values['userid'][0]);
if ($auth_instance = webservice_validate_user($dbuser)) {
// make sure that this account is not already in use
$existing = get_record('external_services_users', 'userid', $dbuser->id);
if (empty($existing)) {
$services = get_records_array('external_services', 'restrictedusers', 1);
if (empty($services)) {
$SESSION->add_error_msg(get_string('noservices', 'auth.webservice'));
}
else {
// just pass the first one for the moment
$service = array_shift($services);
$dbserviceuser = (object) array(
'externalserviceid' => $service->id,
'userid' => $dbuser->id,
'institution' => $auth_instance->institution,
'ctime' => db_format_timestamp(time()),
'publickeyexpires' => time(),
'wssigenc' => 0,
'publickey' => '');
$dbserviceuser->id = insert_record('external_services_users', $dbserviceuser, 'id', true);
redirect('/webservice/admin/userconfig.php?suid=' . $dbserviceuser->id);
}
}
else {
$SESSION->add_error_msg(get_string('duplicateuser', 'auth.webservice'));
}
}
else {
$SESSION->add_error_msg(get_string('invaliduserselected', 'auth.webservice'));
}
}
else {
$SESSION->add_error_msg(get_string('nouser', 'auth.webservice'));
}
}
else {
$dbserviceuser = get_record('external_services_users', 'id', $values['suid']);
if (!empty($dbserviceuser)) {
if ($values['action'] == 'edit') {
redirect('/webservice/admin/userconfig.php?suid=' . $values['suid']);
}
else if ($values['action'] == 'delete') {
// remove everything associated with a service
$params = array($values['suid']);
delete_records_select('external_services_users', "id = ?", $params);
$SESSION->add_ok_msg(get_string('configsaved', 'auth.webservice'));
}
}
}
// default back to where we came from
redirect('/webservice/admin/index.php?open=webservices_user');
}