Changeset 67731 in spip-zone for _plugins_/acces_restreint


Ignore:
Timestamp:
Nov 14, 2012, 4:59:28 PM (9 years ago)
Author:
cedric@…
Message:

Amelioration de la gestion des URLs de documents protégés :

Si apache le permet on se contente d'une unique .htaccess dans IMG/ qui rewrite les urls des documents
Quand la protection est activée

  • on génère des urls de la forme IMG/png/truc.png?12/abe345 qui contiennent l'id et le hash pour des questions de performance (revient a mettre l'autorisation en cache au lieu de la calculer sur chaque hit de l'image).
  • neanmoins les urls IMG/png/truc.png sont aussi fonctionnelles, via le calcul d'autorisation explicite au moment du hit

Cela permet de ne pas casser les urls lorsqu'on active ou desactive la protection de document : dans les deux cas les urls qui existaient auparavant restent fonctionnelles, et s'adaptent à la nouvelle strategie de protection.

Si apache ne permet pas le rewrite rule (testé par un recuperer_page sur une url improbable IMG/test/.test/0/1 donc soumis aussi à la possibilité de faire une requete http) on se rabat sur la strategie antérieure avec un deny all dans chaque sous repertoire, et des urls de la forme /docrestreint.api/12/abe345/png/truc.png

