/* check ip for matching blacklist and whitelist */ unsigned int t_check_ip_access(transfer *const tr) { const char *msg; if (irlist_size(&gdata.xdcc_allow) > 0) { if (!verify_cidr(&gdata.xdcc_allow, &(tr->con.remote))) { msg = "Sorry, downloads to your IP not allowed, ask owner."; t_closeconn(tr, msg, 0); ioutput(OUT_S|OUT_L|OUT_D, COLOR_NO_COLOR, "%s", msg); return 1; } } if (verify_cidr(&gdata.xdcc_deny, &(tr->con.remote))) { msg = "Sorry, downloads to your IP denied, ask owner."; t_closeconn(tr, msg, 0); ioutput(OUT_S|OUT_L|OUT_D, COLOR_NO_COLOR, "%s", msg); return 1; } return 0; }
/* accept incoming connection */ static void telnet_accept(unsigned int i) { gnetwork_t *backup; char *msg; dccchat_t *chat; SIGNEDSOCK int addrlen; updatecontext(); chat = irlist_add(&gdata.dccchats, sizeof(dccchat_t)); chat->name = "telnet"; /* NOTRANSLATE */ chat->status = DCCCHAT_UNUSED; chat->con.family = telnet_family[i]; if (chat->con.family != AF_INET) { addrlen = sizeof (struct sockaddr_in6); chat->con.clientsocket = accept(telnet_listen[i], &(chat->con.remote.sa), &addrlen); } else { addrlen = sizeof (struct sockaddr_in); chat->con.clientsocket = accept(telnet_listen[i], &(chat->con.remote.sa), &addrlen); } if (chat->con.clientsocket < 0) { outerror(OUTERROR_TYPE_WARN, "Accept Error, Aborting: %s", strerror(errno)); return; } if (set_socket_nonblocking(chat->con.clientsocket, 1) < 0 ) { outerror(OUTERROR_TYPE_WARN, "Couldn't Set Non-Blocking"); } addrlen = sizeof(chat->con.local); if (getsockname(chat->con.clientsocket, &(chat->con.local.sa), &addrlen) < 0) { outerror(OUTERROR_TYPE_WARN_LOUD, "Couldn't get sock name: %s", strerror(errno)); shutdown_close(chat->con.clientsocket); chat->con.clientsocket = FD_UNUSED; return; } ++(gdata.num_dccchats); chat->status = DCCCHAT_AUTHENTICATING; chat->net = 0; chat->nick = mystrdup("telnet"); /* NOTRANSLATE */ chat->hostmask = to_hostmask(chat->nick, "telnet"); /* NOTRANSLATE */ chat->con.localport = gdata.telnet_port; chat->con.connecttime = gdata.curtime; chat->con.lastcontact = gdata.curtime; msg = mymalloc(maxtextlength); my_getnameinfo(msg, maxtextlength -1, &(chat->con.remote.sa)); chat->con.localaddr = mystrdup(msg); my_getnameinfo(msg, maxtextlength -1, &(chat->con.local.sa)); chat->con.remoteaddr = mystrdup(msg); ioutput(OUT_S|OUT_L|OUT_D, COLOR_MAGENTA, "Telnet connection received from %s", msg); mydelete(msg); if (is_in_badip(&(chat->con.remote))) { shutdowndccchat(chat, 0); return; } if (irlist_size(&gdata.telnet_allow) > 0) { if (!verify_cidr(&gdata.telnet_allow, &(chat->con.remote))) { shutdowndccchat(chat, 0); return; } } if (verify_cidr(&gdata.telnet_deny, &(chat->con.remote))) { shutdowndccchat(chat, 0); return; } ir_boutput_init(&chat->boutput, chat->con.clientsocket, 0); backup = gnetwork; gnetwork = &(gdata.networks[chat->net]); setup_chat_banner(chat); gnetwork = backup; }