/** * adds a test-type node to database * * @access public * * @param $data - an associative array containing all the node's data * * @return an error if something goes wrong or true * */ public function test_addNode($data) { $db =& $this->getConnection(); if (self::isError($db)) { return $db; } //validazione campi $d = array('id_corso', 'id_posizione', 'id_utente', 'id_istanza', 'nome', 'titolo', 'consegna', 'testo', 'tipo', 'data_creazione', 'ordine', 'id_nodo_parent', 'id_nodo_radice', 'id_nodo_riferimento', 'livello', 'versione', 'n_contatti', 'icona', 'colore_didascalia', 'colore_sfondo', 'correttezza', 'copyright', 'didascalia', 'durata', 'titolo_dragdrop'); foreach ($data as $k => $v) { if (!in_array($k, $d)) { unset($data[$k]); } } $data['data_creazione'] = time(); //fine validazione campi $keys = array_keys($data); $array_values = array_values($data); $placeholders = array_fill(0, count($data), '?'); $sql = "INSERT INTO `" . self::$PREFIX . "nodes` (" . implode(',', $keys) . ") VALUES (" . implode(",", $placeholders) . ")"; ADALogger::log_db("trying inserting the test node: " . $sql); $res = $this->queryPrepared($sql, $array_values); // if an error is detected, an error is created and reported if (self::isError($res)) { return new AMA_Error($this->errorMessage(AMA_ERR_ADD) . " while in test_addNode." . AMA_SEP . ": " . $res->getMessage()); } return $db->lastInsertID(); }
/** * Remove a tutor from the DB * * @access public * * @param $id the unique id of the tutor * * @return an AMA_Error object if something goes wrong, true on success * */ public function remove_tutor($id) { $db =& $this->getConnection(); if (AMA_DB::isError($db)) { return $db; } $sql = "delete from tutor where id_utente_tutor={$id}"; ADALogger::log_db($sql); $res = $this->executeCritical($sql); if (AMA_DB::isError($res)) { // $res is ana AMA_Error object return $res; } $sql = "delete from utente where id_utente={$id}"; $res = $this->executeCritical($sql); if (AMA_DB::isError($res)) { // $res is ana AMA_Error object return $res; } return true; }
/** * * @return unknown_type */ function session_controlFN($neededObjAr = array(), $allowedUsersAr = array(), $trackPageToNavigationHistory = true) { //ADALogger::log('session control FN'); if (!session_start()) { /* * As of PHP 5.3.0 if session fails to star for some reason, * FALSE is returned. */ ADALogger::log('session failed to start'); } /** * giorgio 11/ago/2013 * if it's not multiprovider and we're asking for index page, * sets the selected provider by detecting it from the filename that's executing */ if (!MULTIPROVIDER) { list($client) = explode('.', preg_replace('/(http[s]?:\\/\\/)/', '', $_SERVER['SERVER_NAME'])); if (isset($client) && !empty($client) && is_dir(ROOT_DIR . '/clients/' . $client)) { // $_SESSION['sess_user_provider'] = $client; $GLOBALS['user_provider'] = $client; // other session vars per provider may go here... } else { unset($GLOBALS['user_provider']); } // if (isset($_SESSION['sess_user_provider']) && !empty($_SESSION['sess_user_provider'])) // $GLOBALS['user_provider'] = $_SESSION['sess_user_provider']; // if it's not set and its value is not equal to the new passed one, set a cookie that shall expire in one year // if (isset($GLOBALS['user_provider']) && $_COOKIE['ada_provider']!=$GLOBALS['ada_provider']) // setcookie('ada_provider',$GLOBALS['user_provider'],+time()+ 86400 *365 ,'/'); } // end if !MULTIPROVIDER /* * Navigation history */ require_once ROOT_DIR . '/include/navigation_history.inc.php'; $debug_backtrace = debug_backtrace(); $level = sizeof($debug_backtrace) - 1; /** * giorgio 06/set/2013 * detect mobile device feature */ if (!isset($_SESSION['mobile-detect'])) { $_SESSION['mobile-detect'] = new Mobile_Detect(); } /** * @author giorgio 10/nov/2014 * * sets the IE-version session variable to a float holding * the IE version or false if non-IE or IE version >= 11.0 */ if (isset($_SESSION['mobile-detect']) && !isset($_SESSION['IE-version'])) { $isIE = $_SESSION['mobile-detect']->version('IE'); if ($isIE !== false && is_numeric($isIE)) { $_SESSION['IE-version'] = floatval($isIE); } else { $_SESSION['IE-version'] = false; } } if ($trackPageToNavigationHistory) { $caller_file = $debug_backtrace[$level]['file']; if (!isset($_SESSION['sess_navigation_history'])) { $navigation_history = new NavigationHistory(NAVIGATION_HISTORY_SIZE); $navigation_history->addItem($caller_file); $_SESSION['sess_navigation_history'] = $navigation_history; } else { $navigation_history = $_SESSION['sess_navigation_history']; $navigation_history->addItem($caller_file); $_SESSION['sess_navigation_history'] = $navigation_history; } } $GLOBALS['sess_id'] = session_id(); $parm_errorHa = parameter_controlFN($neededObjAr, $allowedUsersAr); //var_dump($parm_errorHa); if ($parm_errorHa['session']) { } if ($parm_errorHa['user']) { // FIXME: passare messaggio di errore $errObj = new ADA_Error(NULL, NULL, NULL, ADA_ERROR_ID_USER_REQUIRED_BUT_NOT_FOUND, ADA_ERROR_SEVERITY_FATAL, 'index.php'); } /* * URL a cui redirezionare l'utente in caso di errore su corso, istanza_corso, nodo */ $sess_userObj = $_SESSION['sess_userObj']; if ($sess_userObj instanceof ADAGenericUser) { $redirectTo = $sess_userObj->getHomePage(); } else { $redirectTo = 'index.php'; } if ($parm_errorHa['course']) { /** * If parameter_controlFN has put an array in the 'course' key * this means that the user is asking for a node that belongs to * a course for which the user is subscribed to more than one instance. * * The list of the insance id is passed in the 'course key as an * array and must be passed to the browsing/select_instance script * that is responsible for asking the user to select an instance. */ if (is_array($parm_errorHa['course'])) { $errObj = new ADA_Error(NULL, NULL, NULL, ADA_ERROR_ID_CINST_REQUIRED_BUT_NOT_FOUND, ADA_ERROR_SEVERITY_FATAL, 'browsing/select_instance.php?node=' . $parm_errorHa['node'] . '&instances=' . urlencode(implode(',', $parm_errorHa['course']))); } else { // FIXME: passare messaggio di errore $errObj = new ADA_Error(NULL, NULL, NULL, ADA_ERROR_ID_SERVICE_REQUIRED_BUT_NOT_FOUND, ADA_ERROR_SEVERITY_FATAL, $redirectTo); } } if ($parm_errorHa['course_instance']) { // FIXME: passare messaggio di errore // TODO: forse il controllo su ADAGuest in questo if puo' essere rimosso, // dato che non settiamo $parm_errorHa['coutrse_instance'] nel caso in cui // l'utente e' sul tester pubblico (ADAGuest e' solo sul tester pubblico) if (!$sess_userObj instanceof ADAAuthor && !$sess_userObj instanceof ADAGuest) { $errObj = new ADA_Error(NULL, NULL, NULL, ADA_ERROR_ID_CINST_REQUIRED_BUT_NOT_FOUND, ADA_ERROR_SEVERITY_FATAL, $redirectTo); } } if ($parm_errorHa['node']) { // FIXME: passare messaggio di errore $errObj = new ADA_Error(NULL, NULL, NULL, ADA_ERROR_ID_NODE_REQUIRED_BUT_NOT_FOUND, ADA_ERROR_SEVERITY_FATAL, $redirectTo); } if ($parm_errorHa['guest_user_not_allowed']) { // FIXME: passare messaggio di errore $errObj = new ADA_Error(NULL, NULL, NULL, ADA_ERROR_ID_CINST_NOT_PUBLIC, ADA_ERROR_SEVERITY_FATAL, $redirectTo); } // FIXME: controllare su livello utente? // if($parm_errorHa['user_level']) { // } $GLOBALS['sess_id_user'] = isset($_SESSION['sess_id_user']) ? $_SESSION['sess_id_user'] : null; $GLOBALS['sess_id_user_type'] = isset($_SESSION['sess_id_user_type']) ? $_SESSION['sess_id_user_type'] : null; $GLOBALS['sess_user_level'] = isset($_SESSION['sess_user_level']) ? $_SESSION['sess_user_level'] : null; $GLOBALS['sess_id_course'] = isset($_SESSION['sess_id_course']) ? $_SESSION['sess_id_course'] : null; $GLOBALS['sess_id_course_instance'] = isset($_SESSION['sess_id_course_instance']) ? $_SESSION['sess_id_course_instance'] : null; $GLOBALS['sess_id_node'] = isset($_SESSION['sess_id_node']) ? $_SESSION['sess_id_node'] : null; $GLOBALS['sess_selected_tester'] = isset($_SESSION['sess_selected_tester']) ? $_SESSION['sess_selected_tester'] : null; $GLOBALS['sess_user_language'] = isset($_SESSION['sess_user_language']) ? $_SESSION['sess_user_language'] : null; }
/** * get all services * @param $field_list_ar array * @param $clause string * @return $servicesAr array */ public static function find_services_list($field_list_ar, $clause, $for_registration = FALSE, $max_level = 4, $min_level = 1) { /*NOTE: old version was restricted to user's tester and required $userObj as parameter: static public function find_services_list(ADAGenericUser $userObj,$field_list_ar,$clause) { Also, it got $user_id from it: $user_id = $userObj->getId(); */ /* * if ($userObj){ etc $user_id = $userObj->getId(); ) */ $to_sub_course_dataHa = array(); $course_instances = array(); $common_dh = $GLOBALS['common_dh']; $testers_list = $common_dh->get_all_testers(); /* * Obtain services data from testers */ foreach ($testers_list as $testerAr) { //$tester = $testerAr[0]; $tester = $testerAr['puntatore']; ADALogger::log("MultiPort::find_services_list for tester: {$tester}"); $tester_dsn = self::getDSN($tester); //if(($tester_dsn != null) && ($tester!=ADA_PUBLIC_TESTER)) { if ($tester_dsn != null) { // FIXME: deve escludere i PUBLIC o, no? // $tester_dataHa = $common_dh->get_tester_info_from_pointer($tester); if (AMA_DataHandler::isError($tester_dataHa)) { // FIXME: rimuovere e gestire con ADA_Error } // $tester_name = $tester_dataHa[1]; $tester_dh = AMA_DataHandler::instance($tester_dsn); // FIXME: questa versione prende le implementazioni dei servizi, non i servizi !!!!! $all_instance = $tester_dh->find_courses_list($field_list_ar, $clause); if (AMA_DataHandler::isError($all_instance)) { // FIXME: rimuovere e gestire con ADA_Error } if (is_array($all_instance)) { foreach ($all_instance as $one_instance) { $id_course = $one_instance[0]; $course_instances[$id_course] = $one_instance; } } } } // foreach tester /* * Obtain services level from common db */ $services_info = array(); foreach ($course_instances as $id_course => $course_data) { $service_info = $common_dh->get_service_info_from_course($id_course); $tester_info = $common_dh->get_tester_info_from_id_course($id_course); // FIXME /* * Se non siamo riusciti ad ottenere informazioni sul servizio o sul tester * a partire da un corso, possiamo assumere che questo servizio non venga erogato * e quindi non lo mostriamo tra quelli a cui l'utente puo' fare richiesta * di iscrizione. */ if ($service_info == NULL || AMA_Common_DataHandler::isError($tester_info)) { continue; } $tester_name = $tester_info['nome']; $titolo = $course_data[2]; $servizio = $service_info[1]; $descrizione = $course_data[5]; if (AMA_DataHandler::isError($service_info)) { // echo 'get service info from course <br />'; continue; } else { $livello = $service_info[3]; if ($livello <= $max_level and $livello >= $min_level) { if ($livello > 1) { if ($for_registration) { if ($id_course == $_REQUEST['id_course']) { $require_link = "<input type=\"radio\" name=\"id_course\" value={$id_course} checked=\"checked\"'>"; } else { $require_link = "<input type=\"radio\" name=\"id_course\" value={$id_course}>"; } } else { $require_link = "<a href=" . HTTP_ROOT_DIR . "/browsing/registration.php?id_course={$id_course}>" . translateFN('Richiedi') . "</a>"; } // we want subscribe only to services with level>1 $info_link = "<a href=" . HTTP_ROOT_DIR . "/info.php?id_course={$id_course}>" . translateFN('Info') . "</a>"; $img_link = "<img src=\"img/title.png\" border=0> " . translateFN('Servizio'); $row = array(translateFN('Provider') => $tester_name, translateFN('Servizio') => $servizio, translateFN('Livello') => $livello, translateFN('Info') => $info_link, translateFN('Richiedi') => $require_link); array_push($to_sub_course_dataHa, $row); } else { // public access service, level = 1 $id_node = $id_course . '_' . ADA_DEFAULT_NODE; $require_link = '<a href="' . HTTP_ROOT_DIR . '/browsing/view.php?id_course=' . $id_course . '&id_node=' . $id_node . '">' . translateFN('Entra') . '</a>'; $info_link = "<a href=" . HTTP_ROOT_DIR . "/info.php?id_course={$id_course}>" . translateFN('Info') . "</a>"; $img_link = "<img src=\"img/title.png\" border=0> " . translateFN('Servizio'); $row = array(translateFN('Provider') => $tester_name, translateFN('Servizio') => $servizio, translateFN('Livello') => $livello, translateFN('Info') => $info_link, translateFN('Richiedi') => $require_link); array_push($to_sub_course_dataHa, $row); } } } } // sorting on: // provider, then service, then level foreach ($to_sub_course_dataHa as $key => $row) { $provider[$key] = $row[translateFN('Provider')]; $servizio[$key] = $row[translateFN('Servizio')]; $livello[$key] = $row[translateFN('Livello')]; } array_multisort($provider, SORT_DESC, $livello, SORT_DESC, $servizio, SORT_DESC, $to_sub_course_dataHa); return $to_sub_course_dataHa; }
/** * Handle this error * * @return void */ public function handleError() { $action = $this->getAction(); /** * Non chiamare translateFN sul messaggio di errore. */ /** * Error logging */ if ($action & ADA_ERROR_LOG_TO_FILE) { ADALogger::log('ADA ERROR LOG TO FILE'); ADAFileLogger::log_error($this->asTextToLogInFile()); } if ($action & ADA_ERROR_LOG_TO_HTML_COMMENT) { ADALogger::log('ADA ERROR LOG TO HTML COMMENT'); } if ($action & ADA_ERROR_LOG_TO_HTML) { ADAScreenLogger::log_error($this->asTextToLogInHTML()); } if ($action & ADA_ERROR_LOG_TO_EMAIL) { ADALogger::log('ADA ERROR LOG TO EMAIL'); // TODO: log via email /* * Richiamare classe mailer per il log, passando come contenuto * $this->asTextToLogInFile() */ } if ($action & ADA_ERROR_LOG_TO_DB) { ADALogger::log('ADA ERROR LOG TO DB'); // TODO: log su database /* * Richiamare classe MultiPort per il log su tabella DB passando * come argomento $this->asArrayToLogInDB() */ } /** * Redirect user */ if (is_null($this->redirectTo)) { if ($action & ADA_ERROR_REDIRECT_TO_LOGIN) { // FIXME: login location == index? header('Location:' . HTTP_ROOT_DIR); exit; } if ($action & ADA_ERROR_REDIRECT_TO_HOMEPAGE) { $sess_userObj = $_SESSION['sess_userObj']; if ($sess_userObj instanceof ADALoggableUser) { header('Location:' . $sess_userObj->getHomePage()); exit; } else { header('Location:' . HTTP_ROOT_DIR); exit; } } if ($action & ADA_ERROR_REDIRECT_TO_ERROR_PAGE) { header('Location:' . HTTP_ROOT_DIR . '/error.php'); exit; } } else { /* * Controlliamo se il programmatore ha specificato un indirizzo commpleto * contenente HTTP_ROOT_DIR, altrimenti lo appende. */ if (strncmp(HTTP_ROOT_DIR, $this->redirectTo, sizeof(HTTP_ROOT_DIR)) == 0) { header('Location: ' . $this->redirectTo); exit; } header('Location:' . HTTP_ROOT_DIR . '/' . $this->redirectTo); exit; } }
/** * Method for handling thrown exceptions all in the same way. * For time being, simply logs the exception and returns it. * * @author giorgio 31/mag/2013 * * @param PDOException $e the PDOException to be handled * @return PDOException the passed PDOException * * @access private */ private static function handleException(PDOException $e) { /** * Probably log the error somewhere and return it in the connection_object itself */ ADALogger::log_db("[PDOException] : " . $e->getFile() . ":" . $e->getLine() . " - " . $e->getMessage()); return $e; }