diff --git a/include/ircd/hostmask.h b/include/ircd/mask.h similarity index 97% rename from include/ircd/hostmask.h rename to include/ircd/mask.h index d8428142e..147611117 100644 --- a/include/ircd/hostmask.h +++ b/include/ircd/mask.h @@ -5,7 +5,7 @@ * Copyright (C) 1990 Jarkko Oikarinen and University of Oulu, Co Center * Copyright (C) 1996-2002 Hybrid Development Team * Copyright (C) 2002-2004 ircd-ratbox development team - * Copyright (C) 2005-2006 charybdis development team + * Copyright (C) 2005-2016 Charybdis Development Team * * 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 @@ -38,6 +38,7 @@ enum #endif }; +char *pretty_mask(const char *idmask); int parse_netmask(const char *, struct rb_sockaddr_storage *, int *); struct ConfItem *find_conf_by_address(const char *host, const char *sockhost, const char *orighost, struct sockaddr *, diff --git a/include/ircd/stdinc.h b/include/ircd/stdinc.h index a55f27d7c..912fac785 100644 --- a/include/ircd/stdinc.h +++ b/include/ircd/stdinc.h @@ -82,6 +82,7 @@ namespace ircd #include "msg.h" #include "client.h" +#include "mask.h" #include "chmode.h" #include "channel.h" @@ -93,7 +94,6 @@ namespace ircd #include "dns.h" #include "hash.h" #include "hook.h" -#include "hostmask.h" #include "ircd_getopt.h" #include "listener.h" #include "logger.h" diff --git a/ircd/Makefile.am b/ircd/Makefile.am index 52c0ab47f..008fb28c8 100644 --- a/ircd/Makefile.am +++ b/ircd/Makefile.am @@ -52,7 +52,7 @@ libircd_la_SOURCES = \ getopt.cc \ hash.cc \ hook.cc \ - hostmask.cc \ + mask.cc \ info.cc \ ircd.cc \ ircd_lexer.cc \ diff --git a/ircd/chmode.cc b/ircd/chmode.cc index 2224683c0..2531ea523 100644 --- a/ircd/chmode.cc +++ b/ircd/chmode.cc @@ -46,7 +46,6 @@ using namespace ircd; static int mode_count; static int mode_limit; static int mode_limit_simple; -static int mask_pos; static int removed_mask_pos; static int h_get_channel_access; mode::change mode_changes[BUFSIZE]; @@ -252,156 +251,6 @@ allow_mode_change(client::client *source_p, chan::chan *chptr, int alevel, return true; } -/* check_string() - * - * input - string to check - * output - pointer to 'fixed' string, or "*" if empty - * side effects - any white space found becomes \0 - */ -static char * -check_string(char *s) -{ - char *str = s; - static char splat[] = "*"; - if(!(s && *s)) - return splat; - - for(; *s; ++s) - { - if(rfc1459::is_space(*s)) - { - *s = '\0'; - break; - } - } - return str; -} - -/* pretty_mask() - * - * inputs - mask to pretty - * outputs - better version of the mask - * side effects - mask is chopped to limits, and transformed: - * x!y@z => x!y@z - * y@z => *!y@z - * x!y => x!y@* - * x => x!*@* - * z.d => *!*@z.d - */ -static char * -pretty_mask(const char *idmask) -{ - static char mask_buf[BUFSIZE]; - int old_mask_pos; - const char *nick, *user, *host, *forward = NULL; - char *t, *at, *ex; - int nl, ul, hl, fl; - char *mask; - size_t masklen; - - mask = LOCAL_COPY(idmask); - mask = check_string(mask); - collapse(mask); - masklen = strlen(mask); - - nick = user = host = "*"; - nl = ul = hl = 1; - fl = 0; - - if((size_t) BUFSIZE - mask_pos < masklen + 5) - return NULL; - - old_mask_pos = mask_pos; - - if (*mask == '$') - { - memcpy(mask_buf + mask_pos, mask, masklen + 1); - mask_pos += masklen + 1; - t = mask_buf + old_mask_pos + 1; - if (*t == '!') - *t = '~'; - if (*t == '~') - t++; - *t = rfc1459::tolower(*t); - return mask_buf + old_mask_pos; - } - - at = ex = NULL; - if((t = (char *)memchr(mask, '@', masklen)) != NULL) - { - at = t; - t++; - if(*t != '\0') - host = t, hl = strlen(t); - - if((t = (char *)memchr(mask, '!', at - mask)) != NULL) - { - ex = t; - t++; - if(at != t) - user = t, ul = at - t; - if(ex != mask) - nick = mask, nl = ex - mask; - } - else - { - if(at != mask) - user = mask, ul = at - mask; - } - - if((t = (char *)memchr(host, '!', hl)) != NULL || - (t = (char *)memchr(host, '$', hl)) != NULL) - { - t++; - if (host + hl != t) - forward = t, fl = host + hl - t; - hl = t - 1 - host; - } - } - else if((t = (char *)memchr(mask, '!', masklen)) != NULL) - { - ex = t; - t++; - if(ex != mask) - nick = mask, nl = ex - mask; - if(*t != '\0') - user = t, ul = strlen(t); - } - else if(memchr(mask, '.', masklen) != NULL || - memchr(mask, ':', masklen) != NULL) - { - host = mask, hl = masklen; - } - else - { - if(masklen > 0) - nick = mask, nl = masklen; - } - - /* truncate values to max lengths */ - if(nl > NICKLEN - 1) - nl = NICKLEN - 1; - if(ul > USERLEN) - ul = USERLEN; - if(hl > HOSTLEN) - hl = HOSTLEN; - if(fl > CHANNELLEN) - fl = CHANNELLEN; - - memcpy(mask_buf + mask_pos, nick, nl), mask_pos += nl; - mask_buf[mask_pos++] = '!'; - memcpy(mask_buf + mask_pos, user, ul), mask_pos += ul; - mask_buf[mask_pos++] = '@'; - memcpy(mask_buf + mask_pos, host, hl), mask_pos += hl; - if (forward) { - mask_buf[mask_pos++] = '$'; - memcpy(mask_buf + mask_pos, forward, fl), mask_pos += fl; - } - mask_buf[mask_pos++] = '\0'; - - return mask_buf + old_mask_pos; -} - /* check_forward() * * input - client, channel to set mode on, target channel name @@ -1344,7 +1193,6 @@ chan::set_channel_mode(client::client *client_p, client::client *source_p, int reauthorized = 0; /* if we change from MODE_QUERY to MODE_ADD/MODE_DEL, then reauth once, ugly but it works */ int flags_list[3] = { ALL_MEMBERS, ONLY_CHANOPS, ONLY_OPERS }; - mask_pos = 0; removed_mask_pos = 0; mode_count = 0; mode_limit = 0; diff --git a/ircd/hostmask.cc b/ircd/mask.cc similarity index 86% rename from ircd/hostmask.cc rename to ircd/mask.cc index 5e94e4fe5..026ca621e 100644 --- a/ircd/hostmask.cc +++ b/ircd/mask.cc @@ -762,3 +762,156 @@ report_auth(client::client *client_p) } } // namespace ircd + +/* check_string() + * + * input - string to check + * output - pointer to 'fixed' string, or "*" if empty + * side effects - any white space found becomes \0 + */ +static char * +check_string(char *s) +{ + using namespace ircd; + + char *str = s; + static char splat[] = "*"; + if(!(s && *s)) + return splat; + + for(; *s; ++s) + { + if(rfc1459::is_space(*s)) + { + *s = '\0'; + break; + } + } + return str; +} + +/* pretty_mask() + * + * inputs - mask to pretty + * outputs - better version of the mask + * side effects - mask is chopped to limits, and transformed: + * x!y@z => x!y@z + * y@z => *!y@z + * x!y => x!y@* + * x => x!*@* + * z.d => *!*@z.d + */ +char * +ircd::pretty_mask(const char *idmask) +{ + static char mask_buf[BUFSIZE]; + int old_mask_pos; + const char *nick, *user, *host, *forward = NULL; + char *t, *at, *ex; + int nl, ul, hl, fl; + char *mask; + size_t masklen; + int mask_pos; + + mask = LOCAL_COPY(idmask); + mask = check_string(mask); + collapse(mask); + masklen = strlen(mask); + + nick = user = host = "*"; + nl = ul = hl = 1; + fl = 0; + + if((size_t) BUFSIZE - mask_pos < masklen + 5) + return NULL; + + old_mask_pos = mask_pos; + + if (*mask == '$') + { + memcpy(mask_buf + mask_pos, mask, masklen + 1); + mask_pos += masklen + 1; + t = mask_buf + old_mask_pos + 1; + if (*t == '!') + *t = '~'; + if (*t == '~') + t++; + *t = rfc1459::tolower(*t); + return mask_buf + old_mask_pos; + } + + at = ex = NULL; + if((t = (char *)memchr(mask, '@', masklen)) != NULL) + { + at = t; + t++; + if(*t != '\0') + host = t, hl = strlen(t); + + if((t = (char *)memchr(mask, '!', at - mask)) != NULL) + { + ex = t; + t++; + if(at != t) + user = t, ul = at - t; + if(ex != mask) + nick = mask, nl = ex - mask; + } + else + { + if(at != mask) + user = mask, ul = at - mask; + } + + if((t = (char *)memchr(host, '!', hl)) != NULL || + (t = (char *)memchr(host, '$', hl)) != NULL) + { + t++; + if (host + hl != t) + forward = t, fl = host + hl - t; + hl = t - 1 - host; + } + } + else if((t = (char *)memchr(mask, '!', masklen)) != NULL) + { + ex = t; + t++; + if(ex != mask) + nick = mask, nl = ex - mask; + if(*t != '\0') + user = t, ul = strlen(t); + } + else if(memchr(mask, '.', masklen) != NULL || + memchr(mask, ':', masklen) != NULL) + { + host = mask, hl = masklen; + } + else + { + if(masklen > 0) + nick = mask, nl = masklen; + } + + /* truncate values to max lengths */ + if(nl > NICKLEN - 1) + nl = NICKLEN - 1; + if(ul > USERLEN) + ul = USERLEN; + if(hl > HOSTLEN) + hl = HOSTLEN; + if(fl > CHANNELLEN) + fl = CHANNELLEN; + + memcpy(mask_buf + mask_pos, nick, nl), mask_pos += nl; + mask_buf[mask_pos++] = '!'; + memcpy(mask_buf + mask_pos, user, ul), mask_pos += ul; + mask_buf[mask_pos++] = '@'; + memcpy(mask_buf + mask_pos, host, hl), mask_pos += hl; + if (forward) { + mask_buf[mask_pos++] = '$'; + memcpy(mask_buf + mask_pos, forward, fl), mask_pos += fl; + } + mask_buf[mask_pos++] = '\0'; + + return mask_buf + old_mask_pos; +}