Location:
_plugins_/acces_restreint/trunk
Files:
1 added
7 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/acces_restreint/trunk/accesrestreint_administrations.php

    r53669 r67731  
    5151                array('sql_alter',"TABLE spip_zone CHANGE privee privee char(3) DEFAULT 'oui' NOT NULL"),
    5252        );
     53        $maj['0.4.2'] = array(
     54                array('accesrestreint_upgrade_protection_documents'),
     55        );
    5356
    5457        include_spip('base/upgrade');
    5558        maj_plugin($nom_meta_base_version, $version_cible, $maj);
     59}
     60
     61function accesrestreint_upgrade_protection_documents(){
     62        if (isset($GLOBALS['meta']["creer_htaccess"])
     63                AND $GLOBALS['meta']["creer_htaccess"] == 'oui'
     64                AND !isset($GLOBALS['meta']["accesrestreint_proteger_documents"])){
     65                ecrire_meta("accesrestreint_proteger_documents","oui");
     66                include_spip("inc/accesrestreint_documents");
     67                accesrestreint_gerer_htaccess(true);
     68        }
    5669}
    5770
     
    6477        sql_drop_table("spip_zones");
    6578        sql_drop_table("spip_zones_liens");
    66         effacer_meta('creer_htaccess');
     79        effacer_meta('accesrestreint_proteger_documents');
     80        include_spip("inc/accesrestreint_documents");
     81        accesrestreint_gerer_htaccess(false);
    6782        effacer_meta($nom_meta_base_version);
    6883}
  • _plugins_/acces_restreint/trunk/action/api_docrestreint.php

    r67346 r67731  
    4141                $f = implode("/",$arg);
    4242
     43                if ($id_document==0
     44                        AND $cle==1
     45                  AND $f=="test/.test") {
     46                        echo "OK";
     47                        return;
     48                }
     49
    4350                include_spip('inc/documents');
    4451
     
    7077                                $ETag = md5($file . ': '. filemtime($file));
    7178                                if (isset($_SERVER['HTTP_IF_NONE_MATCH'])
    72                                 AND $_SERVER['HTTP_IF_NONE_MATCH'] == $ETag) {
     79                                  AND $_SERVER['HTTP_IF_NONE_MATCH'] == $ETag) {
    7380                                        http_status(304); // Not modified
    7481                                        exit;
    75                                 } else {
     82                                }
     83                                else {
    7684                                        header('ETag: '.$ETag);
    7785                                }
     
    7987                                //
    8088                                // Verifier les droits de lecture du document
    81                                 // en controlant la cle passee en argument
    82                                 //
    83                                 include_spip('inc/securiser_action');
    84                                 if (!verifier_cle_action($doc['id_document'].','.$f, $cle)) {
    85                                         spip_log("acces interdit $cle erronee");
    86                                         $status = 403;
     89
     90                                // en controlant la cle passee en argument si elle est dispo
     91                                // (perf issue : toutes les urls ont en principe cette cle fournie dans la page au moment du calcul de la page)
     92                                if ($cle){
     93                                        include_spip('inc/securiser_action');
     94                                        if (!verifier_cle_action($doc['id_document'].','.$f, $cle)) {
     95                                                spip_log("acces interdit $cle erronee");
     96                                                $status = 403;
     97                                        }
     98                                }
     99                                // en verifiant le droit explicitement sinon, plus lent !
     100                                else {
     101                                        if (!function_exists("autoriser"))
     102                                                include_spip("inc/autoriser");
     103                                        if (!autoriser('voir', 'document', $doc['id_document'])) {
     104                                                $status = 403;
     105                                                spip_log("acces interdit $cle erronee");
     106                                        }
    87107                                }
    88108                        }
     
    95115        case 403:
    96116                include_spip('inc/minipres');
    97                 echo minipres();
     117                echo minipres("","","",true);
    98118                break;
    99119
     
    102122                include_spip('inc/minipres');
    103123                echo minipres(_T('erreur').' 404',
    104                         _T('info_document_indisponible'));
     124                        _T('medias:info_document_indisponible'),"",true);
    105125                break;
    106126
  • _plugins_/acces_restreint/trunk/formulaires/configurer_accesrestreint.html

    r53604 r67731  
    99                #SET{fl,accesrestreint}
    1010                <ul>
    11                         #SET{name,creer_htaccess}#SET{obli,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
     11                        #SET{name,accesrestreint_proteger_documents}#SET{obli,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
    1212                        <li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
    13                                 <label>[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>[
     13                                <label><:accesrestreint:label_creer_htaccess:></label>[
    1414                                <span class='erreur_message'>(#GET{erreurs})</span>
    1515                                ]
     
    1818                                <div class="choix">
    1919                                        <input type="radio" class="radio" name="#GET{name}" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name}}|=={#GET{val}}|oui)checked="checked"] />
    20                                         <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
     20                                        <label for="#GET{name}_#GET{val}"><:accesrestreint:label_creer_htaccess_oui:></label>
    2121                                </div>
    2222                                #SET{val,non}
    2323                                <div class="choix">
    2424                                        <input type="radio" class="radio" name="#GET{name}" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name}}|=={#GET{val}}|oui)checked="checked"] />
    25                                         <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
     25                                        <label for="#GET{name}_#GET{val}"><:accesrestreint:label_creer_htaccess_non:></label>
    2626                                </div>
    2727                        </li>
  • _plugins_/acces_restreint/trunk/formulaires/configurer_accesrestreint.php

    r67329 r67731  
    1010function formulaires_configurer_accesrestreint_charger_dist(){
    1111        $valeurs = array(
    12                 'creer_htaccess' => $GLOBALS['meta']["creer_htaccess"]?$GLOBALS['meta']["creer_htaccess"]:'non',
     12                'accesrestreint_proteger_documents' => isset($GLOBALS['meta']["accesrestreint_proteger_documents"])?$GLOBALS['meta']["accesrestreint_proteger_documents"]:'non',
    1313                'creer_htpasswd' => $GLOBALS['meta']["creer_htpasswd"]?$GLOBALS['meta']["creer_htpasswd"]:'non',
    1414        );
     
    1919function formulaires_configurer_accesrestreint_traiter_dist(){
    2020
    21         $champs = array('creer_htaccess','creer_htpasswd');
     21        $champs = array('accesrestreint_proteger_documents','creer_htpasswd');
     22        $current = $GLOBALS['meta']["accesrestreint_proteger_documents"];
    2223
    2324        foreach($champs as $c)
     
    2526
    2627        // generer/supprimer les fichiers htaccess qui vont bien
    27         include_spip("inc/acces");
    28         gerer_htaccess();
     28        include_spip("inc/accesrestreint_documents");
     29        accesrestreint_gerer_htaccess($GLOBALS['meta']["accesrestreint_proteger_documents"]=="oui");
     30
     31        // si le reglage du htaccess a change, purger le cache
     32        if ($GLOBALS['meta']["accesrestreint_proteger_documents"]!==$current) {
     33                $purger = charger_fonction("purger","action");
     34                $purger("cache");
     35        }
    2936
    3037        return array('message_ok'=>_T('config_info_enregistree'),'editable'=>true);
  • _plugins_/acces_restreint/trunk/inc/accesrestreint_autoriser.php

    r53662 r67731  
    125125        $id_auteur = isset($qui['id_auteur']) ? $qui['id_auteur'] : $GLOBALS['visiteur_session']['id_auteur'];
    126126        if (!isset($documents_statut[$id_auteur][$publique][$id])){
     127
     128                // il faut hacker la meta "creer_htaccess" le temps du calcul de l'autorisation car le core
     129                $clean_meta = false;
     130                if (isset($GLOBALS['meta']["accesrestreint_proteger_documents"]) AND $GLOBALS['meta']["accesrestreint_proteger_documents"]=='oui'){
     131                        if (!isset($GLOBALS['meta']["creer_htaccess"]) OR $GLOBALS['meta']["creer_htaccess"] != 'oui'){
     132                                $GLOBALS['meta']["creer_htaccess"] = 'oui';
     133                                $clean_meta = true;
     134                        }
     135                }
     136
    127137                if (!$id)
    128138                        $documents_statut[$id_auteur][$publique][$id] = autoriser_document_voir_dist($faire, $type, $id, $qui, $opt);
     
    138148                                $documents_statut[$id_auteur][$publique][$id] = autoriser_document_voir_dist($faire, $type, $id, $qui, $opt);
    139149                }
     150
     151                if ($clean_meta){
     152                        unset($GLOBALS['meta']["creer_htaccess"]);
     153                }
     154
    140155        }
    141156        return $documents_statut[$id_auteur][$publique][$id];
  • _plugins_/acces_restreint/trunk/paquet.xml

    r67346 r67731  
    22        prefix="accesrestreint"
    33        categorie="auteur"
    4         version="3.7.0"
     4        version="3.8.0"
    55        etat="stable"
    66        compatibilite="[3.0.0;3.0.*]"
    77        logo="prive/themes/spip/images/zone-32.png"
    8         schema="0.4.1"
     8        schema="0.4.2"
    99        documentation="http://www.spip-contrib.net/Acces-Restreint-3-0"
    1010>       
  • _plugins_/acces_restreint/trunk/urls/generer_url_document.php

    r67346 r67731  
    5151        // cette url doit etre publique !
    5252        $cle = calculer_cle_action($id.','.$f);
    53         return _DIR_RACINE."docrestreint.api/$id/$cle/$f";
     53
     54        // renvoyer une url plus ou moins jolie
     55        if ($GLOBALS['meta']['creer_htaccess'])
     56                return _DIR_RACINE."docrestreint.api/$id/$cle/$f";
     57        else
     58                return get_spip_doc($f)."?$id/$cle";
    5459}
Note: See TracChangeset for help on using the changeset viewer.