Пример #1
0
 /**
  * performs a custom request
  *
  * @param string $method the request type (POST, DELETE, PUT, GET, ...) 
  * @param string $target the taget URL
  * @param string $header an array with header informations
  * @param string $content the request content/body
  *
  * @return an array with the request result (status, header, content)
  * - ['headers'] = an array of header informations e.g. ['headers']['Content-Type']
  * - ['content'] = the response content
  * - ['status'] = the status code e.g. 200,201,404,409,...
  */
 public static function custom($method, $target, $header, $content, $authbool = true, $sessiondelete = false)
 {
     $begin = microtime(true);
     $done = false;
     if (!CConfig::$onload && strpos($target, 'http://localhost/') === 0 && file_exists(dirname(__FILE__) . '/request_cconfig.json')) {
         if (self::$components === null) {
             self::$components = CConfig::loadStaticConfig('', '', dirname(__FILE__), 'request_cconfig.json');
         }
         $coms = self::$components->getLinks();
         if ($coms != null) {
             if (!is_array($coms)) {
                 $coms = array($coms);
             }
             $e = strlen(rtrim($_SERVER['DOCUMENT_ROOT'], '/'));
             $f = substr(str_replace("\\", "/", dirname(__FILE__)), $e);
             $g = substr(str_replace("\\", "/", $_SERVER['SCRIPT_FILENAME']), $e);
             $a = 0;
             for (; $a < strlen($g) && $a < strlen($f) && $f[$a] == $g[$a]; $a++) {
             }
             $h = substr(str_replace("\\", "/", $_SERVER['PHP_SELF']), 0, $a - 1);
             foreach ($coms as $com) {
                 if ($com->getPrefix() === null || $com->getLocalPath() == null || $com->getClassFile() == null || $com->getClassName() == null) {
                     Logger::Log('nodata: ' . $method . ' ' . $target, LogLevel::DEBUG, false, dirname(__FILE__) . '/../calls.log');
                     continue;
                 }
                 $url = 'http://localhost' . $h . '/' . $com->getLocalPath();
                 if (strpos($target, $url . '/') === 0) {
                     $result = array();
                     $tar = dirname(__FILE__) . '/../' . $com->getLocalPath() . '/' . $com->getClassFile();
                     $tar = str_replace("\\", "/", $tar);
                     if (!file_exists($tar)) {
                         continue;
                     }
                     $add = substr($target, strlen($url));
                     $sid = CacheManager::getNextSid();
                     CacheManager::getTree($sid, $target, $method);
                     $cachedData = CacheManager::getCachedDataByURL($sid, $target, $method);
                     if ($cachedData !== null) {
                         $result['content'] = $cachedData->content;
                         $result['status'] = $cachedData->status;
                         ///Logger::Log('out>> '.$method.' '.$target, LogLevel::DEBUG, false, dirname(__FILE__) . '/../calls.log');
                         CacheManager::cacheData($sid, $com->getTargetName(), $target, $result['content'], $result['status'], $method);
                     } else {
                         $args = array('REQUEST_METHOD' => $method, 'PATH_INFO' => $add, 'slim.input' => $content);
                         if (isset($_SERVER['HTTP_SESSION'])) {
                             $args['HTTP_SESSION'] = $_SERVER['HTTP_SESSION'];
                         }
                         if (isset($_SERVER['HTTP_USER'])) {
                             $args['HTTP_USER'] = $_SERVER['HTTP_USER'];
                         }
                         if ($authbool) {
                             if (isset($_SESSION['UID'])) {
                                 $args['HTTP_USER'] = $_SESSION['UID'];
                                 $_SERVER['HTTP_USER'] = $_SESSION['UID'];
                             }
                             if (isset($_SESSION['SESSION'])) {
                                 $args['HTTP_SESSION'] = $_SESSION['SESSION'];
                                 $_SERVER['HTTP_SESSION'] = $_SESSION['SESSION'];
                             }
                             if ($sessiondelete) {
                                 if (isset($_SERVER['REQUEST_TIME'])) {
                                     $args['HTTP_DATE'] = $_SERVER['REQUEST_TIME'];
                                     $_SERVER['HTTP_DATE'] = $_SERVER['REQUEST_TIME'];
                                 }
                             } else {
                                 if (isset($_SESSION['LASTACTIVE'])) {
                                     $args['HTTP_DATE'] = $_SESSION['LASTACTIVE'];
                                     $_SERVER['HTTP_DATE'] = $_SESSION['LASTACTIVE'];
                                 }
                             }
                         }
                         if (isset($_SERVER['HTTP_DATE'])) {
                             $args['HTTP_DATE'] = $_SERVER['HTTP_DATE'];
                         }
                         $oldArgs = array('REQUEST_METHOD' => \Slim\Environment::getInstance()->offsetGet('REQUEST_METHOD'), 'PATH_INFO' => \Slim\Environment::getInstance()->offsetGet('PATH_INFO'), 'slim.input' => \Slim\Environment::getInstance()->offsetGet('slim.input'), 'HTTP_DATE' => \Slim\Environment::getInstance()->offsetGet('HTTP_DATE'), 'HTTP_USER' => \Slim\Environment::getInstance()->offsetGet('HTTP_USER'), 'HTTP_SESSION' => \Slim\Environment::getInstance()->offsetGet('HTTP_SESSION'), 'REQUEST_TIME' => \Slim\Environment::getInstance()->offsetGet('REQUEST_TIME'));
                         $oldRequestURI = $_SERVER['REQUEST_URI'];
                         $oldScriptName = $_SERVER['SCRIPT_NAME'];
                         ///$oldRedirectURL = $_SERVER['REDIRECT_URL'];
                         ///echo "old: ".$_SERVER['REQUEST_URI']."\n";
                         $_SERVER['REQUEST_URI'] = substr($target, strlen('http://localhost/') - 1);
                         //$tar.$add;
                         ///$_SERVER['REDIRECT_URL']= substr($target,strlen('http://localhost/')-1);
                         ///echo "mein: ".substr($target,strlen('http://localhost/')-1)."\n";
                         $_SERVER['SCRIPT_NAME'] = $h . '/' . $com->getLocalPath() . '/' . $com->getClassFile();
                         //$tar;
                         $_SERVER['QUERY_STRING'] = '';
                         $_SERVER['REQUEST_METHOD'] = $method;
                         \Slim\Environment::mock($args);
                         include_once $tar;
                         $oldStatus = http_response_code();
                         $oldHeader = array_merge(array(), headers_list());
                         header_remove();
                         http_response_code(0);
                         $name = $com->getClassName();
                         try {
                             ob_start();
                             $obj = new $name();
                             if (isset($obj)) {
                                 unset($obj);
                             }
                             $result['content'] = ob_get_contents();
                             CacheManager::setETag($result['content']);
                             $result['headers'] = array_merge(array(), self::http_parse_headers_short(headers_list()));
                             header_remove();
                             if (!isset($result['headers']['Cachesid'])) {
                                 $newSid = CacheManager::getNextSid();
                                 $result['headers']['Cachesid'] = $newSid;
                             }
                             ob_end_clean();
                             //header_remove();
                             $result['status'] = http_response_code();
                         } catch (Exception $e) {
                             error_log($e->getMessage());
                             header_remove();
                             $result['status'] = '500';
                             $result['content'] = '';
                             $result['headers'] = array();
                         }
                         $_SERVER['REQUEST_URI'] = $oldRequestURI;
                         $_SERVER['SCRIPT_NAME'] = $oldScriptName;
                         //$_SERVER['REDIRECT_URL'] = $oldRedirectURL;
                         \Slim\Environment::mock($oldArgs);
                         $_SERVER['REQUEST_METHOD'] = $oldArgs['REQUEST_METHOD'];
                         http_response_code($oldStatus);
                         header('Content-Type: text/html; charset=utf-8');
                         foreach ($oldHeader as $head) {
                             header($head);
                         }
                         CacheManager::setCacheSid($sid);
                         $targetSid = isset($result['headers']['Cachesid']) ? $result['headers']['Cachesid'] : null;
                         CacheManager::addPath($sid, $targetSid, $com->getTargetName(), $target, $method, $result['status']);
                         CacheManager::finishRequest($targetSid, $h . '/' . $com->getLocalPath(), $com->getTargetName(), $target, $result['content'], $result['status'], $method, $content);
                         CacheManager::cacheData($sid, $com->getTargetName(), $target, $result['content'], $result['status'], $method);
                         ///Logger::Log('in<< '.$method.' '.$com->getClassName().$add, LogLevel::DEBUG, false, dirname(__FILE__) . '/../calls.log');
                     }
                     $done = true;
                     break;
                 }
             }
         }
     }
     if (!$done) {
         // creates a custom request
         Logger::Log("--" . $method . ' ' . $target, LogLevel::DEBUG, false, dirname(__FILE__) . '/../calls.log');
         $ch = Request_CreateRequest::createCustom($method, $target, $header, $content, $authbool, $sessiondelete)->get();
         $content = curl_exec($ch);
         // get the request result
         $result = curl_getinfo($ch);
         $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
         // splits the received header info, to create an entry
         // in the $result['headers'] for each part of the header
         $result['headers'] = self::http_parse_headers(substr($content, 0, $header_size));
         // seperates the content part
         $result['content'] = substr($content, $header_size);
         // sets the received status code
         $result['status'] = curl_getinfo($ch, CURLINFO_HTTP_CODE);
         curl_close($ch);
     }
     Logger::Log($target . ' ' . round(microtime(true) - $begin, 2) . 's', LogLevel::DEBUG, false, dirname(__FILE__) . '/../executionTime.log');
     return $result;
 }
