function parrainer() { if (!$this->session->islogged()) { $this->redirect("?membre/login"); } $erreurs = array(); $notifications = array(); $soumis = $this->request->data ? $this->request->data : null; $form = array('mail' => ''); if (Session::getToken('parrainage') === false) { Session::addToken(array('name' => 'parrainage', 'limit_time' => 10 * 60, 'time' => time())); } $token = Session::getToken('parrainage'); if ($soumis) { // à ce niveau, le formulaire a été envoyé. /* Si la requete provient d'un autre site ou n'a pas de http_referer (a été directement écrite dans l'url) * on la rejette illico */ //on rejette les requetes extérieures ou tapées dans l'url ou par un autre moyen que post if ($this->request->is('no-origin') || !Session::isValidToken('parrainage')) { $message = conf::DEBUG ? 'Erreur [MEM ' . __LINE__ . '] : La requête a échouée. Veuillez réactualiser la page.' : 'Le jeton CRSF a expiré. Veuillez réactualiser la page.'; $this->error($message); return false; } //on vérifie aussi que le token enregistré et celui envoyé sont les mêmes if ($token['value'] !== $soumis['token']) { $this->redirect('?membre/parrainer/'); } if (empty($erreurs)) { $_SESSION['saveform'] = $soumis; unset($soumis); $this->redirect('?membre/parrainer/'); } } if (isset($_SESSION['saveform'])) { $soumis = $_SESSION['saveform']; unset($_SESSION['saveform']); if (!Session::isValidToken('parrainage')) { $this->error("Le temps de soumission est dépassé. Veuillez recharger la page."); return false; } $form = array('mail' => PregFucntions::sanitize_string($soumis['mail'])); //on s'assure que le mail est inexistant dans la table des membres $find = $this->membre->find(array('conditions' => 'mem_mail = ' . $form['mail'], 'fecthMethod' => PDO::FETCH_ASSOC)); if ($find) { $erreurs[] = "Le mail est déjà utilisé."; } if (!(substr($form['mail'], strrpos($form['mail'], '@')) === '@eleves.ec-nantes.fr')) { $erreurs[] = "Vous n'êtes pas de l'école Centrale. Il vous faut un mail du type xxx@eleves.ec-nantes.fr"; } if (empty($erreurs)) { // ajout à la table parrainage $token_de_validation = Session::genereToken(); $this->membre->add(array('tables' => ' parrainage ', 'values' => " " . Functions::squote($_SESSION['membre']['mem_id']) . ",'-1'" . "," . Functions::squote($form['mail']) . "," . "NOW()" . ",'0'" . "," . Functions::squote($token_de_validation))); //Envoyer le mail au fillot if ($this->mail(array('config' => 'nacder.net', 'destinataire' => $form['mail'], 'expediteur' => Conf::$mail['default']['no-reply'], 'aliasExpediteur' => constant('site_i_name'), 'objet' => "[" . constant('site_i_name') . "] - Confirmez votre parrainage", 'message' => Mail::_messageParrainage(array('parrain_login' => $_SESSION['membre']['mem_login'], 'parrain_mail' => $_SESSION['membre']['mem_mail'], 'fillot_mail' => $form['mail'], 'mem_token' => $token_de_validation, 'logo' => Conf::$mail['default']['logo']))))) { $notifications[] = "Votre requête a été transmise."; } else { $erreurs[] = "La requête n'a pas pu être envoyée à l'adresse donnée."; } } Session::addToken(array('name' => 'parrainage', 'limit_time' => 10 * 60, 'time' => time())); } $variables['soumis'] = $soumis; $variables['erreurs'] = $erreurs; $variables['notifications'] = $notifications; $form['token'] = $token['value']; $variables['form'] = $form; $this->myrender(array('menu' => 'menu', 'title' => 'Espace Parrainage', 'view' => 'parrainage', 'variables' => $variables)); }
function load($age, $eix, $ue, $dir = null, $paramtoken = null) { if (!$this->session->islogged()) { $this->redirect("?membre/login"); } if (!isset($paramtoken)) { $message = "Vous tentez d'accéder à un répertoire inexistant."; $this->error($message); exit; } $dir = urldecode(str_replace('~', '/', $dir)); $path = $age == 'a' ? 'filesOld' : 'files'; //a ancien $path .= strtolower(DS . 'ei' . $eix . DS . $ue . DS . (!empty($dir) ? $dir != 'dir' ? $dir . DS : '' : '')); //$file = BASE_URL.DS.$path.Session::getReverseToken($paramtoken); if ($age == 'a') { $token = Session::getReverseToken($paramtoken); $filename = $token; } elseif ($age == 'n') { $get = $this->document->findFirst(array('conditions' => " doc_code = " . Functions::squote($paramtoken))); $path = $get->doc_path; $filename = $get->doc_name; } $file = '..' . DS . $path . $filename; if (file_exists($file)) { $size = filesize($file); $erreurs = $this->force_telechargement(array('filename' => $filename, 'type' => 'application/octet-stream', 'size' => $size, 'dir' => $path, 'complete_name' => $file)); if ($erreurs[0] && $age == 'a') { Session::delToken($token); Session::addToken($token); $tmpFile = $this->document->findFirst(array('tables' => " openu_oldfiles ", 'conditions' => " path LIKE '%" . $file . "%'", 'fecthMethod' => PDO::FETCH_ASSOC)); // enregistrement du nombre de téléchargement if (!empty($tmpFile)) { $this->document->upDate(array('tables' => " openu_oldfiles ", 'affectations' => "hits = hits+1", 'conditions' => " path LIKE '%" . $file . "%'", 'fecthMethod' => PDO::FETCH_ASSOC)); } /** Enregistrement de l'activité sur les OldFiles */ //l'activité est créée automatiquement à la connexion $this->document->upDate(array('tables' => 'activite_membre', 'affectations' => "nb_down = nb_down+1", 'conditions' => ' id_user = '******'membre']['mem_id'])); } else { $this->error($erreurs[1]); return false; } } $list = Script::_multi_script(array(array('action' => 'ready', 'element' => 'body', 'name' => 'body', 'code' => "setTimeout('self.close()',10000);"))); /*Les champs obligatoires pour le type _query : toReload, "query, #element, #reponse , "method, "url*/ $variables['mesScripts'] = $list['s']; //définitions des fonctions => dans le header $variables['mesScriptsFunc'] = $list['d']; $variables['file'] = $file; $this->myrender(array('menu' => 'menu', 'title' => 'Telechargement de la ressource en cours', 'view' => 'load', 'variables' => $variables)); }
function index() { if (!$this->session->islogged()) { $this->redirect("?membre/login"); } //on crée le jeton s'il n'existe pas if (Session::getToken('uploadDefichier') === false) { Session::addToken(array('name' => 'uploadDefichier', 'limit_time' => 10 * 60, 'time' => time())); } $soumis = null; $erreurs = array(); $notifications = array(); /* petite manipulation pour éviter les soumissions multiples de formulaire ... * le souci avec cette méthode c'est qu'elle ne préserve pas le fichier téléchargé après la redirection * il faut donc le sauvegarder avant de rediriger. La sauvegarde s'effectue dans un fichier temporaire * sous condition que le fichier soit valide */ if ($this->request->data) { $soumis = $this->request->data; $soumisfile = $this->request->datafile; /* à ce niveau, le formulaire a été envoyé. * Si la requete provient d'un autre site ou n'a pas de http_referer (a été directement écrite dans l'url) * on la rejette illico */ if ($this->request->is('external') || $this->request->is('no-origin') || !Session::isValidToken('uploadDefichier')) { $message = 'Erreur [DLU ' . __LINE__ . '] : La requête a échouée. Veuillez réactualiser la page.'; $this->error($message); return false; } $t = Session::getToken('uploadDefichier'); if ($t['value'] !== $soumis['token']) { $erreurs[] = "Le formulaire n'est plus valide."; } // on sauvegarde le fichier avec les seuls droits de lecture si la taille est bonne et aucune erreur détectée $upload_max_file = PregFucntions::return_bytes(ini_get('upload_max_filesize')); $size = filesize($soumisfile['fichier']['tmp_name']); if (empty($erreurs) && $size <= $upload_max_file) { $valid = $this->anyErrorFile($soumisfile['fichier']['error']); if ($valid) { $name = $soumisfile['fichier']['name']; $path = UPLOADS . DS . $soumisfile['fichier']['name']; if ($this->moveFile($soumisfile['fichier']['tmp_name'], $path, 0444)) { $_SESSION['saveform'] = $soumis; $_SESSION['saveformfile'] = $path; unset($soumis); unset($soumisfile); header('Location: ' . Router::url('?upload/index/')); exit; } else { $erreurs[] = "Une erreur est survenue."; $erreurs[] = "Il se pourrait que votre fichier ne respecte pas les règles de sécurité."; } } else { $erreurs[] = $valid; } } else { $erreurs[] = "La limite autorisée est de " . ini_get('upload_max_filesize') . "o"; } } // ... suite de la manipulation et déplacement du fichier vers sa destination finale if (isset($_SESSION['saveform'])) { // à ce niveau, il ne sert à rien de continuer si le jeton est invalide. D'ailleurs on le supprime if (!Session::isValidToken('uploadDefichier')) { $message = "Le temps de soumission est dépassé. Veuillez recharger la page."; $this->error($message); return false; } //récupération des données et suppression des varibles de session $soumis = $_SESSION['saveform']; $soumisfile = $_SESSION['saveformfile']; unset($_SESSION['saveform']); unset($_SESSION['saveformfile']); //on récupère les données du formulaire $form = array('year' => $soumis['year'], 'ue' => $soumis['ue'], 'catg' => strtolower($soumis['catg']), 'name' => basename($soumisfile), 'size' => filesize($soumisfile), 'path' => 'files/ei' . $soumis['year'] . '/' . $soumis['ue'] . '/' . $soumis['catg'] . '/', 'code' => Session::genereToken(), 'valid' => 0); // On s'assure que le token généré est unique dans la base de données while ($this->document->find(array('conditions' => 'doc_code=\'' . $form['code'] . '\'', 'fecthMethod' => PDO::FETCH_ASSOC))) { $form['code'] = Session::genereToken(); } //on s'assure que le cours corrsepond à l'année Ex: algpr => ei1 $find = $this->reseau->find(array('conditions' => 'net_niveau = ' . $form['year'] . ' AND net_nom = ' . Functions::squote($form['ue']) . ' ', 'fecthMethod' => PDO::FETCH_ASSOC)); if ($find) { //On place les fichiers au bon endroit $path = DWLOADS_short . DS . $form['path'] . $form['name']; if ($this->renameFile($soumisfile, $path)) { /* Puisque le fichier a déjà été contrôlé, on l'ajoute aisément dans la base de données puis dans le * bon répertoire, mais avec le statut non approuvé par l'admin, soit mem_etat = 0 */ if ($this->document->add(array('values' => " ''," . Functions::squote($form['name']) . "," . Functions::squote($form['path']) . "," . $form['size'] . "," . $form['year'] . "," . Functions::squote($form['ue']) . "," . Functions::squote($form['catg']) . "," . Functions::squote($form['code']) . ",0,NOW()")) === true) { $notifications[] = "Votre fichier a bien été uploadé sous le nom : " . $form['name']; $notifications[] = "Votre fichier a bien été uploadé et attend d'être validé. "; } else { $erreurs[] = "[1] Une erreur est survenue lors de la migration des fichiers."; } } else { $erreurs[] = "[2] Une erreur est survenue lors de la migration des fichiers."; } } else { $erreurs[] = "Le module mentionné ne correspond pas à l'année choisie."; chmod($soumisfile, 0777); unlink($soumisfile); } //Une fois le formulaire soumis, on génère un nouveau jeton, et ce quelque soit l'issue (formulaire validé ou non, envoyé ou non) Session::addToken(array('name' => 'uploadDefichier', 'limit_time' => 10 * 60, 'time' => time(), 'erase' => true)); } $list_ue['ei1'] = $this->reseau->find(array('conditions' => 'net_niveau=1', 'fecthMethod' => PDO::FETCH_ASSOC)); $list_ue['ei2'] = $this->reseau->find(array('conditions' => 'net_niveau=2', 'fecthMethod' => PDO::FETCH_ASSOC)); $list_ue['ei3'] = $this->reseau->find(array('conditions' => 'net_niveau=3', 'fecthMethod' => PDO::FETCH_ASSOC)); $list_catg = array('ds' => 'Enoncés de Devoirs Surveillés', 'dsc' => 'Corrigés de Devoirs Surveillés', 'ta' => 'Travaux en Autonomie', 'tp' => 'Travaux Pratiques'); if (empty($list_ue)) { $message = Conf::DEBUG ? "Erreur [" . get_class($this) . " " . __LINE__ . "]." : "Erreur [ DLU " . __LINE__ . " ] : un problème est survenu lors du chargement de la page."; $this->error($message); } $variables['soumis'] = $soumis; $variables['erreurs'] = $erreurs; $variables['notifications'] = $notifications; $variables['list_ue'] = $list_ue; $variables['list_catg'] = $list_catg; $this->myrender(array('menu' => 'menu', 'title' => 'Espace Upload', 'view' => 'index', 'variables' => $variables)); unset($soumis); unset($soumisfile); }