From c57785a45ee72803a1e986b9f05d582cc8006e58 Mon Sep 17 00:00:00 2001 From: rswindell <> Date: Wed, 9 Sep 2015 04:25:51 +0000 Subject: [PATCH] Replace the activeuserservice.js with a command-line option to fingerservice.js since activeuserservice.js was just a copy/paste of fingerservice.js to begin with. Replace the "command" value for the ActiveUser and ActiveUser-UDP services in ctrl/services.ini with "fingerservice.js -u". The "?services" request now uses the portdefs.js to go through a list of known standard TCP service ports. --- exec/activeuserservice.js | 132 -------------------------------------- exec/fingerservice.js | 92 +++++++++++++++----------- 2 files changed, 53 insertions(+), 171 deletions(-) delete mode 100644 exec/activeuserservice.js diff --git a/exec/activeuserservice.js b/exec/activeuserservice.js deleted file mode 100644 index 036d893a57..0000000000 --- a/exec/activeuserservice.js +++ /dev/null @@ -1,132 +0,0 @@ -// activeuserservice.js - -// Synchronet Service for the Active User protocol (RFC 866) - -// $Id$ - -// Example configurations (in ctrl/services.ini): - -// [ActiveUser] -// Port=11 -// MaxClients=10 -// Options=NO_HOST_LOOKUP -// Command=activeuserservice.js - -// [ActiveUser-UDP] -// Port=11 -// MaxClients=10 -// Options=UDP | NO_HOST_LOOKUP -// Command=activeuserservice.js - -// Command-line options: - -// -n to the configuration line to eliminate user age and gender -// information from the query results. -// -a report aliases only (no real names) - -// !WARNING! -// Active User is an open protocol utilizing no forms of authorization -// or authentication. ACTIVE USER IS A KNOWN AND ACCEPTED SECURITY RISK. -// Detailed information about your system and its users is made -// available to ANYONE using this service. If there is anything in -// this script that you do not want to be made available to anyone -// and everyone, please comment-out (using /* and */) that portion -// of the script. - -const REVISION = "$Revision$".split(' ')[1]; - -var include_age_gender=true; -var include_real_name=true; - -load("nodedefs.js"); -load("sockdefs.js"); -load("sbbsdefs.js"); - -for(i=0;i<argc;i++) { - switch(argv[i].toLowerCase()) { - case "-n": // no age or gender - include_age_gender = false; - break; - case "-a": // aliases only - include_real_name = false; - break; - } -} - - -var output_buf = ""; - -// Write a string to the client socket -function write(str) -{ - output_buf += str; -} - -// Write all the output at once -function flush() -{ - client.socket.send(output_buf); -} - -// Write a crlf terminated string to the client socket -function writeln(str) -{ - write(str + "\r\n"); -} - -function xtrn_name(code) -{ - if(this.xtrn_area==undefined) - return(code); - - if(xtrn_area.prog!=undefined) - if(xtrn_area.prog[code]!=undefined) - return(xtrn_area.prog[code].name); - else { /* old way */ - for(s in xtrn_area.sec_list) - for(p in xtrn_area.sec_list[s].prog_list) - if(xtrn_area.sec_list[s].prog_list[p].code.toLowerCase()==code.toLowerCase()) - return(xtrn_area.sec_list[s].prog_list[p].name); - } - return(code); -} - -function done() -{ - flush(); - exit(); -} - -log("client requested Active User list"); -write(format("%-25.25s %-31.31s Time %7s Node\r\n" - ,"User","Action",include_age_gender ? "Age Sex":"")); -var dashes="----------------------------------------"; -write(format("%-25.25s %-31.31s %8.8s %3.3s %3.3s %4.4s\r\n" - ,dashes,dashes,dashes - ,include_age_gender ? dashes : "" - ,include_age_gender ? dashes : "" - ,dashes)); -var u = new User(1); -for(n=0;n<system.node_list.length;n++) { - if(system.node_list[n].status!=NODE_INUSE) - continue; - u.number=system.node_list[n].useron; - if(system.node_list[n].action==NODE_XTRN && system.node_list[n].aux) - action=format("running %s",xtrn_name(u.curxtrn)); - else - action=format(NodeAction[system.node_list[n].action] - ,system.node_list[n].aux); - t=time()-u.logontime; - if(t&0x80000000) t=0; - write(format("%-25.25s %-31.31s%3u:%02u:%02u %3s %3s %4d\r\n" - ,u.alias - ,action - ,Math.floor(t/(60*60)) - ,Math.floor(t/60)%60 - ,t%60 - ,include_age_gender ? u.age.toString() : "" - ,include_age_gender ? u.gender : "" - ,n+1 - )); -} -done(); diff --git a/exec/fingerservice.js b/exec/fingerservice.js index f80c0b161b..27bbcaf3ad 100644 --- a/exec/fingerservice.js +++ b/exec/fingerservice.js @@ -1,22 +1,38 @@ // fingerservice.js // Synchronet Service for the Finger protocol (RFC 1288) +// and/or the Active Users protocol (RFC 866) // $Id$ -// Example configuration (in ctrl/services.ini) +// Example configurations (in ctrl/services.ini) // [Finger] // Port=79 -// MaxClients=10 // Options=NO_HOST_LOOKUP // Command=fingerservice.js +// [Finger-UDP] +// Port=79 +// Options=UDP | NO_HOST_LOOKUP +// Command=fingerservice.js + +// [ActiveUser] +// Port=11 +// Options=NO_HOST_LOOKUP +// Command=fingerservice.js -u + +// [ActiveUser-UDP] +// Port=11 +// Options=UDP | NO_HOST_LOOKUP +// Command=fingerservice.js -u + // Command-line options: // -n add to the Command line to eliminate user age and gender // information from the query results. // -a report aliases only (no real names) // -ff enable the findfile feature (requires a "guest" account) +// -u report users only (ignore any request), a.k.a. Active Users protocol // !WARNING! // Finger is an open protocol utilizing no forms of authorization @@ -32,10 +48,12 @@ const REVISION = "$Revision$".split(' ')[1]; var include_age_gender=true; var include_real_name=true; var findfile=true; +var active_users=false; load("nodedefs.js"); load("sockdefs.js"); load("sbbsdefs.js"); +load("portdefs.js"); for(i=0;i<argc;i++) { switch(argv[i].toLowerCase()) { @@ -48,6 +66,9 @@ for(i=0;i<argc;i++) { case "-ff": // enable findfile (requires "guest" account) findfile=true; break; + case "-u": // Active Users only + active_users=true; + break; } } @@ -117,26 +138,31 @@ function done() exit(); } -// Get Finger Request (the main entry point) -if(datagram == undefined) // TCP - request = client.socket.recvline(128 /*maxlen*/, 10 /*timeout*/); -else // UDP - request = datagram; +var request=""; -if(request==null) { - log(LOG_WARNING,"!TIMEOUT waiting for request"); - exit(); -} +if(!active_users) { -request = truncsp(request); + // Get Finger Request (the main entry point) + if(datagram == undefined) // TCP + request = client.socket.recvline(128 /*maxlen*/, 10 /*timeout*/); + else // UDP + request = datagram; -log(LOG_DEBUG,"client request: " + request); + if(request==null) { + log(LOG_WARNING,"!TIMEOUT waiting for request"); + exit(); + } -if(request.substr(0,2).toUpperCase()=="/W") // "higher level of verbosity" - request=request.slice(2); // ignored... + request = truncsp(request); -while(request.charAt(0)==' ') // skip prepended spaces - request=request.slice(1); + log(LOG_DEBUG,"client request: " + request); + + if(request.substr(0,2).toUpperCase()=="/W") // "higher level of verbosity" + request=request.slice(2); // ignored... + + while(request.charAt(0)==' ') // skip prepended spaces + request=request.slice(1); +} if(request=="") { // no specific user requested, give list of active users log("client requested active user list"); @@ -267,28 +293,16 @@ if(request.charAt(0)=='?' || request.charAt(0)=='.') { // Handle "special" reque break; case "services": /* Services running on this host */ - if(test_port(23)) - writeln("Telnet"); - if(test_port(513)) - writeln("RLogin"); - if(test_port(21)) - writeln("FTP"); - if(test_port(25)) - writeln("SMTP"); - if(test_port(110)) - writeln("POP3"); - if(test_port(119)) - writeln("NNTP"); - if(test_port(70)) - writeln("Gopher"); - if(test_port(80)) - writeln("HTTP"); - if(test_port(113)) - writeln("IDENT"); - if(test_port(6667)) - writeln("IRC"); - if(test_port(8080)) - writeln("HTTP Proxy"); + var ports = []; + for(i in standard_service_port) { + if(i == "finger") + continue; + if(ports.indexOf(standard_service_port[i]) >= 0) // Already tested this port + continue; + ports.push(standard_service_port[i]); + if(test_port(standard_service_port[i])) + writeln(i); + } break; default: -- GitLab