home *** CD-ROM | disk | FTP | other *** search
/ WinFiles.com 1998 June / WF0698_3.ISO / servers-websrv / websuite.exe / SDWEBCFG.DA_ / SDWEBCFG.DA
Text File  |  1998-04-01  |  9KB  |  286 lines

  1. // SmartDesk Personal Web Server v2.0 - Event Handler
  2. // (c) 1997-98 SmartDesk, Inc., All Rights Reserved
  3.  
  4. LIBRARY sysclass
  5.  
  6. GLOBAL logLocalHost
  7. STATIC websrvr, sessionId, ClientAddr
  8.  
  9.  
  10. FUNCTION main( _websrvr, _sessionId, _hServer, _hClient )
  11.  
  12.     // Parameters:
  13.     //
  14.         //  websrvr                 Pointer to internal server data
  15.         //  sessionId               Session ID
  16.         //  hServer                 Handle of Server listen socket
  17.         //  hClient                 Handle of Client connetion socket
  18.  
  19.     local hServer, hClient, hackcnt
  20.     local session, command, url, param, defURL, apLibs
  21.     local filename, data, err, flag, webhost, i, fname
  22.  
  23.     TRY
  24.  
  25.     websrvr = 0 + _websrvr
  26.     sessionId = 0 + _sessionId
  27.     hServer = 0 + _hServer
  28.     hClient = 0 + _hClient
  29.  
  30.     // Initialize the Active Page generator...
  31.     _apGenerate( )
  32.  
  33.     // get the local host
  34.     if ( type( logLocalHost ) != "C" )
  35.         logLocalHost = ""
  36.     end
  37.  
  38.     defURL       = webServerDefFile( websrvr )    // default URL to display if none specified
  39.     apLibs        = "sysclass"                    // List of libraries to include when running ap files, ";" delimited
  40.  
  41.     // get the session data
  42.     session = new( "session", websrvr, sessionId )
  43.     
  44.     ClientAddr = session.data( "REMOTE_ADDR" )
  45.     command    = session.data( "REQUEST_METHOD" )
  46.     url           = session.data( "PATH_INFO" )
  47.     filename   = session.data( "PATH_TRANSLATED" )
  48.     param       = session.data( "QUERY_STRING" )
  49.  
  50.     // let 'em know somebody is here...
  51.     mprint( date( ) + " " + time( ) + " CONNECTED    (" + hClient + ") " + ClientAddr )
  52.  
  53.     // check for multiple 404 accesses...
  54.     hackcnt = 0 + session.data( "404COUNT" )
  55.     if ( hackcnt > 5 )
  56.         if ( sessionDataExpired( websrvr, sessionId, "404COUNT", 60 ) )
  57.             session.data( "404COUNT", "0" )
  58.         else
  59.             webhost = webhostfromaddr( ClientAddr )
  60.             if ( type( webhost ) != "C" )
  61.                 webhost = ""
  62.             end
  63.             data = "<H1><FONT COLOR=red>Hack Attack Notification!!!</FONT></H1>You have had way too many attempts accessing unauthorized files on this server. "
  64.             data += "Your internal identification information (<FONT COLOR=red>" + webhost +  " </FONT>/<FONT COLOR=\"#0000FF\"> " + ClientAddr + "</FONT>) has been logged to a our security system "
  65.             data += " and further access to this site will be denied. Have a nice day...<FONT SIZE=1><BR><BR>SmartDesk Personal Web Server v1.1, www.smartdesk.com</FONT><BR>\r\n"
  66.             webServerSend( websrvr, hclient, "HTTP/1.0 200 Success\r\nDate: " + webGMT( ) + "\r\nContent-Type: text/html\r\nContent-Length: " + len( data ) + "\r\n\r\n" + data )
  67.             mprint( " HACKER REJECTED!!!\r\n" )
  68.             mprintln( date( ) + " " + time( ) + " DISCONNECTED (" + hClient + ") " + ClientAddr )
  69.             webServerLogAddEntry( ClientAddr, command, url, param )
  70.             return( 0 )
  71.         end
  72.     end
  73.  
  74.     // log the entry
  75.     webServerLogAddEntry( ClientAddr, command, url, param )
  76.  
  77.     // validate the URI data
  78.     if ( ( at( "*", filename ) > 0 ) || ( at( "?", filename ) > 0 ) )
  79.         // check for wildcards
  80.         filename = ""
  81.     elseif ( strempty( filename ) || ( filename == "\\" ) )
  82.         // check for non-specific request, use default URL if non specified
  83.         filename = webServerFile( websrvr, defURL )
  84.     elseif ( strat( "..", filename ) > 0 )
  85.         // Oops...potential security violation
  86.         webServerLogAddEntry( ClientAddr, "SECURITY_DIRECTORY_ACCESS_ATTEMPT", filename, "" )
  87.         filename = ""
  88.     end
  89.  
  90.        if ( IsWin32( ) )
  91.         fname = lfnLongToShort( filename )
  92.         if ( type( fname ) == "C" )
  93.             if ( ! strempty( fname ) )
  94.                 filename = fname
  95.             end
  96.         end
  97.     end
  98.  
  99.     // check if the file is available
  100.     flag = 1
  101.     if ( ! fileExists( filename ) )
  102.         if ( strat( ".HTML", upper( filename ) ) > 1 )
  103.             fname = strextract( filename, ".", 1 ) + ".htm"
  104.             if ( fileExists( fname ) )
  105.                 filename = fname
  106.                 flag = 0
  107.             else
  108.                 // check if an AP page exists
  109.                 fname = strextract( filename, ".", 1 ) + ".ap"
  110.                 if ( fileExists( fname ) )
  111.                     filename = fname
  112.                     flag = 0
  113.                 end
  114.             end
  115.         elseif ( strat( ".HTM", upper( filename ) ) > 1 )
  116.             // check if an AP page exists
  117.             fname = strextract( filename, ".", 1 ) + ".ap"
  118.             if ( fileExists( fname ) )
  119.                 filename = fname
  120.                 flag = 0
  121.             end
  122.         elseif ( isdir( filename ) || right( filename, 1 ) == "//" )    // check if it references another directory
  123.                fname = fileFixPath( filename + "\\" + defURL )
  124.             if ( fileExists( fname ) )
  125.                 filename = fname
  126.                 flag = 0
  127.             else
  128.                    fname = fileFixPath( filename + "\\index.ap" )
  129.                    if ( fileExists( fname ) )
  130.                     filename = fname
  131.                        flag = 0
  132.                    else
  133.                     fname = fileFixPath( filename + "\\index.htm" )
  134.                        if ( fileExists( fname ) )
  135.                         filename = fname
  136.                            flag = 0
  137.                        end
  138.                    end
  139.             end
  140.         end
  141.         if ( flag )
  142.             data = "<H1>File Not Found</H1>The server was unable to locate the <B>" + url + "</B> file.<FONT SIZE=1><BR>SmartDesk Personal Web Server v1.1, www.smartdesk.com</FONT><BR>\r\n"
  143.             webServerSend( websrvr, hclient, "HTTP/1.0 404 Resource not found\r\nDate: " + webGMT( ) + "\r\nContent-Type: text/html\r\nContent-Length: " + len( data ) + "\r\n\r\n" + data )
  144.             mprint( " GET/404 " + url + "\r\n" )
  145.             mprintln( date( ) + " " + time( ) + " DISCONNECTED (" + hClient + ") " + ClientAddr )
  146.             if ( strempty( session.data( "REFERER" ) ) )
  147.                 session.data( "404COUNT", "" + ( hackcnt + 1 ) )
  148.             end
  149.             return( 0 )
  150.         end
  151.     end
  152.  
  153.     mprint( " " + command + " " + url + " " )
  154.  
  155.     // display the first part of the paramater line
  156.     if ( ! strempty( param ) )
  157.         mprintln( "" )
  158.         if ( len( param ) > 75 )
  159.             mprint( left( param, 75 ) + "... ")
  160.         else
  161.             mprint( param + " " )
  162.         end
  163.     end
  164.     
  165.     // process command specific stuff
  166.     switch ( upper( command ) )
  167.       case "GET"
  168.       case "POST"
  169.       case "HEAD"
  170.         switch ( upper( fileExtension( filename ) ) )
  171.           case "HTM"
  172.             // htm or html file
  173.             if ( command == "HEAD" )
  174.                 webServerSendFileHead( websrvr, hClient, filename )
  175.             else
  176.                 webServerSendFile( websrvr, hClient, filename )
  177.             end
  178.             webServerLogAddEntry( ClientAddr, "SEND_FILE_HTML", filename, "" )
  179.             break
  180.           case "AP"
  181.             // SmartDesk Active Server Page
  182.             data = apServePageToBuffer( filename, aplibs, websrvr, sessionID ) + "\r\n"
  183.             // Check if the AP file processed its own HTTP header
  184.             if ( left( data, 5 ) == "HTTP/" )
  185.                 if ( command == "HEAD" )
  186.                     i = strat( "\r\n\r\n", data )
  187.                     if ( i > 0 )
  188.                         data = left( data, i ) + "\r\n\r\n"
  189.                     end
  190.                 end
  191.                 webServerSend( websrvr, hClient, data )
  192.             else
  193.                 webServerSend( websrvr, hClient,  "HTTP/1.0 200 Success\r\nDate: " + webGMT( ) + "\r\nContent-Type: text/html\r\nContent-Length: " + len( data ) + "\r\n\r\n" + data )
  194.             end
  195.             webServerLogAddEntry( ClientAddr, ( command == "HEAD" ?  "AP_HEAD_INFO" : "AP_SERVE_FILE" ), filename, "" )
  196.             break
  197.           case "EXE"
  198.           case "FGL"
  199.           case "FGX"
  200.           case "COM"
  201.           case "BAT"
  202.               // check if this is a local request
  203.             if ( webAddrFromHost( webHostName( ) ) == ClientAddr )
  204.                 // run the application locally
  205.                 smartrun( filename )
  206.                 break
  207.             end
  208.             // otherwise, fall through to the default handler...
  209.  
  210.           default
  211.             // default to binary data
  212.             if ( command == "HEAD" )
  213.                 webServerSendFileHead( websrvr, hClient, filename )
  214.             else
  215.                 webServerSendFile( websrvr, hClient, filename )
  216.             end
  217.             webServerLogAddEntry( ClientAddr, "SEND_FILE_BINARY", filename, "" )
  218.         end
  219.         break
  220.         
  221.       default
  222.           // error in processing read request, echo back command
  223.         webServerSend( websrvr, hClient, webHeader( ) + "Unsupported HTTP request. Error processing requested command:<BR>" + command + " " + url + webFooter( ) )
  224.         webServerLogAddEntry( ClientAddr, "ERROR_GET_UNKOWN_URL", filename, "" )
  225.     end
  226.  
  227.     mprintln( "" )
  228.     mprintln( date( ) + " " + time( ) + " DISCONNECTED (" + hClient + ") " + ClientAddr )
  229.  
  230.     return( 1 )
  231.     
  232.     CATCH ( err )
  233.         msgDelay( 3000, "Error [" + err.errornum + "] at line #" + err.errorline + " (" + ErrorAsText( err.errornum ) + ")" )
  234.         return( 0 )
  235.     END
  236.     
  237. END
  238.  
  239.  
  240. FUNCTION webServerLogAddEntry( url, command, param, data )
  241.  
  242.     local SummaryFile, LogEntry    
  243.  
  244.     SummaryFile = 1        // Set this to 0 to capture all of the details (big file!)
  245.  
  246.     // don't log the chat update window...
  247.     if ( strat( "CHATTEXT.AP", upper( param ) ) > 0 )
  248.         return( 1 )
  249.     end
  250.  
  251.     if ( ! webLogLocal( websrvr ) )
  252.         if ( ClientAddr == webLocalHost( ) )
  253.             return( 1 )
  254.         elseif ( ClientAddr == "127.0.0.1" )
  255.             return( 1 )
  256.         end
  257.     end
  258.  
  259.     // build the log entry data
  260.     if ( SummaryFile )
  261.         logEntry = date( "YYYY-MM-DD" ) + "," + time( ) + "," + url + "," + command + "," + param + "\r\n"
  262.     else
  263.         logEntry = date( "YYYY-MM-DD" ) + "," + time( ) + "," + url + "," + data + "\r\n"
  264.     end
  265.  
  266.     webLogEntry( websrvr, logEntry )
  267.  
  268.     return( 1 )
  269. END
  270.  
  271.  
  272. FUNCTION mprint( str )
  273.     if ( ! webMonitoring( websrvr ) )
  274.         return( 0 )
  275.     end
  276.     print( str )    // change this line to send the monitor output somewhere else
  277.     return( 1 )
  278. END
  279.  
  280.  
  281. FUNCTION mprintln( str )
  282.     return( mprint( str + "\r" ) )
  283. END
  284.  
  285.  
  286.