diff -cr ../ircu2.10.06/config/config-sh.in ../ircu2.10.06-2/config/config-sh.in *** ../ircu2.10.06/config/config-sh.in Wed Jun 23 17:09:50 1999 --- ../ircu2.10.06-2/config/config-sh.in Fri Jul 2 13:21:36 1999 *************** *** 355,360 **** --- 355,372 ---- mainmenu_option next_comment comment 'Mandatory defines (you should leave these untouched)' + bool 'HISPANO: IRC-HISPANO.ORG Distributed Database ' DB_HISPANO y + if [ "$DB_HISPANO" = "y" ]; then + bool 'HISPANO: NICK_DB authentication' DBH_NICK_HACK y + if [ "$DBH_NICK_HACK" = "y" ]; then + bool 'HISPANO: CHAN_DB features (join # FUNDADOR, modeX)' DBH_CHAN_HACK y + bool 'HISPANO: OPER_DB features (join # OPER, modeX)' DBH_OPER_HACK y + if [ "$DBH_OPER_HACK" = "y" ]; then + bool 'HISPANO: OPER_DB features only on registered (CHAN_DB) channels' DBH_OPER_HACK_ONLYREG y + bool 'HISPANO: OPER_DB members can be Chanserv (+k)' DBH_OPER_HACK_KMODE y + fi + fi + fi bool 'XMODE Networking - ESNET' XMODE_ESNET y bool 'ESNET Distributed DataBase Support - ESNET' DB_ESNET y int 'Max auto connects per class (1!)' MAXIMUM_LINKS 1 diff -cr ../ircu2.10.06/doc/Configure.help ../ircu2.10.06-2/doc/Configure.help *** ../ircu2.10.06/doc/Configure.help Wed Jun 23 17:09:50 1999 --- ../ircu2.10.06-2/doc/Configure.help Fri Jul 2 13:18:24 1999 *************** *** 1100,1102 **** --- 1100,1139 ---- (see doc/example.conf for details on Y: lines). You will probably always override this value in your "ircd.conf" with the Y: lines. The given value used to be an often used value for client sendqs. + + HISPANO: IRC-HISPANO.ORG Distributed Database + DB_HISPANO + Activa el protocolo de Base de Datos distribuida para IRC-HISPANO. + Esto es necesario para el correcto funcionamiento de los nuevos + servicios IRC-HISPANO.ORG: Soporte de multiples masters y versiones + de las tablas de la BD. + + HISPANO: NICK_DB authentication + DBH_NICK_HACK + Activa la autentificacion de usuarios usando la base de datos + distribuida de IRC-HISPANO.ORG + Este parche es absolutamente obligatorio. + + HISPANO: CHAN_DB features (join # FUNDADOR, modeX) + DBH_CHAN_HACK + Con este parche permitimos que el Fundador de un canal pueda usar + los modos especiales (/MODE #canal x+o usuario) en su canal, asi como + el /JOIN #canal FUNDADOR (clave maestra de entrada) + + HISPANO: OPER_DB features (join # OPER, modeX) + DBH_OPER_HACK + Con este parche permitimos que los OPER (OPER_DB) pueda usar + los modos especiales (/MODE #canal x+o usuario) en los canales, asi como + el /JOIN #canal OPER (clave maestra de entrada) + + HISPANO: OPER_DB features only on registered (CHAN_DB) channels + DBH_OPER_HACK_ONLYREG + Si activamos este parche, las facilidades de 'MODE #canal x' y + 'JOIN #canal OPER' solo funcionaran en los canales registrados. + + HISPANO: OPER_DB members can be Chanserv (+k) + DBH_OPER_HACK_KMODE + Si lo activamos, los OPER (OPER_DB) pueden activarse el modo +k + para evitar ser KICK, DEOP y las flood si hemos aplicado el parche + de CS_NO_FLOOD_ESNET + diff -cr ../ircu2.10.06/include/hash.h ../ircu2.10.06-2/include/hash.h *** ../ircu2.10.06/include/hash.h Thu Jan 21 04:30:56 1999 --- ../ircu2.10.06-2/include/hash.h Fri Jul 2 13:18:24 1999 *************** *** 74,77 **** --- 74,81 ---- extern int addNickJupes(char *nicks); extern void clearNickJupes(void); + #if defined(DB_ESNET) || defined(DB_HISPANO) + extern int dbh_hash_registro(char *clave); + #endif /* DB_ESNET || DB_HISPANO */ + #endif /* HASH_H */ diff -cr ../ircu2.10.06/include/msg.h ../ircu2.10.06-2/include/msg.h *** ../ircu2.10.06/include/msg.h Wed Jun 23 17:09:50 1999 --- ../ircu2.10.06-2/include/msg.h Fri Jul 2 13:18:24 1999 *************** *** 46,51 **** --- 46,57 ---- #define CLASS_DB LEVEL_PROPAGATE #endif + #ifdef DB_HISPANO + #define MSG_DBH "DBH" /* Base de Datos ESNET */ + #define TOK_DBH "DBH" + #define CLASS_DBH LEVEL_PROPAGATE + #endif + #define MSG_PRIVATE "PRIVMSG" /* PRIV */ #define TOK_PRIVATE "P" #define CLASS_PRIVATE LEVEL_PROPAGATE diff -cr ../ircu2.10.06/include/s_serv.h ../ircu2.10.06-2/include/s_serv.h *** ../ircu2.10.06/include/s_serv.h Wed Jun 23 17:09:50 1999 --- ../ircu2.10.06-2/include/s_serv.h Fri Jul 2 13:18:24 1999 *************** *** 65,75 **** #ifdef DB_ESNET extern unsigned long db_num_serie_local; - extern void tea(unsigned long v[],unsigned long k[],unsigned long x[]); extern void reload_db(void); extern void initdb(void); struct DB_nick *find_db_nick(char *nick); extern int m_db(aClient *cptr, aClient *sptr, int parc, char *parv[]); #endif #ifdef DEBUGMODE /* Coredump if we miss something... */ --- 65,91 ---- #ifdef DB_ESNET extern unsigned long db_num_serie_local; extern void reload_db(void); extern void initdb(void); struct DB_nick *find_db_nick(char *nick); extern int m_db(aClient *cptr, aClient *sptr, int parc, char *parv[]); + #endif + + #if defined(DB_ESNET) || defined(DB_HISPANO) + extern int tabla_residente [DBH_MAX_TABLA]; + extern unsigned long tabla_cuantos [DBH_MAX_TABLA]; + extern struct dbh_reg *tabla_datos [DBH_MAX_TABLA][DBH_HASH_SIZE]; + extern unsigned long tabla_version [DBH_MAX_TABLA]; + extern unsigned long tabla_serie [DBH_MAX_TABLA]; + + extern void tea(unsigned long v[],unsigned long k[],unsigned long x[]); + extern struct dbh_reg * dbh_buscar_registro_local(char tabla, char *clave); + #endif + + #ifdef DB_HISPANO + extern void dbh_recarga(); + extern void dbh_inicializa(); + extern int m_dbh(aClient *cptr, aClient *sptr, int parc, char *parv[]); #endif #ifdef DEBUGMODE /* Coredump if we miss something... */ diff -cr ../ircu2.10.06/include/struct.h ../ircu2.10.06-2/include/struct.h *** ../ircu2.10.06/include/struct.h Wed Jun 23 17:09:50 1999 --- ../ircu2.10.06-2/include/struct.h Fri Jul 2 13:18:24 1999 *************** *** 162,171 **** --- 162,195 ---- #endif }; + #ifdef DB_ESNET struct DB_nick { char nick[8*((NICKLEN+8)/8)]; /* El +8 es para que siempre sea multiplo entero de 8 */ unsigned long clave[2]; struct DB_nick *siguiente; }; + #endif /* DB_ESNET */ + + #if defined(DB_ESNET) || defined(DB_HISPANO) + /* DB_HASH_SIZE ha de ser 2^n */ + #define DBH_HASH_SIZE 256 + #define DBH_MAX_TABLA 256 + #define DBH_PRIMERA_TABLA 'A' + #define DBH_ULTIMA_TABLA 'Z' + #define DBH_NICKDB 'N' + #define DBH_OPERDB 'O' + #define DBH_CHANDB 'C' + #define ESNET_NICKDB 'n' + + struct dbh_reg { + char *destino; + char *clave; + char *valor; + char local; + char borrado; + char compactado; + struct dbh_reg *next, *prev; + }; + #endif /* DB_ESNET || DB_HISPANO */ #endif /* STRUCT_H */ diff -cr ../ircu2.10.06/ircd/channel.c ../ircu2.10.06-2/ircd/channel.c *** ../ircu2.10.06/ircd/channel.c Wed Jun 23 17:09:51 1999 --- ../ircu2.10.06-2/ircd/channel.c Fri Jul 2 13:18:25 1999 *************** *** 1274,1279 **** --- 1274,1318 ---- break; } #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 + /* + * Los miembros de la BD de OPERs pueden usar los modos X + * Si hack ONLYREG, solo en los canales registrados. + * 1999/06/30 savage@apostols.org + */ + if( + #ifdef DBH_OPER_HACK_ONLYREG + reg && + #endif + dbh_buscar_registro_local(DBH_OPERDB,sptr->name)) + { + if(!is_chan_op(sptr,chptr)) + jcea_xmode_esnet=!0; + break; + } + #endif + + #ifdef DBH_OPER_HACK + /* + * 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; + break; + } + #endif /* DBH_CHAN_HACK */ + } + #endif /* DBH_OPER_HACK || DBH_CHAN_HACK */ + def: default: for (ip = flags; *ip; ip += 2) *************** *** 2000,2008 **** --- 2039,2081 ---- if((IsOper(sptr)) && (!BadPtr(key)) && (!compall("GOD", key))) 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 /* + * El hack de la base de datos de opers permite que estos dispongan + * de la facilidad parecida a JOIN_GOD_ESNET, pero la clave es OPER + * Si activamos el hack ONLYREG, solo funcionara en canales registrados. + * 1999/06/30 savage@apostols.org */ + if( + #ifdef DBH_OPER_HACK_ONLYREG + reg && + #endif + dbh_buscar_registro_local(DBH_OPERDB, sptr->name) + && (!compall("OPER", key)) ) + return 0; + #endif + #ifdef DBH_CHAN_HACK + /* + * El hack de la base de datos de canales permite que el fundador de + * un canal dispongan de una facilidad parecida a JOIN_GOD_ESNET, + * pero la clave es FUNDADOR + * 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 */ diff -cr ../ircu2.10.06/ircd/crypt/Makefile ../ircu2.10.06-2/ircd/crypt/Makefile *** ../ircu2.10.06/ircd/crypt/Makefile Wed Jun 23 17:09:50 1999 --- ../ircu2.10.06-2/ircd/crypt/Makefile Fri Jul 2 13:18:25 1999 *************** *** 1,37 **** - #************************************************************************ - #* IRC - Internet Relay Chat, ircd/crypt/Makefile - #* Copyright (C) 1991 Darren Reed - #* - #* This program is free software; you can redistribute it and/or modify - #* it under the terms of the GNU General Public License as published by - #* the Free Software Foundation; either version 1, or (at your option) - #* any later version. - #* - #* This program is distributed in the hope that it will be useful, - #* but WITHOUT ANY WARRANTY; without even the implied warranty of - #* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - #* GNU General Public License for more details. - #* - #* You should have received a copy of the GNU General Public License - #* along with this program; if not, write to the Free Software - #* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - #*/ - # - # Change this to the path of your local ircd.conf file - # - IRCDCONF = /usr/local/lib/irc/ircd.conf - - LIBS = -lcrypt - - all: mkpasswd - crypt: install - - mkpasswd: mkpasswd.c - gcc -Wall -O2 mkpasswd.c -o mkpasswd ${LIBS} - - install: - crypter ${IRCDCONF} - @echo 'done.' - - clean: - /bin/rm -f mkpasswd --- 0 ---- diff -cr ../ircu2.10.06/ircd/hash.c ../ircu2.10.06-2/ircd/hash.c *** ../ircu2.10.06/ircd/hash.c Wed Jun 23 17:14:52 1999 --- ../ircu2.10.06-2/ircd/hash.c Fri Jul 2 13:25:38 1999 *************** *** 550,552 **** --- 550,566 ---- for (i = 0; i < JUPEHASHSIZE; i++) jupeTable[i][0] = '\000'; } + + #if defined(DB_ESNET) || defined(DB_HISPANO) + /* + * dbh_hash_registro (clave) + * + * calcula el hash de una clave ... + * 1999/06/23 savage@apostols.org + */ + int dbh_hash_registro(char *clave) + { + return (unsigned int)( strhash(clave) & (DBH_HASH_SIZE-1) ); + } + #endif + diff -cr ../ircu2.10.06/ircd/ircd.c ../ircu2.10.06-2/ircd/ircd.c *** ../ircu2.10.06/ircd/ircd.c Wed Jun 23 17:09:51 1999 --- ../ircu2.10.06-2/ircd/ircd.c Fri Jul 2 13:18:25 1999 *************** *** 935,940 **** --- 935,943 ---- #ifdef USE_SYSLOG syslog(LOG_NOTICE, "Server Ready"); #endif + #if defined(DB_HISPANO) || defined(DB_ESNET) + dbh_inicializa(); + #endif #ifdef DB_ESNET initdb(); #endif diff -cr ../ircu2.10.06/ircd/opercmds.c ../ircu2.10.06-2/ircd/opercmds.c *** ../ircu2.10.06/ircd/opercmds.c Wed Jun 23 17:09:44 1999 --- ../ircu2.10.06-2/ircd/opercmds.c Fri Jul 2 13:18:25 1999 *************** *** 647,652 **** --- 647,678 ---- case 'z': count_memory(sptr, parv[0]); break; + #if defined(DB_HISPANO) || defined(DB_ESNET) + case 'B': + case 'b': + #ifdef DB_HISPANO + for(i=DBH_PRIMERA_TABLA;i<=DBH_ULTIMA_TABLA;i++) { + if(tabla_serie[i]) + if(tabla_residente[i]) + sendto_one(sptr, ":%s %d %s B %s Tabla '%c' V=%lu S=%lu R=%lu", + me.name, RPL_STATSDEBUG, parv[0], me.name, + i, tabla_version[i], tabla_serie[i], + tabla_cuantos[i]); + else + sendto_one(sptr, ":%s %d %s B %s Tabla '%c' V=%lu S=%lu NoResidente", + me.name, RPL_STATSDEBUG, parv[0], me.name, + i, tabla_version[i], tabla_serie[i] ); + } + #endif /* DB_HISPANO */ + #ifdef DB_ESNET + sendto_one(sptr, ":%s %d %s B %s Tabla '%c' DB_ESNET S=%lu R=%lu", + me.name, RPL_STATSDEBUG, parv[0], me.name, + ESNET_NICKDB, + tabla_serie[ESNET_NICKDB], + tabla_cuantos[ESNET_NICKDB]); + #endif + break; + #endif default: stat = '*'; break; diff -cr ../ircu2.10.06/ircd/parse.c ../ircu2.10.06-2/ircd/parse.c *** ../ircu2.10.06/ircd/parse.c Wed Jun 23 17:09:51 1999 --- ../ircu2.10.06-2/ircd/parse.c Fri Jul 2 13:18:25 1999 *************** *** 122,127 **** --- 122,130 ---- #ifdef DB_ESNET {CLASS_DB, MSG_DB, TOK_DB, m_db, 0, MAXPARA, MFLG_SLOW, 0L}, #endif + #ifdef DB_HISPANO + {CLASS_DBH, MSG_DBH, TOK_DBH, m_dbh, 0, MAXPARA, MFLG_SLOW, 0L}, + #endif {0, (char *)0, (char *)0, (int (*)(aClient *, aClient *, int, char **))0, 0, 0, 0, 0L} } ; /* *INDENT-ON* */ diff -cr ../ircu2.10.06/ircd/s_bsd.c ../ircu2.10.06-2/ircd/s_bsd.c *** ../ircu2.10.06/ircd/s_bsd.c Wed Jun 23 17:09:51 1999 --- ../ircu2.10.06-2/ircd/s_bsd.c Fri Jul 2 13:18:25 1999 *************** *** 91,96 **** --- 91,100 ---- #include "querycmds.h" #include "IPcheck.h" + #ifdef DB_HISPANO + #include "msg.h" + #endif + RCSTAG_CC("$Id: s_bsd.c,v 1.65 1999/05/13 16:38:38 ircu2_run Exp $"); #ifndef IN_LOOPBACKNET *************** *** 990,997 **** my_name_for_link(me.name, aconf), me.serv->timestamp, newts, MAJOR_PROTOCOL, me.yxx, me.info); #ifdef DB_ESNET ! sendto_one(cptr,"%c DB * 0 J %lu",me.yxx[0],db_num_serie_local); #endif if (!IsDead(cptr)) start_auth(cptr); --- 994,1032 ---- my_name_for_link(me.name, aconf), me.serv->timestamp, newts, MAJOR_PROTOCOL, me.yxx, me.info); #ifdef DB_ESNET ! sendto_one(cptr,"%c DB * 0 J %lu",me.yxx[0],tabla_serie[ESNET_NICKDB]); #endif + + #ifdef DB_HISPANO + /* + * Cuando nos conectamos enviamos una linea 'DBH - 0 J' para cada una + * de las posibles tablas (A..Z), esto hace un pelin mas largo el + * netburst, pero nos ayuda a actualizar todas las tablas. + * 1999/06/20 savage@apostols.org + * OPTIMIZACION a Implementar: + * Nodo->Hub: Solo mando relacion de las residentes + * Hub->Nodo: No mando ninguna (el nodo NO ha de actualizarme) + * Hub->Hub : Las mando todas, que remedio ... + * 1999/06/30 savage@apostols.org + */ + { + int es_hub=0; + if(find_conf_host(cptr->confs, cptr->name, CONF_HUB) != NULL) + es_hub=1; + + for(i=DBH_PRIMERA_TABLA; i<=DBH_ULTIMA_TABLA; i++) + { + #ifndef HUB + /* Ok, soy un LEAF node */ + if(!tabla_residente[i]) + continue; /* Nodo->Hub: solo residentes */ + #endif /* !HUB */ + sendto_one(cptr, "%c %s - 0 J %c %lu %lu", + me.yxx[0], MSG_DBH, (char)i, tabla_version[i], tabla_serie[i]); + } + } + #endif /* DB_HISPANO */ + if (!IsDead(cptr)) start_auth(cptr); diff -cr ../ircu2.10.06/ircd/s_conf.c ../ircu2.10.06-2/ircd/s_conf.c *** ../ircu2.10.06/ircd/s_conf.c Wed Jun 23 17:09:51 1999 --- ../ircu2.10.06-2/ircd/s_conf.c Fri Jul 2 13:18:25 1999 *************** *** 648,653 **** --- 648,656 ---- #ifdef DB_ESNET reload_db(); #endif + #ifdef DB_HISPANO + dbh_recarga(); + #endif for (i = 0; i <= highest_fd; i++) if ((acptr = loc_clients[i]) && !IsMe(acptr)) diff -cr ../ircu2.10.06/ircd/s_debug.c ../ircu2.10.06-2/ircd/s_debug.c *** ../ircu2.10.06/ircd/s_debug.c Wed Jun 23 17:09:51 1999 --- ../ircu2.10.06-2/ircd/s_debug.c Fri Jul 2 13:18:25 1999 *************** *** 200,205 **** --- 200,228 ---- #else '-', #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 + '+', + #else + '-', + #endif + 'O', + #ifdef DBH_OPER_HACK + '+', + #else + '-', + #endif + 'C', + #ifdef DBH_CHAN_HACK + '+', + #else + '-', + #endif + #endif /* DB_HISPANO */ '\0' }; diff -cr ../ircu2.10.06/ircd/s_serv.c ../ircu2.10.06-2/ircd/s_serv.c *** ../ircu2.10.06/ircd/s_serv.c Wed Jun 23 17:09:51 1999 --- ../ircu2.10.06-2/ircd/s_serv.c Fri Jul 2 13:18:25 1999 *************** *** 23,34 **** #include "sys.h" #include ! #ifdef DB_ESNET #include #include #include - #include "common.h" #endif #include "h.h" #include "struct.h" #include "ircd.h" --- 23,35 ---- #include "sys.h" #include ! ! #if defined(DB_ESNET) || defined(DB_HISPANO) #include #include #include #endif + #include "h.h" #include "struct.h" #include "ircd.h" *************** *** 54,59 **** --- 55,73 ---- RCSTAG_CC("$Id: s_serv.c,v 1.79 1999/05/13 16:38:40 ircu2_run Exp $"); + #if defined(DB_ESNET) || defined(DB_HISPANO) + #include "msg.h" + /* + * Las tablas con los registros, serie, version ... + */ + int tabla_residente [DBH_MAX_TABLA]; + unsigned long tabla_cuantos [DBH_MAX_TABLA]; + struct dbh_reg *tabla_datos [DBH_MAX_TABLA][DBH_HASH_SIZE]; + unsigned long tabla_version [DBH_MAX_TABLA]; + unsigned long tabla_serie [DBH_MAX_TABLA]; + #endif /* DB_ESNET || DB_HISPANO */ + + static int exit_new_server(aClient *cptr, aClient *sptr, char *host, time_t timestamp, char *fmt, ...) __attribute__ ((format(printf, 5, 6))); *************** *** 811,818 **** cptr->serv->timestamp, MAJOR_PROTOCOL, me.yxx, (me.info[0]) ? (me.info) : "IRCers United"); #ifdef DB_ESNET ! sendto_one(cptr,"%c DB * 0 J %lu",me.yxx[0],db_num_serie_local); #endif IPcheck_connect_fail(cptr); /* Don't charge this IP# for connecting */ } --- 825,861 ---- cptr->serv->timestamp, MAJOR_PROTOCOL, me.yxx, (me.info[0]) ? (me.info) : "IRCers United"); #ifdef DB_ESNET ! sendto_one(cptr,"%c DB * 0 J %lu",me.yxx[0],tabla_serie[ESNET_NICKDB]); #endif + #ifdef DB_HISPANO + /* + * Cuando se nos conectan enviamos una linea 'DBH * 0 J' para cada una + * de las posibles tablas (A..Z), esto hace un pelin mas largo el + * netburst, pero nos ayuda a actualizar todas las tablas. + * 1999/06/20 savage@apostols.org + * OPTIMIZACION a implementar: + * Nodo->Hub: Solo mando relacion de las residentes + * Hub->Nodo: No mando ninguna (el nodo NO ha de actualizarme) + * Hub->Hub : Las mando todas, que remedio ... + * 1999/06/30 savage@apostols.org + */ + { + int es_hub=0; + if(find_conf_host(cptr->confs, cptr->name, CONF_HUB) != NULL) + es_hub=1; + + for(i=DBH_PRIMERA_TABLA; i<=DBH_ULTIMA_TABLA; i++) + { + #ifndef HUB + /* soy un LEAF node */ + if(!tabla_residente[i]) + continue; /* Nodo->Hub: solo residentes */ + #endif /* !HUB */ + sendto_one(cptr, "%c %s - 0 J %c %lu %lu", + me.yxx[0], MSG_DBH, (char)i, tabla_version[i], tabla_serie[i]); + } + } + #endif /* DB_HISPANO */ IPcheck_connect_fail(cptr); /* Don't charge this IP# for connecting */ } *************** *** 1123,1130 **** return 0; } ! #ifdef DB_ESNET ! /* * TEA (cifrado) * --- 1166,1172 ---- return 0; } ! #if defined(DB_ESNET) || defined(DB_HISPANO) /* * TEA (cifrado) * *************** *** 1134,1153 **** */ void tea(unsigned long v[],unsigned long k[],unsigned long x[]) { ! unsigned long y=v[0]^x[0],z=v[1]^x[1],sum=0,delta=0x9E3779B9; ! unsigned long a=k[0],b=k[1],n=32; ! unsigned long c=0,d=0; ! while(n-->0) ! { ! sum += delta; ! y += (z << 4)+a ^ z+sum ^ (z >> 5)+b; ! z += (y << 4)+c ^ y+sum ^ (y >> 5)+d; ! } ! x[0]=y; x[1]=z; } /* * leer_db * --- 1176,1416 ---- */ void tea(unsigned long v[],unsigned long k[],unsigned long x[]) { ! unsigned long y=v[0]^x[0],z=v[1]^x[1],sum=0,delta=0x9E3779B9; ! unsigned long a=k[0],b=k[1],n=32; ! unsigned long c=0,d=0; ! while(n-->0) ! { ! sum += delta; ! y += (z << 4)+a ^ z+sum ^ (z >> 5)+b; ! z += (y << 4)+c ^ y+sum ^ (y >> 5)+d; ! } ! ! x[0]=y; x[1]=z; ! } ! ! /* ! * dbh_eliminar_borrados (tabla) ! * ! * libera (free) todos los registros con marca 'borrados' de memoria. ! * 1999/06/21 savage@apostols.org ! */ ! void dbh_eliminar_borrados(char tabla) ! { ! FILE *f; ! struct dbh_reg *reg; ! int i; ! ! tabla_cuantos[tabla]=0; ! ! for(i=0;inext) ! if(reg->borrado) ! { ! if(reg->prev) ! reg->prev->next=reg->next; ! else ! tabla_datos[tabla][i]=reg->next; /* era el primero */ ! if(reg->next) ! reg->next->prev=reg->prev; ! if(reg->clave) ! RunFree(reg->clave); ! if(reg->valor) ! RunFree(reg->valor); ! RunFree(reg); ! } else ! tabla_cuantos[tabla]++; ! ! return; ! } ! ! /* ! * dbh_eliminar_registro (tabla, clave) ! * ! * libera (free) un registro de memoria. ! * 1999/06/23 savage@apostols.org ! */ ! void dbh_eliminar_registro(char tabla, char *clave) ! { ! struct dbh_reg *reg; ! 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); ! ! for(reg=tabla_datos[tabla][hashi];reg!=NULL;reg=reg->next) ! if(!strcmp(reg->clave,c)) ! { ! /* ! sendto_ops("Elimino T='%c' C='%s' H=%u",tabla, reg->clave, hashi ); ! */ ! if(reg->prev) ! reg->prev->next=reg->next; ! else ! tabla_datos[tabla][hashi]=reg->next; /* era el primero */ ! ! if(reg->next) ! reg->next->prev=reg->prev; ! ! if(reg->clave) ! RunFree(reg->clave); ! if(reg->valor) ! RunFree(reg->valor); ! RunFree(reg); ! tabla_cuantos[tabla]--; ! } ! ! RunFree(c); ! ! return; ! } ! ! /* ! * dbh_insertar_registro (tabla, destino, clave, valor) ! * ! * mete un registro en memoria ... ! * 1999/06/23 savage@apostols.org ! */ ! void dbh_insertar_registro(char tabla, char *destino, char *clave, char *valor) ! { ! struct dbh_reg *reg, *rh; ! int hashi; ! char *c, *v, *d; ! aClient *acptr; ! int i=0; ! ! /* lo borro primero, por si es un cambio */ ! dbh_eliminar_registro(tabla, clave); ! ! c=RunMalloc(strlen(clave)+1); ! if(!c) return; ! v=RunMalloc(strlen(valor)+1); ! if(!v) { ! RunFree(c); ! return; ! } ! d=RunMalloc(strlen(destino)+1); ! if(!d) { ! RunFree(c); ! RunFree(v); ! return; ! } ! ! reg=RunMalloc(sizeof(struct dbh_reg)); ! if(!reg) { ! RunFree(c); ! RunFree(v); ! RunFree(d); ! return; ! } ! ! strcpy(c,clave); ! strcpy(v,valor); ! strcpy(d,destino); ! ! /* paso a minusculas */ ! while( c[i] != 0 ) ! c[i]=toLower(c[i++]); ! ! /* creo el registro */ ! reg->clave=c; ! reg->valor=v; ! reg->destino=d; ! reg->next=reg->prev=NULL; ! reg->borrado=0; ! reg->compactado=0; ! ! /* marco como local si es para mi o broadcast */ ! if( *d=='*' || ((acptr=find_match_server(d)) && (IsMe(acptr))) ) ! reg->local=1; ! else ! reg->local=0; ! ! /* busco hash */ ! hashi=dbh_hash_registro(reg->clave); ! ! /* ! sendto_ops("Inserto T='%c' C='%s' H=%u",tabla, reg->clave, hashi ); ! */ ! ! rh=tabla_datos[tabla][hashi]; ! tabla_datos[tabla][hashi]=reg; ! reg->next=rh; ! if(rh) ! rh->prev=reg; ! ! tabla_cuantos[tabla]++; ! return; ! } ! ! /* ! * dbh_buscar_registro (tabla, clave) ! * ! * busca un registro en memoria ... ! * 1999/06/23 savage@apostols.org ! */ ! struct dbh_reg * dbh_buscar_registro(char tabla, char *clave) ! { ! struct dbh_reg *reg; ! 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); ! ! /* ! sendto_ops("Busco T='%c' C='%s' H=%u",tabla, c, hashi ); ! */ ! ! for(reg=tabla_datos[tabla][hashi];reg!=NULL;reg=reg->next) ! if(!strcmp(reg->clave,c)) { ! RunFree(c); ! return reg; ! } ! RunFree(c); ! return NULL; ! } ! ! /* ! * dbh_buscar_registro_local (tabla, clave) ! * ! * busca un registro local en memoria ... ! * 1999/06/23 savage@apostols.org ! */ ! struct dbh_reg * dbh_buscar_registro_local(char tabla, char *clave) ! { ! struct dbh_reg *reg; ! ! reg=dbh_buscar_registro(tabla,clave); ! if(!reg) ! return NULL; ! if(reg->local) ! return reg; ! else ! return NULL; } + #endif /* defined(DB_ESNET) || defined(DB_HISPANO) */ + + #ifdef DB_ESNET /* * leer_db * *************** *** 1201,1311 **** } /* - ** El 0 es nuestra base de datos local - ** El 1 son los registros que no son nuestros, para poder compactar luego la DB. - */ - static struct DB_nick *nick_db[2]={NULL,NULL}; - unsigned long db_num_serie_local=0; - - /* - * db_manage_nick - * - * Escribe un registro nuevo, modifica uno existente o lo borra - * - */ - struct DB_nick *db_manage_nick(char *nick_,int offset,int borrar) - { - struct DB_nick *n,*n2=NULL; - char nick[512],*p=nick; - - while(*p++=tolower(*nick_++)); - - n=nick_db[offset]; - /* Busca el registro */ - while(n!=NULL) { - if(!strcmp(n->nick,nick)) break; - if(*(n->nick)=='\0') n2=n; - n=n->siguiente; - } - if(n!=NULL) { - memset(n->nick,0,sizeof(n->nick)); - if(!borrar) strcpy(n->nick,nick); - return n; - } - if(borrar) return NULL; - - /* - ** No existe el registro. Busco un hueco o pido uno nuevo - */ - if(n2!=NULL) { - memset(n2->nick,0,sizeof(n2->nick)); - strcpy(n2->nick,nick); - return n2; - } - n=(struct DB_nick *)RunMalloc(sizeof(struct DB_nick)); - if(n==NULL) { - sendto_ops("No hay memoria para un nuevo registro"); - return NULL; - } - memset(n,0,sizeof(struct DB_nick)); - strcpy(n->nick,nick); - n->siguiente=nick_db[offset]; - nick_db[offset]=n; - return n; - } - - /* * db_alta * * Da de alta una entrada en la base de datos en memoria * Formato "serie destino id clave contenido" * */ void db_alta(char *registro) { ! char *p,*p2,*p3; ! aClient *acptr; ! int offset=0; ! struct DB_nick *nick; ! p=strchr(registro,' '); ! if(p==NULL) return; ! p2=strchr(++p,' '); ! if(p2==NULL) return; ! db_num_serie_local=atol(registro); ! /* ! * Guardamos en memoria AUNQUE no sea para nosotros, para poder hacer ! * luego la compactacion de la base de datos. ! * Si no es para nosotros, los ponemos en una cola aparte. ! * ! */ ! *p2='\0'; ! if(*p=='*') p=me.name; ! acptr=find_match_server(p); ! if((acptr==NULL) || !IsMe(acptr)) offset=1; ! *p2++=' '; ! p=strchr(p2,' '); ! if(p==NULL) return; ! p3=strchr(++p,' '); ! if(p3!=NULL) *p3++='\0'; ! ! switch (*p2) { ! case 'N': ! if(p3==NULL) { /* Borrado */ ! db_manage_nick(p,offset,!0); ! return; ! } ! if(strlen(p3)<12) return; ! nick=db_manage_nick(p,offset,0); ! if(nick==NULL) return; ! nick->clave[0]=base64toint(p3); ! nick->clave[1]=base64toint(p3+6); ! break; ! } ! if(p3!=NULL) *(--p3)=' '; ! return; } /* --- 1464,1507 ---- } /* * db_alta * * Da de alta una entrada en la base de datos en memoria * Formato "serie destino id clave contenido" * + * modificado para usar las hash con funciones dbh_* + * 1999/06/30 savage@apostols.org */ void db_alta(char *registro) { ! char *p0, *p1, *p2, *p3, *p4; ! p0=strtok(registro," "); /* serie */ ! p1=strtok(NULL, " "); /* destino */ ! p2=strtok(NULL, " "); /* tabla */ ! p3=strtok(NULL, " \r\n"); /* clave */ ! p4=strtok(NULL, "\r\n"); /* valor (opcional) */ ! ! if(p3==NULL) ! return; /* registro incompleto */ ! ! tabla_serie[ESNET_NICKDB]=atol(p0); ! ! switch (*p2) ! { ! case 'N': ! if(p4==NULL) { /* Borrado */ ! dbh_eliminar_registro(ESNET_NICKDB, p3); ! break; ! } ! dbh_insertar_registro(ESNET_NICKDB, p1, p3, p4); ! break; ! default: ! break; ! } ! return; } /* *************** *** 1316,1358 **** */ void initdb(void) { ! char buf[1024]; ! int handle; ! nick_db[0]=nick_db[1]=NULL; ! db_num_serie_local=0; ! if(!(handle=abrir_db(0,buf))) return; ! do { ! db_alta(buf); ! } while(leer_db(handle,buf)!=-1); ! return; } /* * borrar_db * ! * Borra la base de datos en memoria * */ void borrar_db(void) { ! struct DB_nick *n,*n2; ! ! n=nick_db[0]; ! while(n!=NULL) { ! n2=n->siguiente; ! RunFree(n); ! n=n2; ! } ! ! n=nick_db[1]; ! while(n!=NULL) { ! n2=n->siguiente; ! RunFree(n); ! n=n2; ! } ! nick_db[0]=nick_db[1]=NULL; ! db_num_serie_local=0; } /* --- 1512,1549 ---- */ void initdb(void) { ! char buf[1024]; ! int handle; ! tabla_residente[ESNET_NICKDB]=1; ! tabla_serie[ESNET_NICKDB]=0; ! tabla_cuantos[ESNET_NICKDB]=0; ! ! if(!(handle=abrir_db(0,buf))) return; ! do { ! db_alta(buf); ! } while(leer_db(handle,buf)!=-1); ! ! dbh_eliminar_borrados(ESNET_NICKDB); ! ! return; } /* * borrar_db * ! * Borra la base de datos en memoria (modificado para uso de hash) * + * 1999/06/30 savage@apostols.org */ void borrar_db(void) { ! int i; ! struct dbh_reg *reg; ! ! for(i=0;inext) ! reg->borrado=1; } /* *************** *** 1363,1393 **** */ void reload_db(void) { ! borrar_db(); ! initdb(); ! sendto_ops("Releyendo la base de datos. Ultimo registro: %lu",db_num_serie_local); } - /* - * find_db_nick - * - * Busca un nick en la base de datos - * - */ - struct DB_nick *find_db_nick(char *nick) - { - struct DB_nick *db_nick; - char n[512],*p=n; - - while(*p++=tolower(*nick++)); - - db_nick=nick_db[0]; - while(db_nick!=NULL) { - if(!strcmp(db_nick->nick,n)) break; - db_nick=db_nick->siguiente; - } - return db_nick; - } /* * m_db --- 1554,1564 ---- */ void reload_db(void) { ! borrar_db(); ! initdb(); ! sendto_ops("Releyendo la base de datos. Ultimo registro: %lu",tabla_serie[ESNET_NICKDB]); } /* * m_db *************** *** 1412,1418 **** db=atol(parv[4]); switch(*parv[3]) { case 'B': ! if(es_hub) sendto_one(sptr,"%c DB %s 0 J %lu",me.yxx[0],parv[0],db_num_serie_local); return 0; break; --- 1583,1589 ---- db=atol(parv[4]); switch(*parv[3]) { case 'B': ! if(es_hub) sendto_one(sptr,"%c DB %s 0 J %lu",me.yxx[0],parv[0],tabla_serie[ESNET_NICKDB]); return 0; break; *************** *** 1421,1427 **** char *p,*p2,*p3,*p4; int cont=100; ! if(db>=db_num_serie_local) { /* Se le pueden mandar registros individuales */ sptr->serv->esnet_db=!0; return 0; break; --- 1592,1598 ---- char *p,*p2,*p3,*p4; int cont=100; ! if(db>=tabla_serie[ESNET_NICKDB]) { /* Se le pueden mandar registros individuales */ sptr->serv->esnet_db=!0; return 0; break; *************** *** 1449,1455 **** } while(leer_db(db_file,db_buf)!=-1); close(db_file); if(cont) sptr->serv->esnet_db=!0; ! else sendto_one(sptr,"%c DB %s 0 B %lu",me.yxx[0],parv[0],db_num_serie_local); return 0; break; } --- 1620,1626 ---- } while(leer_db(db_file,db_buf)!=-1); close(db_file); if(cont) sptr->serv->esnet_db=!0; ! else sendto_one(sptr,"%c DB %s 0 B %lu",me.yxx[0],parv[0],tabla_serie[ESNET_NICKDB]); return 0; break; } *************** *** 1472,1485 **** sendto_one(acptr,"%c DB %s 0 Q %lu\n",NumServ(sptr),acptr->name,db); return 0; } ! if(dbname,db); return 0; } ! if(dbvalue.cptr,db_buf); } ! db_num_serie_local=db; alarm(3); db_file=open("database",O_WRONLY | O_APPEND | O_CREAT, S_IRUSR | S_IWUSR); --- 1682,1688 ---- sendto_one(lp->value.cptr,db_buf); } ! tabla_serie[ESNET_NICKDB]=db; alarm(3); db_file=open("database",O_WRONLY | O_APPEND | O_CREAT, S_IRUSR | S_IWUSR); *************** *** 1531,1534 **** return 0; } ! #endif /* Base de Datos ESNET */ --- 1702,2503 ---- return 0; } ! #endif /* DB_ESNET */ ! ! #ifdef DB_HISPANO ! /* ! * dbh_violacion (argc, argv, texto) ! * ! * Muestra error protocolo DBH a los opers. ! * 1999/06/28 savage@apostols.org ! */ ! 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; inext) ! reg->borrado=1; ! ! return; ! } ! ! /* ! * dbh_compactar_tabla (tabla, version, serie, hash) ! * ! * compacta la tabla de disco, guarda version en disco, ! * si la hash no coincide borra la tabla. ! * 1999/06/21 savage@apostols.org ! */ ! void dbh_compactar_tabla(char tabla, unsigned long version, unsigned long serie, unsigned long hash) ! { ! FILE *n, *o; ! struct dbh_reg *reg; ! unsigned long i, j=0; ! char resi; ! char *rtxt; ! char *p; ! char tmp1[1024], tmp2[1024]; ! ! resi=tabla_residente[tabla]; ! ! /* creamos una tabla nueva */ ! n=dbh_abrir_tabla( '-', "w" ); ! o=dbh_abrir_tabla(tabla, "r" ); ! ! if(!resi) ! dbh_cargar_tabla(tabla); /* Hacemos residente la tabla un momento */ ! ! /* pongo los flags de compactacion a 0 */ ! for(i=0;inext) ! reg->compactado=0; ! ! /* ! * recorremos la tabla y si el registro esta en memoria, ! * lo metemos de nuevo en la tabla ! */ ! for(i=1;icompactado==0 ) { ! reg->compactado=1; ! fprintf(n,"%s %lu %c %s :%s\n", reg->destino, ++j, tabla, p, reg->valor); ! } ! } ! } ! ! dbh_cerrar_tabla(o); ! dbh_cerrar_tabla(n); ! ! /* en cualquier caso actualizo version */ ! dbh_guardar_version(tabla, version); ! ! /* calculo si ha sido correcto */ ! sprintf(tmp1, "tabla.%c", tabla); ! sprintf(tmp2, "tabla.%c", '-'); /* tabla temporal */ ! if( hash==dbh_hash_tabla('-') && j==serie ) { ! unlink(tmp1); ! rename(tmp2,tmp1); ! } else { ! unlink(tmp2); ! dbh_borrar_tabla(tabla,version); /* pone a 0 la serie */ ! dbh_eliminar_borrados(tabla); /* limpia de verdad con RunFree() */ ! return; ! } ! ! if(!resi) { ! /* no era residente, la elimino de memoria aunque haya funcionado */ ! for(i=0;inext) ! reg->borrado=1; ! dbh_eliminar_borrados(tabla); ! } ! ! return; ! } ! ! /* ! * m_dbh ! * ! * parv[0] = prefijo del enviador ! * parv[1..] = argumentos de DBH ! * ! * Maneja los mensajes DBH recibidos por los servers. ! * 1999/06/20 savage@apostols.org ! */ ! int m_dbh(aClient *cptr, aClient *sptr, int parc, char *parv[]) ! { ! unsigned long numserie, numversion, i, hash; ! unsigned int j; ! char tabla; ! aClient *acptr; ! Dlink *lp; ! char db_buf[1024], *reg; ! FILE *db_file; ! int es_hub=0; ! ! if(!IsServer(cptr)) { ! struct dbh_reg *reg; ! ! if(!IsOper(sptr) && !dbh_buscar_registro_local(DBH_OPERDB,sptr->name)) ! return 0; ! /* Aqui meteremos los comandos DBH en modo usuario, de momento nada */ ! /* DBH */ ! if(parc!=3) { ! sendto_one(cptr,":%s NOTICE %s :Parametros incorrectos: Formato: DBH ", ! me.name, parv[0] ); ! return 0; ! } ! ! if(!tabla_residente[*parv[1]]) { ! sendto_one(cptr,":%s NOTICE %s :Tabla '%c' no es residente.", ! me.name, parv[0], ! *parv[1]); ! return 0; ! } ! ! reg=dbh_buscar_registro(*parv[1], parv[2]); ! if(!reg) { ! sendto_one(cptr,":%s NOTICE %s :No encontrado '%s' en '%c'", ! me.name, parv[0], ! parv[2], *parv[1]); ! return 0; ! } ! ! sendto_one(cptr,":%s NOTICE %s :Destino='%s' Valor='%s'", ! me.name, parv[0], ! reg->destino, reg->valor); ! ! return 0; ! } ! ! if(find_conf_host(cptr->confs, cptr->name, CONF_HUB) != NULL) ! es_hub=1; /* El remoto es un Hub */ ! ! numserie=atol(parv[2]); /* solo != 0 en registros */ ! ! if(!numserie) { ! switch(*parv[3]) ! { ! case 'B': ! /* DBH 0 B */ ! /* No rutable, solo hub-nodo: sera para nosotros */ ! if(!es_hub || parc!=7) ! { ! /* ! * Un nodo idiota nos envia un "continua burst", ! * avisamos a los ircops ! */ ! dbh_violacion(parc, parv, "Origen no Hub o Parametros incorrectos"); ! break; ! } ! ! tabla=*parv[4]; ! numversion=atol(parv[5]); ! numserie=atol(parv[6]); ! ! if(numversion==tabla_version[tabla] && numserie==tabla_serie[tabla]) ! { ! /* ! * parece que llegamos al final, ya podemos eliminar de memoria ! * los registros marcados para borrar ... ! */ ! dbh_eliminar_borrados(tabla); ! break; ! } ! ! /* le contestamos con 0 J para que continue */ ! sendto_one(sptr, "%c %s - 0 J %c %lu %lu", ! me.yxx[0], MSG_DBH, ! tabla, tabla_version[tabla], tabla_serie[tabla] ); ! break; ! ! case 'J': ! /* DBH 0 J */ ! /* No rutable, solo nodo-nodo: sera para nosotros */ ! if(parc!=7) ! { ! /* parametros incorrectos, avisamos */ ! dbh_violacion(parc, parv, "Parametros incorrectos"); ! break; ! } ! ! tabla=*parv[4]; ! numversion=atol(parv[5]); ! numserie=atol(parv[6]); ! ! /* 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 */ ! sendto_one(sptr, "%c %s - 0 J %c %lu %lu", ! me.yxx[0], MSG_DBH, ! tabla, tabla_version[tabla], 0 ); ! break; ! } ! #ifdef HUB ! if(numversion>tabla_version[tabla] && !es_hub) { ! /* el nodo es un mamon, con version superior, ordeno borrado */ ! /* tambien podria ser ke yo me perdiera algo, pero ... shit hapens */ ! dbh_violacion(parc, parv, "Nodo con version Superior. Borrando DB remota ..."); ! sendto_one(sptr,"%c %s %s 0 D %c %lu", ! me.yxx[0],MSG_DBH,parv[0], ! tabla, tabla_version[tabla]); ! break; ! } ! ! if(numversion=tabla_serie[tabla]) ! break; /* El remoto es mas nuevo que nosotros o ya esta ok */ ! ! /* abrimos la tabla */ ! db_file = dbh_abrir_tabla(tabla, "r"); ! ! for(j=0,i=numserie+1;db_file && i<=tabla_serie[tabla] && j<25 ;i++,j++) ! { ! char *reg; ! ! reg=dbh_leer_registro(db_file, i); ! if(reg) ! { ! sendto_one(sptr,"%c %s %s", ! me.yxx[0],MSG_DBH,reg); ! } ! } ! ! dbh_cerrar_tabla(db_file); ! ! /* Enviamos el '0 B' para que el otro se entere si hemos terminado */ ! sendto_one(sptr, "%c %s - 0 B %c %lu %lu", ! me.yxx[0], MSG_DBH, ! tabla, tabla_version[tabla], tabla_serie[tabla] ); ! #endif /* HUB */ ! ! break; ! ! case 'q': ! /* DBH 0 q */ ! /* Rutable, debemos buscar destino */ ! #ifdef HUB ! if(parc!=8) ! { ! /* parametros incorrectos, avisamos */ ! dbh_violacion(parc, parv, "Parametros incorrectos"); ! break; ! } ! ! /* lo dejo pasar hacia destino, no puede ser para mi */ ! if(!(acptr=find_match_server(parv[1]))) ! { ! /* joer, el server de destino no existe */ ! sendto_one(sptr, err_str(ERR_NOSUCHSERVER), me.name, parv[0], parv[1]); ! break; ! } ! ! if(IsMe(acptr)) ! { ! /* ! * Un nodo/hub idiota nos contesta sobre una tabla, ! * no hace falta avisar ... ! */ ! break; ! } else ! sendto_one(acptr,"%c %s %s 0 q %s %s %s %s", ! NumServ(sptr), MSG_DBH, acptr->name, ! parv[4],parv[5],parv[6],parv[7]); ! #endif /* HUB */ ! break; ! ! case 'Q': ! /* DBH /<*> 0 Q */ ! /* Rutable y Broadcast: tendre ke mirar destino */ ! if(!es_hub || parc!=5) ! { ! /* ! * Un nodo idiota nos interroga sobre una tabla, ! * avisamos a los ircops ! */ ! dbh_violacion(parc, parv, "Origen no Hub o Parametros incorrectos"); ! break; ! } ! #ifdef HUB ! /* ! * Si es un wildcard lo propago a todos ! */ ! if(*parv[1]=='*') ! { ! for (lp = me.serv->down; lp; lp = lp->next) ! { ! if( lp->value.cptr==cptr ) ! continue; /* al que nos lo envia, no se lo reenvio */ ! sendto_one(lp->value.cptr, "%s %s %s 0 Q %s", ! parv[0], MSG_DBH, parv[1], parv[4] ); ! } ! } else { ! /* ! * Pues no, no es un wilcard, busco destino ... ! */ ! if(!(acptr = find_match_server(parv[1]))) ! { ! /* joer, el server de destino no existe */ ! sendto_one(sptr, err_str(ERR_NOSUCHSERVER), me.name, parv[0], parv[1]); ! break; ! } ! ! if(!IsMe(acptr)) ! { ! sendto_one(acptr,"%c %s %s 0 Q %s\n", ! NumServ(sptr), MSG_DBH, ! acptr->name, parv[4]); ! break; ! } ! } ! #endif /* HUB */ ! ! /* bueno, este 0 Q es para mí (o wilcard), a contestar ... */ ! tabla=*parv[4]; ! sendto_one(sptr,"%c %s %s 0 q %c %lu %lu %lu\n", ! me.yxx[0],MSG_DBH,parv[0], ! tabla, tabla_version[tabla], tabla_serie[tabla], ! dbh_hash_tabla(tabla) ); ! break; ! ! case 'D': ! /* DBH 0 D */ ! /* Rutable: tendre que buscar destino */ ! if(!es_hub || parc!=6) ! { ! /* ! * Un nodo idiota intenta borrarnos una tabla, ! * avisamos a los ircops ! */ ! dbh_violacion(parc, parv, "Origen no Hub o Parametros incorrectos"); ! break; ! } ! #ifdef HUB ! if(!(acptr = find_match_server(parv[1]))) ! { ! /* joer, el server de destino no existe */ ! sendto_one(sptr, err_str(ERR_NOSUCHSERVER), me.name, parv[0], parv[1]); ! break; ! } ! ! if(!IsMe(acptr)) ! { ! sendto_one(acptr,"%c %s %s 0 D %s %s\n", ! NumServ(sptr), MSG_DBH, ! acptr->name, parv[4], parv[5]); ! break; ! } ! #endif /* HUB */ ! ! /* pues alguien me ordena borrar una tabla */ ! tabla=*parv[4]; ! numversion=atol(parv[5]); ! dbh_borrar_tabla(tabla, numversion); ! ! /* envio un 0 J para solicitar registros nuevos */ ! sendto_one(sptr, "%c %s - 0 J %c %lu %lu", ! me.yxx[0], MSG_DBH, ! tabla, tabla_version[tabla], tabla_serie[tabla] ); ! break; ! ! case 'C': ! /* DBH <*> 0 C */ ! /* Broadcast: tengo que propagarlo a todos */ ! if(!es_hub || parc!=8 || *parv[1]!='*' ) ! { ! /* ! * Un nodo idiota intenta compactarnos una tabla, ! * avisamos a los ircops ! */ ! dbh_violacion(parc, parv, "Origen no Hub o Parametros incorrectos"); ! break; ! } ! ! #ifdef HUB ! /* ! * Propago compactacion a todos mis nodos ! */ ! for (lp = me.serv->down; lp; lp = lp->next) ! { ! if( lp->value.cptr==cptr ) ! continue; /* al que nos lo envia, no se lo reenvio */ ! sendto_one(lp->value.cptr, "%s %s %s 0 C %s %s %s %s", ! parv[0], MSG_DBH, parv[1], ! parv[4], parv[5], parv[6], parv[7] ); ! } ! #endif ! tabla=*parv[4]; ! numversion=atol(parv[5]); ! numserie=atol(parv[6]); ! hash=atol(parv[7]); ! dbh_compactar_tabla(tabla,numversion,numserie,hash); ! /* Enviamos el '0 J' para informar / pedir mas */ ! sendto_one(sptr, "%c %s - 0 J %c %lu %lu", ! me.yxx[0], MSG_DBH, ! tabla, tabla_version[tabla], tabla_serie[tabla] ); ! break; ! ! default: ! return 0; /* Orden incorrecta, ni puto caso */ ! } ! ! /* orden procesada */ ! return 0; ! } ! ! /* Si llegamos aqui, se trata de un registro */ ! /* parv[0] parv[1] parv[2] parv[3] parv[4] parv[5] */ ! /* DBH /<*> [:] */ ! /* Broadcast: tengo que propagarlo a todos */ ! ! if(!es_hub || parc<5 ) ! { ! /* ! * Un nodo idiota nos envia un registro, ! * avisaremos a los operadores o a los services ! */ ! dbh_violacion(parc, parv, "Origen no Hub o Parametros incorrectos"); ! return 0; ! } ! ! /* Procesamos un registro */ ! tabla=*parv[3]; ! if(numserie!=(tabla_serie[tabla]+1)) ! { ! /* ! * carambas, un registro atrasado o adelantado ... lo ignoro ... ! * no me interesa ni a mi ni a nadie que cuelgue de mi. ! */ ! return 0; ! } ! ! #ifdef HUB ! /* ! * Propago el registro ... ! */ ! if(parc==6) ! sprintf_irc(db_buf,"%c %s %s %s %s %s :%s", ! NumServ(sptr),MSG_DBH,parv[1], ! parv[2],parv[3],parv[4],parv[5]); ! else ! sprintf_irc(db_buf,"%c %s %s %s %s %s", ! NumServ(sptr),MSG_DBH,parv[1], ! parv[2],parv[3],parv[4]); ! ! for (lp = me.serv->down; lp; lp = lp->next) ! { ! if( lp->value.cptr==cptr ) ! continue; /* al que nos lo envia, no se lo reenvio */ ! sendto_one(lp->value.cptr, db_buf); ! } ! #endif /* HUB */ ! ! /* ! * 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) ! return 0; /* que paso ? deberia informar error %m */ ! alarm(3); ! if(parc==6) ! fprintf(db_file, "%s %lu %c %s :%s\n", ! parv[1], numserie, tabla, parv[4], parv[5]); ! else ! fprintf(db_file, "%s %lu %c %s\n", ! parv[1], numserie, tabla, parv[4]); ! dbh_cerrar_tabla(db_file); ! alarm(0); ! ! /* ! * Actualizo la serie en memoria ! */ ! tabla_serie[tabla]++; ! ! /* ! * Meto el registro en memoria si es una tabla residente ! */ ! if(tabla_residente[tabla]) ! { ! if(parc==6) ! dbh_insertar_registro(tabla, parv[1], parv[4], parv[5]); ! else ! dbh_eliminar_registro(tabla, parv[4]); ! } ! ! /* orden procesada */ ! return 0; ! } ! ! /* ! * dbh_recarga () ! * ! * Recarga la base de datos (carga todas las tablas) ! * 1999/06/28 savage@apostols.org ! */ ! void dbh_recarga() ! { ! unsigned char i; ! unsigned int j; ! struct dbh_reg *reg; ! ! sendto_ops("Recargando tablas DBH"); ! for(i=DBH_PRIMERA_TABLA;i<=DBH_ULTIMA_TABLA;i++) { ! /* marco todo como borrado */ ! for(j=0;jnext) ! reg->borrado=1; ! /* cargo de nuevo de disco */ ! dbh_cargar_tabla(i); ! /* elimino lo marcado */ ! dbh_eliminar_borrados(i); ! if(tabla_serie[i]) ! sendto_ops("Tabla '%c' V:%lu S:%lu", ! i, tabla_version[i], tabla_serie[i]); ! } ! ! return; ! } ! ! /* ! * dbh_inicializa () ! * ! * Inicailiza la base de datos (carga todas las tablas) ! * 1999/06/28 savage@apostols.org ! */ ! void dbh_inicializa() ! { ! unsigned char i; ! ! /* --------------------------------------------------- */ ! memset(tabla_residente, 0, sizeof(tabla_residente)); ! memset(tabla_cuantos, 0, sizeof(tabla_cuantos)); ! memset(tabla_datos, 0, sizeof(tabla_datos)); ! memset(tabla_version, 0, sizeof(tabla_version)); ! memset(tabla_serie, 0, sizeof(tabla_serie)); ! /* --------------------------------------------------- */ ! ! /* ! * Hago residentes las tablas necesarias para los parches ! */ ! tabla_residente[DBH_NICKDB]=1; ! tabla_residente[DBH_OPERDB]=1; ! tabla_residente[DBH_CHANDB]=1; ! ! /* --------------------------------------------------- */ ! for(i=DBH_PRIMERA_TABLA;i<=DBH_ULTIMA_TABLA;i++) ! dbh_cargar_tabla(i); ! ! return; ! } ! ! #endif /* DB_HISPANO */ diff -cr ../ircu2.10.06/ircd/s_user.c ../ircu2.10.06-2/ircd/s_user.c *** ../ircu2.10.06/ircd/s_user.c Wed Jun 23 17:09:51 1999 --- ../ircu2.10.06-2/ircd/s_user.c Fri Jul 2 13:18:26 1999 *************** *** 763,770 **** */ int m_nick(aClient *cptr, aClient *sptr, int parc, char *parv[]) { ! #ifdef DB_ESNET ! struct DB_nick *nick_db=NULL; #endif aClient *acptr, *server = NULL; char nick[NICKLEN + 2], *s; --- 763,770 ---- */ 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; char nick[NICKLEN + 2], *s; *************** *** 886,895 **** return exit_client(cptr, sptr, &me, "Nick/Server collision"); } #ifdef DB_ESNET ! if(!IsServer(cptr)) nick_db=find_db_nick(nick); ! #endif ! if (!(acptr = FindClient(nick))) goto nickkilldone; /* No collisions, all clear... */ /* --- 886,906 ---- 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... */ /* *************** *** 1058,1096 **** nickkilldone: ! #ifdef DB_ESNET /* ! * Comprueba si el nick esta registrado, y si lo esta que se ponga la clave correcta ! * */ ! if(nick_db) { /* El nick indicado esta registrado */ ! unsigned long v[2],k[2],x[2]; ! int cont=(NICKLEN+8)/8; ! unsigned long *p=(unsigned long *)nick_db->nick; ! ! k[0]=k[1]=x[0]=x[1]=0; ! if((parc>=3) && (strlen(parv[2])>=12)) { ! k[0]=base64toint(parv[2]); ! k[1]=base64toint(parv[2]+6); ! } else { ! k[0]=base64toint(cptr->passwd); ! k[1]=base64toint(cptr->passwd+6); ! } ! while(cont--) { ! v[0]=ntohl(*p++); ! v[1]=ntohl(*p++); ! tea(v,k,x); ! } ! ! parc=3; /* Chanchullo !!OJO!! */ ! ! if(x[0]!=nick_db->clave[0] || x[1]!=nick_db->clave[1]) parc=0; ! ! if(parc<3) { ! sendto_one(cptr,err_str(ERR_NICKREGISTERED), ! me.name,parv[0],nick); ! return 0; ! } } #endif --- 1069,1140 ---- 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 */ ! if(reg) { /* El nick indicado esta registrado */ ! unsigned long v[2],k[2],x[2]; ! int cont=(NICKLEN+8)/8; ! char tmpnick[8*((NICKLEN+8)/8)]; ! char tmppass[12+1]; ! unsigned long *p=(unsigned long *)tmpnick; ! unsigned long numpass[2]; ! int legal=1; ! char *nombre; ! ! memset(tmpnick,0,sizeof(tmpnick)); ! strncpy(tmpnick,reg->clave,sizeof(tmpnick)); ! ! memset(tmppass,0,sizeof(tmppass)); ! strncpy(tmppass,reg->valor,sizeof(tmppass)); ! numpass[0]=base64toint(tmppass); ! numpass[1]=base64toint(tmppass+6); ! ! memset(tmppass,0,sizeof(tmppass)); ! if(parc>=3) ! strncpy(tmppass,parv[2],sizeof(tmppass)); ! else ! strncpy(tmppass,cptr->passwd,sizeof(tmppass)); ! ! x[0]=x[1]=0; ! k[0]=base64toint(tmppass); ! k[1]=base64toint(tmppass+6); ! ! while(cont--) { ! v[0]=ntohl(*p++); ! v[1]=ntohl(*p++); ! tea(v,k,x); ! } ! ! if(x[0]!=numpass[0] || x[1]!=numpass[1]) ! legal=0; ! ! if(*parv[0]) ! nombre=parv[0]; ! else ! nombre=nick; ! ! if(legal) { ! sendto_one(cptr, ":%s NOTICE %s :Contraseña aceptada. Bienvenid@ a casa ;)", ! 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), ! me.name,parv[0],nick); ! return 0; ! } } #endif *************** *** 2665,2674 **** */ if (!(setflags & FLAGS_CHSERV) && !IsServer(cptr) #ifdef OPER_CHANNEL_SERVICE_ESNET ! && !IsOper(sptr) #endif ) sptr->flags &= ~FLAGS_CHSERV; /* * Compare new flags with old flags and send string which * will cause servers to update correctly. --- 2709,2722 ---- */ if (!(setflags & FLAGS_CHSERV) && !IsServer(cptr) #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; + /* * Compare new flags with old flags and send string which * will cause servers to update correctly. Only in ../ircu2.10.06-2: jcea2savage.patch