Jump to content

Documents joints : accès par mot de passe


Recommended Posts

Bonjour,

je souhaite protéger l'accès aux documents joints de la fiche produit (PDF) via un login.
Quelqu'un pourrait me donner une astuce ? j'ai protégé le dossier Download et même le dossier controller/front/
Mais rien à faire, le clic sur le nom du PDF télécharge directement sans accès login.
Ce qu'il me faudrait c'est que au clic sur le document PDF joint, une popup de login permette de télécharger. Sans login, pas de téléchargement possible.
Merci pour toute aide :)

Link to comment
Share on other sites

Salut Eolia
oui, j'ai fait ça (probablement pas super bien)
j'ai mis un contrôle sur le répertoire controllers/front/ dans lequel se trouve le fichier AttachmentController.php qui gère il me semble les fichiers joints
mais l'action n'est pas bloquée au clic. Le téléchargement se fait
En revanche, l'accès direct au répertoire affiche bien le login (ce qui ne vaut que pour contrôler la bonne exécution de ma protection par login puisque le htaccess interdit déjà l'accès direct)
je ne trouve pas, il doit bien y avoir un moyen... J'espère..

Link to comment
Share on other sites

eh beeeeeh euh... je vois pas 🙄.
j'ai regardé le code de AttachmentController.php et je ne vois pas d'appel JS ou Ajax
j'ai aussi tenté d'inspecter la page sous Firefox mais ça n'indique que le lien
<a href="//www.monsite.com/index.php?controller=attachment&amp;id_attachment=2">

raison pour laquelle je pensais que protéger le répertoire controllers/front/ (où se situe AttachmentController.php) suffirait à bloquer le téléchargement direct

Link to comment
Share on other sites

