[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&oacute;nico:</td><td>%s</td></tr>' %u["email"])
+  a="(Se ha solicitado un cambio de direcci&oacute;n de correo electr&oacute;nico, y est&aacute; pendiente de confirmaci&oacute;n)" if "new email" in u else ""
+  texto.append('<tr><td>Correo electr&oacute;nico:</td><td>%s %s</td></tr>' %(u["email"],a))
+  texto.append('<tr><td>Nueva direcci&oacute;n de<br/>correo electr&oacute;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