diff -crN ../ircu2.10.06/CAMBIOS ../ircu2.10.06-DBH4_nick_mode_r_whois_fix/CAMBIOS *** ../ircu2.10.06/CAMBIOS Thu Jan 1 01:00:00 1970 --- ../ircu2.10.06-DBH4_nick_mode_r_whois_fix/CAMBIOS Tue Jul 6 14:44:41 1999 *************** *** 0 **** --- 1,39 ---- + * 1999/07/06 savage@apostols.org (patch.DBH3_nick_mode_r_whois) + ----------------------------------------------------------------------- + En el fichero struct.h he ampliado con un nuevo campo la estructura + Client, es un unsigned int llamado hmodes. Esto nos permitira dispo- + ner de 32bits adicionales como flags de usuario. Estos nuevos flags + son propagados si se definen en la tabla user_hmodes[] de s_user.c + + En este parche se hace uso del bit de menor peso de este nuevo campo, + en el fichero s_bsd.h: + #define HMODES_NICKREGISTERED 0x00000001 + Y las macros asocicadas: + IsNickRegistered(cptr); + SetNickRegistered(cptr); + ClearNickRegistered(cptr); + + Cuando alguien se pone un nick, se hace un Clear, y si acierta la clave + se hace un SetNickRegistered. + Este flag queda reflejado con la letra 'r' en los modos de usuario, y + solo es aceptada si la envia un server (o por la autentificacion). + Si un usuario esta conectado y registra su nick en los servicios, este + flag se activara cuando llegue su registro DBH/DB. Y le sera borrado + cuando se llegue un borrado de su registro. Los cambios son informados + al usuario y propagados a la red. + + El /WHOIS ha sido ampliado (whocmds.c) para mostrar este nuevo 'flag' + y he ocupado el ERROR 308 en los fichero s_err.c y numeric.h + + He cambiado los condicionales que comprueban en tablas si nick registrado + por la nueva macro IsNickRegistered() + + Queda reflejado en el /VERSION como DBH3.Nr+...., cambiando el anterior + texto (DBH2.N+....). He decidido cambiar a DBH3, pk las macros son y + seran ampliamente usadas en futuras DBH's, y hago desaparecer la opcion + de compilacion DBH_NICK_HACK quedando integrado todo su codigo en el + que es activado por el #define DB_HISPANO + + ----------------------------------------------------------------------- + + * FINAL o INICIO de CAMBIOS, segun se mire :) diff -crN ../ircu2.10.06/config/config-sh.in ../ircu2.10.06-DBH4_nick_mode_r_whois_fix/config/config-sh.in *** ../ircu2.10.06/config/config-sh.in Tue Jul 6 13:34:54 1999 --- ../ircu2.10.06-DBH4_nick_mode_r_whois_fix/config/config-sh.in Tue Jul 6 14:44:41 1999 *************** *** 357,370 **** 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 --- 357,367 ---- 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: 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 bool 'XMODE Networking - ESNET' XMODE_ESNET y diff -crN ../ircu2.10.06/include/numeric.h ../ircu2.10.06-DBH4_nick_mode_r_whois_fix/include/numeric.h *** ../ircu2.10.06/include/numeric.h Mon Jul 5 17:32:40 1999 --- ../ircu2.10.06-DBH4_nick_mode_r_whois_fix/include/numeric.h Tue Jul 6 18:03:54 1999 *************** *** 138,143 **** --- 138,147 ---- #define RPL_NOWAWAY 306 #define RPL_USERIP 307 /* Undernet extension */ + #if defined(DB_HISPANO) || defined(DB_ESNET) + #define RPL_WHOISNICKREGISTERED 308 + #endif + #define RPL_WHOISUSER 311 /* See also RPL_ENDOFWHOIS */ #define RPL_WHOISSERVER 312 #define RPL_WHOISOPERATOR 313 diff -crN ../ircu2.10.06/include/s_bsd.h ../ircu2.10.06-DBH4_nick_mode_r_whois_fix/include/s_bsd.h *** ../ircu2.10.06/include/s_bsd.h Mon Jul 5 17:32:29 1999 --- ../ircu2.10.06-DBH4_nick_mode_r_whois_fix/include/s_bsd.h Tue Jul 6 14:44:41 1999 *************** *** 43,48 **** --- 43,49 ---- #define SEND_UMODES \ (FLAGS_INVISIBLE|FLAGS_OPER|FLAGS_WALLOP|FLAGS_DEAF|FLAGS_CHSERV|FLAGS_DEBUG) + #define ALL_UMODES (SEND_UMODES|FLAGS_SERVNOTICE|FLAGS_LOCOP) #define FLAGS_ID (FLAGS_DOID|FLAGS_GOTID) *************** *** 180,184 **** --- 181,209 ---- #ifdef VIRTUAL_HOST extern struct sockaddr_in vserv; #endif + + #if defined(DB_HISPANO) || defined(DB_ESNET) + + /* Bits de los modos hispano */ + #define HMODE_NICKREGISTERED 0x00000001 /* Nick is registered (HISPANO/ESNET) */ + + /* Modos hispano a propagar */ + #define SEND_HMODES \ + (HMODE_NICKREGISTERED) + + /* Modos hispano TODOS */ + #define ALL_HMODES \ + (SEND_HMODES) + + /* Macros comprobacion modos hispano */ + #define IsNickRegistered(x) ((x)->hmodes & HMODE_NICKREGISTERED) + + /* Macros para poner modos hispano */ + #define SetNickRegistered(x) ((x)->hmodes |= HMODE_NICKREGISTERED) + + /* Macros para borrar modos hispano */ + #define ClearNickRegistered(x) ((x)->hmodes &= ~HMODE_NICKREGISTERED) + + #endif /* DB_HISPANO || DB_ESNET */ #endif /* S_BSD_H */ diff -crN ../ircu2.10.06/include/s_user.h ../ircu2.10.06-DBH4_nick_mode_r_whois_fix/include/s_user.h *** ../ircu2.10.06/include/s_user.h Mon Jul 5 17:32:41 1999 --- ../ircu2.10.06-DBH4_nick_mode_r_whois_fix/include/s_user.h Tue Jul 6 14:44:41 1999 *************** *** 58,72 **** extern int m_userip(aClient *cptr, aClient *sptr, int parc, char *parv[]); extern int m_ison(aClient *cptr, aClient *sptr, int parc, char *parv[]); extern char *umode_str(aClient *cptr); extern void send_umode(aClient *cptr, aClient *sptr, int old, int sendmask); extern int del_silence(aClient *sptr, char *mask); extern int m_silence(aClient *cptr, aClient *sptr, int parc, char *parv[]); extern void set_snomask(aClient *, snomask_t, int); extern int is_snomask(char *); extern int check_target_limit(aClient *sptr, void *target, const char *name, int created); extern void add_target(aClient *sptr, void *target); ! #ifdef DB_ESNET extern unsigned int base64toint(const char *str); #endif extern const char *inttobase64(unsigned int i); --- 58,77 ---- extern int m_userip(aClient *cptr, aClient *sptr, int parc, char *parv[]); extern int m_ison(aClient *cptr, aClient *sptr, int parc, char *parv[]); extern char *umode_str(aClient *cptr); + #if defined(DB_HISPANO) || defined(DB_ESNET) + void dbh_cambiar_registro_nick(char *nick, char modo); + extern void send_umode(aClient *cptr, aClient *sptr, int old, int sendmask, int oldh, int sendhmask); + #else extern void send_umode(aClient *cptr, aClient *sptr, int old, int sendmask); + #endif extern int del_silence(aClient *sptr, char *mask); extern int m_silence(aClient *cptr, aClient *sptr, int parc, char *parv[]); extern void set_snomask(aClient *, snomask_t, int); extern int is_snomask(char *); extern int check_target_limit(aClient *sptr, void *target, const char *name, int created); extern void add_target(aClient *sptr, void *target); ! #if defined(DB_HISPANO) || defined(DB_ESNET) extern unsigned int base64toint(const char *str); #endif extern const char *inttobase64(unsigned int i); diff -crN ../ircu2.10.06/include/struct.h ../ircu2.10.06-DBH4_nick_mode_r_whois_fix/include/struct.h *** ../ircu2.10.06/include/struct.h Mon Jul 5 17:53:13 1999 --- ../ircu2.10.06-DBH4_nick_mode_r_whois_fix/include/struct.h Tue Jul 6 14:44:41 1999 *************** *** 118,123 **** --- 118,126 ---- char sockhost[HOSTLEN + 1]; /* This is the host name from the socket and after which the connection was accepted. */ char passwd[PASSWDLEN + 1]; + #if defined(DB_HISPANO) || defined(DB_ESNET) + unsigned int hmodes; /* HISPANO user modes (flag extensions) */ + #endif }; struct Server { diff -crN ../ircu2.10.06/ircd/channel.c ../ircu2.10.06-DBH4_nick_mode_r_whois_fix/ircd/channel.c *** ../ircu2.10.06/ircd/channel.c Mon Jul 5 17:54:20 1999 --- ../ircu2.10.06-DBH4_nick_mode_r_whois_fix/ircd/channel.c Tue Jul 6 14:44:41 1999 *************** *** 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 --- 1275,1283 ---- } #endif ! #if defined(DB_HISPANO) && (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 *************** *** 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)) --- 1290,1296 ---- #ifdef DBH_OPER_HACK_ONLYREG reg && #endif ! IsNickRegistered(sptr) && dbh_buscar_registro_local(DBH_OPERDB,sptr->name)) { if(!is_chan_op(sptr,chptr)) *************** *** 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; --- 1304,1310 ---- * El fundador de un canal puede usar los modos X en su canal * 1999/06/30 savage@apostols.org */ ! if(reg && IsNickRegistered(sptr) && !strCasediff(sptr->name,reg->valor)) { if(!is_chan_op(sptr,chptr)) jcea_xmode_esnet=!0; *************** *** 1316,1322 **** } #endif /* DBH_CHAN_HACK */ } ! #endif /* DB_HISPANO && DBH_NICK_HACK && (DBH_OPER_HACK || DBH_CHAN_HACK) */ def: default: --- 1312,1318 ---- } #endif /* DBH_CHAN_HACK */ } ! #endif /* DB_HISPANO && (DBH_OPER_HACK || DBH_CHAN_HACK) */ def: default: *************** *** 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 --- 2041,2050 ---- return 0; #endif ! #if defined(DB_HISPANO) && (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 *************** *** 2066,2072 **** #ifdef DBH_OPER_HACK_ONLYREG reg && #endif ! nick_registrado && dbh_buscar_registro_local(DBH_OPERDB, sptr->name) && (!compall("OPER", key)) ) return 0; --- 2058,2064 ---- #ifdef DBH_OPER_HACK_ONLYREG reg && #endif ! IsNickRegistered(sptr) && dbh_buscar_registro_local(DBH_OPERDB, sptr->name) && (!compall("OPER", key)) ) return 0; *************** *** 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 */ --- 2072,2083 ---- * 1999/06/30 savage@apostols.org */ ! if( (!BadPtr(key)) && reg && IsNickRegistered(sptr) && !strCasediff(reg->valor, sptr->name) && (!compall("FUNDADOR", key)) ) return 0; #endif } ! #endif /* DB_HISPANO && (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 -crN ../ircu2.10.06/ircd/s_debug.c ../ircu2.10.06-DBH4_nick_mode_r_whois_fix/ircd/s_debug.c *** ../ircu2.10.06/ircd/s_debug.c Tue Jul 6 13:34:54 1999 --- ../ircu2.10.06-DBH4_nick_mode_r_whois_fix/ircd/s_debug.c Tue Jul 6 18:19:14 1999 *************** *** 202,215 **** #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 - '+', - #else - '-', - #endif 'O', #ifdef DBH_OPER_HACK '+', --- 202,211 ---- #endif #ifdef DB_HISPANO '.','I','R','C','-', 'H','I','S','P','A','N','O','.','O','R','G',':', ! 'D','B','H' ,'3','+', ! ! 'N', 'r','+', 'O', #ifdef DBH_OPER_HACK '+', diff -crN ../ircu2.10.06/ircd/s_err.c ../ircu2.10.06-DBH4_nick_mode_r_whois_fix/ircd/s_err.c *** ../ircu2.10.06/ircd/s_err.c Mon Jul 5 17:32:41 1999 --- ../ircu2.10.06-DBH4_nick_mode_r_whois_fix/ircd/s_err.c Tue Jul 6 18:03:30 1999 *************** *** 314,320 **** --- 314,324 ---- /* 307 */ {RPL_USERIP, ":"}, /* 308 */ + #if defined(DB_HISPANO) || defined(DB_ESNET) + {RPL_WHOISNICKREGISTERED, "%s :Tiene el nick Registrado y Protegido"}, + #else {0, (char *)NULL}, + #endif /* 309 */ {0, (char *)NULL}, /* 310 */ diff -crN ../ircu2.10.06/ircd/s_serv.c ../ircu2.10.06-DBH4_nick_mode_r_whois_fix/ircd/s_serv.c *** ../ircu2.10.06/ircd/s_serv.c Mon Jul 5 17:55:40 1999 --- ../ircu2.10.06-DBH4_nick_mode_r_whois_fix/ircd/s_serv.c Tue Jul 6 14:44:41 1999 *************** *** 1016,1023 **** acptr->name, acptr->hopcount + 1, acptr->lastnick, acptr->user->username, acptr->user->host, acptr->user->server->name, acptr->info); ! send_umode(cptr, acptr, 0, SEND_UMODES); ! send_user_joins(cptr, acptr); } else { --- 1016,1027 ---- acptr->name, acptr->hopcount + 1, acptr->lastnick, acptr->user->username, acptr->user->host, acptr->user->server->name, acptr->info); ! #if defined(DB_HISPANO) || defined(DB_ESNET) ! send_umode(cptr, acptr, 0, SEND_UMODES, 0, SEND_HMODES); ! #else ! send_umode(cptr, acptr, 0, SEND_UMODES); ! #endif ! send_user_joins(cptr, acptr); } else { *************** *** 1272,1277 **** --- 1276,1287 ---- } RunFree(c); + + if(tabla==DBH_NICKDB || tabla==ESNET_NICKDB) + { + /* si borramos un nick, le hacemos un -r y lo propagamos */ + dbh_cambiar_registro_nick(clave, '-'); + } return; } *************** *** 1353,1358 **** --- 1363,1375 ---- rh->prev=reg; tabla_cuantos[tabla]++; + + if(tabla==DBH_NICKDB || tabla==ESNET_NICKDB) + { + /* si metemos un nick, le ponemos el +r y lo propagamos */ + dbh_cambiar_registro_nick(clave, '+'); + } + return; } *************** *** 2040,2052 **** 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 */ --- 2057,2064 ---- if(!IsServer(cptr)) { struct dbh_reg *reg; ! if(!IsOper(sptr) && (!IsNickRegistered(sptr) || !dbh_buscar_registro_local(DBH_OPERDB,sptr->name))) return 0; /* Aqui meteremos los comandos DBH en modo usuario, de momento nada */ /* DBH */ diff -crN ../ircu2.10.06/ircd/s_user.c ../ircu2.10.06-DBH4_nick_mode_r_whois_fix/ircd/s_user.c *** ../ircu2.10.06/ircd/s_user.c Mon Jul 5 17:55:26 1999 --- ../ircu2.10.06-DBH4_nick_mode_r_whois_fix/ircd/s_user.c Tue Jul 6 15:48:36 1999 *************** *** 688,694 **** --- 688,698 ---- /* Send umode to client */ if (MyUser(sptr)) { + #if defined(DB_HISPANO) || defined(DB_ESNET) + send_umode(cptr, sptr, 0, ALL_UMODES, 0, ALL_HMODES); + #else send_umode(cptr, sptr, 0, ALL_UMODES); + #endif if (sptr->snomask != SNO_DEFAULT && (sptr->flags & FLAGS_SERVNOTICE)) sendto_one(sptr, rpl_str(RPL_SNOMASK), me.name, sptr->name, sptr->snomask, sptr->snomask); *************** *** 711,716 **** --- 715,727 ---- 0, 0 }; + #if defined(DB_HISPANO) || defined(DB_ESNET) + static int user_hmodes[] = { + HMODE_NICKREGISTERED, 'r', + 0, 0 + }; + #endif /* DB_HISPANO || DB_ESNET */ + /* *INDENT-ON* */ unsigned int base64toint(const char *str) *************** *** 763,770 **** */ 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; char nick[NICKLEN + 2], *s; --- 774,782 ---- */ int m_nick(aClient *cptr, aClient *sptr, int parc, char *parv[]) { ! #if defined(DB_ESNET) || defined(DB_HISPANO) struct dbh_reg *reg; + char hflag='-'; #endif aClient *acptr, *server = NULL; char nick[NICKLEN + 2], *s; *************** *** 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... */ --- 898,917 ---- return exit_client(cptr, sptr, &me, "Nick/Server collision"); } ! #if defined(DB_ESNET) || defined(DB_HISPANO) reg=NULL; if(!IsServer(cptr)) { #ifdef DB_ESNET reg=dbh_buscar_registro_local(ESNET_NICKDB,nick); ! #ifdef DB_HISPANO if(reg==NULL) ! #endif /* DB_HISPANO */ #endif /* DB_ESNET */ ! #ifdef DB_HISPANO reg=dbh_buscar_registro_local(DBH_NICKDB,nick); ! #endif /* DB_HISPANO */ } ! #endif /* DB_ESNET || DB_HISPANO */ if (!(acptr = FindClient(nick))) goto nickkilldone; /* No collisions, all clear... */ *************** *** 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 --- 1081,1087 ---- nickkilldone: ! #if defined(DB_ESNET) || defined(DB_HISPANO) /* * Comprueba si el nick esta registrado, y * si lo esta que se ponga la clave correcta *************** *** 1119,1124 **** --- 1131,1137 ---- if(legal) { sendto_one(cptr, ":%s NOTICE %s :Contraseña aceptada. Bienvenid@ a casa ;)", me.name, nick ); + hflag='+'; } else { if(parc<3) { sendto_one(cptr, ":%s NOTICE %s :El nick %s está Registrado, necesitas contraseña.", *************** *** 1171,1182 **** sptr->lastnick = atoi(parv[3]); if (Protocol(cptr) > 9 && parc > 7 && *parv[6] == '+') for (p = parv[6] + 1; *p; p++) ! for (s = user_modes; (flag = *s); s += 2) if (((char)*(s + 1)) == *p) { sptr->flags |= flag; break; ! } /* * Set new nick name. */ --- 1184,1207 ---- sptr->lastnick = atoi(parv[3]); if (Protocol(cptr) > 9 && parc > 7 && *parv[6] == '+') for (p = parv[6] + 1; *p; p++) ! #if defined(DB_HISPANO) || defined(DB_ESNET) ! { ! #endif ! for (s = user_modes; (flag = *s); s += 2) if (((char)*(s + 1)) == *p) { sptr->flags |= flag; break; ! } ! #if defined(DB_HISPANO) || defined(DB_ESNET) ! for (s = user_hmodes; (flag = *s); s += 2) ! if (((char)*(s + 1)) == *p) ! { ! sptr->hmodes |= flag; ! break; ! } ! } ! #endif /* * Set new nick name. */ *************** *** 1318,1323 **** --- 1343,1360 ---- return CPTR_KILLED; } } + #if defined(DB_HISPANO) || defined(DB_ESNET) + if( !IsServer(sptr) ) + { + dbh_cambiar_registro_nick(nick, hflag); + + if(hflag=='+') + SetNickRegistered(sptr); /* por si era nuevo */ + else + ClearNickRegistered(sptr); /* por si era nuevo */ + } + #endif + return 0; } *************** *** 2241,2248 **** --- 2278,2357 ---- return 0; } + #if defined(DB_HISPANO) || defined(DB_ESNET) + static char umode_buf[2 * (sizeof(user_modes)+sizeof(user_hmodes)) / sizeof(int)]; + #else static char umode_buf[2 * sizeof(user_modes) / sizeof(int)]; + #endif /* DB_HISPANO || DB_ESNET */ + #if defined(DB_HISPANO) || defined(DB_ESNET) + /* + * Buscamos en memoria el nick y si es nuestro le cambiamos el estado, + * le informamos del cambio, asi como al resto de servers + * 1999/07/06 savage@apostols.org + */ + void dbh_cambiar_registro_nick(char *nick, char modo) + { + int i, *s; + aClient *acptr; + char flag='r', *n; + + acptr=FindClient(nick); + if( !acptr || !MyUser(acptr)) + return; /* no esta conectado o no es mio*/ + + /* busco la letra del flag en la tabla */ + for (s = user_hmodes; (i = *s); s += 2) + if (i == HMODE_NICKREGISTERED) { + flag=(char)(s[1]); + break; + } + + switch(modo) + { + case '+': + if(IsNickRegistered(acptr)) + return; /* ya tiene modo 'r' */ + SetNickRegistered(acptr); + break; + case '-': + if(!IsNickRegistered(acptr)) + return; /* ya no tiene modo 'r' */ + ClearNickRegistered(acptr); + break; + } + + n=acptr->name; + + /* Informamos al usuario */ + sendto_one(acptr, ":%s MODE %s :%c%c", n, n, modo, flag); + + /* Y a todos mis servers */ + for (i = highest_fd; i >= 0; i--) + if ((acptr = loc_clients[i]) && IsServer(acptr)) + sendto_one(acptr, ":%s MODE %s :%c%c", n, n, modo, flag); + } + + /* + * Ampliacion de modos de usuario (sptr->hmodes) + * 1999/07/06 savage@apostols.org + */ + static void send_umode_out(aClient *cptr, aClient *sptr, int old, int oldh) + { + Reg1 int i; + Reg2 aClient *acptr; + + send_umode(NULL, sptr, old, SEND_UMODES, oldh, SEND_HMODES); + + for (i = highest_fd; i >= 0; i--) + if ((acptr = loc_clients[i]) && IsServer(acptr) && + (acptr != cptr) && (acptr != sptr) && *umode_buf) + sendto_one(acptr, ":%s MODE %s :%s", sptr->name, sptr->name, umode_buf); + + if (cptr && MyUser(cptr)) + send_umode(cptr, sptr, old, ALL_UMODES, oldh, ALL_HMODES); + } + #else /* * added Sat Jul 25 07:30:42 EST 1992 */ *************** *** 2261,2266 **** --- 2370,2376 ---- if (cptr && MyUser(cptr)) send_umode(cptr, sptr, old, ALL_UMODES); } + #endif /* DB_HISPANO || DB_ESNET */ /* * m_oper *************** *** 2333,2338 **** --- 2443,2451 ---- !strcmp(encr, aconf->passwd) && attach_conf(sptr, aconf) == ACR_OK) { int old = (sptr->flags & ALL_UMODES); + #if defined(DB_HISPANO) || defined(DB_ESNET) + int oldh = (sptr->hmodes & ALL_HMODES); + #endif char *s; s = strchr(aconf->host, '@'); *************** *** 2361,2367 **** --- 2474,2484 ---- IsOper(sptr) ? 'O' : 'o'); sptr->flags |= (FLAGS_WALLOP | FLAGS_SERVNOTICE | FLAGS_DEBUG); set_snomask(sptr, SNO_OPERDEFAULT, SNO_ADD); + #if defined(DB_HISPANO) || defined(DB_ESNET) + send_umode_out(cptr, sptr, old, oldh); + #else send_umode_out(cptr, sptr, old); + #endif sendto_one(sptr, rpl_str(RPL_YOUREOPER), me.name, parv[0]); #if !defined(CRYPT_OPER_PASSWORD) && (defined(FNAME_OPERLOG) ||\ (defined(USE_SYSLOG) && defined(SYSLOG_OPER))) *************** *** 2583,2589 **** int what, setflags; snomask_t tmpmask = 0; int snomask_given = 0; ! what = MODE_ADD; if (parc < 2) --- 2700,2709 ---- int what, setflags; snomask_t tmpmask = 0; int snomask_given = 0; ! #if defined(DB_HISPANO) || defined(DB_ESNET) ! int sethmodes; ! #endif ! what = MODE_ADD; if (parc < 2) *************** *** 2616,2621 **** --- 2736,2746 ---- for (s = user_modes; (flag = *s) && (m - buf < BUFSIZE - 4); s += 2) if (sptr->flags & flag) *m++ = (char)(*(s + 1)); + #if defined(DB_HISPANO) || defined(DB_ESNET) + for (s = user_hmodes; (flag = *s) && (m - buf < BUFSIZE - 4); s += 2) + if (sptr->hmodes & flag) + *m++ = (char)(*(s + 1)); + #endif *m = '\0'; sendto_one(sptr, rpl_str(RPL_UMODEIS), me.name, parv[0], buf); if ((sptr->flags & FLAGS_SERVNOTICE) && MyConnect(sptr) *************** *** 2629,2635 **** setflags = 0; for (s = user_modes; (flag = *s); s += 2) if (sptr->flags & flag) ! setflags |= flag; if (MyConnect(sptr)) tmpmask = sptr->snomask; --- 2754,2767 ---- setflags = 0; for (s = user_modes; (flag = *s); s += 2) if (sptr->flags & flag) ! setflags |= flag; ! #if defined(DB_HISPANO) || defined(DB_ESNET) ! sethmodes = 0; ! for (s = user_hmodes; (flag = *s); s += 2) ! if (sptr->hmodes & flag) ! sethmodes |= flag; ! #endif ! if (MyConnect(sptr)) tmpmask = sptr->snomask; *************** *** 2686,2693 **** sptr->flags &= ~flag; break; } ! if (flag == 0 && MyConnect(sptr)) ! sendto_one(sptr, err_str(ERR_UMODEUNKNOWNFLAG), me.name, parv[0]); break; } /* --- 2818,2837 ---- sptr->flags &= ~flag; break; } ! #if defined(DB_HISPANO) || defined(DB_ESNET) ! if(flag==0) ! for (s = user_hmodes; (flag = *s); s += 2) ! if (*m == (char)(*(s + 1))) ! { ! if (what == MODE_ADD) ! sptr->hmodes |= flag; ! else ! sptr->hmodes &= ~flag; ! break; ! } ! #endif ! if (flag == 0 && MyConnect(sptr)) ! sendto_one(sptr, err_str(ERR_UMODEUNKNOWNFLAG), me.name, parv[0]); break; } /* *************** *** 2702,2708 **** det_confs_butmask(sptr, CONF_CLIENT & ~CONF_OPS); /* new umode; servers can set it, local users cannot; * prevents users from /kick'ing or /mode -o'ing */ ! /* ** Si somos IRCOPs y hemos puesto el flag K, lo acepta. ** jcea@argo.es - 16/Dic/97 --- 2846,2857 ---- det_confs_butmask(sptr, CONF_CLIENT & ~CONF_OPS); /* new umode; servers can set it, local users cannot; * prevents users from /kick'ing or /mode -o'ing */ ! #if defined(DB_HISPANO) || defined(DB_ESNET) ! /* el modo +r del usuario no se lo puede poner uno mismo */ ! if(!(sethmodes & HMODE_NICKREGISTERED) && !IsServer(cptr)) ! ClearNickRegistered(sptr); ! #endif ! /* ** Si somos IRCOPs y hemos puesto el flag K, lo acepta. ** jcea@argo.es - 16/Dic/97 *************** *** 2712,2723 **** && !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; /* * Compare new flags with old flags and send string which --- 2861,2870 ---- && !IsOper(sptr) #endif #if defined(DB_HISPANO) && defined(DBH_OPER_HACK_KMODE) ! && ( !IsNickRegistered(sptr) || !dbh_buscar_registro_local(DBH_OPERDB,sptr->name) ) #endif ) ! sptr->flags &= ~FLAGS_CHSERV; /* * Compare new flags with old flags and send string which *************** *** 2731,2738 **** --nrof.inv_clients; if (!(setflags & FLAGS_INVISIBLE) && IsInvisible(sptr)) ++nrof.inv_clients; send_umode_out(cptr, sptr, setflags); ! if (MyConnect(sptr)) { if (tmpmask != sptr->snomask) --- 2878,2888 ---- --nrof.inv_clients; if (!(setflags & FLAGS_INVISIBLE) && IsInvisible(sptr)) ++nrof.inv_clients; + #if defined(DB_HISPANO) || defined(DB_ESNET) + send_umode_out(cptr, sptr, setflags, sethmodes); + #else send_umode_out(cptr, sptr, setflags); ! #endif if (MyConnect(sptr)) { if (tmpmask != sptr->snomask) *************** *** 2758,2764 **** for (s = user_modes; (flag = *s); s += 2) if ((c_flags & flag)) ! *m++ = *(s + 1); *m = '\0'; return umode_buf; /* Note: static buffer, gets --- 2908,2923 ---- for (s = user_modes; (flag = *s); s += 2) if ((c_flags & flag)) ! *m++ = *(s + 1); ! #if defined(DB_HISPANO) || defined(DB_ESNET) ! { ! int c_hmodes = cptr->hmodes & SEND_HMODES; ! ! for (s = user_hmodes; (flag = *s); s += 2) ! if ((c_hmodes & flag)) ! *m++ = *(s + 1); ! } ! #endif *m = '\0'; return umode_buf; /* Note: static buffer, gets *************** *** 2769,2775 **** --- 2928,2938 ---- * Send the MODE string for user (user) to connection cptr * -avalon */ + #if defined(DB_HISPANO) || defined(DB_ESNET) + void send_umode(aClient *cptr, aClient *sptr, int old, int sendmask, int oldh, int sendhmask) + #else void send_umode(aClient *cptr, aClient *sptr, int old, int sendmask) + #endif { Reg1 int *s, flag; Reg2 char *m; *************** *** 2808,2813 **** --- 2971,3005 ---- } } } + #if defined(DB_HISPANO) || defined(DB_ESNET) + for (s = user_hmodes; (flag = *s); s += 2) + { + if (MyUser(sptr) && !(flag & sendhmask)) + continue; + if ((flag & oldh) && !(sptr->hmodes & flag)) + { + if (what == MODE_DEL) + *m++ = *(s + 1); + else + { + what = MODE_DEL; + *m++ = '-'; + *m++ = *(s + 1); + } + } + else if (!(flag & oldh) && (sptr->hmodes & flag)) + { + if (what == MODE_ADD) + *m++ = *(s + 1); + else + { + what = MODE_ADD; + *m++ = '+'; + *m++ = *(s + 1); + } + } + } + #endif *m = '\0'; if (*umode_buf && cptr) sendto_one(cptr, ":%s MODE %s :%s", sptr->name, sptr->name, umode_buf); diff -crN ../ircu2.10.06/ircd/whocmds.c ../ircu2.10.06-DBH4_nick_mode_r_whois_fix/ircd/whocmds.c *** ../ircu2.10.06/ircd/whocmds.c Mon Jul 5 17:32:42 1999 --- ../ircu2.10.06-DBH4_nick_mode_r_whois_fix/ircd/whocmds.c Tue Jul 6 14:44:41 1999 *************** *** 802,807 **** --- 802,813 ---- sendto_one(sptr, rpl_str(RPL_AWAY), me.name, parv[0], name, user->away); + #if defined(DB_HISPANO) || defined(DB_ESNET) + if (IsNickRegistered(acptr)) + sendto_one(sptr, rpl_str(RPL_WHOISNICKREGISTERED), + me.name, parv[0], name); + #endif + if (IsAnOper(acptr)) sendto_one(sptr, rpl_str(RPL_WHOISOPERATOR), me.name, parv[0], name);