L'action ecrivez moi à pour but de proposer un outil très simple d'envoi d'email.
Présentation
Il suffit d'appeler ecrivez moisur une page et voilà ce qui va se passer:
- Définition du destinataire
- Il s'agit systématiquement du propriétaire de la page, l'adresse est récupérée dans la base MySQL
- Définition de l'expéditeur
- S'il est enregistré l'action récupère son NomWiki et son adresse email
- S'il n'est pas enregistré l'action propose un champ de saisie pour définir l'adresse de l'expéditeur
- Affichage du formulaire
- Champ Objet (le nom de site web sera automatiquement ajouté au début du sujet de façon transparente afin que le destinataire puisse aisément établir une règle dans sa messagerie)
- Champ de texte
L'expéditeur n'a pas accès à l'adresse email du destinataire.
Cette action utilise la fonction Mail() de PHP.
Cette action et - en quelque sorte - la même chose que
ActionMailToUser mais vu d'une autre façon.
Limitations
- Pour le moment on ne peut pas joindre de fichier.
- On peut "gruger" en créant une page pour y ajouter l'action et l'attribuer à quelqu'un d'autre.
Discussion
J'allais dire que c'était une chouette idée mais je trouve que la deuxième limitation est vraiment gênante, il faudrait trouver une solution à ça... Le plus sécuritaire c'est que le mail soit autorisé uniquement quand le propriétaire est la dernière personne à avoir édité la page mais ce n'est pas pratique du tout...
Sur ce point on verra plus tard car là j'ai vraiment aucune idée réalisable simplement
Enfin... quelques remarques rapides tout de même sur le code:
- l'interdiction d'appel direct du script devrait être la première instruction pret pour la version 0.2
- Au fait pour la configuration il y a aussi une méthode pour y accéder, c'est peut-être mieux de l'utiliser (à quoi fais tu allusion?)
- Pour obtenir le propriétaire d'une page, il est préférable d'utiliser GetPageOwner?, surtout que celui que tu veux est forcément en cache pret pour la 0.2
- Pour obtenir l'adresse mail tu peux utiliser LoadUser?, c'est plus facile LoadUser? c'est pas pour contrôler le mot de passe????
Sinon en gros le reste a l'air ok --
LordFarquaad
Tu es en train de dire que je progresse... :D. Je m'occupe d'abord de la version 1.5 de
ActionNewTextSearch et je reviens ici après, merci de tes conseil. Quand le code d'Action Ecrivez Moi sera assez stable (ce qui ne devrait pas tarder) je penserais au look, mettre tout ça dans un tableau me semble indispensable.... et félicitations pour ton travail sur les classes
WikiNi.
--
Nicephore17
Humm, j'ai essayé de télécharger ton action sur ton site mais l'archive est corrompue que ce soit à partir de Firefox ou de IE. Soit tu as eu un pb lors de l'upload (le fichier fait 1964 octets) soit ton
ActionAttach ne fonctionne pas correctement. --
OlivierB
Mince, cela vient probablement d'un problème au niveau du codage de l'ASCII... Je suis sous Mac et j'avoue que je sais pas comment régler ce souci... :( mail moi et je te l'envoie si tu veux
Je viens de sortir la version 0.2 qui - entre autre - ne permet plus l'envoi de mails vide. J'envisage aussi de récupérer l'adresse IP de utilisateur non authentifié dans le but de décourager les abus. --
Nicephore17
Proposition pour la confidentialité/sécurité
On pourrait décomposer cette action en deux parties:
- L'action elle même
- Gére le processus d'envoi de mail
- Affiche le formulaire
- Un "Tag"
- Permet d'assurer que l'utilisateur qui a appelé cette action dans sa page est bien celui qui veut recevoir des mails
Principe:
- On appelle le tag avec {{tag id="GgYIu65865ThYFG"}} ou l'id est (par exemple) le code MD5 du mot de passe
- Ce tag charge une constante ou une variable globale en mémoire.
- Il est simple à mettre en place puisqu'il est simple de récupérer le code MD5 du mot de passe dans la base.
- C'est sécurisé puisqu'on ne peut pas le décoder
- L'action vérifie la valeur de la constante (ou variable globale) qui devient indispensable pour son exécution
- Laisse le mot de passe codé par md5 là où il est. Je pense que c'est une mauvaise idée de le faire transiter sur le web. De plus l'utilisateur ne connait pas son mot de passe codé donc je ne vois pas très bien comment il peut le mettre en paramétre de l'action -- OlivierB
Pour sécuriser un peu plus....
- L'action ne fonctionne que si l'owner est le seul à pouvoir éditer la page en question (pour éviter que le code MD5 soit récupéré et mis en pâture à John) de plus c'est du PHP on ne voir rien dans le code source.
- Non laisse tomber sérieusement pour le code md5, en plus de ce que dit OlivierB, tu oublies notamment le handler /raw qui affiche la page brute... -- LordFarquaad
Bon... je vais continuer à réfléchir à ça avant de recommencer à coder. Sinon je le laisse sans sécu, ça dépend aussi du public du wiki en question...
--
Nicephore17
Code source version 0.2
<?php
/*
Copyright 2004 Nicolas FORGEARD-GRIGNON
nicephore17 **at** adminrezo.net
v0.2 - 19/12/2004
Impossible d'envoyer des mails vides
v0.1 - 11/12/2004
Initial release
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
INFORMATIONS D'UTILISATION
*/
// Empeche l'execution php en direct
if ( !defined('WIKINI_VERSION') ) {die ("Désolé, vous ne pouvez pas accéder directement à cette fonctionnalité."); };
// Charge les informations de base
if ( !defined('ECRIVEZMOI_VERSION') ) { define('ECRIVEZMOI_VERSION','0.2'); };
$prefixe = $this->config['table_prefix'];
// Qui donc est propriétaire de la page? (Le destinataire)
$ToName = $this->GetPageOwner();
// Récupération des information sur l'expéditeur
if ($FromName = $this->GetUser()){
$MailFromAdd = $this->LoadSingle('SELECT email FROM '.$prefixe.'users WHERE name ="'.$FromName['name'].'"');
$LigneDe = '===Vous êtes:==='.$FromName['name'].' ('.$MailFromAdd['email'].')""<input type="hidden" name="from" value="'.$MailFromAdd['email'].'"/>""==[[ParametresUtilisateur Modifier cette adresse]]== ';
}else{
$LigneDe = '===Vous êtes:=== ""<input type="text" name="from" />""==(Entrez votre adresse email ci-dessus)== ';
};
// Affichage du titre de la page
echo $this->Format('====Envoyer un mail à '.$ToName.'====----==[Fonctionne avec ""EcrivezMoi"" v'.ECRIVEZMOI_VERSION.']== --- ---');
// Si le courrier n'a pas encore été envoyé...
if (!$_POST['envoyer']){
// Mise en place du forumlaire
echo $this->FormOpen();
echo $this->Format($LigneDe);
echo $this->Format('===Objet:===');
echo ('<input type="text" name="objet" value="" size="58em" />');
echo $this->Format('---===Corps du texte:===');
echo ('<textarea name="corps" cols="55" rows="8"></textarea>');
echo ('<br /><input type="submit" name="envoyer" value="envoyer" />');
echo $this->FormClose();
} else {
//Controle contenu non vide
if ($_POST['from'] AND $_POST['objet'] AND $_POST['corps']) {
//Traitement de l'expedition du messages
$MailToAdd = $this->LoadSingle('SELECT email FROM '.$prefixe.'users WHERE name ="'.$ToName.'"');
$MailSent = mail($MailToAdd['email'],'['.$this->config['wakka_name'].'] '.htmlspecialchars($_POST['objet']),htmlspecialchars($_POST['corps']),'from: '.$FromName['name'].'<'.htmlspecialchars($_POST['from']).'>');
// Information pour l'expéditeur
if ($MailSent) {
echo $this->Format('//Votre message pour '.$ToName.' à bien été expédié, merci.//');
//En cas d'erreur...
}else{
echo $this->Format('//Désolé, votre message n\'a pas pu être envoyé//');
};
} else {
echo $this->Format('//Désolé, vous devez remplir tous les champs du formulaire. Votre email n\'a pas été envoyé.//');
};
};
?>
Changelog ? --
LordFarquaad