Serveur. Code PHP Ne Se Lance Pas. Le Propio A Bridé le PHP

Serveur. Code PHP Ne Se Lance Pas. Le Propio A Bridé le PHP - PHP - Programmation

Marsh Posté le 18-08-2010 à 15:29:48    

Bonjour, j'ai un énorme problème. J'ai un code PHP qui depuis le transfert vers un autre serveur, refuse de se lancer. J'ai deux codes qui refusent celui de la galerie et celui du mail contact
 
Erreur de la Galerie
Warning: imagejpeg() [function.imagejpeg]: Unable to open './galeries/thumbs/CIMG3949.jpg' for writing: Permission denied in /home/www/3c33c76659b7986c7b064f671a3141fd/web/php/galerie.php on line 47
 
Erreur du Contact mail
Warning: mail() [function.mail]: Permission denied: headers injection (empty line) in /home/www/3c33c76659b7986c7b064f671a3141fd/web/contact_.php on line 174
 
Cependant, après contact avec le service qui gère le serveur. ce dernier admet avoir mis un patch PHP dont voici le mail de réponse:

Spoiler :


1ère partie:
Mais regardez également si effectivement vous utilisez des chemins absolus dans le fichier de configuration notamment (configuration.php).
 
La solution relative ($chemin = $_SERVER["DOCUMENT_ROOT"] . "/mondossier/";) semble ne pas fonctionner pour Joomla car Joomla ne prend pas en compte ce chemin.
 
Donc pour l'écrire relativement, il faut écrire
 
var $log_path = '/log/';
var $tmp_path = '/tmp/';
 
dans le fichier de configuration.
 
Nous vous conseillons également de désactiver le FTP de Joomla soit par le fichier de configuration soit par l'interface /administrator.
 
 
 
2ème partie:
JoomlaXplorer et eXtplorer sont des gestionnaires de fichiers trés complets, accessibles via l'administration de Joomla uniquement.
&! nbsp;
Ils permettent de créer, déplacer, modifier, renommer, supprimer, changer les permissions des fichiers ou des répertoires : http://joomlacode.org/gf/project/joomlaxplorer
 
Le téléchargement peut se faire directement sur http://joomlacode.org/gf/project/joomlaxplorer/frs/
 
 
Problème de mail:
Nous appliquons effectivement par mesure de sécurité un patch sur PHP qui bloque les tentatives d'injections de headers via la fonction mail() sur tous les formulaires PHP en ligne. De nombreux sites contiennent des formulaires qui ne respectent pas les standards et normes d'échange/protocole mail et qui ne vérifient pas comme il faut les paramètres qu'ils envoient en "additional parameters" à la fonction mail (ça ne concerne donc exclusivement le 4ème paramètre de cette fonction), ce qui permet d! 'injecter des headers et donc d'envoyer du spam massivement depuis nos serveurs.
 
Ce que nous interdisons dans les paramètres additionnels est l'usage de lignes vides, caractérisées par deux "\r\n"à la suite ; un seul signifie un retour à la ligne, lorsqu'il y en a deux cela signifie une insertion de ligne vide, ce que justement nous empêchons.
 
D'où les messages d'erreur php du style :
 
Warning: mail() href='function.mail':
Permission denied: headers injection (empty line) ...
 
ou
 
Warning: mail()'function.mail':
Permission denied: headers injection (duplicated subject) ...
 
Vos scripts fonctionnaient peut-être auparavant de la sorte, tant que notre patch de sécurité n'était pas appliqué, mais nous avons été obligés de l'appliquer pour faire respecter cette norme afin d'éviter de nous faire blacklister nos serveurs mails sans cesse, et de pénaliser l'ensemble! de nos clients.
 
 
Solution proposée:
Des spammeurs ont répertorié toutes les pages ayant un formulaire de contact envoyant un email. Plusieurs sites hébergé chez nous et dans le monde ont donc été exploités de la même façon.
 
Ils se sont servis d'une faille existante dans beaucoup de formulaires de contact qui ne vérifient pas la présence de retour de ligne dans certains champs, en particulier celui de l'e-mail de l'expéditeur à compléter dans les formulaires.
 