Ok ça fonctionne sur l'accès direct à l'URL (je sais faire en htaccess)
il faut que ça fasse pareil sur le clic du téléchargement, et là à priori (sauf si je n'ai pas compris) je ne suis pas bloqué sur ton lien de la page du chemisier. J'ai pu DL le mp3 sans passer par une demande de login.

Si j'ai faux et qu'effectivement en ajoutant la ligne de code dont tu parles dans le PHP du contrôleur, j'aimerais essayer sur 1.7. Mais il me faudrait cette ligne de code ;)

Merci

Link to comment
Share on other sites

<?php
/*
* 2007-2015 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to [email protected] so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
*  @author PrestaShop SA <[email protected]>
*  @copyright  2007-2015 PrestaShop SA
*  @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
*  International Registered Trademark & Property of PrestaShop SA
*/

class AttachmentControllerCore extends FrontController
{
    public function postProcess()
    {
        $error = $error2  = '';
        $ok = false;
        if(Tools::getValue('username') && Tools::getValue('password')) {
            
            session_start(); 
            // Contrôler dans la bdd si le user existe et est autorisé  
            /*
            if(....) {
                $ok = true;
            }            
            else {
            */    
                $_SESSION['test'] = isset($_SESSION['test']) ? $_SESSION['test'] + 1 : 1;
                if($_SESSION['test'] <= 3)
                    $error = '<p class="error">Erreur: Utilisateur ou mot de passe incorrect</p>';
                else
                    $error2 = '<p class="error">3 tentatives échouées, vous êtes banni.</p>';
            //}    
        }
        if(!$ok) {
            $html = '
            <html>
                <head>
                   <meta charset="utf-8">
                   <style>
                        body{
                            background: #67BE4B;
                            font-family: "arial";
                        }
                        .error {
                            text-align: center;
                            color: white;
                            background-color: #b61414;
                            padding: 10px;
                        }
                        #container{
                            width:400px;
                            margin:0 auto;
                            margin-top:10%;
                        }
                        /* Bordered form */
                        form {
                            width:100%;
                            padding: 30px;
                            border: 1px solid #f1f1f1;
                            background: #fff;
                            box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.2), 0 5px 5px 0 rgba(0, 0, 0, 0.24);
                        }
                        #container h1 {
                            width: 90%;
                            margin: 0 auto;
                            padding-bottom: 10px;
                            text-align: center;
                            font-size: 24px;
                        }

                        /* Full-width inputs */
                        input[type=text], input[type=password] {
                            width: 100%;
                            padding: 12px 20px;
                            margin: 8px 0;
                            display: inline-block;
                            border: 1px solid #ccc;
                            box-sizing: border-box;
                        }

                        /* Set a style for all buttons */
                        input[type=submit] {
                            background-color: #53af57;
                            color: white;
                            padding: 14px 20px;
                            margin: 8px 0;
                            border: none;
                            cursor: pointer;
                            width: 100%;
                        }
                        input[type=submit]:hover {
                            background-color: white;
                            color: #53af57;
                            border: 1px solid #53af57;
                        }
                        </style>
                </head>
                <body>
                    <div id="container">';
                if(!$error2)
                    $html .= '
                        <form method="POST">
                            <h1>L\'accès à ce fichier requiert un identifiant et un mot de passe</h1>
                            '.$error.'
                            <label><b>Nom d\'utilisateur</b></label>
                            <input type="text" placeholder="Entrer le nom d\'utilisateur" name="username" required>
                            <br /><br />
                            <label><b>Mot de passe</b></label>
                            <input type="password" placeholder="Entrer le mot de passe" name="password" required>
                            <br /><br />
                            <input type="submit" id="submit" value="LOGIN" >
                        </form>';
                else
                    $html .= $error2;
                $html .= '
                    </div>
                </body>
            </html>';
            die($html);
        }
        $a = new Attachment(Tools::getValue('id_attachment'), $this->context->language->id);
        if (!$a->id) {
            Tools::redirect('index.php');
        }

        Hook::exec('actionDownloadAttachment', array('attachment' => &$a));

        if (ob_get_level() && ob_get_length() > 0) {
            ob_end_clean();
        }

        header('Content-Transfer-Encoding: binary');
        header('Content-Type: '.$a->mime);
        header('Content-Length: '.filesize(_PS_DOWNLOAD_DIR_.$a->file));
        header('Content-Disposition: attachment; filename="'.utf8_decode($a->file_name).'"');
        @set_time_limit(0);
        readfile(_PS_DOWNLOAD_DIR_.$a->file);
        exit;
    }
}

 

Link to comment
Share on other sites

Génial ! ça fonctionne !
il y avait juste une fermeture en trop à la fin du PHP apparemment, je l'ai viré et c'est OK. J'ai la page de login.
Tu mets quoi et comment pour le login ? Je peux créer un id et mdp unique, il sera communiqué à la demande. Le but est simplement que le visiteur lambda ne puisse télécharger, qu'il passe par une prise de contact d'abord (où on lui donnera le Multipass)

Link to comment
Share on other sites

