Member of The Internet Defense League Últimos cambios
Últimos Cambios
Blog personal: El hilo del laberinto Geocaching

Módulo Nick2

Última Actualización: 24 de Diciembre de 2003 - Miércoles

Este módulo permite el empleo, por fin, de la base de datos distribuída para la gestión y autentificación de usuarios en el IRC.


Preguntas y Respuestas Frecuentes

  • El modo "+r".

  • Preguntas de Usuarios.

    • Mi nick es "^pepe^", pero "nick2" me lo cambia a "~pepe~".

      El IRC no distingue mayúsculas y minúsculas, por lo que nicks como "PePe" y "pEpE" son equivalentes. El IRC, asimismo, define algunas letras "especiales", debido a sus orígenes finlandeses. Dichas "letras" son "^", "~", "[", "{", "]" y "}".

      El "^" es equivalente al "~", el "[" a "{" y el "]" a "}". Y viceversa.

    • Las claves de "nick2" no admiten caracteres como el punto y coma (";"), y la arroba ("@").

      Efectivamente, los caracteres permitidos son las letras (mayúsculas y minúsculas), los números y los caracteres "[" y "]". Si introduces otros caracteres diferentes, se convertirán a uno de los caracteres válidos. Las reglas de conversión son técnicas y no se detallan aquí. La recomendación es que no se utilicen otros caracteres distintos de los válidos.

    • El primer y el séptimo carácter de las claves de "nick2" sólo puede ser "A", "B", "C" o "D", no los que explicas más arriba.

      Correcto. Se pueden meter otros caracteres, pero se convertirán a uno de esos cuatro.

    • Si meto una clave que es "convertida" a otra por contravenir las explicaciones de los puntos anteriores, mi clave original sin convertir funciona.

      La conversión almacena una clave "normalizada" en la base de datos distribuída. Cualquier clave que una vez "normalizada" coincida con ella, se dará por buena.

    • ¿Por qué todo este rollo de la "normalización"?.

      Explicación técnica:

      Las claves de "nick2" son claves de 64 bits, divididas en dos grupos de 32 bits. El primer grupo está representado por los primeros 6 caracteres de la clave, y el segundo grupo por los otros seis. Se representan, pues, 32 bits con 6 caracteres.

      Pero dado que cada carácter proporciona 6 bits de información (64 combinaciones), con 6 caracteres proporcionando 6 bits, tenemos 36 bits, no 32.

      Para reducir los 36 bits a 32, la convención que usa "nick2" es que el primer carácter de cada grupo sólo proporcione 2 bits, en vez de los 6 de los que es capaz. Eso reduce el primer carácter de cada grupo a cuatro valores, que son "A", "B", "C" y "D".

    • ¿Los nicks registrados por "nick2" caducan?

      Las reglas de caducidad de los registros en "nick2" son equivalentes a las del "nick" actual.

    • Acabo de migrar a "nick2", intento cambiar la clave usando "getnewpass" como recomienda el propio bot, pero el comando no me funciona.

      "getnewpass" sólo responde a usuarios con modo "+r". Si acabas de migrar y no has cambiado de nick, sigues sin tener el modo "+r".

      Lo que debes hacer es ponerte un nick cualquiera y, seguidamente, volver a ponerte tu nick real, con la clave que te ha dado "nick2". En ese momento obtendrás el modo "+r" y te funcionará el comando "getnewpass".

    • Tengo varios nicks registrados con la misma clave, y al migrarlos a "nick2" me asigna la misma clave a todos.

      Las claves que "nick2" genera al migrar un nick no son aleatorias, como pueda creerse, sino que se toma la clave original que estaba en "nick", se "normaliza" y, el resultado, es la clave proporcionada por "nick2".

      Por lo tanto, si dos nicks tienen la misma clave en "nick", tendrán la misma clave en "nick2" al hacer la migración, hasta que se les dé una clave nueva con "getnewpass".

    • Puedo obtener el modo "+r" tanto usando la vieja clave de "nick" como la nueva proporcionada por "nick2".

      Como se ha explicado en el punto anterior, mientras no se cambie la clave con "getnewpass", la clave de "nick" y la de "nick2" son EQUIVALENTES, aunque sean distintas. Es decir, se pueden utilizar ambas, como se ha descrito más arriba.

      Se recomienda, no obstante, utilizar la de "nick2".

    • La clave proporcionada por "nick2" es imposible de recordar.

      No la recuerdes. Escríbela en un papel (mejor en dos y guárdalos en sitios distintos, por si pierdes uno), en el móvil, etc.

      No insistas con "getnewpass"; las claves generadas son aleatorias y no te va a dar nunca la que tú quieres :-)

    • ¡¡Pero yo quiero ponerme mi propia clave!!.

      Usa el comando "setpass".

      Nota Importante:

      Aunque el tema está todavía abierto a discusión, el modo "+r" abrirá la puerta a un enorme número de servicios nuevos, que se irán poniendo online a lo largo de los próximos meses. Un ejemplo es la agenda, por poner un caso, lleva funcionando un par de años.

      Debido a ello, es imperativo que el modo "+r" esté muy protegido, ya que puede dar acceso a datos de carácter personal y sensible. En ese sentido hemos preferido que las claves las proporcionemos nosotros, de forma aleatoria, y así poder garantizarles una calidad de 64 bits. Aunque muchos usuarios saben cómo crear y usar claves de calidad, la mayoría de la población de IRC-Hispano sigue usando el "pw1234" original proporcionado por "nick"...

      Se recomienda encarecidamente a los usuarios que usen "getnewpass" para que el sistema les genere una clave aleatoria, óptima en términos de calidad y seguridad.

    • Intento ejecutar un comando "GHOST", pero "NiCK" me dice que la clave no es válida

      Las claves de nick y nick2 pueden no coincidir, según las circunstancias. La solución más sencilla es que cuando cambiemos de clave en nick2, pidamos a un oper de la red que nos haga un "SENDPASS".

      Hay que recordar, no obstante, que la clave que se fijará en "nick" no es la clave del usuario, si no la versión normalizada de la misma.

      Esta medida es temporal, y no será necesaria cuando se implemente directamente el "GHOST" a nivel de servidor.

    • ¡¡Puedo identificarme escribiendo menos caracteres de los que contiene mi clave!!

      Para ello hay dos explicaciones:

      1. La clave que hemos puesto tiene más de 12 caracteres.

        nick2 solo maneja claves de hasta 12 caracteres. Si poner más, se ignoran. Asimismo, cuando metas la clave sólo se tendrán en cuenta los primeros 12 caracteres.

      2. La clave que hemos puesto tiene menos de 12 caracteres.

        nick2 completa la clave introducida, hasta los doce caracteres que utiliza, con letras "A". Ese relleno es opcional a la hora de escribir la clave: lo podemos escribir entero, no escribir ninguno en absoluto, o poner cualquier número de letras "A". Todas esas claves son equivalentes.

      Debido a todo lo dicho en esta sección y otras, recordamos a los usuarios que la forma de tener la clave más segura y de mayor calidad es emplear el comando "getnewpass", que nos garantiza 64 bits 100% aleatorios. Si usamos "setpass" la calidad de las claves dependerá de la pericia del usuario, y la experiencia dicta que, en general, la calidad de las claves elegidas por el usuario es baja.

      Si te molesta aprenderte una clave tan larga y difícil, ¡no te la aprendas!. La copias en tu móvil, la escribes en un papel que llevas en tu cartera, etc. :-).

    • nick2 me suelta mensajes sobre propagación de registros de no se qué de base de datos distribuída

      Las últimas versiones de nick2 ya no envían esa información al usuario.

    • ¿Qué es eso que pone nick2 en la ayuda sobre un tal "token"?

      Las últimas versiones de nick2 ya no publicitan el parámetro "token" en la ayuda, para evitar confusiones a los usuarios.

    • El usuario escribe la clave que le ha dado "nick2", o la que le llega por correo con un "SENDPASS", pero no le funciona

      Existen dos opciones:

      1. El usuario migró al principio del despliegue de "nick2":

        Si la clave del usuario en "nick" contenía caracteres no válidos, existe la posibilidad de que la clave obtenida al migrar no funcione. En ese caso la solución es avisarme, para que le dé una clave nueva y se la envíe por email.

        Los usuarios que migran ahora no se encontrarán con este problema, porque si a "nick2" no le gusta la clave, generará una, 100% aleatoria y válida.

        Se supone que no hay usuarios con este problema, porque el bug se solucionó enseguida y los usuarios con claves no válidas ya deberían haber informado sobre su problema, con lo que ya lo tendrán solucionado.

      2. El usuario es nuevo o acaba de generar una nueva clave con "GETNEWPASS":

        Dependiendo del tipo de letra que estemos utilizando, algunos caracteres de la clave pueden confundirse. Un claro ejemplo son el "O" y el "0", así como el "l", "1" e "I".

  • Preguntas de Operadores.

    • ¿Qué hacemos si un usuario pierde u olvida su clave?

      Exactamente lo mismo que se ha hecho siempre, pero usando "nick2" en vez de "nick". En particular, "nick2" dispone del comando "sendpass", para que el usuario reciba su clave por correo electrónico. Si "nick2" se queja de que un usuario no está migrado, debemos ejecutar el comando en "nick", como siempre.

      Actualmente "nick2" envía la clave al usuario, tanto haya migrado como no.

    • Hago un "sendpass" a un usuario con "+r" y recibe la clave "AAAAAAAAAAAA", que no le funciona.

      Eso es debido a que es un usuario "+r" histórico, que no migró a "nick2" sino que se le dio de alta en el sistema antes de la existencia de dicho bot. Existen, aproximandamente, unos 300 usuarios en dicha situación. Son usuarios a los que se le dio de alta de forma manual para evaluar el funcionamiento de "+r", la agenda, etc.

      Dado que dichos usuarios existen en el sistema con "+r" antes de existir "nick2", el bot desconoce la clave del usuario. Como no la conoce, no puede enviarla por email.

      Existen dos soluciones:

      1. Los usuarios "históricos" pueden dejar de serlo haciendo un "getnewpass". Ese comando les generará una clave nueva, que ahora conocerá "nick2" y, por lo tanto, se les podrá enviar por email.

      2. Si el usuario pierde la clave pero sigue siendo "histórico", debe hablar conmigo personalmente.

      Es importante recordar que si bien la clave "AAAAAAAAAAAA" no es válida para autentificarse en la red, si se ha hecho un "SENDPASS", sí permitirá hacer un ghost a través de "nick". Esto no se considera un problema porque los nicks históricos desaparecerán pronto de la red, ya que son una pesadilla de mantenimiento.

    • Si se hace un "drop" a un nick con "+r", ¿Qué ocurre?.

      Si el "drop" se realiza a través de "creg", éste se encargará de informar tanto a "nick" como a "nick2".

      Dado que "creg" no verifica el correcto funcionamiento de su orden de borrado, si "nick2" está fuera de servicio, el borrado se perdería. Este hecho, normalmente, es fácilmente detectable porque tiempo después se puede verificar que el nick sigue existiendo. En ese caso, basta con realizar un nuevo "drop" sobre el mismo nick.

    • Si se hace un "suspend" a un nick con "+r", ¿Qué ocurre?.

      Este comando es exclusivo de "nick" y no afecta a "nick2". En otras palabras:

      • Los servicios dependientes de "nick" quedarían suspendidos: nick, chan, memo...

      • Los servicios dependientes de "nick2" no se verán afectados: agenda...

      En el futuro es posible que se implemente un comando "suspend" en "nick2", pero es poco probable.

      Si lo que se pretende es dar un toque de atención a un usuario, se recomienda el uso del comando "NICKFORBID" de "nick2". Dicho comando prohibirá el uso del nick en cuestión en la red, por lo que no podrá ni acceder a los servicios de "nick" ni a los de "nick2". Este comando no es destructivo, y su efecto se deshace con "NICKUNFORBID". El usuario recuperará su nick, su clave de acceso y todos los servicios, como si nada hubiera pasado.

    • ¿Por qué "nick2" no utiliza las funcionalidades rename, bajo ciertas circunstancias?

      En algunos momentos resultaría muy conveniente que "nick2" hiciese un rename:

      • Cuando un usuario ha completado su migración de "nick" a "nick2", debemos asegurarnos de que haya copiado la clave y sepa autentificarse. Lo mejor para ello sería hacerle un rename y pedirle que se vuelva a poner su nick.

      • Idem en el "SETPASS"

      • Idem en el "GETNEWPASS"

      Lamentablemente esta funcionalidad necesita disponer de U-Line en toda la red, algo que -hoy por hoy- resulta una utopía.

    • ¿Cuáles son los detalles de la expiración de claves?

      Por razones de seguridad, los OPER están obligados a cambiar de clave de forma periódica. Los criterios son los siguientes:

      1. Menos de un mes desde el último cambio de clave: Todo normal.

      2. Entre uno y dos meses desde el último cambio de clave: "nick2" informará al usuario en cuestión, cada vez que se conecte, de que debe renovar su clave.

      3. Más de 2 meses desde el último cambio de clave: Cuando el usuario se conecte, "nick2" le enviará un mensaje urgiéndole a regenerar su clave en esa misma conexión. Adicionalmente, "nick2" prohibirá usos subsiguientes del nick cuya clave ha expirado, hasta que se le genere una clave nueva.

    • No puedo hacer un "SETPASS"

      Hay dos posibilidades:

      • Soy OPER

        Los opers no tienen acceso al comando "SETPASS", por razones de seguridad. La activación de una nueva clave debe realizarse a través del comando "GETNEWPASS".

      • Fui OPER, pero dejé de serlo hace tiempo

        Para evitar usos "inteligentes" del flag "+h", "nick2" no permite el uso del comando "SETPASS" a ningún usuario que haya tenido el modo "+h" en los últimos tres meses. Si has dejado de ser un OPER, recuperarás el uso de "SETPASS" al cabo de tres meses. Mientras tanto, deberás seguir usando "GETNEWPASS".

    • Cambié mi clave hace poco, pero "nick2" insiste en que ya ha expirado

      "nick2" no guarda las fechas de los cambios de clave de todos los usuarios, lo que sería un gasto inútil de recursos. Tan solo almacena la fecha de cambio de clave para los nicks con modo "+h"; es decir, para los OPER.

      Si eres un OPER reciente, "nick2" no tiene ni forma de saber la fecha de tu último cambio de clave, ni sabe si lo hiciste con "SETPASS" o "GETNEWPASS". Por lo tanto, se cura en salud y asume que ya te has pasado de plazo. Esto permite, asimismo, asegurarnos de que los nuevos OPER tengan una clave de calidad.