Vous pouvez éviter que cela se produise, soit en désactivant le script PHP de contact e-mail de votre site, soit en vous assurant qu'il n'y a pas de retour de ligne dans chacun des champs du formulaire de contact de votre site.
 
Voici comment éviter simplement que ceci soit exploitable en rempla&c! cedil;ant les retours de ligne dans chacun des champs devant normalement contenir un email (ce champ est souvent nommé $email, $sender ou $from):
 
$EMAIL = str_replace("\n", "", str_replace("\r", "", $EMAIL));
 
Le spammer exploite les scripts ressemblant à ceci
 
$MESSAGE = $_POST[msg];
$RECIPIENT = "webmaster@votredomaine.com";
$SUBJECT = "Formulaire de contact";
$EMAIL = $_POST[email];
 
// Sans cette ligne votre script est exploitable !!!!
$EMAIL = str_replace("\n", "", str_replace("\r", "", $EMAIL));
 
mail($RECIPIENT, $SUBJECT, $MESSAGE, "From: $EMAIL" );
 
Merci de bien vouloir vérifier ceci dans vos scripts PHP.


 
Le problème, je n'utilise pas de CMS Joomla et aucune portion de ligne de code données ne correspond à mon code. Si vous avez une solution ou même comprenez la démarche, vous êtes un dieu vivant.

Reply

Marsh Posté le 18-08-2010 à 15:29:48   

Reply

Marsh Posté le 18-08-2010 à 16:23:31    

Pour Le Premier Point, Ca A Juste L'Air D'Etre Le Chemin D'Accès Qui Est Faux.
 
Pour Le Mail, Tu Utilises Bien La Fonction Mail() Dans Ton Php Non? Donc Il Suffit De Faire Ce Qu'Ils Te Disent Sur Les Variables Que Tu Passes À Ta Fonction Et C'Est Bon.


---------------
C'était vraiment très intéressant.
Reply

Marsh Posté le 18-08-2010 à 19:59:43    

Le proprio il a rien bridé du tout.  
C'est juste qu'avant d'utiliser un script PHP trouvé quelque part, faut se demander 2 sec comment il marche ...


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 19-08-2010 à 10:45:54    

Le PHP ayant quelque ressemblance avec l'Action Script quand sa reste simple cela va encore. Oui, j'ai pris le code et avec les connaissances que j'ai, je l'ai modifié mais elle reste somme toute rudimentaire n'ayant pas appris ce code. De plus, comme je l'ai dit sur l'ancien serveur ce dernier marchait.  
 
Je vais essayé ce que dit Lasnoufle. Esox_ch si tu as une solution au lieu de critiquer tu es le bienvenu aussi ;)

Reply

Marsh Posté le 19-08-2010 à 12:52:50    

NebukadRomu a écrit :

Le PHP ayant quelque ressemblance avec l'Action Script quand sa reste simple cela va encore. Oui, j'ai pris le code et avec les connaissances que j'ai, je l'ai modifié mais elle reste somme toute rudimentaire n'ayant pas appris ce code. De plus, comme je l'ai dit sur l'ancien serveur ce dernier marchait.

 

Je vais essayé ce que dit Lasnoufle. Esox_ch si tu as une solution au lieu de critiquer tu es le bienvenu aussi ;)


Bah si t'y arrives pas, colles juste le code de ta page PHP qui envoie le mail et j'te fais la correction, mais bon a priori appliquer ce qu'ils disent dans le mail est très simple (si c'est bien ca qui merde, ce qui est très probable).

 

Et sinon pour les images, c'est vraisemblablement pas un problème d'hébergement non plus, vu que si tu essaies d'accéder aux images directement, ceci marche: http://eteindien.be/galeries/CIMG3980.jpg mais pas ca: http://eteindien.be/galeries/thumbs/CIMG3980.jpg . J'y connais queud en imagerie mais possiblement tes thumbnails ne sont pas "valides" ou un truc du genre, le browser y accède mais arrive pas à les lire quoi.

 

Et aussi, oublies pas d'enlever ca: http://eteindien.be/JeSuisEnTrainDeHackerTonSiteHaHaHa parce que si qqun tombe dessus pour une raison X pendant une visite "classique", voilà quoi.

