123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519 |
- <?php
- /* For licensing terms, see /license.txt */
- use Skill as SkillManager;
- require_once __DIR__.'/../inc/global.inc.php';
- ini_set('memory_limit', -1);
- /*
- ini_set('upload_max_filesize', '4000M');
- ini_set('post_max_size', '4000M');
- ini_set('max_execution_time', '80000');
- ini_set('max_input_time', '80000');
- */
- $debug = true;
- define('WS_ERROR_SECRET_KEY', 1);
- 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;
- }
- return $fault;
- }
- 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) = 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();
- //$server->soap_defencoding = 'UTF-8';
- // Initialize WSDL support
- $server->configureWSDL('WSGradebook', 'urn:WSGradebook');
- $server->wsdl->addComplexType(
- 'WSGradebookScoreParams',
- 'complexType',
- 'struct',
- 'all',
- '',
- [
- 'item_id' => [
- 'name' => 'item_id',
- 'type' => 'xsd:string',
- ],
- 'item_type' => [
- 'name' => 'item_type',
- 'type' => 'xsd:string',
- ],
- 'email' => [
- 'name' => 'email',
- 'type' => 'xsd:string',
- ],
- 'secret_key' => ['name' => 'secret_key', 'type' => 'xsd:string'],
- ]
- );
- $server->wsdl->addComplexType(
- 'returnItemScore',
- 'complexType',
- 'struct',
- 'sequence',
- '',
- [
- 'score' => ['name' => 'score', 'type' => 'xsd:string'],
- 'date' => ['name' => 'date', 'type' => 'xsd:string'],
- 'counter' => ['name' => 'counter', 'type' => 'xsd:string'],
- ]
- );
- // Register the method to expose
- $server->register(
- 'WSGetGradebookUserItemScore', // method name
- ['params' => 'tns:WSGradebookScoreParams'], // input parameters
- ['return' => 'tns:returnItemScore'], // output parameters
- 'urn:WSGradebook', // namespace
- 'urn:WSGradebook#WSGetGradebookUserItemScore', // soapaction
- 'rpc', // style
- 'encoded', // use
- 'get gradebook item user result'
- );
- /**
- * @param array $params
- *
- * @return int|string
- */
- function WSGetGradebookUserItemScore($params)
- {
- if (!WSHelperVerifyKey($params)) {
- return return_error(WS_ERROR_SECRET_KEY);
- }
- $itemId = $params['item_id'];
- $itemType = $params['item_type'];
- $email = $params['email'];
- $userInfo = api_get_user_info_from_email($email);
- if (empty($userInfo)) {
- return new soap_fault('Server', '', 'User not found');
- }
- $em = Database::getManager();
- $score = [];
- switch ($itemType) {
- case 'link':
- /** @var \Chamilo\CoreBundle\Entity\GradebookLink $link */
- $link = $em->getRepository('ChamiloCoreBundle:GradebookLink')->find($itemId);
- if (empty($link)) {
- return new soap_fault('Server', '', 'gradebook link not found');
- }
- $links = AbstractLink::load($link->getId());
- switch ($link->getType()) {
- case LINK_EXERCISE:
- /** @var ExerciseLink $link */
- foreach ($links as $link) {
- $link->set_session_id($link->getCategory()->get_session_id());
- $score = $link->calc_score($userInfo['user_id']);
- break;
- }
- break;
- case LINK_STUDENTPUBLICATION:
- /** @var StudentPublicationLink $link */
- foreach ($links as $link) {
- $link->set_session_id($link->getCategory()->get_session_id());
- $score = $link->calc_score($userInfo['user_id']);
- break;
- }
- break;
- }
- break;
- case 'evaluation':
- //$evaluation = $em->getRepository('ChamiloCoreBundle:GradebookEvaluation')->find($itemId);
- break;
- }
- if (!empty($score)) {
- $result = ExerciseLib::show_score($score[0], $score[1], false);
- $result = strip_tags($result);
- return ['score' => $result, 'date' => $score[2], 'counter' => $score[3]];
- }
- return new soap_fault('Server', '', 'Score not found');
- }
- $server->wsdl->addComplexType(
- 'WSGradebookCategoryScoreParams',
- 'complexType',
- 'struct',
- 'all',
- '',
- [
- 'course_code' => [
- 'name' => 'course_code',
- 'type' => 'xsd:string',
- ],
- 'session_id' => [
- 'name' => 'session_id',
- 'type' => 'xsd:string',
- ],
- 'email' => [
- 'name' => 'email',
- 'type' => 'xsd:string',
- ],
- 'secret_key' => ['name' => 'secret_key', 'type' => 'xsd:string'],
- ]
- );
- // Register the method to expose
- $server->register(
- 'WSGetGradebookCategoryUserScore', // method name
- ['params' => 'tns:WSGradebookCategoryScoreParams'], // input parameters
- ['return' => 'xsd:string'], // output parameters
- 'urn:WSGradebook', // namespace
- 'urn:WSGradebook#WSGetGradebookCategoryUserScore', // soapaction
- 'rpc', // style
- 'encoded'
- );
- /**
- * @param array $params
- *
- * @return int|string
- */
- function WSGetGradebookCategoryUserScore($params)
- {
- if (!WSHelperVerifyKey($params)) {
- return return_error(WS_ERROR_SECRET_KEY);
- }
- $courseCode = $params['course_code'];
- $sessionId = (int) $params['session_id'];
- if (!empty($sessionId)) {
- $sessionInfo = api_get_session_info($sessionId);
- if (empty($sessionInfo)) {
- return new soap_fault('Server', '', 'Session not found');
- }
- }
- $email = $params['email'];
- $userInfo = api_get_user_info_from_email($email);
- if (empty($userInfo)) {
- return new soap_fault('Server', '', 'User not found');
- }
- $userId = $userInfo['user_id'];
- $courseInfo = api_get_course_info($courseCode);
- if (empty($courseInfo)) {
- return new soap_fault('Server', '', 'Course not found');
- }
- $cats = Category::load(null,
- null,
- $courseCode,
- null,
- null,
- $sessionId
- );
- /** @var Category $category */
- $category = isset($cats[0]) ? $cats[0] : null;
- $scorecourse_display = null;
- if (!empty($category)) {
- $categoryCourse = Category::load($category->get_id());
- $category = isset($categoryCourse[0]) ? $categoryCourse[0] : null;
- $allevals = $category->get_evaluations($userId, true);
- $alllinks = $category->get_links($userId, true);
- $allEvalsLinks = array_merge($allevals, $alllinks);
- $main_weight = $category->get_weight();
- $scoredisplay = ScoreDisplay::instance();
- $item_value_total = 0;
- /** @var AbstractLink $item */
- foreach ($allEvalsLinks as $item) {
- $item->set_session_id($sessionId);
- $item->set_course_code($courseCode);
- $score = $item->calc_score($userId);
- if (!empty($score)) {
- $divide = $score[1] == 0 ? 1 : $score[1];
- $item_value = $score[0] / $divide * $item->get_weight();
- $item_value_total += $item_value;
- }
- }
- $item_total = $main_weight;
- $total_score = [$item_value_total, $item_total];
- $score = $scoredisplay->display_score($total_score, SCORE_DIV_PERCENT);
- $score = strip_tags($score);
- return $score;
- }
- if (empty($category)) {
- return new soap_fault('Server', '', 'Gradebook category not found');
- }
- return new soap_fault('Server', '', 'Score not found');
- }
- $server->wsdl->addComplexType(
- 'WSLpProgressParams',
- 'complexType',
- 'struct',
- 'all',
- '',
- [
- 'course_code' => [
- 'name' => 'course_code',
- 'type' => 'xsd:string',
- ],
- 'session_id' => [
- 'name' => 'session_id',
- 'type' => 'xsd:string',
- ],
- 'lp_id' => [
- 'name' => 'lp_id',
- 'type' => 'xsd:string',
- ],
- 'email' => [
- 'name' => 'email',
- 'type' => 'xsd:string',
- ],
- 'secret_key' => ['name' => 'secret_key', 'type' => 'xsd:string'],
- ]
- );
- // Register the method to expose
- $server->register(
- 'WSGetLpProgress', // method name
- ['params' => 'tns:WSLpProgressParams'], // input parameters
- ['return' => 'xsd:string'], // output parameters
- 'urn:WSGradebook', // namespace
- 'urn:WSGradebook#WSGetLpProgress', // soapaction
- 'rpc', // style
- 'encoded'
- );
- /**
- * @param array $params
- *
- * @return int|string
- */
- function WSGetLpProgress($params)
- {
- if (!WSHelperVerifyKey($params)) {
- return return_error(WS_ERROR_SECRET_KEY);
- }
- $courseCode = $params['course_code'];
- $courseInfo = api_get_course_info($courseCode);
- if (empty($courseInfo)) {
- return new soap_fault('Server', '', 'Course not found');
- }
- $sessionId = (int) $params['session_id'];
- if (!empty($sessionId)) {
- $sessionInfo = api_get_session_info($sessionId);
- if (empty($sessionInfo)) {
- return new soap_fault('Server', '', 'Session not found');
- }
- }
- $email = $params['email'];
- $userInfo = api_get_user_info_from_email($email);
- $userId = $userInfo['user_id'];
- if (empty($userInfo)) {
- return new soap_fault('Server', '', 'User not found');
- }
- $lpId = $params['lp_id'];
- $lp = new learnpath($courseCode, $lpId, $userId);
- if (empty($lp)) {
- return new soap_fault('Server', '', 'LP not found');
- }
- return $lp->progress_db;
- }
- $server->wsdl->addComplexType(
- 'WSAssignSkillParams',
- 'complexType',
- 'struct',
- 'all',
- '',
- [
- 'skill_id' => [
- 'name' => 'skill_id',
- 'type' => 'xsd:string',
- ],
- 'level' => [
- 'name' => 'level',
- 'type' => 'xsd:string',
- ],
- 'justification' => [
- 'name' => 'justification',
- 'type' => 'xsd:string',
- ],
- 'email' => [
- 'name' => 'email',
- 'type' => 'xsd:string',
- ],
- 'author_email' => [
- 'name' => 'author_email',
- 'type' => 'xsd:string',
- ],
- 'secret_key' => ['name' => 'secret_key', 'type' => 'xsd:string'],
- ]
- );
- // Register the method to expose
- $server->register(
- 'WSAssignSkill', // method name
- ['params' => 'tns:WSAssignSkillParams'], // input parameters
- ['return' => 'xsd:string'], // output parameters
- 'urn:WSGradebook', // namespace
- 'urn:WSGradebook:WSAssignSkill', // soapaction
- 'rpc', // style
- 'encoded'
- );
- /**
- * @param array $params
- *
- * @return int|string
- */
- function WSAssignSkill($params)
- {
- if (!WSHelperVerifyKey($params)) {
- return return_error(WS_ERROR_SECRET_KEY);
- }
- $em = Database::getManager();
- $skillManager = new SkillManager();
- $skillId = isset($params['skill_id']) ? $params['skill_id'] : 0;
- $skillRepo = $em->getRepository('ChamiloCoreBundle:Skill');
- $skill = $skillRepo->find($skillId);
- if (empty($skill)) {
- return new soap_fault('Server', '', 'Skill not found');
- }
- $justification = $params['justification'];
- if (strlen($justification) < 10) {
- return new soap_fault('Server', '', 'Justification smaller than 10 chars');
- }
- $level = (int) $params['level'];
- $email = $params['email'];
- $userInfo = api_get_user_info_from_email($email);
- if (empty($userInfo)) {
- return new soap_fault('Server', '', 'User not found');
- }
- $email = $params['author_email'];
- $authorInfo = api_get_user_info_from_email($email);
- if (empty($authorInfo)) {
- return new soap_fault('Server', '', 'Author not found');
- }
- $userId = $userInfo['user_id'];
- $user = api_get_user_entity($userId);
- $skillUser = $skillManager->addSkillToUserBadge(
- $user,
- $skill,
- $level,
- $justification,
- $authorInfo['id']
- );
- if (!empty($skillUser)) {
- return 1;
- }
- return 0;
- }
- // 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);
|