[cpif] r282 - in trunk: . backend frontend-web
svn at argo.es
svn at argo.es
Mon Jul 16 18:28:07 CEST 2007
Author: jcea
Date: Mon Jul 16 18:28:04 2007
New Revision: 282
Log:
Ya podemos cambiar la direccion de correo electronico
de los usuarios, de forma confirmada.
Es decir, cuando se quiere cambiar una direccion de correo,
la ponemos en el perfil. El sistema envia un mensaje de
confirmacion a dicha direccion de correo, y hasta que
se pulsa sobre el enlace el cambio no es efectivo y se
sigue usando la direccion antigua.
Added:
trunk/frontend-web/url_email_confirmation.py
- copied, changed from r281, /trunk/frontend-web/url_logout.py
Modified:
trunk/TODO
trunk/backend/database.py
trunk/backend/upgrade.py
trunk/frontend-web/url_perfil.py
trunk/frontend-web/url_perfil_POST.py
Modified: trunk/TODO
==============================================================================
--- trunk/TODO (original)
+++ trunk/TODO Mon Jul 16 18:28:04 2007
@@ -295,3 +295,12 @@
correo electronico, muere vilmente. Nos quedamos sin sistema
de envio.
+- 20070716: FRONTAL WEB: Algunos "sanity check" en la direccion
+ de correo especificada por el usuario: no caracteres raros, no
+ longitud excesiva.
+
+- 20070716: FRONTAL WEB: Para la confirmacion de correo, tenemos
+ que saber nuestra URL. Ahora funciona porque tenemos la cabecera
+ "host", pero no podemos depender de ella si usamos un proxy
+ intermedio.
+
Modified: trunk/backend/database.py
==============================================================================
--- trunk/backend/database.py (original)
+++ trunk/backend/database.py Mon Jul 16 18:28:04 2007
@@ -1,7 +1,7 @@
# $Id$
-VERSION_DB="2007071503"
+VERSION_DB="2007071602"
import globales
@@ -244,6 +244,25 @@
if old_OpenIDs!=OpenIDs : # Solo grabamos si ha habido cambios
old_OpenIDs.clear() # Este tipo es persistente, asi que lo reutilizamos
old_OpenIDs.update(OpenIDs)
+
+def usuario_ask_new_email(conn,nick,email) :
+ nick_normalizado=normaliza_nick(nick)
+ usuario=conn.get_root()["usuarios"]["usuarios"][nick_normalizado]
+ import random,sys
+ nonce=str(random.randint(0,sys.maxint))+str(random.randint(0,sys.maxint))
+ usuario["new email"]=(nonce,email)
+ return nonce
+
+def usuario_confirm_new_email(conn,nick,nonce) :
+ nick_normalizado=normaliza_nick(nick)
+ usuario=conn.get_root()["usuarios"]["usuarios"][nick_normalizado]
+ nonce_orig,email=usuario.get("new email",(None,None))
+
+ if nonce_orig!=nonce : return False
+
+ del usuario["new email"]
+ usuario["email"]=email
+ return True
def usuario_add(conn,nick,datos,clave=None,email="",OpenIDs=set()) :
from durus.btree import BTree
Modified: trunk/backend/upgrade.py
==============================================================================
--- trunk/backend/upgrade.py (original)
+++ trunk/backend/upgrade.py Mon Jul 16 18:28:04 2007
@@ -226,4 +226,21 @@
root["config"]=conf2
conn.commit()
+ if root["version del foro"]=="2007071503" :
+ print "Actualizando la base de datos: 2007071503 -> 2007071601"
+ root["version del foro"]="2007071601"
+ for usuario in root["usuarios"]["usuarios"].itervalues() :
+ usuario["new email"]=None
+ conn.commit()
+
+ if root["version del foro"]=="2007071601" :
+ print "Actualizando la base de datos: 2007071601 -> 2007071602"
+ root["version del foro"]="2007071602"
+ for usuario in root["usuarios"]["usuarios"].itervalues() :
+ if "new email" in usuario :
+ del usuario["new email"]
+ conn.commit()
+
+
+
Copied: trunk/frontend-web/url_email_confirmation.py (from r281, /trunk/frontend-web/url_logout.py)
==============================================================================
--- /trunk/frontend-web/url_logout.py (original)
+++ trunk/frontend-web/url_email_confirmation.py Mon Jul 16 18:28:04 2007
@@ -2,8 +2,15 @@
from globales import monitor
-def gestiona_url(handler,path,usuario) :
- if len(path)!=1 : return None
- # Para borrar una cookie hay que mandarla con una fecha en el pasado.
- return (302,{"Set-Cookie":"cpif_auth=X; path=/; expires=Thu, 01-Jan-1970 01:00:00 GMT","Location":"/"},"")
+ at monitor
+def gestiona_url(conn,handler,path,usuario) :
+ if len(path)!=2 : return None
+ if not usuario :
+ return (200, {"Content-Type":"text/html; charset=utf-8"},"Para confirmar tu correo electrónico, debes estar autentificado primero")
+
+ import database
+ if database.usuario_confirm_new_email(conn,usuario,path[-1]) :
+ return (200, {"Content-Type":"text/html; charset=utf-8"},"Dirección de correo electronico confirmada")
+ else :
+ return (200, {"Content-Type":"text/html; charset=utf-8"},"Confirmación inválida")
Modified: trunk/frontend-web/url_perfil.py
==============================================================================
--- trunk/frontend-web/url_perfil.py (original)
+++ trunk/frontend-web/url_perfil.py Mon Jul 16 18:28:04 2007
@@ -29,7 +29,9 @@
texto=["<tr><td>Usuario:</td><td>%s</td></tr>" %usuario_pedido]
texto.append('<tr><td>Clave nueva:</td><td><input type="password" name="clave1" size="25" value="" /></td></tr>')
texto.append('<tr><td>Confirma clave nueva:</td><td><input type="password" name="clave2" size="25" value="" /></td></tr>')
- texto.append('<tr><td>Correo electrónico:</td><td>%s</td></tr>' %u["email"])
+ a="(Se ha solicitado un cambio de dirección de correo electrónico, y está pendiente de confirmación)" if "new email" in u else ""
+ texto.append('<tr><td>Correo electrónico:</td><td>%s %s</td></tr>' %(u["email"],a))
+ texto.append('<tr><td>Nueva dirección de<br/>correo electrónico:</td><td><input type="text" name="new_email" size=30 value="" /> </td></tr>')
OpenIDs=list(u["OpenID"])+["","","","",""] # Padding
texto.append('<tr><td>Servidores OpenID:</td><td><input type="text" name="OpenID1" size=55 value="%s" /></td></tr>' %OpenIDs[0])
texto.append('<tr><td align=right>(opcionales)</td><td><input type="text" name="OpenID2" size=55 value="%s" /></td></tr>' %OpenIDs[1])
Modified: trunk/frontend-web/url_perfil_POST.py
==============================================================================
--- trunk/frontend-web/url_perfil_POST.py (original)
+++ trunk/frontend-web/url_perfil_POST.py Mon Jul 16 18:28:04 2007
@@ -25,8 +25,9 @@
cuerpo=cgi.FieldStorage(fp=handler.rfile,headers=handler.headers,environ={'REQUEST_METHOD':'POST'},keep_blank_values=1)
clave1=cuerpo.getfirst("clave1")
clave2=cuerpo.getfirst("clave2")
+ new_email=cuerpo.getfirst("new_email")
avatar=cuerpo.getfirst("avatar")
- if clave1==None or clave2==None or avatar==None: # Comprobamos el caso de campos inexistentes
+ if clave1==None or clave2==None or new_email==None or avatar==None: # Comprobamos el caso de campos inexistentes
return None
clave1=clave1.strip()
@@ -60,6 +61,29 @@
pagina.load_url(["error"])
pagina.load_dict({"generic_message": "<h1>%s</h1>" %error})
return (pagina.web())
+
+ new_email=new_email.strip()
+ if new_email :
+ host=handler.headers.getheader("host")
+ if not host :
+ pagina.load_url(["error"])
+ pagina.load_dict({"generic_message": "<h1>La cabecera 'host' no existe</h1>"})
+ return (pagina.web())
+
+ from globales import smtp_email_sender
+ nonce=database.usuario_ask_new_email(conn,usuario_pedido,new_email)
+ texto=["From: %s" %smtp_email_sender]
+ texto.append("To: %s" %new_email)
+ texto.append("Subject: Confirmacion de cambio de correo electronico")
+ texto.append("")
+ texto.append("Autentifiquese en el foro y, despues, pulse sobre el")
+ texto.append("siguiente enlace:")
+ texto.append("")
+ texto.append("http://%s/email_confirmation/%s" %(host,nonce))
+
+ import smtp
+ smtp.enqueue(conn,[new_email],"\r\n".join(texto))
+
database.usuario_update(conn,usuario_pedido,clave=clave1,OpenIDs=OpenIDs)
More information about the cpif
mailing list