Пример #2
0
 /**
  * creates an DELETE curl request object 
  *
  * @param $target the taget URL
  * @param $header an array with header informations
  * @param $content the request content/body
  *
  * @return an curl request object 
  */
 public static function createDelete($target, $header, $content, $authbool = true, $sessiondelete = false)
 {
     return Request_CreateRequest::createCustom("DELETE", $target, $header, $content, $authbool, $sessiondelete);
 }
Пример #3
0
 public function getZip($userid, $sheetid, $status = null)
 {
     $multiRequestHandle = new Request_MultiRequest();
     $filesList = array();
     //request to database to get the markings
     $handler = Request_CreateRequest::createCustom('GET', $this->_getMarking[0]->getAddress() . '/marking/exercisesheet/' . $sheetid . '/tutor/' . $userid, array(), "");
     $multiRequestHandle->addRequest($handler);
     $answer = $multiRequestHandle->run();
     if (count($answer) < 1 || !isset($answer[0]['status']) || $answer[0]['status'] != 200 || !isset($answer[0]['content'])) {
         $this->app->response->setStatus(404);
         $this->app->response->setBody('');
         $this->app->stop();
     }
     $markings = json_decode($answer[0]['content'], true);
     if (isset($status)) {
         $marks = array();
         foreach ($markings as $marking) {
             if (isset($marking['status']) && $marking['status'] == $status) {
                 $marks[] = $marking;
             }
         }
         $markings = $marks;
     }
     $answer = $this->generateTutorArchive($userid, $sheetid, $markings);
     $this->app->response->setStatus($answer['status']);
     $this->app->response->setBody($answer['content']);
 }