TO DO

  • El comando "hacer_migracion" no debería salir a los usuarios con modo "+r", a menos que sean opers.
  • Documentar autentificación con BITCH-X.
  • Hacer algo con la gente que ya tiene claves del tipo "pwxxxx", o claves muy débiles con un montón de "A", puestas antes de los filtros implementados en la versión 1.69 de "nick2".
  • Fijar una longitud mínima de las claves.
  • Documentar en la FAQ que ahora, según la clave que tengamos en "nick", la clave de "nick2" se deriva de ella o es 100% aleatoria.
  • Al hacer log debería ser posible poner un remitente "None".
  • En "NICKFORBID" y "NICKSUSPEND" se debería poder indicar una fecha de fin de acción.
  • Cuando registro un nick con "NICKREGISTER", si hago una expiración sin que el usuario se conecte, el nick puede expirar, porque su timestamp es cero.
  • Si hacemos un "NICKDROP" a un nick que entra antes de que se propague el cambio en la BDD (por ejemplo, split), "nick2" lo marcará como "histórico".
  • En los históricos de nicks que guarda "nick2", pueden aparecer muchos informes de migración para el mismo nick, ya que el usuario puede migrar varias veces su nick mientras no cambie de nick (o reconecte) para conseguir el +r.


Historia

Los números de versión que se indican se refieren a "commit" en el CVS interno. El número de versión cargado en Olimpo en un momento dado es visible usando el comando "dllist".

  • 19/Jul/01 Versión 1.9

    • Cuando entra un nick con flag "+r", se guarda una entrada en la base de datos con: estado (0 si desconocido), clave (0 si desconocido), timestamp de la última entrada (0 si desconocido).

    • Si un usuario con modos "+o" y/o "+h" le abre un privado, le envía notificaciones de entrada de usuarios con "+r", indicando la fecha de la última conexión.

  • 20/Jul/01 Versión 1.17

    • Se implementa el comando de ayuda.

    • Se implementa el comando "NICKDROP", disponible solo para mí. Este comando elimina también la entrada en la base de datos local, y lo comunica al resto de módulos.

    • Asimismo, si recibe notificaciones de "NICKDROP" de otros módulos, elimina la entrada correspondiente de su base de datos.

  • 25/Jul/01 Versión 1.32

    • Se implementan los comandos "NICKREGISTER", "NICKFORBID" y "NICKUNFORBID", disponibles solo para mí.

    • Se implementa el comando "GETPASS", solo para mí.

    • Se implementa el comando "NICKINFO", disponible para todos los usuarios.

    • Solucionados un par de problemas con el comando "NICKUNFORBID", cuando:

      1. Se han hecho varios "NICKFORBID" sobre el mismo usuario.
      2. Se ha hecho un "NICKFORBID" sobre un usuario no registrado.

    • Se implementa el log de comandos.

    • Implementado el comando "GETNEWPASS". Este comando genera una nueva clave para el usuario. Para evitar usos inadvertidos o ingeniería social, el comando nos generará un "token" que el usuario deberá devolver al sistema para ejecutar el comando realmente.

      El "token" es un valor aleatorio, diferente para cada conexión (aunque sea el mismo nick) y con una validez de 20 minutos. Su aleatoriedad es de 30 bits, por lo que existen unos mil millones de posibilidades.

  • 26/Jul/01 Versión 1.41

    • Implementado el comando "HACER_MIGRACION".

    • Implementado el comando "SENDPASS". Funciona de la forma siguiente: intenta hacer un "setpass" en el "nick" tradicional, seguido de un "sendpass". Esto es debido a que este módulo no sabe la dirección de correo electrónico del usuario.

    • ¡¡¡Entrada en servicio!!!.

  • 30/Jul/01 Versión 1.45

    • Muy a mi pesar, implemento el comando "setpass". La gente se pondrá claves pobres, en vez de las claves de alta calidad de "getnewpass" :-(.

    • Cuando un usuario sin "+r" ejecuta "setnewpass", ahora se le advierte de que debe activar el modo "+r", en vez de ignorarle completamente.

  • 01/Ago/01 Versión 1.58

    • Por petición popular, se eliminan los mensajes informativos sobre propagación de registros por la base de datos distribuída, ya que confunden y asustan a los usuarios. En realidad no elimino los mensajes, que pueden ser útiles con fines de depuración, sino que su visualización -ahora- es dependiente de un flag.

    • Se mejora la ayuda del módulo, de cara a los usuarios, con la colaboración de los operadores. En particular, se eliminan las referencias al "token", confusas para el usuario pero de significado evidente si se prueba el comando.

    • Por coherencia con los bots actuales, cambio "nick2" por "NiCK2", como nick del módulo.

    • Cambiadas referencias a "mail" y similares por "correo electrónico".

    • Cambio el mensaje "El 'token' especificado no es valido" por "El 'token' especificado no es valido o ya ha caducado".

    • Implemento el comando "EXPIRE", disponible exclusivamente para mí, y que hace lo siguiente:

      1. Revisa toda la base de datos de nicks registrados y hace una lista con aquellos que llevan más de un mes (30 días) sin conectarse.

      2. Los nicks que cumplen esa propiedad son transferidos a "nick", para que diga si los ha purgado o no, por su cuenta.

      3. Los nicks que haya purgado "nick" son borrados también de las bases de datos de "nick2" y de la BDD.

      Este comando debe ejecutarse de forma manual de vez en cuando. Por ejemplo, una o dos veces por semana.

  • 09/Ago/01 Versión 1.69

    • Implemento un comando "nicks_lista", para volcar la base de datos en un formato ASCII fácil de archivar.

    • Cuando un usuario migra, su registro toma el timestamp actual. En cambio, si se registra con "NICKREGISTER", su timestamp será cero (uno de enero de 1.970). Así reducimos el tráfico de verificación de expiraciones y sabemos cuándo se ha conectado el usuario, aunque sea la sesión en la que ha realizado la migración y no haya activado su modo "+r".

    • En el comando "SETPASS", cuando un usuario desea activar una clave de más de 12 caracteres, se le recorta a 12 y se le informa de este hecho.

    • En el comando "SETPASS", si el usuario especifica caracteres no válidos (no "a-zA-Z0-9]["), su clave se rechaza. Es preferible eso a aceptar claves cuya clave normalizada es de baja calidad, ya que los caracteres no válidos se reemplazarían por "A".

    • Si el usuario tiene una clave en "nick" que contiene caracteres inválidos para "nick2", durante "HACER_MIGRACION" se generará una clave aleatoria nueva, por las mismas razones que en el punto anterior.

    • Cuando un usuario ejecuta "HACER_MIGRACION", no se le muestra la clave normalizada, aunque internamente sea la que se almacena. Con ello evitamos, aparte de la confusión de la gente, el que muchos usuarios hagan un "SETPASS" a continuación, exactamente con la misma clave.

    • No se toleran claves del tipo "pwxxxx", ya que son las claves generadas por defecto por "nick", y con el nuevo esquema de base de datos distribuida, esas claves se pueden atacar rápidamente de forma trivial. Si el usuario tiene una clave de ese tipo en "nick" al hacer la migración, se le genera una clave al azar. Si intenta ponerse una clave de ese tipo con "SETPASS", no se le permite.

  • 14/Ago/01 Versión 1.84

    • Cambio "NiCK2", y lo vuelvo a dejar como "nick2".

    • Cuando se elimina un nick, ya sea por drop o por expiración, hay que actualizar también las tablas "o" y "v", para evitar que un usuario posterior que registre el nick herede sus privilegios.

    • Cuando se hacía un "NICKFORBID" de un nick nuevo (no registrado en "nick2"), aparecía marcado como histórico. Solucionado.

    • Cuando un usuario hace la migración, se le informa de que debe preocuparse de tener una dirección de email correcta registrada en "nick".

    • Añado el comando "ADMINADD", disponible solo para mí, para añadir nuevos administradores en "nick2".

    • Añado el comando "ADMINDEL", disponible para mí y para los administradores de "nick2", para eliminar a uno.

    • Añado el comando "ADMINLIST", disponible para mí y para los administradores de "nick2", para listar los administradores actuales en este módulo.

    • Reescribo el comando "NICKDROP", para que esté disponible también para administradores de "nick2".

    • Cuando se elimina un nick, lo eliminamos también de la lista de administradores de "nick2", si es preciso.

    • Cuando un oper intenta ejecutar los comandos anteriores, le sale un mensaje diciéndole que necesita ser administrador.

    • Reescribo "lista_nicks" para mostrar adecuadamente la lista de administradores.

    • Reescribo los comandos "NICKFORBID" y "NICKUNFORBID", para que estén disponibles también para administradores de "nick2".

  • 23/Ago/01 Versión 1.87

    • Cuando se hace un "SENDPASS", si el usuario no está migrado, informa de este hecho pero solicita a "nick" que envíe la clave de toda la vida.

    • Implemento los comandos "NICKNOEXPIRE" y "NICKEXPIRE", disponibles solo para mí. Aunque al principio pensaba que estos comandos no eran necesarios, utilizando las funcionalidades del "nick", me he dado cuenta de casos extremos interesantes, como el hecho de que si un usuario se pasa conectado más de un mes, el sistema puede expirarlo porque hace más de un mes desde su última conexión, aunque siga conectado. Esto no tiene importancia para usuarios normales, pero sí para bots.

    • Amplío el comando "NICKINFO" para hacerse eco de ese nuevo estado.

    • Cuando un usuario no tenga estado, no lo imprimimos en "NICKINFO", para no confundir a la gente. Anteriormente se visualizaba una línea de estado vacía.

  • 29/Ago/01 Versión 1.118

    • Solucionado un problema con los mensajes que me salen con "NICKREGISTER".

    • Reprogramo toda la gestión de admins, para hacerla más orientada a objetos y aislar los cambios en un único objeto.

    • Cambios menores para hacer el módulo más orientado a objetos, con el fin de limitar los cambios.

    • Cuando expiro nicks, me da el total de registros verificados, y el número de verificaciones por segundo, con fines estadísticos y de evaluación del rendimiento.

    • Reescritura casi completa de toda la interfaz con la base de datos, orientándolo más a objetos, con el fin de limitar los cambios futuros. Esta reescritura supone la práctica refactorización completa del proyecto.

    • Implemento un comando "NICKFORBIDREFRESH", que repasa toda la base de datos y regenera las claves de probibición que se han difundido por la red.

  • 31/Ago/01 Versión 1.148

    • Para evitar problemas, modifico "nick2" y el comando "nicks_lista" para que los registros especiales empiecen con un espacio. Los registros especiales son registros administrativos de "nick2", como la lista de admins o información sobre las expiraciones de claves.

      Hago una versión intermedia, que migre los registros administrativos actuales al nuevo sistema de nombramiento.

    • Pongo expiración para las claves de los usuarios especiales, de un mes. Al cabo de ese mes, nick2 les informa que deben cambiar de clave.

      Un nick es especial cuando ha conectado alguna vez con el modo "+h".

    • Los nicks especiales no tienen acceso al comando "SETPASS".

    • Añado el comando "EXPIREDPASS", solo para mí, que me lista los nicks con expiraciones de claves en curso.

    • Si un nick especial no utiliza "+h" durante tres meses, pierde su estatus de especial. Esto es útil, por ejemplo, porque un ex-oper seguirá teniendo expiraciones de claves de nick, y seguirá sin poder usar "SETPASS". Con esta funcionalidad, una vez que un oper deja de serlo, al cabo de un tiempo "nick2" se olvida de que es especial, y lo tratará como a cualquier otro usuario.

    • Añado el comando "SENDNEWPASS", disponible para los admins, que genera una nueva clave para un nick y se la envía por correo. Esto es útil, por ejemplo, para el refresco de claves de bots.

  • 07/Sep/01 Versión 1.180

    • Cuando avisamos a un usuario de que debe renovar su clave, le indicamos también cuántos días le quedan antes de que su nick deje de ser utilizable.

    • Solucionado un grave problema en la migración: si la clave del usuario medía menos de 12 caracteres, existía la posibilidad de que la clave almacenada en la base de datos no se corresponda a la clave real del usuario. Ello no tiene mayor importancia hasta que el usuario solicita un "sendpass", ya que la clave que le llega por correo no coincide con la clave real necesaria para utilizar el nick.

      Aunque el problema ya está solucionado, es muy posible que muchas claves en la base de datos estén mal. Afortunadamente, son recuperables. Me escribo un pequeño programa que lee la base de datos de disco, y comprueba si las claves coinciden con las distribuidas por BDD. Si es el caso, no hace nada. Si no es el caso, va eliminando caracteres al final de la clave, y volviendo a comprobar, hasta que coincide. Cuando coincide, actualiza la clave real.

      Si el usuario, tras la migración, hizo un "SETPASS" o un "GETNEWPASS", la clave en la base de datos será correcta, ya que el problema se producía, exclusivamente, durante el proceso de migración.

    • Cuando trabajamos con cursores, ocurría un core dump si cerrábamos una transacción sin haber agotado el cursor (sin haber llegado al final del "next"). Reescribo el método de compromiso de transacción para que cierre el cursor si intentamos comprometer una transacción con un cursor abierto en su interior.

    • Si un nick está bloqueado porque su clave expiró, no permite que se realice sobre él un "UNFORBID".

  • 07/Sep/01 Versión 1.190

    • Implemento el comando "GNP", sólo para OPERs, que es equivalente al comando "GETNEWPASS", pero sin el trámite del token. Está pensado para ser utilizado por bots, no por personas.

    • Implemento el comando "FORGETNICKDROPS", disponible solo para mí, que elimina el registro "NICKDROPS" en la base de datos "db.varios". Este registro se utiliza para guardar memoria de los "NICKDROP" que se hacen, para comunicárselos a los módulos dinámicos no cargados en este momento.

      Dado que este registro crece sin cesar a medida que se van eliminando nicks, añado este comando para borrarlo y empezar desde cero.

      Antes de ejecutar este comando debemos asegurarnos de que todos los módulos dinámicos que entienden de nicks estén al día en cuanto a "NICKDROPS" (por ejemplo, la agenda), porque sino puede ser que dejemos de borrar registros de usuarios que ya no existen.

  • 09/Ene/02 Versión 1.221

    • Tenía un error de programación en la gestión de expiraciones hard de claves de nick. Fallaba un "assert" y dejaba bloqueos en la base de datos.

    • Solucionado un bug tonto al desbloquear (vía "GNP", "GETNEWPASS" o "SENDNEWPASS") un nick previamente bloqueado porque su clave haya expirado.

    • Solucionados unos problemas de visualización de usuarios con claves en períodos de expiración (comando "EXPIREDPASS").

    • Cuando no sabemos la fecha de la última entrada de un nick, en vez de imprimir "Thu Jan 1 01:00:00 1970", que se corresponde con el "TimeStamp" de cero, imprimimos "No tengo constancia de su ultima entrada en la red", menos confuso para los usuarios (comando "NICKINFO").

    • En "EXPIREDPASS", para los usuarios que ya no son opers, se muestra tanto la fecha del último cambio de clave, como la fecha de su primera entrada sin "+h".

    • Aprovechando la ampliación del API de Olimpo, cambio la forma de hacer log de las expiraciones de nicks.

    • Hago pequeños cambios en "nick2" para acomodar el nuevo servicio de extensión de caducidad de nicks bajo pago.

    • Muestro en los logs el tiempo empleado en expirar cada nick, para intentar mejorar el rendimiento del proceso.

    • Aprovechando la ampliación del API de Olimpo, realizo expiraciones de nicks de forma automática: cada minuto escaneamos 1000 registros de la base de datos, y verificamos los candidatos para la expiración. De esta forma ya no es necesario utilizar el comando "EXPIRE" para realizar una expiración global, ya que "nick2" revisará automáticamente 1000 registros por minuto.

    • Solucionado un problema con la expiración periódica de nicks, cuando un período coincide justo con el final de la base de datos y no se llega a repasar ningún nick.

  • 09/Ene/02 Versión 1.262

    • "nick2" almacena la fecha de alta del usuario en su base de datos local.

      Para dotar de esa información a los nicks ya registrados, casi 60.000 en este momento, en este módulo se los pregunto uno por uno a "NiCK".

    • Amplío el comando "NICKINFO" para que indique la fecha de alta, si se conoce.

    • Amplío el programa de backup para que guarde también esta información de los nicks.

    • Cambio el programa de backup para que guarde timestamps, no las fechas como texto.

    • Sólo migraremos la fecha de registro de un nick en la red cuando el nick sea "expirable". En particular, ignoramos los nicks en "forbid".

    • Si cuando hacemos la migración de fechas de alta de nicks nos encontramos con que en "NiCK" hay nicks que no existen, me los cargo también de "nick2". Esto es útil cuando, por ejemplo, "NiCK" "pierde" registros.

    • Si cuando migramos fechas nos encontramos con un nick en "forbid" en "NiCK", lo ponemos en "forbid" también en "nick2".

    • Solucionado un problema con "NICKFORBID" de nicks inexistentes, introducido durante uno de los cambios recientes de "nick2".

    • Amplío "nick2" para poder migrar la base de datos de nicks en "forbid" que tenía "NiCK", y así eliminarle esa funcionalidad. Ésta es una rutina de un solo uso, pero la dejo en el código como ejemplo, aunque no pueda ser llamada de nuevo.

    • Cuando se hace un "NICKFORBID", marca el registro como "histórico". Solucionado.

  • 26/Feb/02 Versión 1.280

    • En vez de indicar "escribe getnewpass TOKEN", ponemos "escribe /msg nick2 getnewpass TOKEN", y similares. Esto facilita la tarea de usuarios que desconocen los detalles del IRC y cuyos privados a "nick2" les salen en la ventana de estado, en vez de en una ventana separada y propia.

    • Ahora los usuarios normales pueden usar el comando "sendpass". Las reglas son:

      1. El nick que solicita el envío debe ser +r.

      2. El nick que solicita el envío NO debe haber pedido otro envío en las últimas 24 horas.

      3. El nick al que se quiere enviar su clave NO debe haber recibido otro envío en las últimas 24 horas.

      4. Si el usuario que pide el envío es +h (se trata de un OPER), no tiene ninguna restricción.

    • Solucionado un bug en la expiración de los "sendpass". El problema estaba relacionado con la modificación de secuencias Python mutables.

    • Para evitar que un atacante pueda obtener la clave de un OPER si tiene acceso a su buzón de correo, un usuario normal no puede hacer un "sendpass" a un OPER.

  • 28/Feb/02 Versión 1.296

    • Con la prohibición de hacer un "set email" en "nick" (cambio de hoy), reprogramo "nick2" para que transfiera todos los emails actuales de la base de datos de "nick" a la propia de "nick2".

    • Cuando se hace una migración de un nick, se toma su email.

    • Actualizamos las herramientas de volcado ASCII para que vuelquen también el email de los usuarios registrados.

    • Añado el comando "SETEMAILNOW", accesible a los administradores de "nick2".

    • Cuando se envía una clave por email, ya sea por "SENDPASS" o "SENDNEWPASS", se actualiza en "nick" el email de contacto actual del usuario.

    • Limitamos el tamaño máximo permitido de un email a 64 caracteres.

    • Un par de cambios cosméticos menores.

  • 05/Mar/02 Versión 1.328

    • Soporte para históricos de nicks. Guardo un histórico de:

      • Migración de nicks
      • forbid/unforbid
      • Registro directo de nicks
      • Drop
      • expire/noexpire
      • Cambios de email

    • Solo guarda histórico de "NICKDROP" si el nick eliminado está en "nick2".

    • Solo guarda histórico de "NICKUNFORBID" si el nick está en "nick2". Esto incluye un "NICKFORBID" previo.

    • Solucionados un par de detalles con transacciones en "SETEMAILNOW".

  • 11/Mar/02 Versión 1.333

    • Cuando se hace un "NICKFORBID" de un nick que no existe, debería marcarse en el registro, para que cuando se haga un "NICKUNFORBID" se elimine el registro en vez de restaurarlo. Debido a un bug de programación, esto no es así, y provoca que cuando se retire la prohibición, el nick pase a estar registrado.

      El problema no tiene efectos a largo plazo, ya que la clave del nick no será conocida y, por tanto, el nick acaba por expirar por inactividad, un mes más tarde.

      Problema solucionado.

    • Cuando durante el repaso periódico de la base de datos nos encontramos con un registro sin dirección de correo electrónico asociada, no debemos pedirla a "nick" si el registro es un FORBID.

    • Elimino rutinas históricas que ya no se usan. Las había dejado para que me sirviesen de ejemplo, pero con mi experiencia con "nick2" ya no es necesario.

    • Si un registro es un FORBID de un nick inexistente, debe ser conciso en respuesta a "NICKINFO".

  • 13/Mar/02 Versión 1.339

    • Se implementa el comando "COMENTARIO", que permite que un OPER ponga una marca textual a un nick determinado.

    • Meto en el histórico también:

      • La generación y envío de una nueva clave de alta calidad a un usuario (SENDNEWPASS).
      • La propagación de FORBID en la red ocasionados por la expiración de claves de nick de OPERs.
      • Comentarios de operadores.

    • Cada entrada en el histórico de un nick recibe un código que indica la acción realizada, como complemento al texto explicativo. Ello permite procesar el histórico por otros bots, por ejemplo, de forma automatizada.

    • Limito la longitud del comentario a un tamaño razonable (unos 400 bytes).

    • Cuando se ponen entradas en el histórico de un nick, se verifica que tengan un tamaño razonable, tanto las entradas en sí como el nick que se indica.

    • No se pueden prohibir nicks de más de 20 caracteres.

    • No se puede registrar un nick de más de 20 caracteres.

    • Si "nick" nos proporciona una dirección de correo electrónico de más de 64 caracteres, la ignoramos.

  • 21/Mar/02 Versión 1.347

    • Cuando se hace un "SETEMAILNOW", se indica el email antiguo y el nuevo.

    • Cuando se migra un nick, se almacena en el historico el email de registro.

    • "NICKREGISTER" requiere un parámetro adicional de email.

    • Amplío "NICKFORBID" y "NICKUNFORBID" para que requieran un comentario explicativo. El comentario se limita a unos 400 caracteres, aproximadamente.

    • Amplío "NICKDROP" para que guarde un comentario explicativo. El comentario se limita a unos 400 caracteres, aproximadamente.

  • 05/Abr/02 Versión 1.393

    • Reescribo el sistema de ejecución diferida para que se puedan invocar varios objetos de forma diferida, no solo uno. De esa forma es posible y sencillo realizar tareas periodicas o diferidas independientes y descoordinadas.

      Esto me permite programar objetos de ejecución diferida de forma independiente entre sí: expiración de nicks, expiración de claves de opers, cambios de email diferidos, etc.

    • Soporte para cambio de correo de registro/contacto por parte de los propios usuarios:

      • Cuando se conecta un usuario con un cambio de email solicitado:

        • Si ha pasado menos de un mes, se le envía un mensaje de aviso con todos los detalles y con la opción de anular el cambio de correo.

        • Si ha transcurrido más de un mes desde la solicitud del cambio, se indica al usuario que el cambio es efectivo y se procede a la actualización de sus datos.

      • Cuando un operador pide un "NICKINFO", se muestra si el usuario en cuestión tiene un cambio de correo pendiente, indicando la fecha de solicitud y la nueva dirección.

      • Se implementa el comando "ANULASETEMAIL", que anula el "SETEMAIL" pendiente del usuario que lo solicita.

      • Cuando se elimina un nick, se elimina cualquier "SETEMAIL" que pudiese tener pendiente.

      • Se implementa el comando "SETEMAIL" para usuarios normales. La longitud de la dirección de correo se limita a 64 caracteres.

      • Implemento el comando "LISTASETEMAIL", solo para mí, que me indica todos los nicks con cambios de email pendiente, indicando la fecha de petición y el nuevo correo solicitado. El listado sale ordenado por nick.

      • Cuando se hace efectivo un cambio de email (al cabo de un mes), guardo el cambio en el histórico y en el log.

      • Cuando se informa de que el "SETEMAIL" se hace efectivo, en el log debe indicarse también de qué nick estamos hablando...

      • Cuando un administrador hace un "SETEMAILNOW", se elimina cualquier "SETEMAIL" pendiente que pudiese haber.

  • 06/Ago/02 Versión 1.435

    • Implemento un comando para permitir que "NICK" registre nicks directamente en "NICK2" para que:

      1. Los usuarios no tengan que migrar.

      2. La cuota de usuarios de "NICK2" no pueda sino crecer.

      En principio "NICK2" acepta peticiones de registro salvo que:

      • El email del usuario no sea válido o mida más de 64 caracteres.

      • El nick mide más de 20 caracteres.

      • El nick ya exista en "NICK2", tanto registrado por un usuario como en "FORBIDS" o similares.

    • En cuanto "NICK" registra un nuevo usuario, "NICK2"hace un "SETPASS", "SETEMAIL" y "SENDPASS" al mismo.

    • Cuando se registraba un nuevo nick, no se metía su clave en la base de datos distribuída.

    • Cuando se registraba un nuevo nick, la clave almacenada en la base de datos distribuída, que es la que vale, no coincide con la clave enviada al usuario por email.

    • Implemento los comandos "NICKSUSPEND" y "NICKUNSUSPEND":

      • Este comando, como los "FORBID", está disponible solo para administradores de este bot.

      • Documento estos comandos en la ayuda.

      • Sólo se puede desuspender un nick si estaba suspendido.

      • Sólo se puede suspender un nick si:

        1. Está en "NICK2".

        2. No está suspendido.

        3. No está prohibido.

    • Un nick suspendido no actualiza su fecha de última conexión, y expira al cabo de un mes. Eso supone que el nick puede caducar aunque el usuario lo use todos los días, si no se preocupa de solucionar la suspensión.

    • Modifico el comando "NICKFORBID" para que no se pueda usar si el nick está suspendido.

    • Modifico el comando "NICKUNFORBID" para que no se pueda usar si el nick está suspendido.

    • Si al nick le ha expirado la clave, no debe poder quitársele la suspensión hasta que se le asigne una clave nueva.

    • Modifico los comandos "SETPASS" y "GETNEWPASS" para permitir cambios de clave aunque el nick esté suspendido.

    • Soluciono el problema de que al cambiar de clave con "SETPASS" o "GETNEWPASS" se propagase una desuspension por la red, si el nick estaba suspendido. Osea, un nick suspendido solo necesitaba cambiar de clave para anular la suspensión.

    • Idem si se pone una prohibición a un nick, éste sigue conectado y cambia de clave.

    • Idem los puntos anteriores con el comando "SENDNEWPASS" y otro comando no documentado :-p.

  • 23/Ene/03 Versión 1.445

    • A veces no queda más remedio que utilizar el nick desde un lugar que no nos merece ninguna confianza. Ello puede plantear el riesgo evidente de seguridad de que la clave sea "capturada" de alguna manera, y pueda ser utilizada por otras personas sin nuestro conocimiento.

      Al terminar la sesión, el usuario tiene dos opciones:

      1. Cambiar su clave de nick en ese momento. Para ello puede usar los comandos "SETPASS" o "GETNEWPASS", pero en ambos casos el usuario recibe la nueva clave a través de su conexión actual. Si esa conexión no es segura, estamos igual que si no hubiéramos cambiado la clave. De hecho es peor, porque proporciona una sensación de seguridad que no es real.

      2. El usuario puede esperar a llegar a un lugar seguro (su casa, por ejemplo) para conectarse y pedir una clave nueva. Lamentablemente entre la sesión anterior y la actual pueden pasar horas o días. Durante ese tiempo, se puede abusar del nick y de todos los servicios a los que éste proporcione acceso.

      Una opción sugerida por un OPER de la red consiste en abrir el comando "SENDNEWPASS" a todos los usuarios, con la particularidad de que un usuario "normal" sólo pueda cambia la clave de su propio nick.

      Tras discutir el asunto en las listas relevantes, se acepta la propuesta y se abre el comando "SENDNEWPASS" para todos los usuarios.

      Insistimos, no obstante, en que usar la clave de nick desde una conexión que no nos merece confianza está ABSOLUTAMENTE desaconsejado. Evítelo en lo posible.

    • Se soluciona un bug en "SENDNEWPASS" que hacía que se guardase log del comando dos veces. Una antes del "token" y la otra después.

    • Se actualiza "HELP" para reflejar el cambio en "SENDNEWPASS".

    • Cuando "nick" está offline, el comando "SENDNEWPASS" era rechazado. Con el cambio del comando, por razones de seguridad, puede interesar cambiar la clave de forma segura aunque no se pueda enviar por correo en este momento. En este caso la clave se cambia inmediatamente, pero no se envía por correo electrónico. El usuario debe solicitar un "SENDPASS" a posteriori, cuando "nick" ya funcione.

    • No deben permitirse los comandos "SETPASS", "GETNEWPASS" o "SENDNEWPASS" sobre nicks en "forbid". Hay que cambiar también algunos comandos de uso interno, no documentados. Estos cambios son necesarios para evitar "race conditions".

    • Cuando un usuario hace un "SENDNEWPASS" sobre sí mismo, se guarda en el log, pero no en el histórico.

    • Los comandos "SENDPASS" y "SENDNEWPASS" tenían un texto de "He solicitado a 'nick' que envie la clave. Le llegara en unos minutos". Lo cambio, por claridad, a "He solicitado a 'nick' que envie la clave. Le llegara en unos minutos, al email asociado a su nick".

    • En los mensajes de "nick2", cambio donde dice "mes" y pongo "30 días", para ser preciso. Esto afecta al comando "SETEMAIL".

  • 02/Abr/03 Versión 1.447

    • La tabla de históricos de nicks crece y crece. Ya mide unos 170 Megabytes. Sigo el plan original y divido esa base de datos en dos: Una estable y "read only" que contiene los registros existentes hasta el momento, y otra actualizable que contiene los añadidos a partir de ahora.

      Las escrituras al histórico van a la base de datos actualizable.

      Las lecturas del histórico (comando "HISTORY") van a ambas bases de datos, fusionando sus resultados en uno solo.

      Utilizo CDB ("Constant DataBase") para la base de datos estática.

    • Reescribo la implementación de "HISTORY" para que acceda también a la base de datos CDB.

    • Para hacer esta conversión sigo los siguientes pasos:

      • Paro "nick2".

      • Hago un "checkpoint" de la base de datos, para asegurarme de que todos los datos están en los ficheros, y no hay nada en el "log" de transacciones.

      • Hago un "recover" de la base de datos, para eliminar todo el entorno Berkeley DB y dejar los ficheros en un estado consistente. Así no queda nada en la caché de memoria MMAP.

      • Renombro la base de datos de histórico.

      • Reactivo nuevamente "nick2". En este momento no tendremos histórico, y se empezará a crear uno nuevo. No tendremos acceso a los históricos antiguos a través de "HISTORY".

      • Convierto el viejo histórico a una CDB. Este proceso lleva su tiempo.

      • Desactivo y vuelvo a activar "nick2", con el soporte para la base de datos CDB que acabamos de crear. El comando "HISTORY" nos vuelve a dar acceso a todo, otra vez.

    • Migramos una base de datos que ocupa 165 megabytes, y contienen 452.840 registros. La CDB resultante mide 80 megabytes.

    • La base de datos histórica está diseñada para que su formato sea ampliado en cualquier momento. Eliminando dicha opción en la CDB que, por definición, es constante, la base de datos final mide 73'5Mb. Se podría eliminar más información, como valores en coma flotante que se pueden convertir a enteros, pero no afino más de momento. Lo dejo como algo de cara al futuro, si es preciso.

  • 04/Nov/03 Versión 1.459

    • Cuando se indica el tiempo que falta para que ocurra algo (cambio de email, expiración de clave...), se da más precisión que antes, para evitar que nos salgan cosas como "quedan 0.0 días" cuando aún quedan cuatro dos horas.

    • A través de la API "IPC" publico un objeto llamado "nick:get_email". El objeto se invoca con una cadena, que es un nick. Devuelve la dirección de correo asociada a dicho nick o None si el nick no está registrado. Si desconocemos su dirección de correo electrónico, devuelve un asterisco ("*").

    • Desde la versión del IRCD u2.10.H.04.51 (13/Jun/02), los nodos de IRC no permiten que un usuario se ponga un nick en "FORBID", aunque conozca su clave aleatoria. Esto es así porque reconocen el carácter "*" al final de la clave cifrada en la BDD como una marca de prohibición. Debido a ello ya no necesitamos el comando "NICKFORBIDREFRESH". Dejo el código, pero lo desactivo.

      En el estado actual de IRC-Hispano, es un comando muy lento porque tiene que revisar toda la base de datos. Más aún, si la operación es muy lenta y la conexión con el HUB se corta, Olimpo va a morir al intentar actualizar la BDD con el flujo cerrado.

  • 04/Nov/03 Versión 1.459

    • Volvemos a realizar una migración de históricos de la BerkeleyDB a la CDB. Seguimos los pasos detallados en la versión 1.447.

      El script python (2.3.*) que uso para convertir la base de datos histórica a CDB es el siguiente:

      import bsddb
      import cdb
      import cPickle as pickle
      
      a=bsddb.hashopen("db.nicks-historico2") # La base de datos renombrada
      b=cdb.cdbmake("/tmp/db.nicks-historico.CDB.Dic2003","/tmp/db.nicks-historico.CDB.Dic2003.tmp")
      
      i=0
      for k,v in a.iteritems() :
        i+=1
        v=pickle.dumps(pickle.loads(v)[0],pickle.HIGHEST_PROTOCOL)
        b.add(k,v)
      
      print i,b.numentries
      b.finish()
      

      Migramos una base de datos que ocupa 104 megabytes, y contienen 418.764 registros. La CDB resultante mide 65 megabytes.

    • Hago unos pequeños cambios en el módulo para que añadir nuevas CDB sea una tarea trivial.

    • Cada vez que se recarga "nick2", se realiza un nuevo mapeo de las CDB. Es decir, no se desmapea el viejo y se mapea el nuevo.

      El problema se soluciona si invocamos una recogida de basuras manual.

      El problema parece que reside en la interacción de los objetos "nuevos" (los que heredan de "object") con el sistema de recogida de basuras. Parece que son más remolones para ser liberados de forma automática ("reference counters").

      La solución parece ser cerrar manualmente las CDB cuando se descarga el módulo.



Python Zope ©2001-2003 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS