5 #include "ClientSocket.h"
7 static const struct default_language_entry msgtab[] = {
8 {"TIME_MASK_2_ITEMS", "%s and %s"},
9 {"TIME_MASK_3_ITEMS", "%s, %s and %s"},
10 {"TIME_YEAR", "year"},
11 {"TIME_YEARS", "years"},
12 {"TIME_MONTH", "month"},
13 {"TIME_MONTHS", "months"},
14 {"TIME_WEEK", "week"},
15 {"TIME_WEEKS", "weeks"},
17 {"TIME_DAYS", "days"},
18 {"TIME_HOUR", "hour"},
19 {"TIME_HOURS", "hours"},
20 {"TIME_MINUTE", "minute"},
21 {"TIME_MINUTES", "minutes"},
22 {"TIME_SECOND", "second"},
23 {"TIME_SECONDS", "seconds"},
27 /* copied from IRCU 2.10.12 match.c */
29 * Compare if a given string (name) matches the given
30 * mask (which can contain wild cards: '*' - match any
31 * number of chars, '?' - match any single character.
36 * Originally by Douglas A Lewis (dalewis@acsu.buffalo.edu)
37 * Rewritten by Timothy Vogelsang (netski), net@astrolink.org
39 int match(const char *mask, const char *name)
41 const char *m = mask, *n = name;
42 const char *m_tmp = mask, *n_tmp = name;
45 for (;;) switch (*m) {
59 /* allow escaping to force capitalization */
64 for (star_p = 0; ; m++) {
75 else if (*m == '\\') {
79 for (n_tmp = n; *n && *n != *m; n++) ;
82 for (n_tmp = n; *n && tolower(*n) != tolower(*m); n++) ;
85 /* and fall through */
89 if (tolower(*m) != tolower(*n))
99 struct Table *table_init(int width, int length, int flags) {
101 struct Table *table = malloc(sizeof(*table));
102 table->contents = malloc(length * sizeof(*table->contents));
103 for(row = 0; row < length; row++) {
104 table->contents[row] = calloc(width, sizeof(*table->contents[row]));
106 table->length = length;
107 table->width = width;
108 table->flags = flags;
109 table->col_flags = calloc(length, sizeof(int));
111 table->maxwidth = calloc(length, sizeof(int));
112 table->table_lines = NULL;
116 int table_add(struct Table *table, char **entry) {
118 if(table->entrys == table->length) return 0;
119 for(col = 0; col < table->width; col++) {
120 table->contents[table->entrys][col] = ((table->flags & TABLE_FLAG_USE_POINTER) ? entry[col] : strdup(entry[col]));
121 if(strlen(entry[col]) > table->maxwidth[col])
122 table->maxwidth[col] = strlen(entry[col]);
128 int table_set_bold(struct Table *table, int collum, int bold) {
130 table->col_flags[collum] |= TABLE_FLAG_COL_BOLD;
132 table->col_flags[collum] &= ~TABLE_FLAG_COL_BOLD;
136 char **table_end(struct Table *table) {
137 int row, col, tablewidth = 0, pos,i;
138 if(!table->entrys) return NULL;
139 for(col = 0; col < table->width; col++) {
140 tablewidth += table->maxwidth[col]+1;
141 if(table->col_flags[col] & TABLE_FLAG_COL_BOLD)
144 table->table_lines = malloc(table->entrys * sizeof(table->table_lines));
145 for(row = 0; row < table->entrys; row++) {
146 table->table_lines[row] = malloc(tablewidth * sizeof(*table->table_lines[row]));
148 for(col = 0; col < table->width; col++) {
149 if(table->col_flags[col] & TABLE_FLAG_COL_BOLD)
150 table->table_lines[row][pos++] = '\002';
151 for(i = 0; i < strlen(table->contents[row][col]); i++) {
152 table->table_lines[row][pos++] = table->contents[row][col][i];
154 if(col < table->width-1) {
155 for(;i < table->maxwidth[col]; i++) {
156 table->table_lines[row][pos++] = ' ';
158 table->table_lines[row][pos++] = ' ';
160 table->table_lines[row][pos++] = '\0';
162 if(table->col_flags[col] & TABLE_FLAG_COL_BOLD)
163 table->table_lines[row][pos++] = '\002';
166 return table->table_lines;
169 void table_free(struct Table *table) {
171 for(row = 0; row < table->length; row++) {
172 if(!(table->flags & TABLE_FLAG_USE_POINTER) && table->entrys > row) {
173 for(col = 0; col < table->width; col++) {
174 free(table->contents[row][col]);
177 free(table->contents[row]);
179 free(table->contents);
180 free(table->col_flags);
181 free(table->maxwidth);
182 if(table->table_lines) {
183 for(row = 0; row < table->entrys; row++) {
184 free(table->table_lines[row]);
186 free(table->table_lines);
191 char* timeToStr(struct UserNode *user, int seconds, int items, char *buf) {
192 char item[items][MAXLEN];
194 if(citem != items && seconds >= 31536000) { //60*60*24*365 = 31536000
196 tmp = seconds / 31536000;
197 sprintf(item[citem++], "%d %s", tmp, get_language_string(user, tmp == 1 ? "TIME_YEAR" : "TIME_YEARS"));
198 seconds -= tmp * 31536000;
200 if(citem != items && seconds >= 86400) { //60*60*24 = 86400
201 tmp = seconds / 86400;
202 sprintf(item[citem++], "%d %s", tmp, get_language_string(user, tmp == 1 ? "TIME_DAY" : "TIME_DAYS"));
203 seconds -= tmp * 86400;
205 if(citem != items && seconds >= 3600) { //60*60 = 3600
206 tmp = seconds / 3600;
207 sprintf(item[citem++], "%d %s", tmp, get_language_string(user, tmp == 1 ? "TIME_HOUR" : "TIME_HOURS"));
208 seconds -= tmp * 3600;
210 if(citem != items && seconds >= 60) {
212 sprintf(item[citem++], "%d %s", tmp, get_language_string(user, tmp == 1 ? "TIME_MINUTE" : "TIME_MINUTES"));
215 if(citem != items && seconds >= 1) {
216 sprintf(item[citem++], "%d %s", seconds, get_language_string(user, seconds == 1 ? "TIME_SECOND" : "TIME_SECONDS"));
219 build_language_string(user, buf, "TIME_MASK_2_ITEMS", item[0], item[1]);
220 } else if(citem == 3) {
221 build_language_string(user, buf, "TIME_MASK_3_ITEMS", item[0], item[1], item[2]);
224 for(i = 0; i < citem; i++) {
225 for(ii = 0; ii < strlen(item[i]); ii++) {
226 buf[p++] = item[i][ii];
235 int strToTime(struct UserNode *user, char *str) {
237 * y = year = 365 days
238 * M = month = 30 days
245 int total_time = 0, cvalue;
247 int unit_multiplikator;
250 while(*p && isdigit(*p)) //get the value
254 cvalue = isdigit(*str) ? atoi(str) : 0;
257 while(*p && !isdigit(*p)) //get the unit
261 if(p - str > 1) { //unit has more than one char
262 if(!stricmp(str, "year") || !stricmp(str, "year") || !stricmp(str, get_language_string(user, "TIME_YEAR")) || !stricmp(str, get_language_string(user, "TIME_YEARS")))
263 unit_multiplikator = 31536000; //60*60*24*365 = 31536000
264 else if(!stricmp(str, "month") || !stricmp(str, "months") || !stricmp(str, get_language_string(user, "TIME_MONTH")) || !stricmp(str, get_language_string(user, "TIME_MONTHS")))
265 unit_multiplikator = 2592000; //60*60*24*30 = 2592000
266 else if(!stricmp(str, "week") || !stricmp(str, "weeks") || !stricmp(str, get_language_string(user, "TIME_WEEK")) || !stricmp(str, get_language_string(user, "TIME_WEEKS")))
267 unit_multiplikator = 604800; //60*60*24*7 = 604800
268 else if(!stricmp(str, "day") || !stricmp(str, "days") || !stricmp(str, get_language_string(user, "TIME_DAY")) || !stricmp(str, get_language_string(user, "TIME_DAYS")))
269 unit_multiplikator = 86400; //60*60*24 = 86400
270 else if(!stricmp(str, "hour") || !stricmp(str, "hours") || !stricmp(str, get_language_string(user, "TIME_HOUR")) || !stricmp(str, get_language_string(user, "TIME_HOURS")))
271 unit_multiplikator = 3600; //60*60 = 3600
272 else if(!stricmp(str, "minute") || !stricmp(str, "minutes") || !stricmp(str, "min") || !stricmp(str, "mins") || !stricmp(str, get_language_string(user, "TIME_MINUTE")) || !stricmp(str, get_language_string(user, "TIME_MINUTES")))
273 unit_multiplikator = 60;
275 unit_multiplikator = 1;
279 unit_multiplikator = 31536000; //60*60*24*365 = 31536000
282 unit_multiplikator = 2592000; //60*60*24*30 = 2592000
285 unit_multiplikator = 604800; //60*60*24*7 = 604800
288 unit_multiplikator = 86400; //60*60*24 = 86400
291 unit_multiplikator = 3600; //60*60 = 3600
294 unit_multiplikator = 60;
297 unit_multiplikator = 1;
301 total_time += (cvalue * unit_multiplikator);
308 struct ModeBuffer* initModeBuffer(struct ClientSocket *client, struct ChanNode *chan) {
309 struct ModeBuffer *modeBuf = malloc(sizeof(*modeBuf));
311 perror("malloc() failed");
314 modeBuf->client = client;
315 modeBuf->chan = chan;
316 modeBuf->addCount = 0;
317 modeBuf->delCount = 0;
321 void modeBufferSet(struct ModeBuffer *modeBuf, int add, char mode, char *param) {
323 modeBuf->addModes[modeBuf->addCount] = mode;
324 modeBuf->addModesParams[modeBuf->addCount] = (param ? strdup(param) : NULL);
326 modeBuf->addModes[modeBuf->addCount] = '\0';
328 modeBuf->delModes[modeBuf->delCount] = mode;
329 modeBuf->delModesParams[modeBuf->delCount] = (param ? strdup(param) : NULL);
331 modeBuf->delModes[modeBuf->delCount] = '\0';
333 if(modeBuf->addCount + modeBuf->delCount == MAXMODES)
334 flushModeBuffer(modeBuf);
337 void flushModeBuffer(struct ModeBuffer *modeBuf) {
338 char modeStr[MAXMODES+3];
340 char paramStr[MAXLEN];
343 if(modeBuf->addCount) {
344 modeStr[modePos++] = '+';
345 for(i = 0; i < modeBuf->addCount; i++) {
346 modeStr[modePos++] = modeBuf->addModes[i];
347 if(modeBuf->addModesParams[i]) {
348 paramPos += sprintf(paramStr + paramPos, " %s", modeBuf->addModesParams[i]);
351 modeBuf->addCount = 0;
353 if(modeBuf->delCount) {
354 modeStr[modePos++] = '-';
355 for(i = 0; i < modeBuf->delCount; i++) {
356 modeStr[modePos++] = modeBuf->delModes[i];
357 if(modeBuf->delModesParams[i]) {
358 paramPos += sprintf(paramStr + paramPos, " %s", modeBuf->delModesParams[i]);
361 modeBuf->delCount = 0;
363 modeStr[modePos++] = '\0';
364 putsock(modeBuf->client, "MODE %s %s%s", modeBuf->chan->name, modeStr, paramStr);
367 void freeModeBuffer(struct ModeBuffer *modeBuf) {
368 if(modeBuf->addCount + modeBuf->delCount)
369 flushModeBuffer(modeBuf);
373 int is_ircmask(const char *text) {
374 while (*text && (isalnum((char)*text) || strchr("-_[]|\\`^{}?*", *text)))
378 while (*text && *text != '@' && !isspace((char)*text))
382 while (*text && !isspace((char)*text))
387 char* generate_banmask(struct UserNode *user, char *buffer) {
388 char *userhost = user->host;
390 if(isFakeHost(user->host)) {
391 sprintf(buffer, "*!*@%s", userhost);
395 //check if the hostname has more than 4 connections (trusted host)
396 if(countUsersWithHost(userhost) > 4) {
397 sprintf(buffer, "*!%s@%s", user->ident, userhost);
400 sprintf(buffer, "*!*@%s", userhost);
405 char* make_banmask(char *input, char* buffer) {
406 char *nick = NULL, *ident = NULL, *host = NULL;
409 if((p = strstr(input, "!"))) {
413 if((p = strstr(ident, "@"))) {
417 } else if((p = strstr(input, "@"))) {
421 } else if((p = strstr(input, "."))) {
423 } else if(*input == '*' && !strstr(input+1, "*")) {
425 p = getAuthFakehost(input+1);
429 sprintf(tmp, "%s.*", input+1);
433 struct UserNode *user = searchUserByNick(input);
435 return generate_banmask(user, buffer);
439 if(*nick == '\0') nick = NULL;
440 if(*ident == '\0') ident = NULL;
441 if(*host == '\0') host = NULL;
442 sprintf(buffer, "%s!%s@%s", (nick ? nick : "*"), (ident ? ident : "*"), (host ? host : "*"));
446 int isFakeHost(char *host) {
447 char *p1, *p2 = host;
449 //find the last dot to identify if the hostmask is a fake host
450 while((p1 = strstr(p2, "."))) {
453 //TLD database: http://www.iana.org/domains/root/db/
454 //the longest TLD i found was 6 chars long (ignoring the stange exotic ones :D)
455 //but we even ignore '.museum' and '.travel' so we can say that the TLD of our mask needs to be less than 4 chars to be a real domain
456 return (strlen(p2+1) > 4);
460 register_default_language_table(msgtab);