home *** CD-ROM | disk | FTP | other *** search
/ Australian Personal Computer 2004 July / APC0407D1.iso / powerkit / firewall / files / NPF2004.exe / Setup / ISCommon / APP / fwUI.dll / HTML / PORTS.JS < prev    next >
Encoding:
JavaScript  |  2003-09-06  |  7.9 KB  |  285 lines

  1. ////////////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // PRODUCT: Norton Internet Security/Symantec Desktop Firewall
  4. //
  5. // NAME:    ports.js 
  6. //
  7. // Copyright (c) 2001 by Symantec Corporation. All rights reserved.
  8. //
  9. ////////////////////////////////////////////////////////////////////////////////////////////
  10.  
  11. //******************************************************************************************
  12. //******************************************************************************************
  13. //
  14. //                          HELPERS FOR PORTS XML CODE
  15. //
  16. //******************************************************************************************
  17. //******************************************************************************************
  18.  
  19. function addPort(xml, port)
  20. {
  21.     return ("" != findPort(xml, port, true));
  22. }
  23.  
  24. function portExists(xml, port)
  25. {
  26.     return ("" != findPort(xml, port, false));
  27. }
  28.  
  29. //
  30. // Indicates whether port exists and whether its in a range.
  31. //
  32. function portExistsInRange(xml, port)
  33. {
  34.     return findPort(xml, port, false);
  35. }
  36.  
  37. function getPortStr(port, bICMP)
  38. {
  39.     var retStr = "";
  40.     var separ = StrID("port_separator");
  41.     var openParen = StrID("port_openparen");
  42.     var closeParen = StrID("port_closeparen");
  43.  
  44.     var knownPorts = new ActiveXObject("Microsoft.XMLDOM");
  45.     knownPorts.load(bICMP?"res://fwui.dll/ICMP-services.xml":"res://fwui.dll/services.xml");
  46.  
  47.     //**TODO: Need JavaScript equivalent to sprintf to make localization easier.
  48.     //
  49.     // Determine if this is a single port or port range.
  50.     //
  51.     if (1 == port.Type)
  52.     {
  53.         //
  54.         // It's a port range.
  55.         //
  56.         retStr = StrID(bICMP?"commands":"ports") + " " + port.RangeStart + StrID("dash_for_range") + port.RangeEnd;
  57.     }
  58.     else
  59.     {
  60.         //
  61.         // It's a single port.
  62.         //
  63.  
  64.         //
  65.         // Find a friendly name, if any, for the port.
  66.         //
  67.         var friendlyName = knownPorts.selectSingleNode("/*/port[value=" + port.PortNum + "]");
  68.         if (null != friendlyName)
  69.         {
  70.             //
  71.             // Format for friendly name: "ftp-data (port 21)"
  72.             //
  73.             retStr = friendlyName.selectSingleNode("name").nodeTypedValue;
  74.             retStr += " " + openParen + StrID(bICMP?"command":"port") + " " + port.PortNum + closeParen;
  75.         }
  76.         else
  77.         {
  78.             //
  79.             // Format for unfriendly name: "port 21"
  80.             //
  81.             retStr = StrID(bICMP?"command":"port") + " " + port.PortNum;
  82.         }
  83.     }
  84.  
  85.     return retStr;
  86. }
  87.  
  88. function getGenericServicesStr(rule)
  89. {
  90.  
  91.     var services;
  92.     var locPorts = rule.LocalPorts;
  93.     var remPorts = rule.RemotePorts;
  94.  
  95.     if ((0 == locPorts.ItemCount) && (0 == remPorts.ItemCount))
  96.         services = StrID("genericport_any");
  97.     else
  98.         services = StrID("genericport_specific");
  99.  
  100.     return services;
  101.  
  102. }
  103.  
  104. //******************************************************************************************
  105. //                PRIVATES/IMPLEMENTATION: HELPERS FOR PORTS XML CODE
  106. //******************************************************************************************
  107.  
  108. function findPort(xml, port, bUpdate)
  109. {
  110.     //
  111.     // Determine if this is a single port or port range.
  112.     //
  113.     var aPort = port.toString().split(":");
  114.     var bRange = (1 < aPort.length);
  115.  
  116.     if (bRange)
  117.     {
  118.         newStartPort = aPort[0];
  119.         newEndPort = aPort[1];
  120.     }
  121.     else
  122.     {
  123.         newStartPort = port.toString();
  124.         newEndPort = port.toString();
  125.     }
  126.     
  127.     //
  128.     // Check to ensure port/range doesn't already exist.
  129.     //
  130.     var ports = xml.selectNodes("Port|PortRange");
  131.     var found = "";
  132.     for (var nElem; ports.length > nElem; nElem++)
  133.     {
  134.         //
  135.         // Determine if this node is a single port or port range.
  136.         //
  137.         if ("PORTRANGE" == ports[nElem].nodeName.toUpperCase())
  138.         {
  139.             //
  140.             // Yup, its a range.
  141.             //
  142.             var aRange = ports[nElem].nodeTypedValue.split(":");
  143.             startPort = aRange[0];
  144.             endPort = aRange[1];
  145.             bNodeIsRange = true;
  146.         }
  147.         else
  148.         {
  149.             //
  150.             // Single port. Check for match
  151.             //
  152.             endPort = startPort = ports[nElem].nodeTypedValue;
  153.             bNodeIsRange = false;
  154.         }
  155.  
  156.         //
  157.         // Check for overlap.
  158.         // 
  159.         // First, check lower bound of new entry.
  160.         //
  161.         if ((startPort <= newStartPort) && (endPort >= newStartPort))
  162.         {
  163.             //
  164.             // There's overlap, update this node (only if its a range
  165.             // and the new range is larger or lies outside previous range).
  166.             // This update only occurs for PortRange nodes (due to code logic).
  167.             //
  168.             if (bUpdate && (startPort < newEndPort))
  169.                 ports[nElem].text = startPort + ":" + newEndPort;
  170.  
  171.             //
  172.             // Indicate a node already exists so we don't add one.
  173.             //
  174.             if (bNodeIsRange)
  175.                 found = "RANGE";
  176.             else
  177.                 found = "PORT";
  178.         }
  179.         //
  180.         // Now, check upper bound of new entry.
  181.         //
  182.         else if ((startPort <= newEndPort) && (endPort >= newEndPort))
  183.         {
  184.             //
  185.             // There's overlap, update this node. This update only occurs
  186.             // for PortRange nodes (due to code logic).
  187.             //
  188.             if (bUpdate)
  189.                 ports[nElem].text = newStartPort + ":" + endPort;
  190.  
  191.             //
  192.             // Indicate a node already exists so we don't add one.
  193.             //
  194.             if (bNodeIsRange)
  195.                 found = "RANGE";
  196.             else
  197.                 found = "PORT";
  198.         }
  199.     }
  200.  
  201.     //
  202.     // If we didn't find a match, add a new Port/PortRange node.
  203.     //
  204.     if (("" == found) && bUpdate)
  205.     {
  206.         xmlDoc = xml.ownerDocument;
  207.         if (null == xmlDoc)
  208.             xmlDoc = xml;
  209.  
  210.         if (bRange)
  211.         {
  212.             newNode = xmlDoc.createElement("PortRange");
  213.             newNode.text = newStartPort + ":" + newEndPort;
  214.         }
  215.         else
  216.         {
  217.             newNode = xmlDoc.createElement("Port");
  218.             newNode.text = newStartPort;
  219.         }
  220.  
  221.         //
  222.         // The following is required to differentiate between document and 
  223.         // non-document nodes.
  224.         //
  225.         var appendTo = xml.selectSingleNode(".");
  226.         if (null == xml.ownerDocument)
  227.             appendTo = xml.selectSingleNode("*");
  228.         appendTo.appendChild(newNode);
  229.     }
  230.  
  231.     return found;
  232. }
  233.  
  234. // dumbed down edition of add port used because port lists may not include both
  235. // port ranges and port lists.
  236.  
  237. function addPort_limited(xml, port)
  238. {
  239.     //
  240.     // Determine if this is a single port or port range.
  241.     //
  242.     var aPort = port.toString().split(":");
  243.     var bRange = (1 < aPort.length);
  244.     var ports = null;
  245.     var bFound = false;
  246.  
  247.     if (bRange)
  248.     {
  249.         var ports = xml.selectNodes("./*");
  250.         for (var nElem=0; nElem < ports.length; nElem++)
  251.         {
  252.             xml.removeChild(ports[nElem]);
  253.         }
  254.  
  255.         newNode = xml.ownerDocument.createElement("PortRange");
  256.         newNode.text = aPort[0] + ":" + aPort[1];
  257.         xml.appendChild(newNode);
  258.     }
  259.     else
  260.     {
  261.         // adding port - test for range
  262.         ports = xml.selectNodes("PortRange");
  263.         if (ports.length > 0) {
  264.             ports = xml.selectNodes("./*");
  265.             for (var nElem=0; nElem < ports.length; nElem++)
  266.             {
  267.                 xml.removeChild(ports[nElem]);
  268.             }
  269.         } else {
  270.             ports = xml.selectNodes("./Port");
  271.             for (var nElem=0; nElem < ports.length; nElem++)
  272.             {
  273.                 if (ports[nElem].nodeTypedValue == port)
  274.                     bFound = true;
  275.             }
  276.         }
  277.         if (!bFound)
  278.         {
  279.             newNode = xml.ownerDocument.createElement("Port");
  280.             newNode.text = port;
  281.             xml.appendChild(newNode);
  282.         }
  283.     }
  284. }
  285.