// File : /adm/daemons/telnetd.c // Creator : Watcher@TMI (03/28/93) // // This daemon handles all outgoing telnet socket use approval, #include <mudlib.h> #include <net/telnet.h> #include <net/socket.h> #include <uid.h> inherit DAEMON ; void load_sites(); string *SITES; create() { seteuid(getuid(this_object())); load_sites(); } void load_sites() { string *tmp, file; int loop; SITES = ({ }); // Read in the list of approved sites. file = read_file( APPROVED_SITES ); // Check to see if there is such a file and if it has any addresses. if(!file) return; tmp = explode(file, "\n"); for(loop=0; loop<sizeof(tmp); loop++) if(tmp[loop][0] == '#' || tmp[loop][0] == '\n' || tmp[loop] == "") continue; else SITES += ({ tmp[loop] }); } // Whenever a socket command is initiated, master.c's valid_socket() // will ask the telnet daemon to see if the action is permitted. // The info array passes the following information: // info[0] = int fd // info[1] = object owner // info[2] = string ip_address // info[3] = int port int telnet_permission(object caller, string func, mixed *info) { string eff_user, tmp1, tmp2, tmp3; int loop; #if 0 log_file("telnetd","Caller: " + identify(caller) + " Func: " + identify(func) + " Info: " + identify(info) + "\n"); #endif // If approved sites aren't loaded yet ... load em. if(!SITES) load_sites(); // Get calling object's Euid ... eff_user = geteuid(caller); // If the caller is an Admin, or they are using a ROOT_UID // calling object ... approve the telnet attempt. // Mobydick added the socket group and gave it access on 4-11-93. if(adminp(eff_user) || eff_user == ROOT_UID || member_group(eff_user, "socket")) return 1; // If telnet object is an approved client ... approve telnet attempt. if(caller && member_array(base_name(caller), APPROVED_TELNET) != -1) return 1; // If no ip number is given by the request ... tentatively approve it. if(!info[2]) return 1; // Check to see if requested site matches a permitted telnet site. for(loop=0; loop<sizeof(SITES); loop++) { if(SITES[loop] == info[2]) return 1; // Positive direct match else if(SITES[loop] == "*.*.*.*") return 1; // Full wildcard match // Check for pattern wildcard matching else if(sscanf(SITES[loop],"%s.*.*.*", tmp1) == 1) { if(sscanf(info[2], tmp1 + ".%s.%s.%s", tmp1, tmp2, tmp3) == 3) return 1; } else if(sscanf(SITES[loop], "%s.%s.*.*", tmp1, tmp2) == 2) { if(sscanf(info[2], tmp1 + "." + tmp2 + ".%s.%s", tmp1, tmp2) == 2) return 1; } else if(sscanf(SITES[loop], "%s.%s.%s.*", tmp1, tmp2, tmp3) == 3) { if(sscanf(info[2], tmp1 + "." + tmp2 + "." + tmp3 + ".%s", tmp1) == 1) return 1; } } return 0; }