Message cité 1 fois
Message édité par lasnoufle le 19-08-2010 à 12:53:14

---------------
C'était vraiment très intéressant.
Reply

Marsh Posté le 19-08-2010 à 14:23:01    

lasnoufle a écrit :


Bah si t'y arrives pas, colles juste le code de ta page PHP qui envoie le mail et j'te fais la correction, mais bon a priori appliquer ce qu'ils disent dans le mail est très simple (si c'est bien ca qui merde, ce qui est très probable).
 
Et sinon pour les images, c'est vraisemblablement pas un problème d'hébergement non plus, vu que si tu essaies d'accéder aux images directement, ceci marche: http://eteindien.be/galeries/CIMG3980.jpg mais pas ca: http://eteindien.be/galeries/thumbs/CIMG3980.jpg . J'y connais queud en imagerie mais possiblement tes thumbnails ne sont pas "valides" ou un truc du genre, le browser y accède mais arrive pas à les lire quoi.
 
Et aussi, oublies pas d'enlever ca: http://eteindien.be/JeSuisEnTrainDeHackerTonSiteHaHaHa parce que si qqun tombe dessus pour une raison X pendant une visite "classique", voilà quoi.


 
Si tu fais allusion au texte subtil dans l'erreur 404. C'était juste pour m'essayer. Quand on découvre, on test en tout genre  :D. Pour la galerie, la redirection marche bien que j'ai encore les ligne d'erreur afficher. Même si c'est pas cà, je vais essayé de trouver. Si tu veux voir le code original (non modifié) de l'envoi du courrier au cas ou.
 
Merci en tout cas.
 

