home *** CD-ROM | disk | FTP | other *** search
/ synchro.net / synchro.net.tar / synchro.net / Synchronet_Archive / 310IBETA.ZIP / gopherservice.js < prev    next >
Encoding:
Text File  |  2002-02-24  |  5.0 KB  |  223 lines

  1. // gopherservice.js
  2.  
  3. // Synchronet Service for the Gopher Protocol (RFC 1436)
  4.  
  5. // Example configuration (in ctrl/services.cfg):
  6.  
  7. // Gopher        70    0-unlimited    0        gopherservice.js
  8.  
  9. load("sbbsdefs.js");
  10. load("nodedefs.js");
  11.  
  12. const VERSION = "1.00 Alpha";
  13. const GOPHER_PORT = 70;
  14.  
  15. var debug = false;
  16. var no_anonymous = false;
  17.  
  18. // Parse arguments
  19. for(i=0;i<argc;i++)
  20.     if(argv[i].toLowerCase()=="-d")
  21.         debug = true;
  22.  
  23. // Write a string to the client socket
  24. function write(str)
  25. {
  26.     if(0 && debug)
  27.         log(format("rsp: %s",str));
  28.     client.socket.send(str);
  29. }
  30.  
  31. function writeln(str)
  32. {
  33.     write(str + "\r\n");
  34. }
  35.  
  36. // Send the contents of a text file to the client socket
  37. function send_file(fname)
  38. {
  39.     f = new File(fname);
  40.     if(!f.open("r")) 
  41.         return;
  42.     txt = f.readAll();
  43.     f.close();
  44.     for(l in txt)
  45.         writeln(strip_ctrl(txt[l]));
  46. }
  47.  
  48. var msgbase=null;
  49.  
  50. if(!login("guest"))    {
  51.     writeln("Sorry, no Gopher access here.");
  52.     log("!NO GUEST ACCOUNT CONFIGURED");
  53.     exit();
  54. }
  55.  
  56.  
  57. // Get Request
  58. request = client.socket.recvline(512 /*maxlen*/, 10 /*timeout*/);
  59.  
  60. if(request==null) {
  61.     log("!TIMEOUT waiting for request");
  62.     exit();
  63. }
  64.  
  65. log(format("client request: '%s'",request));
  66.  
  67. var gopher_plus=false;
  68. if((term=request.indexOf("\t+"))>=0) {
  69.     gopher_plus=true;
  70.     request=request.substr(0,term);
  71.     writeln("+-2");
  72. }
  73.  
  74. if(request=="") { /* blank = "root" */
  75.     for(g in msg_area.grp_list) 
  76.         writeln(format("1%s\tgrp:%s\t%s\t%u"
  77.             ,msg_area.grp_list[g].description
  78.             ,msg_area.grp_list[g].name.toLowerCase()
  79.             ,system.inetaddr
  80.             ,GOPHER_PORT
  81.             ));
  82. /** to-do
  83.     for(l in file_area.lib_list) 
  84.         writeln(format("1%s\tlib:%s\t%s\t%u"
  85.             ,file_area.lib_list[l].description
  86.             ,file_area.lib_list[l].name.toLowerCase()
  87.             ,system.inetaddr
  88.             ,GOPHER_PORT
  89.             ));
  90. **/
  91.     writeln(format("0%s\t%s\t%s\t%u"
  92.         ,"Node List"
  93.         ,"nodelist"
  94.         ,system.inetaddr
  95.         ,GOPHER_PORT
  96.         ));
  97.     writeln(format("0%s\t%s\t%s\t%u"
  98.         ,"Logon List"
  99.         ,"logonlist"
  100.         ,system.inetaddr
  101.         ,GOPHER_PORT
  102.         ));
  103.     writeln(format("0%s\t%s\t%s\t%u"
  104.         ,"Auto-Message"
  105.         ,"automsg"
  106.         ,system.inetaddr
  107.         ,GOPHER_PORT
  108.         ));
  109.  
  110.     exit();
  111. }
  112.  
  113. switch(request) {
  114.     case "nodelist":
  115.         var user = new User(1);
  116.         for(n=0;n<system.node_list.length;n++) {
  117.             write(format("Node %2d ",n+1));
  118.             if(system.node_list[n].status==NODE_INUSE) {
  119.                 user.number=system.node_list[n].useron;
  120.                 write(format("%s (%u %s) ", user.alias, user.age, user.gender));
  121.                 if(system.node_list[n].action==NODE_XTRN && system.node_list[n].aux)
  122.                     write(format("running %s",user.curxtrn));
  123.                 else
  124.                     write(format(NodeAction[system.node_list[n].action],system.node_list[n].aux));
  125.             } else
  126.                 write(format(NodeStatus[system.node_list[n].status],system.node_list[n].aux));
  127.  
  128.             write("\r\n");
  129.         }            
  130.         break;
  131.     case "logonlist":
  132.         send_file(system.data_dir + "logon.lst");
  133.         break;
  134.  
  135.     case "automsg":
  136.         send_file(system.data_dir + "msgs/auto.msg");
  137.         break;
  138. }
  139.  
  140. field = request.split(':');
  141. switch(field[0]) {
  142.     case "grp":
  143.         for(g in msg_area.grp_list) 
  144.             if(msg_area.grp_list[g].name.toLowerCase()==field[1]) {
  145.                 for(s in msg_area.grp_list[g].sub_list)
  146.                     writeln(format("1[%s] %s\tsub:%s\t%s\t%u"
  147.                         ,msg_area.grp_list[g].name
  148.                         ,msg_area.grp_list[g].sub_list[s].description
  149.                         ,msg_area.grp_list[g].sub_list[s].code.toLowerCase()
  150.                         ,system.inetaddr
  151.                         ,GOPHER_PORT
  152.                         ));
  153.                 break;
  154.             }
  155.         break;
  156.     case "lib":
  157.         for(l in file_area.lib_list) 
  158.             if(file_area.lib_list[l].name.toLowerCase()==field[1]) {
  159.                 for(d in file_area.lib_list[l].dir_list)
  160.                     writeln(format("1[%s] %s\tdir:%s\t%s\t%u"
  161.                         ,file_area.lib_list[l].name
  162.                         ,file_area.lib_list[l].dir_list[d].description
  163.                         ,file_area.lib_list[l].dir_list[d].code.toLowerCase()
  164.                         ,system.inetaddr
  165.                         ,GOPHER_PORT
  166.                         ));
  167.                 break;
  168.             }
  169.         break;
  170.     case "sub":
  171.         msgbase = new MsgBase(field[1]);
  172.         if(Number(field[2])) {
  173.             hdr=msgbase.get_msg_header(false,Number(field[2]));
  174.             if(hdr.attr&MSG_DELETE)
  175.                 break;
  176.             writeln(format("Subj : %s",hdr.subject));
  177.             writeln(format("To   : %s",hdr.to));
  178.             writeln(format("From : %s",hdr.from));
  179.             writeln(format("Date : %s",system.timestr(hdr.when_written_time)));
  180.             writeln("");
  181.             body=msgbase.get_msg_body(false,Number(field[2]),true)
  182.             writeln(body);
  183.             break;
  184.         }
  185. /**
  186.         msginfo=format("%-25.25s %-25.25s %-25.25s %s"
  187.                 ,"Subject"
  188.                 ,"From"
  189.                 ,"To"
  190.                 ,"Date"
  191.                 );
  192.         writeln(format("0%s\tnull\tnull\tnull\r\n",msginfo));
  193. **/
  194.         first = msgbase.first_msg;
  195.         for(i=msgbase.last_msg;i>=first;i--) {
  196.             hdr=msgbase.get_msg_header(false,i);
  197.             if(hdr==null)
  198.                 continue;
  199.             if(hdr.attr&MSG_DELETE)
  200.                 continue;
  201.             msginfo=format("%-25.25s %-25.25s %-25.25s %s"
  202.                 ,hdr.subject
  203.                 ,hdr.from
  204.                 ,hdr.to
  205.                 ,system.timestr(hdr.when_written_time)
  206.                 );
  207.             writeln(format("0%s\tsub:%s:%u\t%s\t%u"
  208.                 ,msginfo
  209.                 ,field[1]
  210.                 ,i
  211.                 ,system.inetaddr
  212.                 ,GOPHER_PORT
  213.                 ));
  214.         }
  215.         msgbase.close();
  216.         break;
  217.     case "dir":
  218.         /* to-do */
  219.         break;
  220. }
  221.  
  222. /* End of gopherservice.js */
  223.