static int do_dcc_send(int idx, char *dir, char *fn, char *nick) { char s[161], s1[161]; FILE *f; int x; Context; if (strlen(nick) > NICKMAX) nick[NICKMAX] = 0; if (dccdir[0] == 0) { dprintf(idx, "DCC file transfers not supported.\n"); putlog(LOG_FILES, "*", "Refused dcc get %s from [%s]", fn, dcc[idx].nick); return 0; } if (strchr(fn, '/') != NULL) { dprintf(idx, "Filename cannot have '/' in it...\n"); putlog(LOG_FILES, "*", "Refused dcc get %s from [%s]", fn, dcc[idx].nick); return 0; } if (dir[0]) sprintf(s, "%s%s/%s", dccdir, dir, fn); else sprintf(s, "%s%s", dccdir, fn); f = fopen(s, "r"); if (f == NULL) { dprintf(idx, "No such file.\n"); putlog(LOG_FILES, "*", "Refused dcc get %s from [%s]", fn, dcc[idx].nick); return 0; } fclose(f); if (!nick[0]) nick = dcc[idx].nick; /* already have too many transfers active for this user? queue it */ if (at_limit(nick)) { char xxx[1024]; sprintf(xxx, "%d*%s%s", strlen(dccdir), dccdir, dir); queue_file(xxx, fn, dcc[idx].nick, nick); dprintf(idx, "Queued: %s to %s\n", fn, nick); return 1; } if (copy_to_tmp) { /* copy this file to /tmp */ sprintf(s, "%s%s%s%s", dccdir, dir, dir[0] ? "/" : "", fn); sprintf(s1, "%s%s", tempdir, fn); if (copyfile(s, s1) != 0) { dprintf(idx, "Can't make temporary copy of file!\n"); putlog(LOG_FILES | LOG_MISC, "*", "Refused dcc get %s: copy to %s FAILED!", fn, tempdir); return 0; } } else sprintf(s1, "%s%s%s%s", dccdir, dir, dir[0] ? "/" : "", fn); sprintf(s, "%s%s%s", dir, dir[0] ? "/" : "", fn); x = _dcc_send(idx, s1, nick, s); if (x != DCCSEND_OK) wipe_tmp_filename(s1, -1); return x; }
static void remote_filereq(int idx, char *from, char *file) { char *p, what[256], dir[256], s[256], s1[256], *reject; FILE *f; filedb fdb; long i = 0; strcpy(what, file); p = strrchr(what, '/'); if (p == NULL) dir[0] = 0; else { *p = 0; strcpy(dir, what); strcpy(what, p + 1); } f = filedb_open(dir, 0); reject = NULL; if (f == NULL) { reject = FILES_DIRDNE; } else { if (!findmatch(f, what, &i, &fdb)) { reject = FILES_FILEDNE; filedb_close(f); } else { if ((!(fdb.stat & FILE_SHARE)) || (fdb.stat & (FILE_HIDDEN | FILE_DIR))) { reject = FILES_NOSHARE; filedb_close(f); } else { filedb_close(f); /* copy to /tmp if needed */ sprintf(s1, "%s%s%s%s", dccdir, dir, dir[0] ? "/" : "", what); if (copy_to_tmp) { sprintf(s, "%s%s", tempdir, what); copyfile(s1, s); } else strcpy(s, s1); i = raw_dcc_send(s, "*remote", FILES_REMOTE, s); if (i > 0) { wipe_tmp_filename(s, -1); reject = FILES_SENDERR; } } } } simple_sprintf(s1, "%s:%s/%s", botnetnick, dir, what); if (reject) { botnet_send_filereject(idx, s1, from, reject); return; } /* grab info from dcc struct and bounce real request across net */ i = dcc_total - 1; simple_sprintf(s, "%d %u %d", iptolong(getmyip()), dcc[i].port, dcc[i].u.xfer->length); botnet_send_filesend(idx, s1, from, s); putlog(LOG_FILES, "*", FILES_REMOTEREQ, dir, dir[0] ? "/" : "", what); }
static void remote_filereq(int idx, char *from, char *file) { char *p = NULL, *what = NULL, *dir = NULL, *s1 = NULL, *reject = NULL, *s = NULL; FILE *fdb = NULL; int i = 0; filedb_entry *fdbe = NULL; malloc_strcpy(what, file); p = strrchr(what, '/'); if (p) { *p = 0; malloc_strcpy(dir, what); strcpy(what, p + 1); } else { malloc_strcpy(dir, ""); } fdb = filedb_open(dir, 0); if (!fdb) { reject = FILES_DIRDNE; } else { filedb_readtop(fdb, NULL); fdbe = filedb_matchfile(fdb, ftell(fdb), what); filedb_close(fdb); if (!fdbe) { reject = FILES_FILEDNE; } else { if ((!(fdbe->stat & FILE_SHARE)) || (fdbe->stat & (FILE_HIDDEN | FILE_DIR))) reject = FILES_NOSHARE; else { s1 = nmalloc(strlen(dccdir) + strlen(dir) + strlen(what) + 2); /* Copy to /tmp if needed */ sprintf(s1, "%s%s%s%s", dccdir, dir, dir[0] ? "/" : "", what); if (copy_to_tmp) { s = nmalloc(strlen(tempdir) + strlen(what) + 1); sprintf(s, "%s%s", tempdir, what); copyfile(s1, s); } else s = s1; i = raw_dcc_send(s, "*remote", FILES_REMOTE, s); if (i > 0) { wipe_tmp_filename(s, -1); reject = FILES_SENDERR; } if (s1 != s) my_free(s); my_free(s1); } free_fdbe(&fdbe); } } s1 = nmalloc(strlen(botnetnick) + strlen(dir) + strlen(what) + 3); simple_sprintf(s1, "%s:%s/%s", botnetnick, dir, what); if (reject) { botnet_send_filereject(idx, s1, from, reject); my_free(s1); my_free(what); my_free(dir); return; } /* Grab info from dcc struct and bounce real request across net */ i = dcc_total - 1; s = nmalloc(40); /* Enough? */ simple_sprintf(s, "%d %u %d", iptolong(getmyip()), dcc[i].port, dcc[i].u.xfer->length); botnet_send_filesend(idx, s1, from, s); putlog(LOG_FILES, "*", FILES_REMOTEREQ, dir, dir[0] ? "/" : "", what); my_free(s1); my_free(s); my_free(what); my_free(dir); }
static int do_dcc_send(int idx, char *dir, char *fn, char *nick, int resend) { char *s = NULL, *s1 = NULL; int x; if (nick && strlen(nick) > NICKMAX) nick[NICKMAX] = 0; if (dccdir[0] == 0) { dprintf(idx, "DCC file transfers not supported.\n"); putlog(LOG_FILES, "*", "Refused dcc %sget %s from [%s]", resend ? "re" : "", fn, dcc[idx].nick); return 0; } if (strchr(fn, '/') != NULL) { dprintf(idx, "Filename cannot have '/' in it...\n"); putlog(LOG_FILES, "*", "Refused dcc %sget %s from [%s]", resend ? "re" : "", fn, dcc[idx].nick); return 0; } if (dir[0]) { s = nmalloc(strlen(dccdir) + strlen(dir) + strlen(fn) + 2); sprintf(s, "%s%s/%s", dccdir, dir, fn); } else { s = nmalloc(strlen(dccdir) + strlen(fn) + 1); sprintf(s, "%s%s", dccdir, fn); } if (!file_readable(s)) { dprintf(idx, "No such file.\n"); putlog(LOG_FILES, "*", "Refused dcc %sget %s from [%s]", resend ? "re" : "", fn, dcc[idx].nick); my_free(s); return 0; } if (!nick || !nick[0]) nick = dcc[idx].nick; /* Already have too many transfers active for this user? queue it */ if (at_limit(nick)) { char xxx[1024]; sprintf(xxx, "%d*%s%s", (int) strlen(dccdir), dccdir, dir); queue_file(xxx, fn, dcc[idx].nick, nick); dprintf(idx, "Queued: %s to %s\n", fn, nick); my_free(s); return 1; } if (copy_to_tmp) { char *tempfn = mktempfile(fn); /* Copy this file to /tmp, add a random prefix to the filename. */ s = nrealloc(s, strlen(dccdir) + strlen(dir) + strlen(fn) + 2); sprintf(s, "%s%s%s%s", dccdir, dir, dir[0] ? "/" : "", fn); s1 = nrealloc(s1, strlen(tempdir) + strlen(tempfn) + 1); sprintf(s1, "%s%s", tempdir, tempfn); my_free(tempfn); if (copyfile(s, s1) != 0) { dprintf(idx, "Can't make temporary copy of file!\n"); putlog(LOG_FILES | LOG_MISC, "*", "Refused dcc %sget %s: copy to %s FAILED!", resend ? "re" : "", fn, tempdir); my_free(s); my_free(s1); return 0; } } else { s1 = nrealloc(s1, strlen(dccdir) + strlen(dir) + strlen(fn) + 2); sprintf(s1, "%s%s%s%s", dccdir, dir, dir[0] ? "/" : "", fn); } s = nrealloc(s, strlen(dir) + strlen(fn) + 2); sprintf(s, "%s%s%s", dir, dir[0] ? "/" : "", fn); x = _dcc_send(idx, s1, nick, s, resend); if (x != DCCSEND_OK) wipe_tmp_filename(s1, -1); my_free(s); my_free(s1); return x; }