Пример #4
0
    }
    $fileString = json_encode($files);
    $zipfile = http_post_data($filesystemURI . '/zip', $fileString, true);
    $zipfile = File::decodeFile($zipfile);
    $zipfile->setDisplayName('attachments.zip');
    $zipfile = File::encodeFile($zipfile);
    echo $zipfile;
    exit(0);
} elseif (isset($_GET['downloadMarkings'])) {
    checkPermission(PRIVILEGE_LEVEL::STUDENT);
    $sid = $_GET['downloadMarkings'];
    $multiRequestHandle = new Request_MultiRequest();
    //request to database to get the markings
    $handler = Request_CreateRequest::createCustom('GET', "{$logicURI}/DB/marking/exercisesheet/{$sid}/user/{$uid}", array(), '');
    $multiRequestHandle->addRequest($handler);
    $handler = Request_CreateRequest::createCustom('GET', "{$logicURI}/DB/exercisesheet/exercisesheet/{$sid}/exercise", array(), '');
    $multiRequestHandle->addRequest($handler);
    $answer = $multiRequestHandle->run();
    $markings = json_decode($answer[0]['content'], true);
    $sheet = json_decode($answer[1]['content'], true);
    $exercises = $sheet['exercises'];
    //an array to descripe the subtasks
    $alphabet = range('a', 'z');
    $count = 0;
    $namesOfExercises = array();
    $attachments = array();
    $count = null;
    foreach ($exercises as $key => $exercise) {
        $exerciseId = $exercise['id'];
        if (isset($exercise['attachments'])) {
            $attachments[$exerciseId] = $exercise['attachments'];
Пример #5
0
 /**
  * Compiles data for the Condition site.
  *
  * @warning If there is more than one condition assigned to the same
  * exercise type it is undefined which condition will be evaluated. This
  * might even change per user!.
  *
  * @author Florian Lücke
  */
 public function checkCondition($userid, $courseid)
 {
     // load all the data
     $multiRequestHandle = new Request_MultiRequest();
     $URL = $this->_getExerciseType->getAddress() . '/exercisetype';
     $handler = Request_CreateRequest::createCustom('GET', $URL, array(), '');
     $multiRequestHandle->addRequest($handler);
     $URL = $this->_getExercise->getAddress() . '/exercise/course/' . $courseid . '/nosubmission';
     $handler = Request_CreateRequest::createCustom('GET', $URL, array(), '');
     $multiRequestHandle->addRequest($handler);
     $URL = $this->_getApprovalCondition->getAddress() . '/approvalcondition/course/' . $courseid;
     $handler = Request_CreateRequest::createCustom('GET', $URL, array(), '');
     $multiRequestHandle->addRequest($handler);
     $URL = $this->_getUser->getAddress() . '/user/course/' . $courseid . '/status/0';
     $handler = Request_CreateRequest::createCustom('GET', $URL, array(), '');
     $multiRequestHandle->addRequest($handler);
     $URL = $this->_getGroup->getAddress() . '/group/course/' . $courseid;
     $handler = Request_CreateRequest::createGet($URL, array(), '');
     $multiRequestHandle->addRequest($handler);
     $answer = $multiRequestHandle->run();
     $possibleExerciseTypes = json_decode($answer[0]['content'], true);
     $exercises = json_decode($answer[1]['content'], true);
     $approvalconditions = json_decode($answer[2]['content'], true);
     $students = json_decode($answer[3]['content'], true);
     $groups = json_decode($answer[4]['content'], true);
     // preprocess the data to make it quicker to get specific values
     $exerciseTypes = array();
     foreach ($possibleExerciseTypes as $exerciseType) {
         $exerciseTypes[$exerciseType['id']] = $exerciseType;
     }
     $exercisesById = array();
     foreach ($exercises as $exercise) {
         $exercisesById[$exercise['id']] = $exercise;
     }
     $exercisesByType = array();
     foreach ($exercises as $exercise) {
         if (!isset($exercisesByType[$exercise['type']])) {
             $exercisesByType[$exercise['type']] = array();
         }
         unset($exercise['submissions']);
         $exercisesByType[$exercise['type']][] = $exercise;
     }
     // calculate the maximum number of points that a user could get
     // for each exercise type
     $maxPointsByType = array();
     foreach ($exercisesByType as $type => $exercises) {
         $maxPointsByType[$type] = array_reduce($exercises, function ($value, $exercise) {
             if ($exercise['bonus'] == null || $exercise['bonus'] == '0') {
                 // only count the
                 $value += $exercise['maxPoints'];
             }
             return $value;
         }, 0);
     }
     $approvalconditionsByType = array();
     foreach ($approvalconditions as &$condition) {
         // add the name of the exercise type to the approvalcondition
         $typeID = $condition['exerciseTypeId'];
         $condition['exerciseType'] = $exerciseTypes[$typeID]['name'];
         // prepare percenteages for the UI
         $condition['minimumPercentage'] = $condition['percentage'] * 100;
         $condition['approvalConditionId'] = $condition['id'];
         unset($condition['id']);
         // sort approvalconditions by exercise type
         /**
          * @warning this implies that there is *only one* approval
          * condition per exercise type!
          */
         $exerciseTypeID = $condition['exerciseTypeId'];
         if (isset($maxPointsByType[$exerciseTypeID])) {
             $condition['maxPoints'] = $maxPointsByType[$exerciseTypeID];
         } else {
             $condition['maxPoints'] = 0;
         }
         $approvalconditionsByType[$exerciseTypeID] = $condition;
     }
     // get all markings
     $allMarkings = array();
     $URL = $this->_getMarking->getAddress() . '/marking/course/' . $courseid;
     $answer = Request::custom('GET', $URL, array(), '');
     $markings = json_decode($answer['content'], true);
     foreach ($markings as $marking) {
         if (isset($marking['submission']['selectedForGroup']) && $marking['submission']['selectedForGroup'] == 1) {
             $allMarkings[] = $marking;
         }
     }
     unset($markings);
     $allGroups = array();
     foreach ($groups as $group) {
         if (!isset($allGroups[$group['sheetId']])) {
             $allGroups[$group['sheetId']] = array();
         }
         $allGroups[$group['sheetId']][$group['leader']['id']] = $group;
     }
     unset($groups);
     // done preprocessing
     // actual computation starts here
     // add up points that each student reached in a specific exercise type
     $studentMarkings = array();
     foreach ($allMarkings as $marking) {
         $studentID = $marking['submission']['studentId'];
         $leaderID = $marking['submission']['leaderId'];
         if (!isset($studentMarkings[$studentID])) {
             $studentMarkings[$studentID] = array();
         }
         if (!isset($marking['submission']['accepted']) || $marking['submission']['accepted'] == 0) {
             continue;
         }
         $exerciseID = $marking['submission']['exerciseId'];
         $sheetID = $marking['submission']['exerciseSheetId'];
         $exerciseType = $exercisesById[$exerciseID]['type'];
         if (!isset($studentMarkings[$studentID][$exerciseType])) {
             $studentMarkings[$studentID][$exerciseType] = 0;
         }
         $studentMarkings[$leaderID][$exerciseType] += isset($marking['points']) ? $marking['points'] : 0;
         if (isset($allGroups[$sheetID][$leaderID])) {
             $group = $allGroups[$sheetID][$leaderID];
             if (isset($group['members'])) {
                 foreach ($group['members'] as $member) {
                     if (!isset($studentMarkings[$member['id']])) {
                         $studentMarkings[$member['id']] = array();
                     }
                     if (!isset($studentMarkings[$member['id']][$exerciseType])) {
                         $studentMarkings[$member['id']][$exerciseType] = 0;
                     }
                     $studentMarkings[$member['id']][$exerciseType] += isset($marking['points']) ? $marking['points'] : 0;
                 }
             }
         }
     }
     $resultStudents = array();
     foreach ($students as $student) {
         if (!isset($student['id'])) {
             continue;
         }
         if (isset($student['courses'])) {
             unset($student['courses']);
         }
         if (isset($student['attachments'])) {
             unset($student['attachments']);
         }
         $student['percentages'] = array();
         $allApproved = true;
         // iteraterate over all conditions, this will also filter out the
         // exercisetypes that are not needed for this course
         foreach ($approvalconditionsByType as $typeID => $condition) {
             $thisPercentage = array();
             $thisPercentage['exerciseTypeID'] = $typeID;
             $thisPercentage['exerciseType'] = $exerciseTypes[$typeID]['name'];
             // check if it was possible to get points for this exercisetype
             if (!isset($maxPointsByType[$typeID])) {
                 Logger::Log("Unmatchable condition: " . $condition['approvalConditionId'] . "in course: " . $courseid, LogLevel::WARNING);
                 $maxPointsByType[$typeID] = 0;
             }
             if ($maxPointsByType[$typeID] == 0) {
                 $thisPercentage['percentage'] = '100';
                 $thisPercentage['isApproved'] = true;
                 $thisPercentage['maxPoints'] = 0;
                 if (isset($student['id']) && isset($studentMarkings[$student['id']]) && isset($studentMarkings[$student['id']][$typeID])) {
                     $points = $studentMarkings[$student['id']][$typeID];
                     $thisPercentage['points'] = $points;
                 } elseif (isset($student['id'])) {
                     $thisPercentage['points'] = 0;
                 }
             } else {
                 // check if there are points for this
                 // student-exerciseType combination
                 if (isset($student['id']) && isset($studentMarkings[$student['id']]) && isset($studentMarkings[$student['id']][$typeID])) {
                     // the user has points for this exercise type
                     $points = $studentMarkings[$student['id']][$typeID];
                     $maxPoints = $maxPointsByType[$typeID];
                     $percentage = $points / $maxPoints;
                     $percentageNeeded = $condition['percentage'];
                     $thisPercentage['points'] = $points;
                     $thisPercentage['maxPoints'] = $maxPoints;
                     $typeApproved = $percentage >= $percentageNeeded;
                     $allApproved = $allApproved && $typeApproved;
                     $thisPercentage['isApproved'] = $typeApproved;
                     $thisPercentage['percentage'] = round($percentage * 100, 2);
                 } elseif (isset($student['id'])) {
                     // there are no points for the user for this
                     // exercise type
                     $thisPercentage['percentage'] = 0;
                     $thisPercentage['points'] = 0;
                     $maxPoints = $maxPointsByType[$typeID];
                     $thisPercentage['maxPoints'] = $maxPoints;
                     $typeApproved = $maxPoints == 0;
                     $thisPercentage['isApproved'] = $typeApproved;
                     $allApproved = $allApproved && $typeApproved;
                 }
             }
             $student['percentages'][] = $thisPercentage;
         }
         $student['isApproved'] = $allApproved;
         $resultStudents[] = $student;
     }
     $students = $resultStudents;
     $this->flag = 1;
     $response['user'] = $this->userWithCourse($userid, $courseid);
     if (isset($students)) {
         $response['users'] = $students;
     }
     $response['minimumPercentages'] = array_values($approvalconditionsByType);
     $this->app->response->setBody(json_encode($response));
 }