diff -cNr ../ircd-hybrid-5.3p7/README.jcs ./README.jcs *** ../ircd-hybrid-5.3p7/README.jcs Wed Dec 31 18:00:00 1969 --- ./README.jcs Sat Jul 17 20:49:07 1999 *************** *** 0 **** --- 1,39 ---- + This version of the Hybrid IRC daemon has been modified to give opers (global + and local) the ability to do the following: + + o Join a channel that is invite-only (+i) or has a key (+k) without + being granted an invite or knowing the key. + + o Join a channel that the operator is banned from. + + o Give channel operator status to themselves or another person on + the channel. + + There is another version of Hybrid out there called DrDevil which also allows + opers to join +i'd or +k'd channels, as well as do anything a channel op can + do without explicitly being given channel operator status (set the topic, + change channel modes, etc.). DrDevil also denies users to kick an oper off a + channel, as well as deop them. This works good in theory, but after using this + on a network, all hell breaks loose. For one thing, all other servers on the + network must use DrDevil for these modifications to work (I'm not sure if it + would even work then), because other servers will allow users to kick opers, as + well as report to opers that they aren't channel operators when they try to do + things without being opped. So, my solution to this is, simply allow opers to + op themselves on a given channel. This way, the channel MODE change will + correctly propogate to all the linked servers and the oper will be able to do + the normal channel operator functions without errors. However, as luck would + have it, a user cannot op themselves on a channel (even if they are already + opped) according to the RFC (1459). When Hybrid receives a channel MODE change + to op an already-opped user, it just drops the request. + + With that, Hybrid+jcs was born. I started from scratch with Hybrid 5.3p7 and + modified the code to allow the aforementioned privelages to opers. Technically + this breaks RFC because it allows a user to op themselves on a channel even if + they are already opped, but it doesn't affect anything (to my knowledge). + Rather than pick a clever title and rename Hybrid, I'm just going to stick with + Hybrid+jcs and release my modifications as .diff-style patches to the official + Hybrid releases. + + + Contact: Joshua Stein + Homepage: http://jcs.org/ircd/ diff -cNr ../ircd-hybrid-5.3p7/diff ./diff *** ../ircd-hybrid-5.3p7/diff Wed Dec 31 18:00:00 1969 --- ./diff Sat Jul 17 22:08:40 1999 *************** *** 0 **** --- 1,45 ---- + diff -cNr ../ircd-hybrid-5.3p7/README.jcs ./README.jcs + *** ../ircd-hybrid-5.3p7/README.jcs Wed Dec 31 18:00:00 1969 + --- ./README.jcs Sat Jul 17 20:49:07 1999 + *************** + *** 0 **** + --- 1,39 ---- + + This version of the Hybrid IRC daemon has been modified to give opers (global + + and local) the ability to do the following: + + + + o Join a channel that is invite-only (+i) or has a key (+k) without + + being granted an invite or knowing the key. + + + + o Join a channel that the operator is banned from. + + + + o Give channel operator status to themselves or another person on + + the channel. + + + + There is another version of Hybrid out there called DrDevil which also allows + + opers to join +i'd or +k'd channels, as well as do anything a channel op can + + do without explicitly being given channel operator status (set the topic, + + change channel modes, etc.). DrDevil also denies users to kick an oper off a + + channel, as well as deop them. This works good in theory, but after using this + + on a network, all hell breaks loose. For one thing, all other servers on the + + network must use DrDevil for these modifications to work (I'm not sure if it + + would even work then), because other servers will allow users to kick opers, as + + well as report to opers that they aren't channel operators when they try to do + + things without being opped. So, my solution to this is, simply allow opers to + + op themselves on a given channel. This way, the channel MODE change will + + correctly propogate to all the linked servers and the oper will be able to do + + the normal channel operator functions without errors. However, as luck would + + have it, a user cannot op themselves on a channel (even if they are already + + opped) according to the RFC (1459). When Hybrid receives a channel MODE change + + to op an already-opped user, it just drops the request. + + + + With that, Hybrid+jcs was born. I started from scratch with Hybrid 5.3p7 and + + modified the code to allow the aforementioned privelages to opers. Technically + + this breaks RFC because it allows a user to op themselves on a channel even if + + they are already opped, but it doesn't affect anything (to my knowledge). + + Rather than pick a clever title and rename Hybrid, I'm just going to stick with + + Hybrid+jcs and release my modifications as .diff-style patches to the official + + Hybrid releases. + + + + + + Contact: Joshua C. Stein + + Homepage: http://jcs.superblock.net/ircd/ diff -cNr ../ircd-hybrid-5.3p7/include/patchlevel.h ./include/patchlevel.h *** ../ircd-hybrid-5.3p7/include/patchlevel.h Sat Jun 12 20:24:02 1999 --- ./include/patchlevel.h Sat Jul 17 21:14:26 1999 *************** *** 17,21 **** */ #ifndef PATCHLEVEL ! #define PATCHLEVEL "2.8/hybrid-5.3p7" #endif --- 17,21 ---- */ #ifndef PATCHLEVEL ! #define PATCHLEVEL "2.8/hybrid-5.3p7+jcs" #endif diff -cNr ../ircd-hybrid-5.3p7/src/channel.c ./src/channel.c *** ../ircd-hybrid-5.3p7/src/channel.c Sat Jun 12 20:24:03 1999 --- ./src/channel.c Sat Jul 17 21:59:47 1999 *************** *** 400,408 **** Reg Link *lp; if (chptr) if ((lp = find_user_link(chptr->members, cptr))) return (lp->flags & CHFL_CHANOP); ! return 0; } --- 400,412 ---- Reg Link *lp; if (chptr) + /* jcs - an oper is an op */ + { + if(IsOper(cptr)) + return CHFL_CHANOP; if ((lp = find_user_link(chptr->members, cptr))) return (lp->flags & CHFL_CHANOP); ! } return 0; } *************** *** 411,419 **** Reg Link *lp; if (chptr) if ((lp = find_user_link(chptr->members, cptr))) return (lp->flags & CHFL_DEOPPED); ! return 0; } --- 415,426 ---- Reg Link *lp; if (chptr) + { + if (IsOper(cptr)) + return 0; if ((lp = find_user_link(chptr->members, cptr))) return (lp->flags & CHFL_DEOPPED); ! } return 0; } *************** *** 803,810 **** ** be resetting the channel's TS -orabidoo */ ! if (who == cptr && whatt == MODE_ADD && *curr == 'o') ! break; /* * to stop problems, don't allow +v and +o to mix * into the one message if from a client. --- 810,818 ---- ** be resetting the channel's TS -orabidoo */ ! /* if (who == cptr && whatt == MODE_ADD && *curr == 'o') ! break; */ /* jcs - breaking rfc :-/ */ ! /* * to stop problems, don't allow +v and +o to mix * into the one message if from a client. *************** *** 1248,1253 **** --- 1256,1265 ---- static int can_join(aClient *sptr, aChannel *chptr, char *key) { Reg Link *lp; + + /* jcs */ + if(IsOper(sptr)) + return 0; /* jcs */ if (is_banned(sptr, chptr)) return (ERR_BANNEDFROMCHAN);