Ben normalement, si le user et le pass sont ok tu dois être débanni^^

        $error = $error2  = '';
        $ok = false;
        $user = Tools::getValue('username');
        $pass = Tools::getValue('password');
        session_start(); 
        if($_SESSION['test'] != 'ok') {
            
            if(!isset($_SESSION['referer']))
                $_SESSION['referer'] = $_SERVER['HTTP_REFERER'];
            if($user && $pass) {
                
                if(($user == 'Kamoulox') && $pass == 'GrEEn') {
                    $ok = true;
                    $_SESSION['test'] = 'ok';
                    Tools::redirect('https://'.$_SERVER[HTTP_HOST].$_SERVER[REQUEST_URI]);
                }            
                else {

                    $_SESSION['test'] = isset($_SESSION['test']) ? $_SESSION['test'] + 1 : 1;
                    if($_SESSION['test'] <= 3)
                        $error = '<p class="error">Erreur: Utilisateur ou mot de passe incorrect</p>';
                    else
                        $error2 = '<p class="error">3 tentatives échouées, vous êtes banni.<br /><span style="font-size:small">Le login est <b>Kamoulox</b> et le pass <b>GrEEn</b></p>';
                }    
            }
            if(!$ok) {
                $html = '
                <html>
                    <head>
                       <meta charset="utf-8">
                       <style>
                            body{
                                background: #67BE4B;
                                font-family: "arial";
                            }
                            .error {
                                text-align: center;
                                color: white;
                                background-color: #b61414;
                                padding: 10px;
                            }
                            #container{
                                width:400px;
                                margin:0 auto;
                                margin-top:5%;
                            }
                            /* Bordered form */
                            form {
                                width:100%;
                                padding: 30px;
                                border: 1px solid #f1f1f1;
                                background: #fff;
                                box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.2), 0 5px 5px 0 rgba(0, 0, 0, 0.24);
                            }
                            #container h1 {
                                width: 90%;
                                margin: 0 auto;
                                padding-bottom: 10px;
                                text-align: center;
                                font-size: 24px;
                            }

                            /* Full-width inputs */
                            input[type=text], input[type=password] {
                                width: 100%;
                                padding: 12px 20px;
                                margin: 8px 0;
                                display: inline-block;
                                border: 1px solid #ccc;
                                box-sizing: border-box;
                            }

                            /* Set a style for all buttons */
                            input[type=submit] {
                                background-color: #53af57;
                                color: white;
                                padding: 14px 20px;
                                margin: 8px 0;
                                border: none;
                                cursor: pointer;
                                width: 100%;
                                border: 1px solid white;
                            }
                            input[type=submit]:hover {
                                background-color: white;
                                color: #53af57;
                                border: 1px solid #53af57;
                            }
                            .link {
                                margin: 10px auto;
                                text-align: center;
                                display: block;
                            }
                            .link a {
                                text-decoration: none;
                                padding: 7px 8px;
                                border: 1px solid #ab9efc;
                                border-radius: 3px;
                                background: #92bcfe;
                                color: white;
                                transition: 0.8s;
                            }
                            .link a:hover {
                                color: #1c56b0;
                                background: #ebf0ff;
                                border-color: #ebf0ff;
                            }
                            </style>
                    </head>
                    <body>
                        <div id="container">';
                    if(!$error2)
                        $html .= '
                            <form method="POST">
                                <h1>L\'accès à ce fichier requiert un identifiant et un mot de passe</h1>
                                '.$error.'
                                <label><b>Nom d\'utilisateur</b></label>
                                <input type="text" placeholder="Entrer le nom d\'utilisateur" name="username" required>
                                <br /><br />
                                <label><b>Mot de passe</b></label>
                                <input type="password" placeholder="Entrer le mot de passe" name="password" required>
                                <br /><br />
                                <input type="submit" id="submit" value="LOGIN" >
                                <br/>
                                <dip class="link" >
                                    <a href="'.$_SESSION['referer'].'">Revenir au produit</a>
                                </div>
                            </form>';
                    else
                        $html .= $error2;
                    $html .= '
                        </div>
                    </body>
                </html>';
                die($html);
            }
        }
        session_destroy();

 

Link to comment
Share on other sites

Mais oui ça fonctionne !!
le code est un peu différent de celui posté au départ, peut-être que ça venait de là (ou pas). C'est vraiment sympa de m'avoir aidé sur ce pb, ça me sort de la galère.
On peut éventuellement ajouter des identifiants et password complémentaires ? genre Kamoulox 1, Kamoulox 2 (j'ai changé le nom sur mon site je précise)

du style
if(($user == 'Kamoulox') && $pass == 'GrEEn' OR (($user == 'Kamoulox1') && $pass == 'GrEEn1') OR (($user == 'Kamoulox2') && $pass == 'GrEEn2'){

(pas sûr de mon bout de code)

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...