static void try_flag(FBFILE *f, int *flags, int flag, const char *string) { if ((*flags & flag)) { fbputs(string, f, strlen(string)); *flags &= ~flag; fbputs(*flags ? ", " : ";\n", f, 2); } }
/* log_failed_oper() * * inputs - pointer to client that failed to oper up * - oper name * output - none * side effects - ffailed_operlog is written to, if its present */ void log_failed_oper(struct Client *source_p, const char *name) { if (ConfigLoggingEntry.failed_operlog[0] == '\0') return; if (IsPerson(source_p)) { FBFILE *oper_fb; if ((oper_fb = fbopen(ConfigLoggingEntry.failed_operlog, "r")) != NULL) { fbclose(oper_fb); oper_fb = fbopen(ConfigLoggingEntry.failed_operlog, "a"); } if (oper_fb != NULL) { char linebuf[BUFSIZE]; size_t nbytes = ircsprintf(linebuf, "%s FAILED OPER (%s) by (%s!%s@%s)\n", myctime(CurrentTime), name, source_p->name, source_p->username, source_p->host); fbputs(linebuf, oper_fb, nbytes); fbclose(oper_fb); } } }
/* log_user_exit() * * inputs - pointer to connecting client * output - NONE * side effects - Current exiting client is logged to * either SYSLOG or to file. */ void log_user_exit(struct Client *source_p) { time_t on_for = CurrentTime - source_p->firsttime; #ifdef SYSLOG_USERS if (IsPerson(source_p)) { ilog(L_INFO, "%s (%3ld:%02ld:%02ld): %s!%s@%s %ld/%ld\n", myctime(source_p->firsttime), (signed long) on_for / 3600, (signed long) (on_for % 3600)/60, (signed long) on_for % 60, source_p->name, source_p->username, source_p->host, source_p->localClient->sendK, source_p->localClient->receiveK); } #else { char linebuf[BUFSIZ]; /* * This conditional makes the logfile active only after * it's been created - thus logging can be turned off by * removing the file. * -Taner */ if (IsPerson(source_p)) { if (user_log_fb == NULL) { if ((ConfigLoggingEntry.userlog[0] != '\0') && (user_log_fb = fbopen(ConfigLoggingEntry.userlog, "r")) != NULL) { fbclose(user_log_fb); user_log_fb = fbopen(ConfigLoggingEntry.userlog, "a"); } } if (user_log_fb != NULL) { size_t nbytes = ircsprintf(linebuf, "%s (%3ld:%02ld:%02ld): %s!%s@%s %d/%d\n", myctime(source_p->firsttime), (signed long) on_for / 3600, (signed long) (on_for % 3600)/60, (signed long) on_for % 60, source_p->name, source_p->username, source_p->host, source_p->localClient->sendK, source_p->localClient->receiveK); fbputs(linebuf, user_log_fb, nbytes); } } } #endif }
static void write_log(const char *message) { char buf[LOG_BUFSIZE]; size_t nbytes = 0; if (logFile == NULL) return; nbytes = snprintf(buf, sizeof(buf), "[%s] %s\n", smalldate(CurrentTime), message); fbputs(buf, logFile, nbytes); }
extern void write_log(const char *filename, const char *pattern, ...) { FBFILE *logfile; va_list vl; static char logbuf[1024]; logfile = fbopen(filename, "a"); if (logfile) { va_start(vl, pattern); ircd_vsnprintf(0, logbuf, sizeof(logbuf) - 1, pattern, vl); va_end(vl); fbputs(logbuf, logfile); fbclose(logfile); } }
static void write_pidfile(const char *filename) { FBFILE *fb; if ((fb = fbopen(filename, "w"))) { char buff[32]; unsigned int pid = (unsigned int)getpid(); size_t nbytes = ircsprintf(buff, "%u\n", pid); if ((fbputs(buff, fb, nbytes) == -1)) ilog(L_ERROR, "Error writing %u to pid file %s (%s)", pid, filename, strerror(errno)); fbclose(fb); } else { ilog(L_ERROR, "Error opening pid file %s", filename); } }
void fbputpacket(char *msg, int *row) { int len = strlen(msg); int needed_rows = (int)ceil(((double) len) / MAX_SCREEN_X) + 1; if (needed_rows > MAX_SCREEN_Y - 1) { *row = 2; fbclearlines(1, MAX_SCREEN_Y - 1); fbputs("Message too long to display", 1, 0); return; } if (*row + needed_rows > MAX_SCREEN_Y) { // Mark the beginning of the last blank line unsigned char *bottom = framebuffer + (*row * FONT_HEIGHT + fb_vinfo.yoffset) * fb_finfo.line_length; printf("initial position: %p, bottom: %p, byte difference: %d, needed rows: %d\n", framebuffer, (char *)bottom, bottom - framebuffer, needed_rows); // Mark the position from the beginning of the terminal unsigned char *top = framebuffer + (1 * FONT_HEIGHT + fb_vinfo.yoffset) * fb_finfo.line_length; // Mark the new top unsigned char *new_top = framebuffer + ((1 + needed_rows) * FONT_HEIGHT + fb_vinfo.yoffset) * fb_finfo.line_length; // Copy the onscreen stuff up memcpy(top, new_top, bottom - new_top); // Clear everything below fbclearlines(*row - needed_rows, MAX_SCREEN_Y); // Change the value of rows *row = *row - needed_rows; } int col = 0; while (*msg != 0) { if (col == 128) { col = 0; (*row)++; } fbputchar(*msg, *row, col); msg++; col++; } (*row)++; }
/* Now, our job is a bit harder. I will scan through the SPOOF_FILE * and read all auths{} (assuming they are written in our line formatting..), * then rewrite them skipping the one to delete. --adx */ static void mo_delspoof(struct Client *client_p, struct Client *source_p, int parc, char *parv[]) { #ifdef SPOOF_FILE FBFILE *f, *fout; int ignore_it = 1, spoof_found = 0; char buffer[1024], *tmp; #endif const char *user = NULL; char *host = NULL; if (MyConnect(source_p) && !IsOperAdmin(source_p)) { sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, parv[0], "DELSPOOF"); return; } if (parv[1] == NULL || !*parv[1]) { if (MyConnect(source_p)) sendto_one(source_p, ":%s NOTICE %s :Syntax: /DELSPOOF <user@host>", me.name, source_p->name); return; } /* check user@host mask */ (void) collapse(parv[1]); host = strchr(parv[1], '@'); if (host != NULL) { user = parv[1]; *host = '\0'; host++; } else { user = "******"; host = parv[1]; } #ifdef PROPAGATE_SPOOF sendto_server(client_p, source_p, NULL, NOCAPS, NOCAPS, LL_ICLIENT, ":%s DELSPOOF %s@%s", source_p->name, user, host); #endif #ifdef SPOOF_FILE if ((f = fbopen(SPOOF_FILE, "r")) == NULL) { sendto_realops_flags(UMODE_ALL, L_ALL, "Could not open %s file, auth for %s@%s not deleted " "(requested by %s)", SPOOF_FILE, user, host, source_p->name); return; } if ((fout = fbopen(SPOOF_FILE ".new", "w")) == NULL) { sendto_realops_flags(UMODE_ALL, L_ALL, "Could not create %s.new file, auth for %s@%s not " "deleted (requested by %s)", SPOOF_FILE, user, host, source_p->name); return; } while (fbgets(buffer, 1024, f)) { if (!ircncmp(buffer, "auth {", 6)) { /* don't process it yet.. we have to check whether the user="******"; field * matches the user@host mask which is being deleted */ ignore_it = 1; continue; } /* a simple parser substitute... */ for (tmp = buffer; *tmp == '\t' || *tmp == ' '; tmp++) ; if (!ircncmp(tmp, "user", 4)) { for (tmp += 4; *tmp == '\t' || *tmp == ' '; tmp++) ; if (*tmp == '=') { for (++tmp; *tmp == '\t' || *tmp == ' '; tmp++) ; if (*tmp == '\"') { /* yuppi, we've just reached the user="******"; field */ int matches; char *tmp2 = strchr(++tmp, '\"'); if (tmp2 != NULL) *tmp2 = '\0'; tmp2 = strchr(tmp, '@'); /* is it matching our mask? */ if (tmp2 == NULL) matches = !irccmp(user, "*") && !irccmp(host, tmp); else { *tmp2++ = '\0'; matches = !irccmp(user, tmp) && !irccmp(host, tmp2); } if (!matches) { /* no.. so leave it unchanged */ if (ignore_it) { ignore_it = 0; fbputs("auth {\n", fout, 7); /* user="******" should be the first field in the auth {}; block, * otherwise we could have problems... */ } fbputs("\tuser = \"", fout, 9); if (tmp2 == NULL) fbputs("*", fout, 1); else fbputs(tmp, fout, strlen(tmp)); fbputs("@", fout, 1); fbputs(tmp2, fout, strlen(tmp2)); fbputs("\";\n", fout, 3); } else { /* we've got it! - omit and continue working */ spoof_found = 1; } continue; } } } if (!ignore_it) fbputs(buffer, fout, strlen(buffer)); } fbclose(f); fbclose(fout); if (!spoof_found) { if (MyConnect(source_p)) sendto_one(source_p, ":%s NOTICE %s :No auth for %s@%s found", me.name, source_p->name, user, host); unlink(SPOOF_FILE ".new"); return; } unlink(SPOOF_FILE); rename(SPOOF_FILE ".new", SPOOF_FILE); rehash(0); #endif #ifdef LOG_SPOOF sendto_realops_flags(UMODE_ALL, L_ALL, "%s deleted auth for %s@%s", source_p->name, user, host); #endif }
static void mo_spoof(struct Client *client_p, struct Client *source_p, int parc, char *parv[]) { char *host, *spoof, *password; const char *tmp = NULL; const char *user = NULL; const char *flags = NULL; int i = 0; #ifdef SPOOF_FILE int class_opers; FBFILE *f; char buffer[1024]; struct AddressRec *arec; #endif if (MyConnect(source_p) && !IsOperAdmin(source_p)) { sendto_one(source_p, form_str(ERR_NOPRIVS), me.name, source_p->name, "SPOOF"); return; } /* check the user@host mask */ if (strchr(parv[1], '!') != NULL) { syntax: if (MyConnect(source_p)) sendto_one(source_p, ":%s NOTICE %s :Syntax: SPOOF <umask@hmask> " "<spoof/-> [flags/- [password]]", me.name, source_p->name); return; } (void) collapse(parv[1]); for (tmp = parv[1]; *tmp; tmp++) if (!IsKWildChar(*tmp)) if (++i >= ConfigFileEntry.min_nonwildcard) break; if (i < ConfigFileEntry.min_nonwildcard) { if (MyConnect(source_p)) sendto_one(source_p, ":%s NOTICE %s :Not enough non-wildcard characters " "in user@host mask", me.name, source_p->name); return; } host = strchr(parv[1], '@'); if (host) { user = parv[1]; *host = '\0'; host++; } else { user = "******"; host = parv[1]; } /* check the spoof field */ spoof = parv[2]; if (spoof == NULL || !*spoof) goto syntax; if (spoof[0] != '-' || spoof[1] != '\0') { for (tmp = spoof; *tmp; tmp++) if (!IsHostChar(*tmp)) { if (MyConnect(source_p)) sendto_one(source_p, ":%s NOTICE %s :The spoof [%s] is invalid", me.name, source_p->name, spoof); return; } if (strlen(spoof) >= HOSTLEN) { if (MyConnect(source_p)) sendto_one(source_p, ":%s NOTICE %s :Spoofs must be less than %d.." "ignoring it", me.name, source_p->name, HOSTLEN); return; } } flags = (parc > 3) ? parv[3] : "-"; password = (parc > 4 && parv[4][0]) ? parv[4] : NULL; #ifdef PROPAGATE_SPOOF sendto_server(client_p, source_p, NULL, NOCAPS, NOCAPS, LL_ICLIENT, ":%s SPOOF %s@%s %s %s :%s", source_p->name, user, host, spoof, flags, password ? password : ""); #endif #ifdef SPOOF_FILE /* Walk through auth {} items and check if we have another auth block * for this hostname */ for (i = 0; i < ATABLE_SIZE; i++) for (arec = atable[i]; arec; arec = arec->next) if (arec->type == CONF_CLIENT && !irccmp(arec->aconf->host, host) && !irccmp(arec->aconf->user, user)) { /* auth entry already exists */ if (MyConnect(source_p)) sendto_one(source_p, ":%s NOTICE %s :auth for %s@%s already exists, you need " "to use /DELSPOOF first", me.name, source_p->name, user, host); #ifdef LOG_SPOOF sendto_realops_flags(UMODE_ALL, L_ALL, "%s attemped to re-add auth for %s@%s " "[spoof: %s, flags: %s]", source_p->name, user, host, spoof, flags); #endif return; } /* Add the spoof to the the spoof file */ if ((f = fbopen(SPOOF_FILE, "a")) == NULL) { sendto_realops_flags(UMODE_ALL, L_ALL, "Could not open %s file, auth for %s@%s " "[spoof: %s, flags: %s, requested by %s] not added", SPOOF_FILE, user, host, spoof, flags, source_p->name); return; } /* write the auth {} block */ fbputs("auth {\n", f, 7); i = ircsprintf(buffer, "\tuser = \"%s@%s\";\n", user, host); fbputs(buffer, f, i); if (spoof[0] != '-' || spoof[1] != '\0') { i = ircsprintf(buffer, "\tspoof = \"%s\";\n", spoof); fbputs(buffer, f, i); } if (password) { i = ircsprintf(buffer, "\tpassword = \"%s\";\n", password); fbputs(buffer, f, i); } /* process given flags */ i = class_opers = 0; for (tmp = flags; *tmp; ++tmp) switch (*tmp) { case 't': i |= CONF_FLAGS_NO_TILDE; /* no_tilde = yes; */ break; case 'i': i |= CONF_FLAGS_NEED_IDENTD; /* need_ident = yes; */ break; case 'k': i |= CONF_FLAGS_EXEMPTKLINE; /* kline_exempt = yes; */ break; case 'g': i |= CONF_FLAGS_EXEMPTGLINE; /* gline_exempt = yes; */ break; case 'l': i |= CONF_FLAGS_NOLIMIT; /* exceed_limit = yes; */ break; case 'o': class_opers = 1; /* class = "opers"; */ break; case 'f': i |= CONF_FLAGS_CAN_FLOOD; /* can_flood = yes; */ break; case 'p': i|= CONF_FLAGS_NEED_PASSWORD; /* need_password = yes; */ } if (i) { fbputs("\tflags = ", f, 9); try_flag(f, &i, CONF_FLAGS_NO_TILDE, "no_tilde"); try_flag(f, &i, CONF_FLAGS_NEED_IDENTD, "need_ident"); try_flag(f, &i, CONF_FLAGS_EXEMPTKLINE, "kline_exempt"); try_flag(f, &i, CONF_FLAGS_EXEMPTGLINE, "gline_exempt"); try_flag(f, &i, CONF_FLAGS_NOLIMIT, "exceed_limit"); try_flag(f, &i, CONF_FLAGS_CAN_FLOOD, "can_flood"); try_flag(f, &i, CONF_FLAGS_NEED_PASSWORD, "need_password"); } if (class_opers) fbputs("\tclass = \"opers\";\n", f, 18); else fbputs("\tclass = \"users\";\n", f, 18); fbputs("};\n\n", f, 4); fbclose(f); rehash(0); #endif #ifdef LOG_SPOOF sendto_realops_flags(UMODE_ALL, L_ALL, "%s added auth for %s@%s [spoof: %s, flags: %s]", source_p->name, user, host, spoof, flags); ilog(L_TRACE, "%s added auth for %s@%s [spoof: %s, flags: %s]", source_p->name, user, host, spoof, flags); #endif }