write_error_to_log("API Connexion", "Connexion à la base de données impossible : " . $e->getMessage()); die('{"status_code":0, "error_description":"connection to database failed"}'); } /************************/ // JSON // /************************/ // On génére la commande SQL nous permettant de vérifier si l'utilisateur est // bien authentifié (le mot de passe et le nom d'utilisateur doivent correspondre) $selectStatement = $connexion->prepare('SELECT COUNT(*) FROM utilisateur WHERE utilisateur.username = :username AND utilisateur.password = :password LIMIT 1'); $selectStatement->bindValue(':username', $_POST['pseudoPost'], PDO::PARAM_STR); $selectStatement->bindValue(':password', md5($_POST['passwordPost']), PDO::PARAM_STR); // Execution de la commande SQL if ($selectStatement->execute()) { // Calcul du nombre de colonne retournée $nbr_ligne = $selectStatement->fetchColumn(); // Si le nombre de colonne est suppérieur à 0, l'utilisateur est alors connecté if ($nbr_ligne > 0) { // On assigne le pseudo et le mot de passe aux variables de session $_SESSION['pseudo'] = $_POST['pseudoPost']; $_SESSION['password'] = md5($_POST['passwordPost']); die('{"status_code":1}'); } else { // Le mot de passe et/ou le nom d'utilisateur ne correspondent pas die('{"status_code":0,"error_description":"username and/or password does not match"}'); } } else { // Une erreur est survenue lors de l'execution de la commande SQL $errorInfoArray = $selectStatement->errorInfo(); write_error_to_log("API Connexion", "Impossible d'exécuter la commande SQL (connexion) : " . $errorInfoArray[2]); die('{"status_code":0,"error_description":"failed to execute query"}'); }
// Vérification de la présence du fichier if (file_exists($fullPath)) { // Le fichier est déjà présent, il est inutile de le déplacer à nouveau write_error_to_log("API Importation", "Le fichier existe déjà (fichier : '" . $_FILES['file']['name'] . "')"); die('{"status_code":0, "error_description":"file already exist"}'); } // Vérification de la taille du fichier if ($tailleFichier > $MAX_FILESIZE) { // Le fichier est trop gros, il ne peut pas être mis en ligne write_error_to_log("API Importation", "La taille du fichier ('" . $tailleFichier . "') est trop importante, maximum : '" . $MAX_FILESIZE . "')"); die('{"status_code":0, "error_description":"file too big"}'); } // Vérification de la nature du fichier if (!($mimetypeFichier == "audio/flac") && !($mimetypeFichier == "audio/x-flac") && !($mimetypeFichier == "application/octet-stream")) { // Le fichier mis en ligne n'est pas un fichier flac write_error_to_log("API Importation", "Le mimetype du fichier est invalide (mimetype du fichier : '" . $mimetypeFichier . "')"); die('{"status_code":0, "error_description":"file is not a valid flac file"}'); } // Déplacement de la musique dans le dossier de stockage prévu à cet effet if (!move_uploaded_file($_FILES['file']['tmp_name'], $fullPath)) { // Déplacement du fichier impossible write_error_to_log("API Importation", "Impossible de déplacer le fichier au chemin : '" . $fullPath . "'"); die('{"status_code":0, "error_description":"unable to move file"}'); } } else { // Une erreur est survenue lors de l'execution de la commande SQL write_error_to_log("API Importation", "Une erreur est survenue lors de l'upload du fichier : '" . $_FILES['file']['name'] . "'"); die('{"status_code":0, "error_description":"upload error"}'); } // Si tout ce passe bien, on retourne un résultat positif via une string JSON die('{"status_code":1}');
function getTrackForPlaylist($connexion, $playlistID) { // Protection de la chaîne (pour éviter les attaques SQL) $playlistID = $connexion->quote($playlistID); // Création de la commande SQL $commande_SQL = "SELECT DISTINCT * FROM pistes, contenu_playlists WHERE pistes.idPISTES = contenu_playlists.PISTES_idPISTES AND contenu_playlists.PLAYLIST_idPLAYLIST=" . $playlistID; $tableauPistes = array(); // Execution de la commande SQL if ($selectStatement = $connexion->query($commande_SQL)) { // Assignation de chaque ligne while ($ligne = $selectStatement->fetch(PDO::FETCH_ASSOC)) { // On vérifie si le tableau "$tableauPistes" contient la piste de cet enregistrement if (!in_array($ligne, $tableauPistes)) { // La piste n'existe pas dans le tableau, // on va l'ajouter $tableauPistes[] = array_map("utf8_encode", $ligne); } } } else { // Une erreur est survenue lors de l'execution de la commande SQL $errorInfoArray = $connexion->errorInfo(); write_error_to_log("API Récupération données", "Impossible d'exécuter la commande SQL (récupération des pistes d'une playlist) : " . $errorInfoArray[2]); } return $tableauPistes; }
} else { // Une erreur est survenue lors de l'execution de la commande SQL write_error_to_log("API Édition métadonnées", "Impossible d'exécuter la commande SQL (insert genre) : " . $errorInfoArray[2]); die('{"status_code":0,"error_description":"failed to insert genre"}'); } } else { // Pour toute les autres métadonnées différentes de "genre" // Concaténation de la string "$commandeSQLUpdate" (début de la commande déclarée plus haut) // On ajoute toutes les métadonnées à mettre à jour $commandeSQLUpdate .= "`" . $global_array[$i]['column'] . "` = " . $connexion->quote($global_array[$i]['value']); if ($i == count($global_array) - 1) { // Conclusion de la commande SQL $commandeSQLUpdate .= " WHERE idPISTES=" . $idPISTES . ";"; $updateStatement = $connexion->prepare(utf8_decode($commandeSQLUpdate)); // Execution de la commande SQL if (!$updateStatement->execute()) { // Une erreur est survenue lors de l'execution de la commande SQL $errorInfoArray = $updateStatement->errorInfo(); write_error_to_log("API Édition métadonnées", "Impossible d'exécuter la commande SQL (update) : " . $errorInfoArray[2] . $commandeSQLUpdate); die('{"status_code":0,"error_description":"failed to update metatag"}'); } } else { // Le parcours du tableau n'est pas terminé, on ajoute donc une "," // permettant ainsi d'ajouter de nouvelle métadonnée $commandeSQLUpdate .= ", "; } } } } // Si tout ce passe bien, on retourne un résultat positif via une string JSON die('{"status_code":1}');
// Envoie du mail // Le mail est ensuite traité et envoyé via le logiciel "fake sendmail" if (mail($to, $titre, $corps, $headers)) { // Le mail à bien été envoyé die('{"status_code":1}'); } else { // Une erreur est survenue lors de l'envoie du mail write_error_to_log("API Mot de passe oublié", "Impossible d'envoyer l'email de réinitialisation"); die('{"status_code":0,"error_description":"mail not sent"}'); } } // Comparaison du hash récupéré précedement (base de données) avec l'argument récupéré en GET ("hashpass") if ($passwordHash != $_GET['hashpass']) { // Les 2 hash MD5 ne correspondent pas die('{"status_code":0,"error_description":"unable to login"}'); } // Affichage d'un formulaire HTML permettant à l'utilisateur de changer son mot de passe echo '<form id="formChangerMotDePassePopup" method="POST" action="changepass.php"> <input type="hidden" name="pseudoPost" id="pseudoName-text" value="' . $ligne['username'] . '"> <input type="hidden" name="actualPasswordPost" id="pseudoName-text" value="' . $_GET['hashpass'] . '"> <input placeholder="Nouveau mot de passe" name="newPasswordPost" id="newPassword-text" type="text"> <input placeholder="Confirmation" name="confirmPasswordPost" id="confirmPassword-text" type="password"> <br/><br/> <input type="submit" value="Changer le mot de passe" /> </form>'; } else { // Une erreur est survenue lors de l'execution de la commande SQL $errorInfoArray = $selectStatement->errorInfo(); write_error_to_log("API Mot de passe oublié", "Impossible d'exécuter la commande SQL (selection password) : " . $errorInfoArray[2]); die('{"status_code":0,"error_description":"failed to execute select query"}'); }
write_error_to_log("API Illustration Genres", "La taille du fichier ('" . $tailleFichier . "') est trop importante, maximum : '" . $MAX_FILESIZE_COVER . "')"); die('{"status_code":0, "error_description":"file too big"}'); } // Calcul taille de l'image if (getimagesize($_FILES[$tableauImageGenre[$i]]['tmp_name']) == 0) { // La valeur retournée est FALSE, donc le fichier n'est pas une image write_error_to_log("API Illustration Genres", "La cover est invalide (le fichier n'est pas une image)"); die('{"status_code":0, "error_description":"file is not a valid image file"}'); } // Déplacement de l'image dans le dossier de stockage prévu à cet effet if (!move_uploaded_file($_FILES[$tableauImageGenre[$i]]['tmp_name'], $fullPath)) { // Déplacement de l'image impossible write_error_to_log("API Illustration Genres", "Impossible de déplacer le fichier au chemin : '" . $fullPath . "'"); die('{"status_code":0, "error_description":"unable to move file"}'); } /************************/ // MYSQL // /************************/ // On génére la commande SQL permettant de mettre à jour le nom de l'image dans la base de données $commandeSQLUpdate = "UPDATE `genres` SET `image` = '" . $_FILES[$tableauImageGenre[$i]]['name'] . "' WHERE idGENRES=" . $tableauImageGenre[$i] . ";"; $updateStatement = $connexion->prepare(utf8_decode($commandeSQLUpdate)); // Execution de la commande SQL if (!$updateStatement->execute()) { // Une erreur est survenue lors de l'execution de la commande SQL $errorInfoArray = $updateStatement->errorInfo(); write_error_to_log("API Illustration Genres", "Impossible d'exécuter la commande SQL (update) : " . $errorInfoArray[2] . $commandeSQLUpdate); die('{"status_code":0,"error_description":"failed to update image name"}'); } } // Si tout ce passe bien, on retourne un résultat positif via une string JSON die('{"status_code":1}');
// Variables // /************************/ include 'conf.php'; $type = $_POST["type"]; if ($type != "albums" && $type != "artistes" && $type != "annees" && $type != "genres") { die('{"status_code":0, "error_description": "bad type"}'); } /************************/ // MYSQL // /************************/ try { $connexion = new PDO("mysql:host={$DB_HOST};dbname={$DB_NAME}", $DB_READER_USER_LOGIN, $DB_READER_USER_PSW); $pseudoQuoted = $connexion->quote($_POST['pseudoPost']); $passwordQuoted = $connexion->quote($_POST['passwordPost']); } catch (PDOException $e) { write_error_to_log("Génération choix playlist", "Connection DB failed: " . $e->getMessage()); die('{"status_code":0, "error_description":"connection to database failed"}'); } $date = getdate(); $dateStr = $date['mday'] . "/" . $date['mon'] . "/" . $date['year']; echo '{"status_code":1, "fetched_at": "' . $dateStr . '"'; if ($type == "genres") { echo ',"genres": '; /************************/ // GENRES // /************************/ $commande_SQL = "SELECT * FROM genres WHERE nom != 'NULL'"; $query = $connexion->prepare($commande_SQL); $query->execute(); while ($result = $query->fetch(PDO::FETCH_ASSOC)) { $genresToUTF8Format[] = array_map("utf8_encode", $result);
/************************************/ // Creation de la playlist // /************************************/ $commande_SQL = "INSERT INTO playlists VALUES (''," . $connexionWrite->quote($playlist_name) . ", 0)"; $query = $connexionWrite->prepare($commande_SQL); $query->execute(); /************************************/ // ID de la playlist // /************************************/ $commande_SQL = "SELECT idPLAYLIST FROM playlists WHERE playlists.name = " . $connexion->quote($playlist_name) . " ORDER BY idPLAYLIST DESC LIMIT 1"; $query = $connexion->prepare($commande_SQL); $query->execute(); while ($result = $query->fetch(PDO::FETCH_ASSOC)) { $playlist_id = $result["idPLAYLIST"]; } /************************************/ // Insertion des musiques // /************************************/ for ($ipiste = 0; $ipiste < count($_playlist); $ipiste++) { $commande_SQL = "INSERT INTO contenu_playlists VALUES ( '', " . $playlist_id . ", " . $_playlist[$ipiste] . " )"; $query = $connexionWrite->prepare($commande_SQL); $query->execute(); } $commande_SQL = "UPDATE playlists SET items_count = '" . count($_playlist) . "' WHERE idPLAYLIST = '{$playlist_id}' "; $query = $connexionWrite->prepare($commande_SQL); $query->execute(); } catch (Exception $err) { die('{"status_code":0,"error_description":"Failed to execute query"}'); write_error_to_log("Création playlist", $err->getMessage()); } echo '{"status_code":1}';
$errorInfoArray = $selectStatement->errorInfo(); write_error_to_log("API Changement mot de passe", "Impossible d'exécuter la commande SQL (vérification utilisateur) : " . $errorInfoArray[2]); die('{"status_code":0,"error_description":"failed to execute select query"}'); } /************************/ // Changement Pass // /************************/ // On génére la commande SQL permettant de mettre à jour le mot de passe $selectStatement = $connexion->prepare('UPDATE utilisateur SET utilisateur.password = :newpassword WHERE utilisateur.username = :username AND utilisateur.password = :password'); $selectStatement->bindValue(':newpassword', $newPassword, PDO::PARAM_STR); $selectStatement->bindValue(':username', $_POST['pseudoPost'], PDO::PARAM_STR); $selectStatement->bindValue(':password', $_POST['actualPasswordPost'], PDO::PARAM_STR); // Execution de la commande SQL if ($selectStatement->execute()) { // La commande n'a renvoyée aucune erreur // On assigne le nouveau mot de passe à la variable de session $_SESSION['password'] = $newPassword; die('{"status_code":1}'); } else { // Une erreur est survenue lors de l'execution de la commande SQL $errorInfoArray = $selectStatement->errorInfo(); write_error_to_log("API Changement mot de passe", "Impossible d'exécuter la commande SQL (changement mot de passe) : " . $errorInfoArray[2]); die('{"status_code":0,"error_description":"failed to execute update query"}'); } // Cette fonction permet de vérifier si une string est un hash MD5 function isValidMd5($md5 = '') { // En appliquant un masque REGEX à la string md5, // on retourne le resultat de la fonction return preg_match('/^[a-f0-9]{32}$/', $md5); }