Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

fins de lignes dans un paramètre passé à un script cgi

4 réponses
Avatar
Gauthier
Bonjour à tous,

Sur une machine Linux, je souhaite mettre en place un script cgi qui permette
aux utilisateurs de modifier certains de leurs fichiers de configuration
comme .fetchmailrc, .forward, etc.

Apache tourne avec suexec et le script situé dans ~/public_html peut donc
lire/écrire avec les droits de chaque utilisateur.

Le fichier à modifier est lu et son contenu inséré dans un formulaire html
entre les balises <textarea>, puis le contenu de ce formulaire est envoyé
comme paramètre au script cgi pour être ré-inscrit dans le fichier.

Le problème que je rencontre tient aux fins de lignes : avant d'être
modifié, le fichier est un fichier texte unix "normal", que j'ai créé par ex.
avec vi. Mais après avoir été modifié par le script cgi, les fins de ligne
s'affichent avec ^M dans vi, soit la fin de ligne qui caractérise les fichiers
créés sous DOS, et certains programmes se comportent alors de façon hasardeuse
quand ces fichiers sont altérés.

# lecture initiale du fichier
$FETCHMAILRC="$Home/.fetchmailrc";
if ( -r $FETCHMAILRC and -w $FETCHMAILRC ) {
open FETCHMAILRC,"<$FETCHMAILRC";
@lines=<FETCHMAILRC>;
$nl=@lines; # nombre de lignes du fichier à modifier,
# pour adapter la taille du formulaire
close FETCHMAILRC;
} else {
print "Impossible de lire/écrire $Home/.fetchmailrc"
}

print<<EoI;
<form action="$ENV{SCRIPT_NAME}" method=post>
<textarea rows=$nl cols=80 name=contenu>
EoI

foreach $l (@lines) {
# par acquis de conscience, je tronque la fin de chaque ligne, mais
# ça n'améliore rien :-(
chomp $l;
print "$l\n"; # et le \n est obligatoire pour un affichage correct
# dans le formulaire html
}

print<<EoI;
</textarea>
<input type=hidden name=todo value=updatefetchmail>
<input type=submit value="Mise à jour">
EoI

#------------------------------------------------------------------------------

# le contenu du fichier modifié est transmis au script sous forme de
# paramètre au script qui ré-écrit le fichier
my $contenu=param("contenu");
my $FETCHMAILRC="$Home/.fetchmailrc";

open FETCHMAILRC,">$FETCHMAILRC";
print FETCHMAILRC "$contenu";
close FETCHMAILRC;
chmod (0600,$FETCHMAILRC)
and
print ".fetchmailrc mis en lecture seule pour $User. OK\n" ;


#------------------------------------------------------------------------------

Je ne trouve pas où je commets une faute : pourrait-on m'expliquer comment il
se fait que chaque fin ligne est ainsi transformé et comment y remédier ?

--
^^ Gauthier
(_____/°°-ç
| \_`-"
)/@mmm||
\nn \nn FOE-Belgium : http://www.amisdelaterre.be

4 réponses

Avatar
Paul Gaborit
À (at) 06 Apr 2005 22:00:43 GMT,
Gauthier écrivait (wrote):
# le contenu du fichier modifié est transmis au script sous forme de
# paramètre au script qui ré-écrit le fichier
my $contenu=param("contenu");
[...]


Je ne trouve pas où je commets une faute : pourrait-on m'expliquer comment il
se fait que chaque fin ligne est ainsi transformé et comment y remédier ?


C'est le navigateur (distant par définition) qui choisit l'encodage qu'il
souhaite utiliser... Le plus simple est donc de remplacer les trois types de
fin de ligne (Unix, Mac ou Windows) par celui que vous utilisez localement
avant de stocker votre fichier :

$contenu =~ s/(?:1512|15|12)/n/g;

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>

Avatar
Gauthier
Le Thu, 07 Apr 2005 10:32:32 +0200, Paul Gaborit a écrit:
C'est le navigateur (distant par définition) qui choisit l'encodage qu'il
souhaite utiliser... Le plus simple est donc de remplacer les trois types de
fin de ligne (Unix, Mac ou Windows) par celui que vous utilisez localement


Le plus étonnant, c'est que j'utilise Firefox sur lemême poste linux,
et qu'il m'ajoute des CRLF

avant de stocker votre fichier :

$contenu =~ s/(?:1512|15|12)/n/g;


OK, mais que signifie le ?: dans la première alternative ?

--
^^ Gauthier
(_____/°°-ç
| _`-"
)/@mmm||
nn nn FOE-Belgium : http://www.amisdelaterre.be

Avatar
Jacques Caron
Salut,

On 07 Apr 2005 19:10:20 GMT, Gauthier
wrote:

Le Thu, 07 Apr 2005 10:32:32 +0200, Paul Gaborit
a écrit:
C'est le navigateur (distant par définition) qui choisit l'encodage
qu'il
souhaite utiliser... Le plus simple est donc de remplacer les trois
types de
fin de ligne (Unix, Mac ou Windows) par celui que vous utilisez
localement


Le plus étonnant, c'est que j'utilise Firefox sur lemême poste linux,
et qu'il m'ajoute des CRLF


Normal, ce n'est pas dépendant de l'OS utilisé, mais édicté par la norme
HTML, qui dit que le séparateur de ligne est CR+LF (c'est pareil pour
HTTP, d'ailleurs):

http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4

avant de stocker votre fichier :

$contenu =~ s/(?:1512|15|12)/n/g;


OK, mais que signifie le ?: dans la première alternative ?


Il signifie que les () servent juste à grouper des alternatives, pas à
isoler un élément (c'est surtout utile pour un match, pour éviter de
mettre des alternatives dans des $n, ou dans un split, pour éviter de
mettre les séparateurs dans le tableau de destination, par exemple).

Jacques.
--
Interactive Media Factory
Création, développement et hébergement
de services interactifs: SMS, SMS+, Audiotel...
http://www.imfeurope.com/


Avatar
Gauthier
Le Thu, 07 Apr 2005 22:18:07 +0200, Jacques Caron a écrit:
OK, mais que signifie le ?: dans la première alternative ?


Il signifie que les () servent juste à grouper des alternatives, pas à
isoler un élément (c'est surtout utile pour un match, pour éviter de
mettre des alternatives dans des $n, ou dans un split, pour éviter de
mettre les séparateurs dans le tableau de destination, par exemple).

Jacques.


Un grand merci à tous,
--
^^ Gauthier
(_____/°°-ç
| _`-"
)/@mmm||
nn nn FOE-Belgium : http://www.amisdelaterre.be