Algunos de los errores detectados pero no solucionados por este parche. Serán solucionados durante la fusión de la gestión de bases de datos distribuidas de IRC-Hispano y ESNET: * Cuando se verifica un nick con el comando "/nick" se realiza una conversión a Base64, pero ni siquiera comprobamos que dicha conversión es válida. Este problema es evidente, pero lo dejamos de momento por compatibilidad con las claves qwue se están utilizando en IRC-Hispano. * Es posible compilar el soporte de base de datos pero no compilar el soporte de base de datos de nicks. * Se ha eliminado el Makefile de "crypt". * Todo el tema de versiones... puff :-) * Si se compila sin soporte de nicks, no debe haber soporte tampoco de OPER ni canales. * No parece que durante una compactación se haga nada con la base de datos que * está en disco. * Si fallan los Malloc, hay que hacer algo aparte de no insertar el registro. * Los registros se marcan como borrados en memoria, pero no se borran. * El hash de las bases de datos debería calcularse "al vuelo" cada vez que se modifican. * La compactación renumera los registros y los cambia de orden. * Riesgos de overflow en varias operaciones de copia. * No se gestiona la importante cuestión de "grifo" abierto/cerrado. El problema es el siguiente: - Se produce un "join". Ambas partes intercambian versiones. El nodo LEAF tiene una versión anterior. En enlace tiene LAG. - El Hub recibe altas de nuevos registros y los propaga hacia todos sus enlaces, incluyendo este nuevo nodo. Por tanto este nodo recibe los registros nuevos ANTES de que el HUB pueda haber actualizado su base de datos. - El hub recibe el "J" del leaf y envía la actualización, que será rechazada por el LEAF, al tener ya un registro más moderno. - Eso sin contar con que el LEAF no se quede en un bucle infinito por encontrarse con un hueco en la numeración de los registros. - Este tema está solucionado hace meses en la gestión de base de datos de ESNET. - No tenemos garantías de que búferes como tmpnick estén alineados. - El STRNCPY es peligroso, porque si llega a copiar hasta el contador máximo, no pone el "\0" final. diff -cr ../ircu2.10.06/include/msg.h ../ircu2.10.06-2/include/msg.h *** ../ircu2.10.06/include/msg.h Fri Jul 2 13:46:49 1999 --- ../ircu2.10.06-2/include/msg.h Mon Jul 5 11:45:18 1999 *************** *** 47,53 **** #endif #ifdef DB_HISPANO ! #define MSG_DBH "DBH" /* Base de Datos ESNET */ #define TOK_DBH "DBH" #define CLASS_DBH LEVEL_PROPAGATE #endif --- 47,53 ---- #endif #ifdef DB_HISPANO ! #define MSG_DBH "DBH" /* Base de Datos IRC-HISPANO */ #define TOK_DBH "DBH" #define CLASS_DBH LEVEL_PROPAGATE #endif diff -cr ../ircu2.10.06/ircd/channel.c ../ircu2.10.06-2/ircd/channel.c *** ../ircu2.10.06/ircd/channel.c Fri Jul 2 13:46:50 1999 --- ../ircu2.10.06-2/ircd/channel.c Mon Jul 5 12:55:41 1999 *************** *** 1275,1283 **** } #endif ! #if defined(DBH_OPER_HACK) || defined(DBH_CHAN_HACK) { struct dbh_reg *reg; reg=dbh_buscar_registro_local(DBH_CHANDB,chptr->chname); #ifdef DBH_OPER_HACK --- 1275,1287 ---- } #endif ! #if defined(DB_HISPANO) && defined(DBH_NICK_HACK) && (defined(DBH_OPER_HACK) || defined(DBH_CHAN_HACK)) { struct dbh_reg *reg; + int nick_registrado=0; + + if((dbh_buscar_registro_local(DBH_NICKDB,sptr->name)!=NULL) || + (dbh_buscar_registro_local(ESNET_NICKDB,sptr->name)!=NULL)) nick_registrado!=0; reg=dbh_buscar_registro_local(DBH_CHANDB,chptr->chname); #ifdef DBH_OPER_HACK *************** *** 1290,1295 **** --- 1294,1300 ---- #ifdef DBH_OPER_HACK_ONLYREG reg && #endif + nick_registrado && dbh_buscar_registro_local(DBH_OPERDB,sptr->name)) { if(!is_chan_op(sptr,chptr)) *************** *** 1303,1309 **** * El fundador de un canal puede usar los modos X en su canal * 1999/06/30 savage@apostols.org */ ! if(reg && !strCasediff(sptr->name,reg->valor)) { if(!is_chan_op(sptr,chptr)) jcea_xmode_esnet=!0; --- 1308,1314 ---- * El fundador de un canal puede usar los modos X en su canal * 1999/06/30 savage@apostols.org */ ! if(reg && nick_registrado && !strCasediff(sptr->name,reg->valor)) { if(!is_chan_op(sptr,chptr)) jcea_xmode_esnet=!0; *************** *** 1311,1317 **** } #endif /* DBH_CHAN_HACK */ } ! #endif /* DBH_OPER_HACK || DBH_CHAN_HACK */ def: default: --- 1316,1322 ---- } #endif /* DBH_CHAN_HACK */ } ! #endif /* DB_HISPANO && DBH_NICK_HACK && (DBH_OPER_HACK || DBH_CHAN_HACK) */ def: default: *************** *** 2040,2049 **** return 0; #endif ! #if defined(DBH_OPER_HACK) || defined(DBH_CHAN_HACK) if( !BadPtr(key) ) { struct dbh_reg *reg; reg=dbh_buscar_registro_local(DBH_CHANDB, (char*)chptr->chname); #ifdef DBH_OPER_HACK --- 2045,2058 ---- return 0; #endif ! #if defined(DB_HISPANO) && defined(DBH_NICK_HACK) && (defined(DBH_OPER_HACK) || defined(DBH_CHAN_HACK)) if( !BadPtr(key) ) { struct dbh_reg *reg; + int nick_registrado=0; + + if((dbh_buscar_registro_local(DBH_NICKDB,sptr->name)!=NULL) || + (dbh_buscar_registro_local(ESNET_NICKDB,sptr->name)!=NULL)) nick_registrado!=0; reg=dbh_buscar_registro_local(DBH_CHANDB, (char*)chptr->chname); #ifdef DBH_OPER_HACK *************** *** 2057,2062 **** --- 2066,2072 ---- #ifdef DBH_OPER_HACK_ONLYREG reg && #endif + nick_registrado && dbh_buscar_registro_local(DBH_OPERDB, sptr->name) && (!compall("OPER", key)) ) return 0; *************** *** 2070,2081 **** * 1999/06/30 savage@apostols.org */ ! if( (!BadPtr(key)) && reg && !strCasediff(reg->valor, sptr->name) && (!compall("FUNDADOR", key)) ) return 0; #endif } ! #endif /* DBH_HACK_OPER || DBH_HACK_CHAN */ /* Now a banned user CAN join if invited -- Nemesi */ /* Now a user CAN escape channel limit if invited -- bfriendly */ --- 2080,2091 ---- * 1999/06/30 savage@apostols.org */ ! if( (!BadPtr(key)) && reg && nick_registrado && !strCasediff(reg->valor, sptr->name) && (!compall("FUNDADOR", key)) ) return 0; #endif } ! #endif /* DB_HISPANO && DBH_NICK_HACK && (DBH_OPER_HACK || DBH_CHAN_HACK) */ /* Now a banned user CAN join if invited -- Nemesi */ /* Now a user CAN escape channel limit if invited -- bfriendly */ diff -cr ../ircu2.10.06/ircd/s_debug.c ../ircu2.10.06-2/ircd/s_debug.c *** ../ircu2.10.06/ircd/s_debug.c Fri Jul 2 13:46:50 1999 --- ../ircu2.10.06-2/ircd/s_debug.c Mon Jul 5 12:00:34 1999 *************** *** 202,208 **** #endif #ifdef DB_HISPANO '.','I','R','C','-', 'H','I','S','P','A','N','O','.','O','R','G',':', ! 'D','B','H' ,'1','+', 'N', #ifdef DBH_NICK_HACK --- 202,208 ---- #endif #ifdef DB_HISPANO '.','I','R','C','-', 'H','I','S','P','A','N','O','.','O','R','G',':', ! 'D','B','H' ,'2','+', 'N', #ifdef DBH_NICK_HACK diff -cr ../ircu2.10.06/ircd/s_serv.c ../ircu2.10.06-2/ircd/s_serv.c *** ../ircu2.10.06/ircd/s_serv.c Fri Jul 2 13:46:51 1999 --- ../ircu2.10.06-2/ircd/s_serv.c Mon Jul 5 12:34:51 1999 *************** *** 1237,1249 **** int hashi, i=0; char *c; ! c=RunMalloc(strlen(clave)); if(c==NULL) return; strcpy(c,clave); /* paso a minusculas */ ! while( c[i] != 0 ) ! c[i]=toLower(c[i++]); hashi=dbh_hash_registro(c); --- 1237,1251 ---- int hashi, i=0; char *c; ! c=RunMalloc(strlen(clave)+1); if(c==NULL) return; strcpy(c,clave); /* paso a minusculas */ ! while( c[i] != 0 ) { ! c[i]=toLower(c[i]); ! i++; ! } hashi=dbh_hash_registro(c); *************** *** 1318,1325 **** strcpy(d,destino); /* paso a minusculas */ ! while( c[i] != 0 ) ! c[i]=toLower(c[i++]); /* creo el registro */ reg->clave=c; --- 1320,1329 ---- strcpy(d,destino); /* paso a minusculas */ ! while( c[i] != 0 ) { ! c[i]=toLower(c[i]); ! i++; ! } /* creo el registro */ reg->clave=c; *************** *** 1364,1376 **** int hashi, i=0; char *c; ! c=RunMalloc(strlen(clave)); if(c==NULL) return; strcpy(c,clave); /* paso a minusculas */ ! while( c[i] != 0 ) ! c[i]=toLower(c[i++]); /* busco hash */ hashi=dbh_hash_registro(c); --- 1368,1382 ---- int hashi, i=0; char *c; ! c=RunMalloc(strlen(clave)+1); if(c==NULL) return; strcpy(c,clave); /* paso a minusculas */ ! while( c[i] != 0 ) { ! c[i]=toLower(c[i]); ! i++; ! } /* busco hash */ hashi=dbh_hash_registro(c); *************** *** 1714,1720 **** void dbh_violacion(int parc, char *parv[], char *causa) { int i; ! char line[2048]="\0"; sprintf_irc(line,"%s %s ", parv[0], MSG_DBH ); for(i=1; iname)) ! return 0; /* Aqui meteremos los comandos DBH en modo usuario, de momento nada */ /* DBH */ if(parc!=3) { --- 2035,2048 ---- if(!IsServer(cptr)) { struct dbh_reg *reg; ! if(!IsOper(sptr)) { ! if(dbh_buscar_registro_local(DBH_NICKDB,sptr->name) || ! dbh_buscar_registro_local(ESNET_NICKDB,sptr->name)) { ! if(!dbh_buscar_registro_local(DBH_OPERDB,sptr->name)) ! return 0; ! } else return 0; ! } ! /* Aqui meteremos los comandos DBH en modo usuario, de momento nada */ /* DBH */ if(parc!=3) { *************** *** 2118,2124 **** /* Parece ke no estamos en la version correcta */ if(numversion>tabla_version[tabla] && es_hub) { ! /* me perdi un compromiso .... */ dbh_violacion(parc, parv, "Hub con version Superior. Borrando DB local ..."); dbh_borrar_tabla(tabla, numversion); /* le contestamos con 0 J para que continue o pare */ --- 2130,2136 ---- /* Parece ke no estamos en la version correcta */ if(numversion>tabla_version[tabla] && es_hub) { ! /* me perdi un COMMIT .... */ dbh_violacion(parc, parv, "Hub con version Superior. Borrando DB local ..."); dbh_borrar_tabla(tabla, numversion); /* le contestamos con 0 J para que continue o pare */ *************** *** 2403,2409 **** /* * meto el registro en la tabla de disco ! * lo meto en un formato aprobechable en los burst */ db_file=dbh_abrir_tabla(tabla, "a"); if(!db_file) --- 2415,2421 ---- /* * meto el registro en la tabla de disco ! * lo meto en un formato aprovechable en los burst */ db_file=dbh_abrir_tabla(tabla, "a"); if(!db_file) diff -cr ../ircu2.10.06/ircd/s_user.c ../ircu2.10.06-2/ircd/s_user.c *** ../ircu2.10.06/ircd/s_user.c Fri Jul 2 13:46:51 1999 --- ../ircu2.10.06-2/ircd/s_user.c Mon Jul 5 12:25:19 1999 *************** *** 763,769 **** */ int m_nick(aClient *cptr, aClient *sptr, int parc, char *parv[]) { ! #if defined(DB_ESNET) || defined(DBH_NICK_HACK) struct dbh_reg *reg; #endif aClient *acptr, *server = NULL; --- 763,769 ---- */ int m_nick(aClient *cptr, aClient *sptr, int parc, char *parv[]) { ! #if defined(DB_ESNET) || (defined(DB_HISPANO) && defined(DBH_NICK_HACK)) struct dbh_reg *reg; #endif aClient *acptr, *server = NULL; *************** *** 886,905 **** return exit_client(cptr, sptr, &me, "Nick/Server collision"); } ! #if defined(DB_ESNET) || defined(DBH_NICK_HACK) reg=NULL; if(!IsServer(cptr)) { #ifdef DB_ESNET reg=dbh_buscar_registro_local(ESNET_NICKDB,nick); ! #ifdef DBH_NICK_HACK if(reg==NULL) ! #endif /* DBH_NICK_HACK */ #endif /* DB_ESNET */ ! #ifdef DBH_NICK_HACK reg=dbh_buscar_registro_local(DBH_NICKDB,nick); ! #endif /* DBH_NICK_HACK */ } ! #endif /* DB_ESNET || DBH_NICK_HACK */ if (!(acptr = FindClient(nick))) goto nickkilldone; /* No collisions, all clear... */ --- 886,905 ---- return exit_client(cptr, sptr, &me, "Nick/Server collision"); } ! #if defined(DB_ESNET) || (defined(DB_HISPANO) && defined(DBH_NICK_HACK)) reg=NULL; if(!IsServer(cptr)) { #ifdef DB_ESNET reg=dbh_buscar_registro_local(ESNET_NICKDB,nick); ! #if defined(DB_HISPANO) && defined(DBH_NICK_HACK) if(reg==NULL) ! #endif /* DB_HISPANO && DBH_NICK_HACK */ #endif /* DB_ESNET */ ! #if defined(DB_HISPANO) && defined(DBH_NICK_HACK) reg=dbh_buscar_registro_local(DBH_NICKDB,nick); ! #endif /* DB_HISPANO && DBH_NICK_HACK */ } ! #endif /* DB_ESNET || (DB_HISPANO && DBH_NICK_HACK) */ if (!(acptr = FindClient(nick))) goto nickkilldone; /* No collisions, all clear... */ *************** *** 1069,1075 **** nickkilldone: ! #if defined(DB_ESNET) || defined(DBH_NICK_HACK) /* * Comprueba si el nick esta registrado, y * si lo esta que se ponga la clave correcta --- 1069,1075 ---- nickkilldone: ! #if defined(DB_ESNET) || (defined(DB_HISPANO) && defined(DBH_NICK_HACK)) /* * Comprueba si el nick esta registrado, y * si lo esta que se ponga la clave correcta *************** *** 1121,1134 **** me.name, nick ); } else { if(parc<3) { ! sendto_one(cptr, ":%s NOTICE %s :El nick %s está Registrado, necesitas contraseña.", me.name, nombre, nick ); } else { ! sendto_one(cptr, ":%s NOTICE %s :Contraseña Incorrecta para el nick %s.", me.name, nombre, nick ); } ! sendto_one(cptr, ":%s NOTICE %s :Utiliza /QUOTE NICK %s contraseña para identificarte.", me.name, nombre, nick ); sendto_one(cptr,err_str(ERR_NICKREGISTERED), --- 1121,1134 ---- me.name, nick ); } else { if(parc<3) { ! sendto_one(cptr, ":%s NOTICE %s :El nick %s está Registrado, necesitas contraseña.", me.name, nombre, nick ); } else { ! sendto_one(cptr, ":%s NOTICE %s :Contraseña Incorrecta para el nick %s.", me.name, nombre, nick ); } ! sendto_one(cptr, ":%s NOTICE %s :Utiliza /QUOTE NICK %s contraseña para identificarte.", me.name, nombre, nick ); sendto_one(cptr,err_str(ERR_NICKREGISTERED), *************** *** 2711,2718 **** #ifdef OPER_CHANNEL_SERVICE_ESNET && !IsOper(sptr) #endif ! #ifdef DBH_OPER_HACK_KMODE ! && !dbh_buscar_registro_local(DBH_OPERDB,sptr->name) #endif ) sptr->flags &= ~FLAGS_CHSERV; --- 2711,2720 ---- #ifdef OPER_CHANNEL_SERVICE_ESNET && !IsOper(sptr) #endif ! #if defined(DB_HISPANO) && defined(DBH_OPER_HACK_KMODE) ! && (dbh_buscar_registro_local(DBH_NICKDB,sptr->name) || ! dbh_buscar_registro_local(ESNET_NICKDB,sptr->name)) && ! !dbh_buscar_registro_local(DBH_OPERDB,sptr->name) #endif ) sptr->flags &= ~FLAGS_CHSERV;