[jabber] ajout du cgi pour créer un compte jabber

darcs-hash:20090728100655-bd074-9a4cf910f821f6b2dc69d8e9c74fe496ea6a37d7.gz
This commit is contained in:
Antoine Durand-Gasselin 2009-07-28 12:06:55 +02:00
parent e5d6982a1e
commit aaf52989f6
9 changed files with 521 additions and 0 deletions

16
jabber/403.py Executable file
View file

@ -0,0 +1,16 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
print "content-type: text/html"
print
file=open('/var/www/jabber/template')
html=file.read()
print html % "<p><img src='/erreurs/403.jpg' width='215' height='54' border='0' usemap='#Map'>\
<map name='Map'> \
</map>\
</p>\
<p><b><font size='4'>Page interdite</font></b></p>\
<p>Vous n'avez pas l'autorisation d'afficher ce répertoire ou cette page.</p>\
<p><b>Note :</b> l'inscritpion à jabber n'est possible que depuis les ordinateurs de la zone crans.</p>\
<p></p>"

25
jabber/404.py Executable file
View file

@ -0,0 +1,25 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
print "content-type: text/html"
print
file=open('/var/www/jabber/template')
html=file.read()
print html % "<p><img src='/erreurs/404.jpg' width='215' height='54' border='0' usemap='#Map'>\
<map name='Map'> \
</map>\
</p>\
<p><b><font size='4'> Page introuvable</font></b></p>\
<p> La page que vous voulez consulter est introuvable.</p>\
<p>Bon.</p>\
<p>On va pas en faire un drame non plus, hein ? <br>\
C'est p't&ecirc;t de notre faute si elle n'est pas l&agrave;, mais vous &ecirc;tes \
venu ici tout seul. On ne vous a pas forc&eacute;. Donc c'est votre probl&egrave;me.\
Pas le n&ocirc;tre.</p>\
<p>... et puis, en y r&eacute;fl&eacute;chissant un peu, est-ce que vous vouliez \
<i>vraiment</i> consulter cette page ? Est-ce que vous n'avez pas cliqu&eacute; \
sur un lien, comme &ccedil;a, au hasard ? Est-ce que vous n'avez pas tap&eacute; \
votre URL avec des moufles ? Est-ce que vous savez seulement taper sur un \
clavier ?</p> \
<p></p>"

87
jabber/fonctions.py Executable file
View file

@ -0,0 +1,87 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# # # # # # # # # # # # # #
# Génération de password #
# # # # # # # # # # # # # #
from whrandom import choice
import string
jabberuserdir='/var/lib/jabber/jabber.crans.org/'
def GenPasswd(length=8, chars=string.letters + string.digits):
return ''.join([choice(chars) for i in range(length)])
# # # # # # # # # # # # # #
# Parseur de templates #
# # # # # # # # # # # # # #
import re, sys
def parse(text, var_dictiary):
def replace(matchobj):
token = matchobj.group(1)
if var_dictiary.has_key(token):
return var_dictiary.get(token)
else:
return matchobj.group()
#raise NameError, 'parseur : variable inconnue : '+token
return re.sub('\{([^\}]+)\}',replace, text)
def parse_file(file_name, var_dictionary):
file = open(file_name, 'r')
text = file.read();
return parse(text, var_dictionary);
# # # # # # # # # # # # # #
# Modifier le fichier XML #
# # # # # # # # # # # # # #
def XMLChgePassword(XMLString, newPassword):
pattern = "<password xmlns='jabber:iq:auth'>(.*)</password>"
replace = "<password xmlns='jabber:iq:auth'>" + newPassword + "</password>"
XMLString = re.sub(pattern, replace, XMLString)
pattern = "<password xmlns='jabber:iq:auth' xdbns='jabber:iq:auth'>(.*)</password>"
replace = "<password xmlns='jabber:iq:auth' xdbns='jabber:iq:auth'>" + newPassword + "</password>"
return re.sub(pattern, replace, XMLString)
def chgePasswordForUser(user, newPassword):
fileName = jabberuserdir+user+".xml"
file=open(fileName)
xmlString=file.read()
xmlString = XMLChgePassword(xmlString, newPassword)
file=open(fileName,'w')
file.write(xmlString)
file.close()
os.chmod(fileName,0600)
# # # # # # # # # # # # # # #
# Lire le fichier XML #
# # # # # # # # # # # # # # #
def XMLMailForUser(user):
fileName = jabberuserdir+user+".xml"
file=open(fileName)
xmlString=file.read()
return re.sub("<email>([^<>]*)</email>",lambda m:m.group(1),re.search('<email>([^<>]*)</email>',xmlString).group())
# # # # # # # # # # # # # # #
# Envoyer des e-mails #
# # # # # # # # # # # # # # #
SENDMAIL = "/usr/sbin/sendmail" # sendmail location
import os
def sendmail(text):
p = os.popen("%s -t" % SENDMAIL, "w")
p.write(text)
sts = p.close()
if sts != None:
print "Sendmail exit status :", sts
# # # # # # # # # # # # # # #
# ok, maintenant on vas #
# faire des trucs #
# # # # # # # # # # # # # # #
# on regarde la variable des champs renvoyŽs par l'utilisateur
# si elle est dŽfinit (donc on a reu les rŽponses ˆ un forulaire)
# on execute l'action correspondante ; sinon on affiche la page par defaut

97
jabber/lostPassword.py Executable file
View file

@ -0,0 +1,97 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
########################################################################
# Fichier : lostPassword.py
# Qu'est-ce que ça fait : génère automatiquement un nouveau mot de passe
# et l'envoie à l'utilisateur
#
# Configuration :
#
# le répertoire où sont stoqués les fichiers xml des comptes jabber
#jabberuserdir='/var/lib/jabber/jabber.crans.org/' # Avec un / à la fin
from fonctions import jabberuserdir
# Le fichier de log
logfile='/var/log/jabber/inscriptions.log'
########################################################################
########################################################################
# Si on a reçu de champs du formulaire
# -> l'utilisateur a envoyer son login et son mail
# -> s'ils correspondent bien à un fichier xml
# on envoie le mail avec le nouveau mot de passe
# -> s'il y a une erreur, on réaffiche le formulaire
# Sinon on affiche juste la template du formulaire
import os, cgi, string, time, sys, fonctions
form = cgi.FieldStorage()
print "content-type: text/html"
print
erreur = ''
file=open('/var/www/jabber/template')
html=file.read()
try :
form['traitement'] # Si ne passe pas c'est que la page est donnée sans arguments
# Récupération des arguments et test
try :
user=form['user'].value
user=string.lower(user)
for i in user[:] :
if not i in string.lowercase+string.digits : raise
if not user[0] in string.lowercase : raise
col_user='FFFFFF'
except :
col_user='FF0000'
user=''
filename=jabberuserdir+user+".xml"
if user:
if not os.path.exists(filename) :
erreur+= "<b>Erreur : </b>login inconnu : "+user+"<br><br>"
col_user='FFFF00'
user=''
try :
mail = form['mail'].value
mail = string.lower(mail)
col_mail = 'FFFFFF'
if user:
if not mail == fonctions.XMLMailForUser(user): raise
except :
erreur+= "<b>Erreur : </b>adresse mail incorecte.<br><br>"
mail=''
col_mail='FF0000'
# Fin des tests
except : # si ce n'est pas passé : on a pas reçu le formulaire
user = '' ; col_user='FFFFFF'
mail = '' ; col_mail='FFFFFF'
if user and mail:
t=time.localtime()
timestamp=''
for i in [0,1,2,3,4,5] :
if t[i]<10 : timestamp += "0%s" % t[i]
else : timestamp += "%s" % t[i]
timestamp=timestamp[0:8]+"T"+timestamp[8:10]+':'+timestamp[10:12]+':'+timestamp[12:14]
newPassword = fonctions.GenPasswd()
# enregistrer le nouveau mot de passe
fonctions.chgePasswordForUser(user,newPassword)
# envoyer un mail
fonctions.sendmail(fonctions.parse_file('./templates/mail.tpl', {'mail':mail, 'password':newPassword}))
# ecrire la confirmation
print html % (fonctions.parse_file('./templates/new_password_confirm.tpl',{'mail':mail}))
# Paranoia : on loggue
#file=open(logfile,'a')
#file.write("%s %s %s %s.%s\n" % (timestamp, os.environ['REMOTE_HOST'], user, prenom, nom) )
#file.close()
else:
# on affiche le formulaire
print html % (fonctions.parse_file('./templates/new_password_form.tpl',{'mail':mail, 'user':user, 'col_user':col_user, 'col_mail':col_mail, 'erreur':erreur}))

149
jabber/register.py Executable file
View file

@ -0,0 +1,149 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
###########################################
# Système d'inscription en ligne à jabber #
# 14/02/2004 -- Frédéric Pauget #
###########################################
import os, cgi, string, time, sys
form = cgi.FieldStorage()
print "content-type: text/html"
print
file=open('/var/www/jabber/template')
html=file.read()
jabberuserdir='/var/lib/jabber/jabber.crans.org/' # Avec un / à la fin
logfile='/var/log/jabber/inscriptions.log'
page ="<H2>Création d'un compte Jabber.</H2>"
try :
form['traitement'] # Si ne passe pas c'est que la page est donnés sans arguements
# Récupération des arguments et test
try :
user=form['user'].value
user=string.lower(user)
for i in user[:] :
if not i in string.lowercase+string.digits : raise
if not user[0] in string.lowercase : raise
col_user='FFFFFF'
except :
col_user='FF0000'
user=''
filename=jabberuserdir+user+".xml"
if user :
if os.path.exists(filename) :
page += "<b>Erreur : </b>login déja pris.<br><br>"
col_user='FFFF00'
user=''
try :
pass1=form['pass1'].value
pass2=form['pass2'].value
if pass1!=pass2 : raise
password=pass1
col_pass='FFFFFF'
except :
password=''
col_pass='FF0000'
try :
nom=form['nom'].value
nom=string.capitalize(nom)
for i in nom[:] :
if not i in string.letters+' -' : raise
if not nom[0] in string.uppercase : raise
col_nom='FFFFFF'
except :
nom=''
col_nom='FF0000'
try :
prenom=form['prenom'].value
prenom=string.capitalize(prenom)
for i in prenom[:] :
if not i in string.letters+' -' : raise
if not prenom[0] in string.uppercase : raise
col_prenom='FFFFFF'
except :
prenom=''
col_prenom='FF0000'
try :
mail=form['mail'].value
mail = string.lower(mail)
if not mail[0] in string.lowercase : raise
if string.find(mail,'@')<1 : raise
if not (mail[-3] in '.' or mail[-4] in ('.')) : raise
for l in mail[:]:
if not l in (string.lowercase + string.digits + '-_.@') : raise
col_mail='FFFFFF'
except :
mail=''
col_mail='FF0000'
# Fin des tests
except :
user ='' ; col_user='FFFFFF'
nom='' ; col_nom='FFFFFF'
prenom='' ; col_prenom='FFFFFF'
mail='' ; col_mail='FFFFFF'
col_pass='FFFFFF'
if col_user!='FFFFFF' or col_pass!='FFFFFF' or col_mail!='FFFFFF' or col_nom!='FFFFFF' or col_prenom!='FFFFFF' :
page+="Certaines donnes sont incorrectes :<br><br>"
if user and password and nom and prenom and mail:
t=time.localtime()
timestamp=''
for i in [0,1,2,3,4,5] :
if t[i]<10 : timestamp += "0%s" % t[i]
else : timestamp += "%s" % t[i]
timestamp=timestamp[0:8]+"T"+timestamp[8:10]+':'+timestamp[10:12]+':'+timestamp[12:14]
file=open(filename,'w')
file.write("<xdb><password xmlns='jabber:iq:auth' xdbns='jabber:iq:auth'>%s</password>" % password)
file.write("<query xmlns='jabber:iq:register' xdbns='jabber:iq:register'>")
file.write("<username>%s</username>" % user)
file.write("<password xmlns='jabber:iq:auth'>%s</password>" % password)
file.write("<name>%s.%s</name>" % (prenom,nom) )
file.write("<email>%s</email>" % mail)
file.write("<x xmlns='jabber:x:delay' stamp='%s'>registered</x></query><foo xdbns='jabber:x:offline' xmlns='jabber:x:offline'>" % timestamp)
# file.write("<message from='jabber.crans.org' to='%s@jabber.crans.org'>\n" % user)
# file.write(" <subject>Bienvenue !</subject>\n")
# file.write(" <body>Bienvenue sur le seveur Jabber du Cr@ns -- Nous espérons que vous aprécierez ce service !</body>\n")
# file.write(" <x xmlns='jabber:x:delay' from='%s@jabber.crans.org' stamp='%s'>Offline Storage</x></message>" % (user, timestamp) )
file.write("</foo></xdb>")
file.close()
os.chmod(filename,0600)
# Paranoia : on loggue
file=open(logfile,'a')
file.write("%s %s %s %s.%s\n" % (timestamp, os.environ['REMOTE_HOST'], user, prenom, nom) )
file.close()
page += "<b>Enregistrement réussi :</b><br><ul>"
page += "<li>vous pouvez immédiatement vous connecter au serveur jabber du crans<br>"
page += "<li>Votre nom d'utilisateur est : %s<br>" % user
page += "<li>Le serveur est : jabber.crans.org<br>"
page += "<li>Votre JID est %s@jabber.crans.org<br>" %user
page += "<li>Le port standard est le 5222<br>"
page += "<li>Notre serveur accepte le SSL sur le port 5223 ('ancien SSL')<br>"
page += "</ul><p><b>Bonne utilisation de Jabber :)</b></p>"
page += "<p>Plus d'informations pour configurer son client sur le <a href=http://wiki.crans.org/VieCrans/UtiliserJabber>wiki</a>."
else :
page += "<table align=center border=1 cellpadding=5>"
page += "<form method=post>"
page += "<tr><td align=right>Identifiant souhaité (JID):<td bgcolor=#%s><input type=text name=user size=10 value='%s'>@jabber.crans.org" % (col_user,user)
page += "<tr><td align=right>Mot de passe :<td bgcolor=#%s><input type=password name=pass1 size=15>" % col_pass
page += "<tr><td align=right>Retaper mot de passe :<td bgcolor=#%s><input type=password name=pass2 size=15>" % col_pass
page += "<tr><td align=right>Nom :<td bgcolor=#%s><input type=text name=nom size=15 value='%s'>" % (col_nom,nom)
page += "<tr><td align=right>Prénom :<td bgcolor=#%s><input type=text name=prenom size=15 value='%s'>" % (col_prenom,prenom)
page += "<tr><td align=right>Adresse mail :<td bgcolor=#%s><input type=text name=mail size=30 value='%s'>" % (col_mail,mail)
page += "<tr><td align=right><td><input type=submit name=traitement value=\"S'inscrire\">"
page += "</table></form>"
print html % page

