You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
487 lines
13 KiB
487 lines
13 KiB
<?php
|
|
/* For licensing terms, see /license.txt */
|
|
|
|
use Chamilo\CoreBundle\Entity\ExtraField as EntityExtraField;
|
|
use Chamilo\UserBundle\Entity\User;
|
|
|
|
/**
|
|
* @package chamilo.webservices
|
|
*/
|
|
require_once __DIR__.'/../inc/global.inc.php';
|
|
$debug = true;
|
|
|
|
define('WS_ERROR_SECRET_KEY', 1);
|
|
define('WS_ERROR_NOT_FOUND_RESULT', 2);
|
|
define('WS_ERROR_INVALID_INPUT', 3);
|
|
define('WS_ERROR_SETTING', 4);
|
|
|
|
/**
|
|
* @param integer $code
|
|
*/
|
|
function return_error($code)
|
|
{
|
|
$fault = null;
|
|
switch ($code) {
|
|
case WS_ERROR_SECRET_KEY:
|
|
$fault = new soap_fault(
|
|
'Server',
|
|
'',
|
|
'Secret key is not correct or params are not correctly set'
|
|
);
|
|
break;
|
|
case WS_ERROR_NOT_FOUND_RESULT:
|
|
$fault = new soap_fault(
|
|
'Server',
|
|
'',
|
|
'No result was found for this query'
|
|
);
|
|
break;
|
|
case WS_ERROR_INVALID_INPUT:
|
|
$fault = new soap_fault(
|
|
'Server',
|
|
'',
|
|
'The input variables are invalid o are not correctly set'
|
|
);
|
|
break;
|
|
case WS_ERROR_SETTING:
|
|
$fault = new soap_fault(
|
|
'Server',
|
|
'',
|
|
'Please check the configuration for this webservice'
|
|
);
|
|
break;
|
|
}
|
|
return $fault;
|
|
}
|
|
|
|
/**
|
|
* @param array $params
|
|
* @return bool
|
|
*/
|
|
function WSHelperVerifyKey($params)
|
|
{
|
|
global $_configuration, $debug;
|
|
if (is_array($params)) {
|
|
$secret_key = $params['secret_key'];
|
|
} else {
|
|
$secret_key = $params;
|
|
}
|
|
//error_log(print_r($params,1));
|
|
$check_ip = false;
|
|
$ip_matches = false;
|
|
$ip = trim($_SERVER['REMOTE_ADDR']);
|
|
// if we are behind a reverse proxy, assume it will send the
|
|
// HTTP_X_FORWARDED_FOR header and use this IP instead
|
|
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
|
|
list($ip1, $ip2) = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
|
|
$ip = trim($ip1);
|
|
}
|
|
if ($debug) {
|
|
error_log("ip: $ip");
|
|
}
|
|
// Check if a file that limits access from webservices exists and contains
|
|
// the restraining check
|
|
if (is_file('webservice-auth-ip.conf.php')) {
|
|
include 'webservice-auth-ip.conf.php';
|
|
if ($debug) {
|
|
error_log("webservice-auth-ip.conf.php file included");
|
|
}
|
|
if (!empty($ws_auth_ip)) {
|
|
$check_ip = true;
|
|
$ip_matches = api_check_ip_in_range($ip, $ws_auth_ip);
|
|
if ($debug) {
|
|
error_log("ip_matches: $ip_matches");
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($debug) {
|
|
error_log("checkip ".intval($check_ip));
|
|
}
|
|
|
|
if ($check_ip) {
|
|
$security_key = $_configuration['security_key'];
|
|
} else {
|
|
$security_key = $ip.$_configuration['security_key'];
|
|
//error_log($secret_key.'-'.$security_key);
|
|
}
|
|
|
|
$result = api_is_valid_secret_key($secret_key, $security_key);
|
|
//error_log($secret_key.'-'.$security_key);
|
|
if ($debug) {
|
|
error_log('WSHelperVerifyKey result: '.intval($result));
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
// Create the server instance
|
|
$server = new soap_server();
|
|
|
|
/** @var HookWSRegistration $hook */
|
|
$hook = HookWSRegistration::create();
|
|
if (!empty($hook)) {
|
|
$hook->setEventData(['server' => $server]);
|
|
$res = $hook->notifyWSRegistration(HOOK_EVENT_TYPE_PRE);
|
|
if (!empty($res['server'])) {
|
|
$server = $res['server'];
|
|
}
|
|
}
|
|
|
|
$server->soap_defencoding = 'UTF-8';
|
|
|
|
// Initialize WSDL support
|
|
$server->configureWSDL('WSAccessUrl', 'urn:WSAccessUrl');
|
|
|
|
$server->wsdl->addComplexType(
|
|
'portalItem',
|
|
'complexType',
|
|
'struct',
|
|
'all',
|
|
'',
|
|
[
|
|
'id' => ['name' => 'id', 'type' => 'xsd:string'],
|
|
'url' => ['name' => 'url', 'type' => 'xsd:string']
|
|
]
|
|
);
|
|
|
|
$server->wsdl->addComplexType(
|
|
'portalList',
|
|
'complexType',
|
|
'array',
|
|
'',
|
|
'SOAP-ENC:Array',
|
|
[],
|
|
[
|
|
[
|
|
'ref' => 'SOAP-ENC:arrayType',
|
|
'wsdl:arrayType' => 'tns:portalItem[]',
|
|
],
|
|
],
|
|
'tns:portalItem'
|
|
);
|
|
|
|
$server->wsdl->addComplexType(
|
|
'getPortals',
|
|
'complexType',
|
|
'struct',
|
|
'all',
|
|
'',
|
|
[
|
|
'secret_key' => ['name' => 'secret_key', 'type' => 'xsd:string']
|
|
]
|
|
);
|
|
|
|
// Register the method to expose
|
|
$server->register(
|
|
'WSGetPortals', // method name
|
|
['getPortals' => 'tns:getPortals'], // input parameters
|
|
['return' => 'tns:portalList'], // output parameters
|
|
'urn:WSAccessUrl', // namespace
|
|
'urn:WSAccessUrl#WSGetPortals', // soapaction
|
|
'rpc', // style
|
|
'encoded', // use
|
|
'This service adds a user to portal' // documentation
|
|
);
|
|
|
|
// Define the method WSAddUserToPortal
|
|
function WSGetPortals($params)
|
|
{
|
|
global $debug;
|
|
if (!WSHelperVerifyKey($params['secret_key'])) {
|
|
return return_error(WS_ERROR_SECRET_KEY);
|
|
}
|
|
$urlData = UrlManager::get_url_data();
|
|
|
|
$return = [];
|
|
foreach ($urlData as $data) {
|
|
$return[] = [
|
|
'id' => $data['id'],
|
|
'url' => $data['url'],
|
|
];
|
|
}
|
|
if ($debug) {
|
|
error_log(print_r($return, 1));
|
|
}
|
|
|
|
return $return;
|
|
}
|
|
|
|
$server->wsdl->addComplexType(
|
|
'AddUserToPortal',
|
|
'complexType',
|
|
'struct',
|
|
'all',
|
|
'',
|
|
[
|
|
'secret_key' => ['name' => 'secret_key', 'type' => 'xsd:string'],
|
|
'user_id' => ['name' => 'user_id', 'type' => 'xsd:string'],
|
|
'portal_id' => ['name' => 'portal_id', 'type' => 'xsd:string']
|
|
]
|
|
);
|
|
|
|
// Register the method to expose
|
|
$server->register(
|
|
'WSAddUserToPortal', // method name
|
|
['addUserToPortal' => 'tns:AddUserToPortal'], // input parameters
|
|
['return' => 'xsd:string'], // output parameters
|
|
'urn:WSAccessUrl', // namespace
|
|
'urn:WSAccessUrl#WSAddUserToPortal', // soapaction
|
|
'rpc', // style
|
|
'encoded', // use
|
|
'This service adds a user to portal' // documentation
|
|
);
|
|
|
|
// Define the method WSAddUserToPortal
|
|
function WSAddUserToPortal($params)
|
|
{
|
|
if (!WSHelperVerifyKey($params['secret_key'])) {
|
|
return return_error(WS_ERROR_SECRET_KEY);
|
|
}
|
|
|
|
$userId = $params['user_id'];
|
|
$portalId = $params['portal_id'];
|
|
|
|
UrlManager::add_user_to_url($userId, $portalId);
|
|
|
|
$result = UrlManager::relation_url_user_exist($userId, $portalId);
|
|
if (!empty($result)) {
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Register the method to expose
|
|
$server->register(
|
|
'WSRemoveUserFromPortal', // method name
|
|
['removeUserFromPortal' => 'tns:AddUserToPortal'], // input parameters
|
|
['return' => 'xsd:string'], // output parameters
|
|
'urn:WSAccessUrl', // namespace
|
|
'urn:WSAccessUrl#WSRemoveUserFromPortal', // soapaction
|
|
'rpc', // style
|
|
'encoded', // use
|
|
'This service remove a user from a portal' // documentation
|
|
);
|
|
|
|
// Define the method WSDeleteUserFromGroup
|
|
function WSRemoveUserFromPortal($params)
|
|
{
|
|
if (!WSHelperVerifyKey($params['secret_key'])) {
|
|
return return_error(WS_ERROR_SECRET_KEY);
|
|
}
|
|
|
|
$userId = $params['user_id'];
|
|
$portalId = $params['portal_id'];
|
|
|
|
UrlManager::delete_url_rel_user($userId, $portalId);
|
|
|
|
$result = UrlManager::relation_url_user_exist($userId, $portalId);
|
|
if (empty($result)) {
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
$server->wsdl->addComplexType(
|
|
'getPortalListFromUser',
|
|
'complexType',
|
|
'struct',
|
|
'all',
|
|
'',
|
|
[
|
|
'secret_key' => ['name' => 'secret_key', 'type' => 'xsd:string'],
|
|
'user_id' => ['name' => 'user_id', 'type' => 'xsd:string'],
|
|
]
|
|
);
|
|
|
|
// Register the method to expose
|
|
$server->register(
|
|
'WSGetPortalListFromUser', // method name
|
|
['getPortalListFromUser' => 'tns:getPortalListFromUser'], // input parameters
|
|
['return' => 'tns:portalList'], // output parameters
|
|
'urn:WSAccessUrl', // namespace
|
|
'urn:WSAccessUrl#WSGetPortalListFromUser', // soapaction
|
|
'rpc', // style
|
|
'encoded', // use
|
|
'This service remove a user from a portal' // documentation
|
|
);
|
|
|
|
// Define the method WSDeleteUserFromGroup
|
|
function WSGetPortalListFromUser($params)
|
|
{
|
|
if (!WSHelperVerifyKey($params['secret_key'])) {
|
|
return return_error(WS_ERROR_SECRET_KEY);
|
|
}
|
|
|
|
$userId = $params['user_id'];
|
|
|
|
$result = UrlManager::get_access_url_from_user($userId);
|
|
if (!empty($result)) {
|
|
foreach ($result as &$data) {
|
|
$data['id'] = $data['access_url_id'];
|
|
}
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
// Course ws
|
|
$server->wsdl->addComplexType(
|
|
'getPortalListFromCourse',
|
|
'complexType',
|
|
'struct',
|
|
'all',
|
|
'',
|
|
[
|
|
'secret_key' => ['name' => 'secret_key', 'type' => 'xsd:string'],
|
|
'original_course_id_name' => ['name' => 'original_course_id_name', 'type' => 'xsd:string'],
|
|
'original_course_id_value' => ['name' => 'original_course_id_value', 'type' => 'xsd:string']
|
|
]
|
|
);
|
|
|
|
// Register the method to expose
|
|
$server->register(
|
|
'WSGetPortalListFromCourse', // method name
|
|
['getPortalListFromCourse' => 'tns:getPortalListFromCourse'], // input parameters
|
|
['return' => 'tns:portalList'], // output parameters
|
|
'urn:WSAccessUrl', // namespace
|
|
'urn:WSAccessUrl#getPortalListFromCourse', // soapaction
|
|
'rpc', // style
|
|
'encoded', // use
|
|
'This service remove a user from a portal' // documentation
|
|
);
|
|
|
|
// Define the method WSDeleteUserFromGroup
|
|
function WSGetPortalListFromCourse($params)
|
|
{
|
|
if (!WSHelperVerifyKey($params['secret_key'])) {
|
|
return return_error(WS_ERROR_SECRET_KEY);
|
|
}
|
|
|
|
$courseInfo = CourseManager::getCourseInfoFromOriginalId(
|
|
$params['original_course_id_value'],
|
|
$params['original_course_id_name']
|
|
);
|
|
|
|
$courseId = $courseInfo['real_id'];
|
|
|
|
$result = UrlManager::get_access_url_from_course($courseId);
|
|
|
|
if (!empty($result)) {
|
|
foreach ($result as &$data) {
|
|
$data['id'] = $data['access_url_id'];
|
|
}
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
$server->wsdl->addComplexType(
|
|
'addCourseToPortal',
|
|
'complexType',
|
|
'struct',
|
|
'all',
|
|
'',
|
|
[
|
|
'secret_key' => ['name' => 'secret_key', 'type' => 'xsd:string'],
|
|
'portal_id' => ['name' => 'portal_id', 'type' => 'xsd:string'],
|
|
'original_course_id_name' => ['name' => 'original_course_id_name', 'type' => 'xsd:string'],
|
|
'original_course_id_value' => ['name' => 'original_course_id_value', 'type' => 'xsd:string']
|
|
]
|
|
);
|
|
|
|
// Register the method to expose
|
|
$server->register(
|
|
'WSAddCourseToPortal', // method name
|
|
['addCourseToPortal' => 'tns:addCourseToPortal'], // input parameters
|
|
['return' => 'xsd:string'], // output parameters
|
|
'urn:WSAccessUrl', // namespace
|
|
'urn:WSAccessUrl#WSAddCourseToPortal', // soapaction
|
|
'rpc', // style
|
|
'encoded', // use
|
|
'This service adds a course to portal' // documentation
|
|
);
|
|
|
|
// Define the method WSAddUserToPortal
|
|
function WSAddCourseToPortal($params)
|
|
{
|
|
if (!WSHelperVerifyKey($params['secret_key'])) {
|
|
return return_error(WS_ERROR_SECRET_KEY);
|
|
}
|
|
|
|
$courseInfo = CourseManager::getCourseInfoFromOriginalId(
|
|
$params['original_course_id_value'],
|
|
$params['original_course_id_name']
|
|
);
|
|
|
|
$courseId = $courseInfo['real_id'];
|
|
$portalId = $params['portal_id'];
|
|
|
|
UrlManager::add_course_to_url($courseId, $portalId);
|
|
|
|
$result = UrlManager::relation_url_course_exist($courseId, $portalId);
|
|
|
|
return intval($result);
|
|
}
|
|
|
|
// Register the method to expose
|
|
$server->register(
|
|
'WSRemoveCourseFromPortal', // method name
|
|
['removeCourseFromPortal' => 'tns:addCourseToPortal'], // input parameters
|
|
['return' => 'xsd:string'], // output parameters
|
|
'urn:WSAccessUrl', // namespace
|
|
'urn:WSAccessUrl#WSRemoveCourseFromPortal', // soapaction
|
|
'rpc', // style
|
|
'encoded', // use
|
|
'This service remove a course from a portal' // documentation
|
|
);
|
|
|
|
// Define the method WSDeleteUserFromGroup
|
|
function WSRemoveCourseFromPortal($params)
|
|
{
|
|
if (!WSHelperVerifyKey($params['secret_key'])) {
|
|
return return_error(WS_ERROR_SECRET_KEY);
|
|
}
|
|
|
|
$courseInfo = CourseManager::getCourseInfoFromOriginalId(
|
|
$params['original_course_id_value'],
|
|
$params['original_course_id_name']
|
|
);
|
|
|
|
$courseId = $courseInfo['real_id'];
|
|
$portalId = $params['portal_id'];
|
|
|
|
UrlManager::delete_url_rel_course($courseId, $portalId);
|
|
$result = UrlManager::relation_url_course_exist($courseId, $portalId);
|
|
|
|
if (empty($result)) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
/* Delete user from group Web Service end */
|
|
|
|
// Add more webservices through hooks from plugins
|
|
if (!empty($hook)) {
|
|
$hook->setEventData(['server' => $server]);
|
|
$res = $hook->notifyWSRegistration(HOOK_EVENT_TYPE_POST);
|
|
if (!empty($res['server'])) {
|
|
$server = $res['server'];
|
|
}
|
|
}
|
|
|
|
// Use the request to (try to) invoke the service
|
|
$GLOBALS['HTTP_RAW_POST_DATA'] = file_get_contents('php://input');
|
|
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
|
|
|
|
// If you send your data in utf8 then this value must be false.
|
|
$decodeUTF8 = api_get_setting('registration.soap.php.decode_utf8');
|
|
if ($decodeUTF8 === 'true') {
|
|
$server->decode_utf8 = true;
|
|
} else {
|
|
$server->decode_utf8 = false;
|
|
}
|
|
$server->service($HTTP_RAW_POST_DATA);
|
|
|