1 /* 2 * Copyright (c) 2005 William Pitcock, et al. 3 * Rights to this code are as documented in doc/LICENSE. 4 * 5 * Protocol handlers, both generic and the actual declarations themselves. 6 * 7 */ 8 9 #ifndef PHANDLER_H 10 #define PHANDLER_H 11 12 struct ircd_ { 13 const char *ircdname; 14 const char *tldprefix; 15 bool uses_uid; 16 bool uses_rcommand; 17 bool uses_owner; 18 bool uses_protect; 19 bool uses_halfops; 20 bool uses_p10; /* Parser hackhack. */ 21 bool uses_vhost; /* Do we use vHosts? */ 22 unsigned int oper_only_modes; 23 unsigned int owner_mode; 24 unsigned int protect_mode; 25 unsigned int halfops_mode; 26 const char *owner_mchar; 27 const char *protect_mchar; 28 const char *halfops_mchar; 29 unsigned int type; 30 unsigned int perm_mode; /* Modes to not disappear when empty */ 31 unsigned int oimmune_mode; /* Mode to disallow kicking ircops */ 32 const char *ban_like_modes; /* e.g. "beI" */ 33 char except_mchar; 34 char invex_mchar; 35 int flags; 36 }; 37 38 typedef struct ircd_ ircd_t; 39 40 /* values for type */ 41 /* -- what the HELL are these used for? A grep reveals nothing.. --w00t 42 * -- they are used to provide a hint to third-party module coders about what 43 * ircd they are working with. --nenolod 44 */ 45 #define PROTOCOL_ASUKA 1 46 #define PROTOCOL_BAHAMUT 2 47 #define PROTOCOL_CHARYBDIS 3 48 #define PROTOCOL_DREAMFORGE 4 49 #define PROTOCOL_HYPERION 5 /* obsolete */ 50 #define PROTOCOL_INSPIRCD 6 51 #define PROTOCOL_IRCNET 7 52 #define PROTOCOL_MONKEY 8 /* obsolete */ 53 #define PROTOCOL_PLEXUS 9 54 #define PROTOCOL_PTLINK 10 55 #define PROTOCOL_RATBOX 11 56 #define PROTOCOL_SCYLLA 12 57 #define PROTOCOL_ELEMENTAL_IRCD 13 58 #define PROTOCOL_SORCERY 14 /* obsolete */ 59 #define PROTOCOL_ULTIMATE3 15 60 #define PROTOCOL_UNREAL 17 61 #define PROTOCOL_SOLIDIRCD 18 62 #define PROTOCOL_NEFARIOUS 19 63 #define PROTOCOL_OFFICEIRC 20 64 #define PROTOCOL_SPORKSIRCD 21 65 #define PROTOCOL_NGIRCD 22 66 67 #define PROTOCOL_OTHER 255 68 69 /* values for flags */ 70 #define IRCD_CIDR_BANS 1 71 #define IRCD_HOLDNICK 2 /* supports holdnick_sts() */ 72 #define IRCD_TOPIC_NOCOLOUR 4 73 #define IRCD_SASL_USE_PUID 8 74 75 /* forced nick change types */ 76 #define FNC_REGAIN 0 /* give a registered user their nick back */ 77 #define FNC_FORCE 1 /* force a user off their nick (kill if unsupported) */ 78 79 /* server login, usually sends PASS, CAPAB, SERVER and SVINFO 80 * you can still change ircd->uses_uid at this point 81 * set me.bursting = true 82 * return 1 if sts() failed (by returning 1), otherwise 0 */ 83 E unsigned int (*server_login)(void); 84 /* introduce a client on the services server */ 85 E void (*introduce_nick)(user_t *u); 86 /* send an invite for a given user to a channel 87 * the source may not be on the channel */ 88 E void (*invite_sts)(user_t *source, user_t *target, channel_t *channel); 89 /* quit a client on the services server with the given message */ 90 E void (*quit_sts)(user_t *u, const char *reason); 91 /* send wallops 92 * use something that only opers can see if easily possible */ 93 E void (*wallops_sts)(const char *text); 94 /* join a channel with a client on the services server 95 * the client should be introduced opped 96 * isnew indicates the channel modes (and bans XXX) should be bursted 97 * note that the channelts can still be old in this case (e.g. kills) 98 * modes is a convenience argument giving the simple modes with parameters 99 * do not rely upon chanuser_find(c,u) */ 100 E void (*join_sts)(channel_t *c, user_t *u, bool isnew, char *modes); 101 /* lower the TS of a channel, joining it with the given client on the 102 * services server (opped), replacing the current simple modes with the 103 * ones stored in the channel_t and clearing all other statuses 104 * if bans are timestamped on this ircd, call chanban_clear() 105 * if the topic is timestamped on this ircd, clear it */ 106 E void (*chan_lowerts)(channel_t *c, user_t *u); 107 /* kick a user from a channel 108 * source is a client on the services server which may or may not be 109 * on the channel */ 110 E void (*kick)(user_t *source, channel_t *c, user_t *u, const char *reason); 111 /* send a privmsg 112 * here it's ok to assume the source is able to send */ 113 E void (*msg)(const char *from, const char *target, const char *fmt, ...) PRINTFLIKE(3, 4); 114 /* send a global privmsg to all users on servers matching the mask 115 * from is a client on the services server 116 * mask is either "*" or it has a non-wildcard TLD */ 117 E void (*msg_global_sts)(user_t *from, const char *mask, const char *text); 118 /* send a notice to a user 119 * from can be a client on the services server or the services server 120 * itself (NULL) */ 121 E void (*notice_user_sts)(user_t *from, user_t *target, const char *text); 122 /* send a global notice to all users on servers matching the mask 123 * from is a client on the services server 124 * mask is either "*" or it has a non-wildcard TLD */ 125 E void (*notice_global_sts)(user_t *from, const char *mask, const char *text); 126 /* send a notice to a channel 127 * from can be a client on the services server or the services server 128 * itself (NULL) 129 * if the source cannot send because it is not on the channel, send the 130 * notice from the server or join for a moment */ 131 E void (*notice_channel_sts)(user_t *from, channel_t *target, const char *text); 132 /* send a notice to ops in a channel 133 * source may or may not be on channel 134 * generic_wallchops() sends an individual notice to each channel operator */ 135 E void (*wallchops)(user_t *source, channel_t *target, const char *message); 136 /* send a numeric from must currently be me.me */ 137 E void (*numeric_sts)(server_t *from, int numeric, user_t *target, const char *fmt, ...) PRINTFLIKE(4, 5); 138 /* kill a user 139 * killer can be a client on the services server or NULL for the 140 * services server itself 141 * unlike other functions, the target is specified by a UID or nick; 142 * do not call user_find(), user_find_named() or similar on it */ 143 E void (*kill_id_sts)(user_t *killer, const char *id, const char *reason); 144 /* part a channel with a client on the services server */ 145 E void (*part_sts)(channel_t *c, user_t *u); 146 /* add a kline on the servers matching the given mask 147 * duration is in seconds, 0 for a permanent kline 148 * if the ircd requires klines to be sent from users, use opersvs */ 149 E void (*kline_sts)(const char *server, const char *user, const char *host, long duration, const char *reason); 150 /* remove a kline on the servers matching the given mask 151 * if the ircd requires unklines to be sent from users, use opersvs */ 152 E void (*unkline_sts)(const char *server, const char *user, const char *host); 153 /* add a xline on the servers matching the given mask 154 * duration is in seconds, 0 for a permanent xline 155 * if the ircd requires xlines to be sent from users, use opersvs */ 156 E void (*xline_sts)(const char *server, const char *realname, long duration, const char *reason); 157 /* remove a xline on the servers matching the given mask 158 * if the ircd requires unxlines to be sent from users, use opersvs */ 159 E void (*unxline_sts)(const char *server, const char *realname); 160 /* add a qline on the servers matching the given mask 161 * duration is in seconds, 0 for a permanent qline 162 * if the ircd requires qlines to be sent from users, use opersvs */ 163 E void (*qline_sts)(const char *server, const char *mask, long duration, const char *reason); 164 /* remove a qline on the servers matching the given mask 165 * if the ircd requires unqlines to be sent from users, use opersvs */ 166 E void (*unqline_sts)(const char *server, const char *mask); 167 /* add a dline (sometimes called zline) on the servers matching mask 168 * if the ircd requires dlines to be sent from users, use opersvs */ 169 E void (*dline_sts)(const char *server, const char *host, long duration, const char *reason); 170 /* remove a dline (sometimes called zline) on the servers matching the given mask 171 * if the ircd requires undlines to be sent from users, use opersvs */ 172 E void (*undline_sts)(const char *server, const char *host); 173 /* make the given service set a topic on a channel 174 * setter and ts should be used if the ircd supports topics to be set 175 * with a given topicsetter and topicts; ts is not a channelts 176 * prevts is the topicts of the old topic or 0 if there was no topic, 177 * useful in optimizing which form of topic change to use 178 * if the given topicts was not set and topicts is used on the ircd, 179 * set c->topicts to the value used */ 180 E void (*topic_sts)(channel_t *c, user_t *source, const char *setter, time_t ts, time_t prevts, const char *topic); 181 /* set modes on a channel by the given sender; sender must be a client 182 * on the services server; sender may or may not be on channel */ 183 E void (*mode_sts)(char *sender, channel_t *target, char *modes); 184 /* ping the uplink 185 * first check if me.connected is true and bail if not */ 186 E void (*ping_sts)(void); 187 /* mark user 'u' as logged in as 'account' 188 * wantedhost is currently not used 189 * first check if me.connected is true and bail if not */ 190 E void (*ircd_on_login)(user_t *u, myuser_t *account, const char *wantedhost); 191 /* mark user 'u' as logged out 192 * first check if me.connected is true and bail if not 193 * return false if successful or logins are not supported 194 * return true if the user was killed to force logout (P10) */ 195 E bool (*ircd_on_logout)(user_t *u, const char *account); 196 /* introduce a fake server 197 * it is ok to use opersvs to squit the old server 198 * if SQUIT uses kill semantics (e.g. charybdis), server_delete() the server 199 * and continue 200 * if SQUIT uses unconnect semantics (e.g. bahamut), set SF_JUPE_PENDING on 201 * the server and return; you will be called again when the server is really 202 * deleted */ 203 E void (*jupe)(const char *server, const char *reason); 204 /* set a dynamic spoof on a user 205 * if the ircd does not notify the user of this, do 206 * notice(source->nick, target->nick, "Setting your host to \2%s\2.", host); */ 207 E void (*sethost_sts)(user_t *source, user_t *target, const char *host); 208 /* force a nickchange for a user 209 * possible values for type: 210 * FNC_REGAIN: give a registered user their nick back 211 * FNC_FORCE: force a user off their nick (kill if unsupported) 212 */ 213 E void (*fnc_sts)(user_t *source, user_t *u, const char *newnick, int type); 214 /* temporarily make a nick unavailable to users 215 * source is the responsible service 216 * duration is in seconds, 0 to remove the effect of a previous call 217 * account is an account that may still use the nick, or NULL */ 218 E void (*holdnick_sts)(user_t *source, int duration, const char *nick, myuser_t *account); 219 /* change nick, user, host and/or services login name for a user 220 * target may also be a not yet fully introduced UID (for SASL) */ 221 E void (*svslogin_sts)(char *target, char *nick, char *user, char *host, myuser_t *account); 222 /* send sasl message */ 223 E void (*sasl_sts) (char *target, char mode, char *data); 224 /* send sasl mech list */ 225 E void (*sasl_mechlist_sts)(const char *mechlist); 226 /* find next channel ban (or other ban-like mode) matching user */ 227 E mowgli_node_t *(*next_matching_ban)(channel_t *c, user_t *u, int type, mowgli_node_t *first); 228 /* find next host channel access matching user */ 229 E mowgli_node_t *(*next_matching_host_chanacs)(mychan_t *mc, user_t *u, mowgli_node_t *first); 230 /* check a nickname for validity; normally you don't need to override this */ 231 E bool (*is_valid_nick)(const char *nick); 232 /* check a username for validity; normally you don't need to override this */ 233 E bool (*is_valid_username)(const char *username); 234 /* check a vhost for validity; the core will already have checked for 235 * @!?*, space, empty, : at start, length and cidr masks */ 236 E bool (*is_valid_host)(const char *host); 237 /* burst a channel mlock. */ 238 E void (*mlock_sts)(channel_t *c); 239 /* burst a channel topiclock */ 240 E void (*topiclock_sts)(channel_t *c); 241 /* attempt to quarantine a user. 242 * in Unreal-esque terms, this means SHUN. 243 * in Hybrid, this means CAPTURE. 244 * pretty much the same thing either way. 245 */ 246 E void (*quarantine_sts)(user_t *source, user_t *victim, long duration, const char *reason); 247 /* Ask the proto module if this is valid as an extban */ 248 E bool (*is_extban)(const char *mask); 249 250 E unsigned int generic_server_login(void); 251 E void generic_introduce_nick(user_t *u); 252 E void generic_invite_sts(user_t *source, user_t *target, channel_t *channel); 253 E void generic_quit_sts(user_t *u, const char *reason); 254 E void generic_wallops_sts(const char *text); 255 E void generic_join_sts(channel_t *c, user_t *u, bool isnew, char *modes); 256 E void generic_chan_lowerts(channel_t *c, user_t *u); 257 E void generic_kick(user_t *source, channel_t *c, user_t *u, const char *reason); 258 E void generic_msg(const char *from, const char *target, const char *fmt, ...); 259 E void generic_msg_global_sts(user_t *from, const char *mask, const char *text); 260 E void generic_notice_user_sts(user_t *from, user_t *target, const char *text); 261 E void generic_notice_global_sts(user_t *from, const char *mask, const char *text); 262 E void generic_notice_channel_sts(user_t *from, channel_t *target, const char *text); 263 E void generic_wallchops(user_t *source, channel_t *target, const char *message); 264 E void generic_numeric_sts(server_t *from, int numeric, user_t *target, const char *fmt, ...); 265 E void generic_kill_id_sts(user_t *killer, const char *id, const char *reason); 266 E void generic_part_sts(channel_t *c, user_t *u); 267 E void generic_kline_sts(const char *server, const char *user, const char *host, long duration, const char *reason); 268 E void generic_unkline_sts(const char *server, const char *user, const char *host); 269 E void generic_xline_sts(const char *server, const char *realname, long duration, const char *reason); 270 E void generic_unxline_sts(const char *server, const char *realname); 271 E void generic_qline_sts(const char *server, const char *mask, long duration, const char *reason); 272 E void generic_unqline_sts(const char *server, const char *mask); 273 E void generic_topic_sts(channel_t *c, user_t *source, const char *setter, time_t ts, time_t prevts, const char *topic); 274 E void generic_mode_sts(char *sender, channel_t *target, char *modes); 275 E void generic_ping_sts(void); 276 E void generic_on_login(user_t *u, myuser_t *account, const char *wantedhost); 277 E bool generic_on_logout(user_t *u, const char *account); 278 E void generic_jupe(const char *server, const char *reason); 279 E void generic_sethost_sts(user_t *source, user_t *target, const char *host); 280 E void generic_fnc_sts(user_t *source, user_t *u, const char *newnick, int type); 281 E void generic_holdnick_sts(user_t *source, int duration, const char *nick, myuser_t *account); 282 E void generic_svslogin_sts(char *target, char *nick, char *user, char *host, myuser_t *account); 283 E void generic_sasl_sts(char *target, char mode, char *data); 284 E void generic_sasl_mechlist_sts(const char *mechlist); 285 E mowgli_node_t *generic_next_matching_ban(channel_t *c, user_t *u, int type, mowgli_node_t *first); 286 E mowgli_node_t *generic_next_matching_host_chanacs(mychan_t *mc, user_t *u, mowgli_node_t *first); 287 E bool generic_is_valid_host(const char *host); 288 E bool generic_is_valid_nick(const char *nick); 289 E bool generic_is_valid_username(const char *username); 290 E void generic_mlock_sts(channel_t *c); 291 E void generic_topiclock_sts(channel_t *c); 292 E void generic_quarantine_sts(user_t *source, user_t *victim, long duration, const char *reason); 293 E bool generic_is_extban(const char *mask); 294 E void generic_dline_sts(const char *server, const char *host, long duration, const char *reason); 295 E void generic_undline_sts(const char *server, const char *host); 296 297 E struct cmode_ *mode_list; 298 E struct extmode *ignore_mode_list; 299 E size_t ignore_mode_list_size; 300 E struct cmode_ *status_mode_list; 301 E struct cmode_ *prefix_mode_list; 302 E struct cmode_ *user_mode_list; 303 304 E ircd_t *ircd; 305 306 #endif 307 308 /* vim:cinoptions=>s,e0,n0,f0,{0,}0,^0,=s,ps,t0,c3,+s,(2s,us,)20,*30,gs,hs 309 * vim:ts=8 310 * vim:sw=8 311 * vim:noexpandtab 312 */ 313