117
jabber/template Normal file
View file

@ -0,0 +1,117 @@
<HTML>
<HEAD>
<TITLE>.:: &nbsp; Jabber &nbsp; @ &nbsp; C r a n s &nbsp; ::.</TITLE>
<META NAME="keywords" CONTENT="crans, informatique, réseau, réseaux, cachan, ENS, école, normale, supérieure, ecole, superieure, jabber, xmpp">
<META NAME="description" CONTENT="Site web du CRANS, l'association qui gère le réseau des élèves de l'Ecole Normale Supérieure de Cachan">
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
<script language="JavaScript">
<!--
<!--
function MM_preloadImages() { //v3.0
var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}
function MM_swapImgRestore() { //v3.0
var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}
function MM_findObj(n, d) { //v4.0
var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
if(!x && document.getElementById) x=document.getElementById(n); return x;
}
function MM_swapImage() { //v3.0
var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}
function MM_reloadPage(init) { //reloads the window if Nav4 resized
if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}
else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();
}
MM_reloadPage(true);
// -->
function MM_displayStatusMsg(msgStr) { //v1.0
status=msgStr;
document.MM_returnValue = true;
}
//-->
</script>
<link rel="SHORTCUT ICON" HREF="/favicon.ico">
<link rel="stylesheet" href="/styles/crans.css" type="text/css">
</HEAD>
<BODY BGCOLOR=#FFFFFF leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" onLoad="MM_preloadImages('/images/presentation-hi.jpg','/images/presentation-down.jpg','/images/liens-hi.jpg','/images/liens-down.jpg','/images/informations-hi.jpg','/images/informations-down.jpg','/images/vie-hi.jpg','/images/vie-down.jpg','/images/annuaire-hi.jpg','/images/annuaire-down.jpg','/images/pages-perso-hi.jpg','/images/pages-perso-down.jpg','/images/webmail-hi.jpg','/images/webmail-down.jpg','/images/ssh-hi.jpg','/images/ssh-down.jpg')">
<div id="Texte" style="position:absolute; left:200px; top:152px; width:667px; z-index:1; overflow: visible; visibility: visible; background-color: #FFFFFF; layer-background-color: #FFFFFF">
%s
<br>
<hr>
<table width="650" cellpadding="0" cellspacing="0" border="0"><tr>
<td align=right><a href="/">Informations sur le serveur jabber du crans</a>
</table>
<p></p></div>
<div id="Titre" style="position:absolute; left:462px; top:42px; width:261px;
height:34px; z-index:2"><font size="5" color="#FFFFFF"><b>Jabber</b></font></div>
<TABLE WIDTH=1004 BORDER=0 CELLPADDING=0 CELLSPACING=0>
<TR>
<TD HEIGHT=138 COLSPAN=4> <a name="top"></a><IMG SRC="/images/ntop.jpg" WIDTH=1004 HEIGHT=138 name="top"></TD>
</TR>
<TR>
<TD WIDTH=145 rowspan="2"> <a href="https://www.crans.org/AssociationCrans/CransPresentation" onMouseOut="MM_swapImgRestore();MM_displayStatusMsg('Bienvenue sur le site du cr@ns');return document.MM_returnValue" onMouseOver="MM_swapImage('presentation','','/images/presentation-hi.jpg',1);MM_displayStatusMsg('Pr&eacute;sentation du cr@ns');return document.MM_returnValue" onMouseDown="MM_swapImage('presentation','','/images/presentation-down.jpg',1)" onMouseUp="MM_swapImage('presentation','','/images/presentation-hi.jpg',1)"><IMG SRC="/images/presentation.jpg" WIDTH=145 HEIGHT=36 name="presentation" border="0" ALT="presentation"></a></TD>
<TD WIDTH=21 ROWSPAN=9> <IMG SRC="/images/nborder.jpg" WIDTH=21 HEIGHT=242 name="border"></TD>
<TD WIDTH=47 HEIGHT=16 valign="top"> <IMG SRC="/images/nback.jpg" name="back" align="top"></TD>
<TD WIDTH=791></TD>
</TR>
<TR>
<TD HEIGHT=20></TD>
<TD></TD>
</TR>
<TR>
<TD WIDTH=145 HEIGHT=29> <a href="http://www.crans.org/" onMouseOut="MM_swapImgRestore();MM_displayStatusMsg('Bienvenue sur le site du cr@ns');return document.MM_returnValue" onMouseOver="MM_swapImage('liens','','/images/liens-hi.jpg',1);MM_displayStatusMsg('Liens &amp; Contacts');return document.MM_returnValue" onMouseDown="MM_swapImage('liens','','/images/liens-down.jpg',1)" onMouseUp="MM_swapImage('liens','','/images/liens-hi.jpg',1)"><IMG SRC="/images/liens.jpg" WIDTH=145 HEIGHT=29 ALT="liens" name="liens" border="0"></a></TD>
<TD></TD>
<TD></TD>
</TR>
<TR>
<TD WIDTH=145 HEIGHT=30> <a href="http://jabber.crans.org/" onMouseOut="MM_swapImgRestore();MM_displayStatusMsg('Bienvenue sur le site du cr@ns');return document.MM_returnValue" onMouseOver="MM_swapImage('informations','','/images/informations-hi.jpg',1);MM_displayStatusMsg('Informations techniques et administratives');return document.MM_returnValue" onMouseUp="MM_swapImage('informations','','/images/informations-hi.jpg',1)" onMouseDown="MM_swapImage('informations','','/images/informations-down.jpg',1)"><IMG SRC="/images/informations.jpg" WIDTH=145 HEIGHT=30 ALT="informations" name="informations" border="0"></a></TD>
<TD></TD>
<TD></TD>
</TR>
<TR>
<TD WIDTH=145 HEIGHT=30> <a href="http://www.crans.org/VieCrans" onMouseOut="MM_swapImgRestore();MM_displayStatusMsg('Bienvenue sur le site du cr@ns');return document.MM_returnValue" onMouseOver="MM_swapImage('vie','','/images/vie-hi.jpg',1);MM_displayStatusMsg('La vie du cr@ns');return document.MM_returnValue" onMouseDown="MM_swapImage('vie','','/images/vie-down.jpg',1)" onMouseUp="MM_swapImage('vie','','/images/vie-hi.jpg',1)"><IMG SRC="/images/vie.jpg" WIDTH=145 HEIGHT=30 ALT="vie" name="vie" border="0"></a></TD>
<TD></TD>
<TD></TD>
</TR>
<TR>
<TD WIDTH=145 HEIGHT=29> <a href="/cransonly/boxesprenom.html" onMouseOut="MM_swapImgRestore();MM_displayStatusMsg('Bienvenue sur le site du cr@ns');return document.MM_returnValue" onMouseOver="MM_swapImage('annuaire','','/images/annuaire-hi.jpg',1);MM_displayStatusMsg('Annuaire des adh&eacute;rents');return document.MM_returnValue" onMouseDown="MM_swapImage('annuaire','','/images/annuaire-down.jpg',1)" onMouseUp="MM_swapImage('annuaire','','/images/annuaire-hi.jpg',1)"><IMG SRC="/images/annuaire.jpg" WIDTH=145 HEIGHT=29 ALT="annuaire" name="annuaire" border="0"></a></TD>
<TD></TD>
<TD></TD>
</TR>
<TR>
<TD WIDTH=145 HEIGHT=28> <a href="https://perso.crans.org" onMouseOut="MM_swapImgRestore();MM_displayStatusMsg('Bienvenue sur le site du cr@ns');return document.MM_returnValue" onMouseOver="MM_swapImage('pagesperso','','/images/pages-perso-hi.jpg',1);MM_displayStatusMsg('Pages perso des adh&eacute;rents');return document.MM_returnValue" onMouseDown="MM_swapImage('pagesperso','','/images/pages-perso-down.jpg',1)" onMouseUp="MM_swapImage('pagesperso','','/images/pages-perso-hi.jpg',1)"><IMG SRC="/images/pages-perso.jpg" WIDTH=145 HEIGHT=28 ALT="pages perso" name="pagesperso" border="0"></a></TD>
<TD></TD>
<TD></TD>
</TR>
<TR>
<TD WIDTH=145 HEIGHT=29> <a href="https://webmail.crans.org/" onMouseOut="MM_swapImgRestore();MM_displayStatusMsg('Bienvenue sur le site du cr@ns');return document.MM_returnValue" onMouseOver="MM_swapImage('webmail','','/images/webmail-hi.jpg',1);MM_displayStatusMsg('Acc&egrave;s mail s&eacute;curis&eacute; (imp)');return document.MM_returnValue" onMouseDown="MM_swapImage('webmail','','/images/webmail-down.jpg',1)" onMouseUp="MM_swapImage('webmail','','/images/webmail-hi.jpg',1)"><IMG SRC="/images/webmail.jpg" WIDTH=145 HEIGHT=29 ALT="webmail" name="webmail" border="0"></a></TD>
<TD></TD>
<TD></TD>
</TR>
<TR>
<TD WIDTH=145 HEIGHT=31> <a href="https://ssh.crans.org/" onMouseOut="MM_swapImgRestore();MM_displayStatusMsg('Bienvenue sur le site du cr@ns');return document.MM_returnValue" onMouseOver="MM_swapImage('ssh','','/images/ssh-hi.jpg',1);MM_displayStatusMsg('Connexion SSH');return document.MM_returnValue" onMouseDown="MM_swapImage('ssh','','/images/ssh-down.jpg',1)" onMouseUp="MM_swapImage('ssh','','/images/ssh-hi.jpg',1)"><IMG SRC="/images/ssh.jpg" WIDTH=145 HEIGHT=31 ALT="ssh" name="ssh" border="0"></a></TD>
<TD></TD>
<TD></TD>
</TR>
<TR>
<TD WIDTH=166 HEIGHT=234 COLSPAN=2> <IMG SRC="https://jabber.crans.org/images/nleft.jpg" WIDTH=166 HEIGHT=234 name="left"></TD>
<TD></TD>
<TD></TD>
</TR>
</TABLE>
</BODY>
</HTML>

View file

@ -0,0 +1,4 @@
To: {mail}
Subject: Ton mouveau mot de passe Jabber
Ton nouveau mot de passe est : {password}

View file

@ -0,0 +1,2 @@
<H2>J'ai perdu mon mot de passe.</H2>
Ton mouveau mot de passe Jabber &agrave; &eacute;t&eacute; envoy&eacute; &agrave; l'adresse : {mail}

View file

@ -0,0 +1,24 @@
<h1 id="title">Jabber / Perte de mot de passe</h1>
<div id="content">
{erreur}
<div id="explications">
Tu as perdu ton mot de passe <em>jabber</em> et tu
souhaites en obtenir un nouveau. Il te suffit alors de completer et de valider
le formualire ci-dessous.
</div>
<div id="formulaire">
<form method="post">
<table border="1px" cellpadding="5px" cellspacing="0" style="form">
<tr>
<td align=right>Login (JID):
<td bgcolor={col_user}><input type=text name=user size=10 value="{user}">@jabber.crans.org
<tr>
<td align=right>Adresse mail :
<td bgcolor={col_mail}><input type=text name=mail size=30 value='{mail}'>
<tr>
<td align=right>
<td><input type=submit name=traitement value="OK">
</table>
</form>
</div>
</div>