Changeset 96873 in spip-zone


Ignore:
Timestamp:
Apr 29, 2016, 8:17:18 PM (5 years ago)
Author:
eric@…
Message:

Ajout d'une vérification sur le mode runtime du serveur : si mode runtime on renvoie une 501.
Renommage de items en données.
Si aucune erreur, on renvoie un tableau vide à l'index erreur plutot que le status 200 et type vide.

Location:
_plugins_/svp_api/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/svp_api/trunk/http/svp.php

    r96842 r96873  
    7777        $format_reponse = 'json';
    7878
    79         // Vérification du format de sortie demandé
     79        // Vérification du mode SVP du serveur : celui-ci ne doit pas être en mode runtime pour
     80        // renvoyer des données complètes
    8081        if (requete_verifier_format($contenu['requete']['format'], $erreur)) {
    81                 // On positionne cette fois le format de sortie car on sait que celui demandé est valide
    82                 $format_reponse = $contenu['requete']['format'];
    83                 // Vérification du nom de la collection
    84                 if (requete_verifier_collection($contenu['requete']['collection'], $erreur)) {
    85                         $items = array();
    86                         // On vérifie les critères de filtre additionnels si la requête en contient
    87                         $where = array();
    88                         if (requete_verifier_criteres($contenu['requete']['criteres'], $erreur)) {
    89                                 // Si il y a des critères additionnels on complète le where en conséquence
    90                                 if ($contenu['requete']['criteres']) {
    91                                         foreach ($contenu['requete']['criteres'] as $_critere => $_valeur) {
    92                                                 if ($_critere == 'compatible_spip') {
    93                                                         $f_critere = charger_fonction('where_compatible_spip', 'inc');
    94                                                         $where[] = $f_critere($_valeur, 'spip_plugins', '>');
    95                                                 } else {
    96                                                         $where[] = "spip_plugins.${_critere}=" . sql_quote($_valeur);
     82                // Vérification du format de sortie demandé
     83                if (requete_verifier_format($contenu['requete']['format'], $erreur)) {
     84                        // On positionne cette fois le format de sortie car on sait que celui demandé est valide
     85                        $format_reponse = $contenu['requete']['format'];
     86                        // Vérification du nom de la collection
     87                        if (requete_verifier_collection($contenu['requete']['collection'], $erreur)) {
     88                                $donnees = array();
     89                                // On vérifie les critères de filtre additionnels si la requête en contient
     90                                $where = array();
     91                                if (requete_verifier_criteres($contenu['requete']['criteres'], $erreur)) {
     92                                        // Si il y a des critères additionnels on complète le where en conséquence
     93                                        if ($contenu['requete']['criteres']) {
     94                                                foreach ($contenu['requete']['criteres'] as $_critere => $_valeur) {
     95                                                        if ($_critere == 'compatible_spip') {
     96                                                                $f_critere = charger_fonction('where_compatible_spip', 'inc');
     97                                                                $where[] = $f_critere($_valeur, 'spip_plugins', '>');
     98                                                        } else {
     99                                                                $where[] = "spip_plugins.${_critere}=" . sql_quote($_valeur);
     100                                                        }
    97101                                                }
    98102                                        }
     103
     104                                        // Récupération de la collection spécifiée en fonction des critères appliqués
     105                                        $collectionner = 'reponse_collectionner_' . $contenu['requete']['collection'];
     106                                        $donnees = $collectionner($where);
     107
     108                                        $contenu['donnees'] = $donnees;
    99109                                }
    100 
    101                                 // Récupération de la collection spécifiée en fonction des critères appliqués
    102                                 $collectionner = 'reponse_collectionner_' . $contenu['requete']['collection'];
    103                                 $items = $collectionner($where);
    104 
    105                                 $contenu['items'] = $items;
    106110                        }
    107111                }
     
    144148        $format_reponse = 'json';
    145149
    146         // Vérification du format de sortie demandé
     150        // Vérification du mode SVP du serveur : celui-ci ne doit pas être en mode runtime pour
     151        // renvoyer des données complètes
    147152        if (requete_verifier_format($contenu['requete']['format'], $erreur)) {
    148                 // On positionne le format de sortie qui sera utilisé car on sait que celui demandé est valide
    149                 $format_reponse = $contenu['requete']['format'];
    150                 // Vérification du nom de la collection
    151                 if (requete_verifier_ressource($contenu['requete']['collection'], $erreur)) {
    152                         // Vérification du préfixe de la ressource
    153                         if (requete_verifier_prefixe($contenu['requete']['ressource'], $erreur)) {
    154                                 $prefixe = strtoupper($contenu['requete']['ressource']);
    155                                 $items = array();
    156                                 // On recherche d'abord le plugin par son préfixe dans la table spip_plugins en vérifiant que
    157                                 // c'est bien un plugin fourni pas un dépôt et pas un plugin installé sur le serveur uniquement
    158                                 $from = array('spip_plugins', 'spip_depots_plugins AS dp');
    159                                 $select = array('*');
    160                                 $where = array(
    161                                         'prefixe=' . sql_quote($prefixe),
    162                                         'dp.id_depot>0',
    163                                         'dp.id_plugin=spip_plugins.id_plugin'
    164                                 );
    165                                 $group_by = array('spip_plugins.id_plugin');
    166                                 $plugin = sql_fetsel($select, $from, $where, $group_by);
    167                                 if ($plugin) {
    168                                         // On refactore le tableau de sortie du fetsel en supprimant les colonnes id_depot et id_plugin qui ne
    169                                         // sont d'aucune utilité pour le service.
    170                                         unset($plugin['id_plugin']);
    171                                         unset($plugin['id_depot']);
    172                                         $items['plugin'] = normaliser_champs('plugin', $plugin);
    173 
    174                                         // On recherche maintenant les paquets du plugin
    175                                         $from = array('spip_paquets');
     153                // Vérification du format de sortie demandé
     154                if (requete_verifier_format($contenu['requete']['format'], $erreur)) {
     155                        // On positionne le format de sortie qui sera utilisé car on sait que celui demandé est valide
     156                        $format_reponse = $contenu['requete']['format'];
     157                        // Vérification du nom de la collection
     158                        if (requete_verifier_ressource($contenu['requete']['collection'], $erreur)) {
     159                                // Vérification du préfixe de la ressource
     160                                if (requete_verifier_prefixe($contenu['requete']['ressource'], $erreur)) {
     161                                        $prefixe = strtoupper($contenu['requete']['ressource']);
     162                                        $donnees = array();
     163                                        // On recherche d'abord le plugin par son préfixe dans la table spip_plugins en vérifiant que
     164                                        // c'est bien un plugin fourni pas un dépôt et pas un plugin installé sur le serveur uniquement
     165                                        $from = array('spip_plugins', 'spip_depots_plugins AS dp');
    176166                                        $select = array('*');
    177167                                        $where = array(
    178168                                                'prefixe=' . sql_quote($prefixe),
    179                                                 'id_depot>0'
     169                                                'dp.id_depot>0',
     170                                                'dp.id_plugin=spip_plugins.id_plugin'
    180171                                        );
    181                                         $paquets = sql_allfetsel($select, $from, $where);
    182                                         $items['paquets'] = array();
    183                                         if ($paquets) {
    184                                                 // On refactore le tableau de sortie du allfetsel en un tableau associatif indexé par archives zip.
    185                                                 $champs_inutiles = array(
    186                                                         'id_paquet', 'id_plugin', 'id_depot',
    187                                                         'actif', 'installe', 'recent', 'maj_version', 'superieur', 'obsolete', 'attente', 'constante', 'signature'
     172                                        $group_by = array('spip_plugins.id_plugin');
     173                                        $plugin = sql_fetsel($select, $from, $where, $group_by);
     174                                        if ($plugin) {
     175                                                // On refactore le tableau de sortie du fetsel en supprimant les colonnes id_depot et id_plugin qui ne
     176                                                // sont d'aucune utilité pour le service.
     177                                                unset($plugin['id_plugin']);
     178                                                unset($plugin['id_depot']);
     179                                                $donnees['plugin'] = normaliser_champs('plugin', $plugin);
     180
     181                                                // On recherche maintenant les paquets du plugin
     182                                                $from = array('spip_paquets');
     183                                                $select = array('*');
     184                                                $where = array(
     185                                                        'prefixe=' . sql_quote($prefixe),
     186                                                        'id_depot>0'
    188187                                                );
    189                                                 foreach ($paquets as $_paquet) {
    190                                                         foreach ($champs_inutiles as $_champ) {
    191                                                                 unset($_paquet[$_champ]);
     188                                                $paquets = sql_allfetsel($select, $from, $where);
     189                                                $donnees['paquets'] = array();
     190                                                if ($paquets) {
     191                                                        // On refactore le tableau de sortie du allfetsel en un tableau associatif indexé par archives zip.
     192                                                        $champs_inutiles = array(
     193                                                                'id_paquet', 'id_plugin', 'id_depot',
     194                                                                'actif', 'installe', 'recent', 'maj_version', 'superieur', 'obsolete', 'attente', 'constante', 'signature'
     195                                                        );
     196                                                        foreach ($paquets as $_paquet) {
     197                                                                foreach ($champs_inutiles as $_champ) {
     198                                                                        unset($_paquet[$_champ]);
     199                                                                }
     200                                                                $donnees['paquets'][$_paquet['nom_archive']] = normaliser_champs('paquet', $_paquet);
    192201                                                        }
    193                                                         $items['paquets'][$_paquet['nom_archive']] = normaliser_champs('paquet', $_paquet);
    194202                                                }
     203                                        } else {
     204                                                // On renvoie une erreur 404 pour indiquer que le plugin n'existe pas
     205                                                $erreur = array(
     206                                                        'status'  => 404,
     207                                                        'type'    => 'plugin_nok',
     208                                                        'element' => 'plugin',
     209                                                        'valeur'  => $contenu['requete']['ressource']
     210                                                );
    195211                                        }
    196                                 } else {
    197                                         // On renvoie une erreur 404 pour indiquer que le plugin n'existe pas
    198                                         $erreur = array(
    199                                                 'status'  => 404,
    200                                                 'type'    => 'plugin_nok',
    201                                                 'element' => 'plugin',
    202                                                 'valeur'  => $contenu['requete']['ressource']
    203                                         );
     212                                        $contenu['donnees'] = $donnees;
    204213                                }
    205                                 $contenu['items'] = $items;
    206214                        }
    207215                }
  • _plugins_/svp_api/trunk/inc/svpapi_reponse.php

    r96872 r96873  
    8787                'erreur'        => $erreur,
    8888                'schema'        => $schema,
    89                 'items'         => array());
     89                'donnees'               => array());
    9090
    9191        return $contenu;
     
    177177                foreach($objet as $_champ => $_valeur) {
    178178                        if (in_array($_champ, $champs_multi)) {
     179                                // Passer un champ multi en tableau indexé par la langue
    179180                                $objet_normalise[$_champ] = normaliser_multi($_valeur);
    180181                        }
    181182
    182183                        if (in_array($_champ, $champs_serialises)) {
     184                                // Désérialiser un champ sérialisé
    183185                                $objet_normalise[$_champ] = unserialize($_valeur);
    184186                        }
    185187
    186188                        if (in_array($_champ, $champs_version)) {
     189                                // Retourne la chaine de la version x.y.z sous sa forme initiale, sans
     190                                // remplissage à gauche avec des 0.
    187191                                $objet_normalise[$_champ] = denormaliser_version($_valeur);
    188192                        }
    189193
    190194                        if (in_array($_champ, $champs_liste)) {
     195                                // Passer une chaine liste en tableau
    191196                                $objet_normalise[$_champ] = explode(',', $_valeur);
    192197                        }
     
    228233        $reponse->setCharset('utf-8');
    229234        $reponse->setStatusCode($contenu['erreur']['status']);
     235        if ($contenu['erreur']['status'] == 200) {
     236                $contenu['erreur'] = array();
     237        }
    230238
    231239        if ($format_reponse == 'json') {
  • _plugins_/svp_api/trunk/inc/svpapi_requete.php

    r96842 r96873  
    22
    33if (!defined('_ECRIRE_INC_VERSION')) return;
     4
     5
     6/**
     7 * Détermine si le serveur est en mode run-time ou pas.
     8 * On considère qu'un serveur en mode run-time n'est pas valide pour
     9 * traiter les requêtes.
     10 *
     11 * @param &array        $erreur
     12 *              Tableau initialisé avec les index identifiant l'erreur ou vide si pas d'erreur.
     13 *      Les index mis à jour sont:
     14 *      - status : le code de l'erreur HTTP, soit 501
     15 *      - type : chaine identifiant l'erreur plus précisément, soit serveur_nok
     16 *      - element : type d'objet sur lequel porte l'erreur, soit serveur
     17 *      - valeur : la valeur du mode runtime
     18 *
     19 * @return boolean
     20 *              True si le serveur est valide, false sinon.
     21 */
     22function requete_verifier_serveur(&$erreur) {
     23        $serveur_valide = true;
     24
     25        include_spip('inc/svp_phraser');
     26        if (!_SVP_MODE_RUNTIME) {
     27                $erreur = array(
     28                        'status'        => 501,
     29                        'type'          => 'serveur_nok',
     30                        'element'       => 'serveur',
     31                        'valeur'        => _SVP_MODE_RUNTIME);
     32                $serveur_valide = false;
     33        }
     34
     35        return $serveur_valide;
     36}
    437
    538
  • _plugins_/svp_api/trunk/paquet.xml

    r96872 r96873  
    22        prefix="svpapi"
    33        categorie="outil"
    4         version="0.2.4"
     4        version="0.3.0"
    55        etat="test"
    66        compatibilite="[3.0.0;3.1.*]"
Note: See TracChangeset for help on using the changeset viewer.