Code :
  1. <?
  2. $dest="adresse@internet.com";
  3. $reponse=StripSlashes("Votre message a été envoyé! Merci." );
  4. class Mail
  5. {
  6.         var $sendto= array();
  7.         var $from, $msubject;
  8.         var $acc= array();
  9.         var $abcc= array();
  10.         var $aattach= array();
  11. // Mail contructor
  12. function Mail()
  13. {
  14.         $this->autoCheck( true );
  15. }
  16. function autoCheck( $bool )
  17. {
  18.         if( $bool )
  19.                 $this->checkAddress = true;
  20.         else
  21.                 $this->checkAddress = false;
  22. }
  23. function Subject( $subject )
  24. {
  25.         $this->msubject = strtr( $subject, "\r\n" , "  " );
  26. }
  27. function From( $from )
  28. {
  29.         if( ! is_string($from) ) {
  30.                 echo "Class Mail: error, From is not a string";
  31.                 exit;
  32.         }
  33.         $this->from= $from;
  34. }
  35. function To( $to )
  36. {
  37.         // TODO : test validité sur to
  38.         if( is_array( $to ) )
  39.                 $this->sendto= $to;
  40.         else
  41.                 $this->sendto[] = $to;
  42.         if( $this->checkAddress == true )
  43.                 $this->CheckAdresses( $this->sendto );
  44. }
  45. function Cc( $cc )
  46. {
  47.         if( is_array($cc) )
  48.                 $this->acc= $cc;
  49.         else
  50.                 $this->acc[]= $cc;
  51.         if( $this->checkAddress == true )
  52.                 $this->CheckAdresses( $this->acc );
  53. }
  54. function Bcc( $bcc )
  55. {
  56.         if( is_array($bcc) ) {
  57.                 $this->abcc = $bcc;
  58.         } else {
  59.                 $this->abcc[]= $bcc;
  60.         }
  61.         if( $this->checkAddress == true )
  62.                 $this->CheckAdresses( $this->abcc );
  63. }
  64. function Body( $body )
  65. {
  66.         $this->body= $body;
  67. }
  68. function Send()
  69. {
  70.         // build the headers
  71.         $this->_build_headers();
  72.         // include attached files
  73.         if( sizeof( $this->aattach > 0 ) ) {
  74.                 $this->_build_attachement();
  75.                 $body = $this->fullBody . $this->attachment;
  76.         }
  77.         // envoie du mail aux destinataires principal
  78.         for( $i=0; $i< sizeof($this->sendto); $i++ ) {
  79.                 $res = mail($this->sendto[$i], $this->msubject,$body, $this->headers);
  80.                 // TODO : trmt res
  81.         }
  82. }
  83. function Organization( $org )
  84. {
  85.         if( trim( $org != "" )  )
  86.                 $this->organization= $org;
  87. }
  88. function Priority( $priority )
  89. {
  90.         if( ! intval( $priority ) )
  91.                 return false;
  92.         if( ! isset( $this->priorities[$priority-1]) )
  93.                 return false;
  94.         $this->priority= $this->priorities[$priority-1];
  95.         return true;
  96. }
  97. function Attach( $filename, $filetype='application/x-unknown-content-type', $disposition = "inline" )
  98. {
  99.         // TODO : si filetype="", alors chercher dans un tablo de MT connus / extension du fichier
  100.         $this->aattach[] = $filename;
  101.         $this->actype[] = $filetype;
  102.         $this->adispo[] = $disposition;
  103. }
  104. function Get()
  105. {
  106.         $this->_build_headers();
  107.         if( sizeof( $this->aattach > 0 ) ) {
  108.                 $this->_build_attachement();
  109.                 $this->body= $this->body . $this->attachment;
  110.         }
  111.         $mail = $this->headers;
  112.         $mail .= "\n$this->body";
  113.         return $mail;
  114. }
  115. function ValidEmail($address)
  116. {
  117.         if( ereg( ".*<(.+)>", $address, $regs ) ) {
  118.                 $address = $regs[1];
  119.         }
  120.          if(ereg( "^[^@  ]+@([a-zA-Z0-9\-]+\.)+([a-zA-Z0-9\-]{2}|net|com|gov|mil|org|edu|int)\$",$address) )
  121.                  return true;
  122.          else
  123.                  return false;
  124. }
  125. function CheckAdresses( $aad )
  126. {
  127.         for($i=0;$i< sizeof( $aad); $i++ ) {
  128.                 if( ! $this->ValidEmail( $aad[$i]) ) {
  129.                         echo "Class Mail, method Mail : invalid address $aad[$i]";
  130.                         exit;
  131.                 }
  132.         }
  133. }
  134. /************* Methode Perso ***************/
  135. function _build_headers()
  136. {
  137.         // creation du header mail
  138.         $this->headers= "From: $this->from\n";
  139.         $this->to= implode( ", ", $this->sendto );
  140.         if( count($this->acc) > 0 ) {
  141.                 $this->cc= implode( ", ", $this->acc );
  142.                 $this->headers .= "CC: $this->cc\n";
  143.         }
  144.         if( count($this->abcc) > 0 ) {
  145.                 $this->bcc= implode( ", ", $this->abcc );
  146.                 $this->headers .= "BCC: $this->bcc\n";
  147.         }
  148.         if( $this->organization != ""  )
  149.                 $this->headers .= "Organization: $this->organization\n";
  150.         if( $this->priority != "" )
  151.                 $this->headers .= "X-Priority: $this->priority\n";
  152. }
  153. function _build_attachement()
  154. {
  155.         $this->boundary= "------------" . md5( uniqid("myboundary" ) ); // TODO : variable bound
  156.         $this->headers .= "MIME-Version: 1.0\nContent-Type: multipart/mixed;\n boundary=\"$this->boundary\"\n\n";
  157.         $this->fullBody = "This is a multi-part message in MIME format.\n--$this->boundary\nContent-Type: text/plain; charset=us-ascii\nContent-Transfer-Encoding: 7bit\n\n" . $this->body ."\n";
  158.         $sep= chr(13) . chr(10);
  159.         $ata= array();
  160.         $k=0;
  161.         // for each attached file, do...
  162.         for( $i=0; $i < sizeof( $this->aattach); $i++ ) {
  163.                 $filename = $this->aattach[$i];
  164.                 $basename = basename($filename);
  165.                 $ctype = $this->actype[$i];        // content-type
  166.                 $disposition = $this->adispo[$i];
  167.                 if( ! file_exists( $filename) ) {
  168.                         echo "Class Mail, method attach : file $filename can't be found"; exit;
  169.                 }
  170.                 $subhdr= "--$this->boundary\nContent-type: $ctype;\n name=\"$basename\"\nContent-Transfer-Encoding: base64\nContent-Disposition: $disposition;\n  filename=\"$basename\"\n";
  171.                 $ata[$k++] = $subhdr;
  172.                 // non encoded line length
  173.                 $linesz= filesize( $filename)+1;
  174.                 $fp= fopen( $filename, 'r' );
  175.                 $data= base64_encode(fread( $fp, $linesz));
  176.                 fclose($fp);
  177.                 $ata[$k++] = chunk_split( $data );
  178. /*
  179.                 // OLD version - used in php < 3.0.6 - replaced by chunk_split()
  180.                 $deb=0; $len=76; $data_len= strlen($data);
  181.                 do {
  182.                         $ata[$k++]= substr($data,$deb,$len);
  183.                         $deb += $len;
  184.                 } while($deb < $data_len );
  185. */
  186.         }
  187.         $this->attachment= implode($sep, $ata);
  188. }
  189. } // class Mail
  190. $subject=StripSlashes($subject);
  191. $msg=StripSlashes($msg);
  192. $msg="Message d'un client depuis le site L'été Indien:
  193. $msg";
  194. $m= new Mail; // create the mail
  195.         $m->From( "$email" );
  196.         $m->To( "$dest" );   
  197.         $m->Subject( "$subject" );
  198.         $m->Body( $msg);        // set the body
  199. if ($email1!="" ) {
  200.         $m->Cc( "$email1" );
  201.     }
  202.         $m->Priority($priority) ; 
  203. if ("$NomFichier_name"!="" ) {
  204.     copy("$NomFichier","../upload/$NomFichier_name" );
  205.     $m->Attach( "../upload/$NomFichier_name", "application/octet-stream" );
  206.     }
  207.         $m->Send();
  208. if ("$NomFichier_name"!="" ) {
  209. Unlink("../upload/$NomFichier_name" );   }   
  210. ?>


Message édité par NebukadRomu le 19-08-2010 à 14:24:19
Reply

Marsh Posté le 19-08-2010 à 17:01:11    

Wow c'est de l'objet en PHP ca? Purée qu'c'est moche, en plus c'est overkill pour juste envoyer un mail, m'enfin bon. Le truc qui m'intrigue c'est que l'erreur reportée sur l'envoi de mail a pas l'air de matcher le code, m'enfin bon bis. Je devine vaguement les deux endroits ou tu peux mettre le "correctif". Soit ici:

Code :
  1. function From( $from )
  2. {
  3.         if( ! is_string($from) ) {
  4.                 echo "Class Mail: error, From is not a string";
  5.                 exit;
  6.         }
  7.         $this->from= str_replace("\n", "", str_replace("\r", "", $from));
  8. }


Soit ici:

Code :
  1. $m= new Mail; // create the mail
  2.         $m->From( str_replace("\n", "", str_replace("\r", "", $email) );


PHP je connais pas trop donc syntaxe non garantie.


---------------
C'était vraiment très intéressant.
Reply

Marsh Posté le 19-08-2010 à 23:45:42    

lasnoufle a écrit :

Wow c'est de l'objet en PHP ca? Purée qu'c'est moche...


visiblement de l'objet type PHP3 ou PHP4 :/


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 20-08-2010 à 08:23:39    

Perso je fouttrais le script loin et je l'écrirais dans un PHP récent.. Parce que là un jour où l'autre qqch va être "deprecated" et boum


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 20-08-2010 à 10:33:05    

si c'est pas déjà fait ... quand t'es en PHP 5.1 ou 5.2, les ereg il te les déprécie déjà :/


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 20-08-2010 à 10:33:05   

Reply

Marsh Posté le 20-08-2010 à 18:25:35    

Yep,
 
Non, j'ai encore rien chipoté, désolé. Je vais m'y atteler maintenant. J'suis entrain de refaire le design du site avec à cela un mail promotion en HTML.
 
J'admet que le code est assez violent (pour ma part) mais c'est l'un des rares qui fonctionne correctement. J'en ai trouvé un la mais il ne marche pas. Il envoie pas le mail, je n'ai même aucun message d'envoi ou non.
 
En tout les cas, je vous remercie grandement.
 
Edit: voila que je découvre encore une nouvelle norme, le chmod 777

Citation :

Cependant voici la solution aux soucis de votre client:
 
 
1. Pour les images, droits pas suffisants sur le répertoire web/galeries/thumbs. Nos Administrateurs système ont normalement réglé
cela. Il me semble que le fichier web/php/galerie.php soit en CHMOD 664 au lieu de 777 - origine du warning.
 
 
2. Pour le mail, le pb se pose a la ligne suivante:
 
    $res = mail($this->sendto[$i], $this->msubject,$body,$this->headers);
 
La variable $this->headers doit contenir une ligne vide (double \n\n par exemple), et c'est refusé par notre fonction mail pour raison de sécurité.


PS: J'avais demandé pour parler avec les véritables gestionnaire du serveur pour discuter du problème mais que "Selon les modalités du contrat partenaire vos client ne doivent en aucun cas prendre contact avec nous et votre requête n'est donc malheureusement pas recevable."
 
Edit2: OOOOOOOUUUUuuuuuiiiii! Enfin! J'a réussi pour le mail! J'ai supprimer ce qui est en gras. J'ai pas fait comme il a dit mais ça marche et comme c'est la classe, j'ai rien compris a ce que j'ai fait  :D ........ Maintenant, Il me reste la galerie...
 

Code :
  1. for( $i=0; $i< sizeof($this->sendto); $i++ ) {
  2.                 $res = mail($this->sendto[$i], $this->msubject,$body, $this->headers);


 
Edit3: Bon beh en fait non... Je reçois le mail mais je n'ai plus l’expéditeur... -_-
Edit4: J'ai fait à la barbare... j'ai rajouté la ligne directement dans le mail. Pour répondre, il faudra cliquer sur l'email affiché dans le mail. Pas super mais je connais pas mieux. :/


Message édité par NebukadRomu le 20-08-2010 à 20:43:46
Reply

Marsh Posté le 22-08-2010 à 19:02:38    

Mais à part ça, plutôt que de prendre des codes que tu ne comprends pas (et qui sont à moitié obsolètes). Pourquoi ne pas écrire ton propre truc?


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 23-08-2010 à 15:31:28    

esox_ch a écrit :

Mais à part ça, plutôt que de prendre des codes que tu ne comprends pas (et qui sont à moitié obsolètes). Pourquoi ne pas écrire ton propre truc?


 
J'aimerais bien, je te l'avoue, ici, le problème était d'abord assez urgent, donc pas le temps d'en créer un. Ensuite, je ne suis qu'un amateur en ce qui concerne le PHP. Bien que j'ai crée un code qui permet au background de changer suivant les saisons ou encore d'afficher un texte différent suivant les périodes d'ouverture de la société. J'ai quand même réussi a virer une partie du code programme qui ne me servait pas comme la gestion de priorité ou des pièces attachée.

Reply

Marsh Posté le 23-08-2010 à 16:15:17    

Salut,
 
Personnellement je ne vois que 2 solutions viables :  
 
- Tu n'as pas le temps de le faire toi même, donc tu paies qqn pour le faire à ta place.
- Tu n'as pas les moyens de payer qqn qui le fait pour toi, donc tu prends un livre de PHP, tu l'étudies un peu et après tu fais ce que tu dois faire.
 
L'idée de prendre un code déjà fait, que tu ne comprends pas, et de l'utiliser pour moi n'est pas qqch de valable parce que un jour où l'autre ça va forcément te péter à la gueule, et là t'aurais plus que les yeux pour pleurer.


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 23-08-2010 à 18:30:35    

Si je paye quelqu'un, il va juste me balancer le fichier PHP et je l'incorpore sur le site. Le temps, normalement, j'en ai plein. J'préfère mettre ma main dans le moteur, créer et chipoter. Le papier collant que j'ai fait tiens pour le moment, c'est le principal. Ensuite, j'ai d'autres priorités que je dois faire pour le site, je redessine légèrement la charte graphique du site, faire un folder, refaire le menu en Action Script, petite modification pour le mail html.  
 
Mais promis dès que je me mettrai sur le code, j'irai t'emmerder pour le PHP pour le plaisir de faire, mouahaha :D. Merci ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed