home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 May / 05_02.iso / software / nis / files / NIS / NIS.MSI / fwUI.dll / HTML / PORTS.JS < prev    next >
Encoding:
JavaScript  |  2001-12-01  |  7.9 KB  |  283 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(node, bICMP)
  38. {
  39.     var retStr = "";
  40.     var separ = StrID("port_separator");
  41.     var openParen = StrID("port_openparen");
  42.     var closeParen = StrID("port_closeparen");
  43.     var knownPorts = new ActiveXObject("Microsoft.XMLDOM");
  44.     knownPorts.load(bICMP?"res://fwui.dll/ICMP-services.xml":"res://fwui.dll/services.xml");
  45.  
  46.     //**TODO: Need JavaScript equivalent to sprintf to make localization easier.
  47.     //
  48.     // Determine if this is a single port or port range.
  49.     //
  50.     if ("PORTRANGE" == node.nodeName.toUpperCase())
  51.     {
  52.         //
  53.         // It's a port range.
  54.         //
  55.         var aPorts = node.nodeTypedValue.split(":");
  56.         retStr = StrID(bICMP?"commands":"ports") + " " + aPorts[0] + StrID("dash_for_range") + aPorts[1];
  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="+node.nodeTypedValue+"]");
  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") + " " + node.nodeTypedValue + closeParen;
  75.         }
  76.         else
  77.         {
  78.             //
  79.             // Format for unfriendly name: "port 21"
  80.             //
  81.             retStr = StrID(bICMP?"command":"port") + " " + node.nodeTypedValue;
  82.         }
  83.     }
  84.  
  85.     return retStr;
  86. }
  87.  
  88. function getGenericServicesStr(rule)
  89. {
  90.  
  91.     var services;
  92.     var ports = rule.selectSingleNode("(LocalPorts|RemotePorts)");
  93.     if (null == ports)
  94.         services = StrID("genericport_any");
  95.     else
  96.         services = StrID("genericport_specific");
  97.  
  98.     return services;
  99.  
  100. }
  101.  
  102. //******************************************************************************************
  103. //                PRIVATES/IMPLEMENTATION: HELPERS FOR PORTS XML CODE
  104. //******************************************************************************************
  105.  
  106. function findPort(xml, port, bUpdate)
  107. {
  108.     //
  109.     // Determine if this is a single port or port range.
  110.     //
  111.     var aPort = port.toString().split(":");
  112.     var bRange = (1 < aPort.length);
  113.  
  114.     if (bRange)
  115.     {
  116.         newStartPort = aPort[0];
  117.         newEndPort = aPort[1];
  118.     }
  119.     else
  120.     {
  121.         newStartPort = port.toString();
  122.         newEndPort = port.toString();
  123.     }
  124.     
  125.     //
  126.     // Check to ensure port/range doesn't already exist.
  127.     //
  128.     var ports = xml.selectNodes("Port|PortRange");
  129.     var found = "";
  130.     for (var nElem; ports.length > nElem; nElem++)
  131.     {
  132.         //
  133.         // Determine if this node is a single port or port range.
  134.         //
  135.         if ("PORTRANGE" == ports[nElem].nodeName.toUpperCase())
  136.         {
  137.             //
  138.             // Yup, its a range.
  139.             //
  140.             var aRange = ports[nElem].nodeTypedValue.split(":");
  141.             startPort = aRange[0];
  142.             endPort = aRange[1];
  143.             bNodeIsRange = true;
  144.         }
  145.         else
  146.         {
  147.             //
  148.             // Single port. Check for match
  149.             //
  150.             endPort = startPort = ports[nElem].nodeTypedValue;
  151.             bNodeIsRange = false;
  152.         }
  153.  
  154.         //
  155.         // Check for overlap.
  156.         // 
  157.         // First, check lower bound of new entry.
  158.         //
  159.         if ((startPort <= newStartPort) && (endPort >= newStartPort))
  160.         {
  161.             //
  162.             // There's overlap, update this node (only if its a range
  163.             // and the new range is larger or lies outside previous range).
  164.             // This update only occurs for PortRange nodes (due to code logic).
  165.             //
  166.             if (bUpdate && (startPort < newEndPort))
  167.                 ports[nElem].text = startPort + ":" + newEndPort;
  168.  
  169.             //
  170.             // Indicate a node already exists so we don't add one.
  171.             //
  172.             if (bNodeIsRange)
  173.                 found = "RANGE";
  174.             else
  175.                 found = "PORT";
  176.         }
  177.         //
  178.         // Now, check upper bound of new entry.
  179.         //
  180.         else if ((startPort <= newEndPort) && (endPort >= newEndPort))
  181.         {
  182.             //
  183.             // There's overlap, update this node. This update only occurs
  184.             // for PortRange nodes (due to code logic).
  185.             //
  186.             if (bUpdate)
  187.                 ports[nElem].text = newStartPort + ":" + endPort;
  188.  
  189.             //
  190.             // Indicate a node already exists so we don't add one.
  191.             //
  192.             if (bNodeIsRange)
  193.                 found = "RANGE";
  194.             else
  195.                 found = "PORT";
  196.         }
  197.     }
  198.  
  199.     //
  200.     // If we didn't find a match, add a new Port/PortRange node.
  201.     //
  202.     if (("" == found) && bUpdate)
  203.     {
  204.         xmlDoc = xml.ownerDocument;
  205.         if (null == xmlDoc)
  206.             xmlDoc = xml;
  207.  
  208.         if (bRange)
  209.         {
  210.             newNode = xmlDoc.createElement("PortRange");
  211.             newNode.text = newStartPort + ":" + newEndPort;
  212.         }
  213.         else
  214.         {
  215.             newNode = xmlDoc.createElement("Port");
  216.             newNode.text = newStartPort;
  217.         }
  218.  
  219.         //
  220.         // The following is required to differentiate between document and 
  221.         // non-document nodes.
  222.         //
  223.         var appendTo = xml.selectSingleNode(".");
  224.         if (null == xml.ownerDocument)
  225.             appendTo = xml.selectSingleNode("*");
  226.         appendTo.appendChild(newNode);
  227.     }
  228.  
  229.     return found;
  230. }
  231.  
  232. // dumbed down edition of add port used because port lists may not include both
  233. // port ranges and port lists.
  234.  
  235. function addPort_limited(xml, port)
  236. {
  237.     //
  238.     // Determine if this is a single port or port range.
  239.     //
  240.     var aPort = port.toString().split(":");
  241.     var bRange = (1 < aPort.length);
  242.     var ports = null;
  243.     var bFound = false;
  244.  
  245.     if (bRange)
  246.     {
  247.         var ports = xml.selectNodes("./*");
  248.         for (var nElem=0; nElem < ports.length; nElem++)
  249.         {
  250.             xml.removeChild(ports[nElem]);
  251.         }
  252.  
  253.         newNode = xml.ownerDocument.createElement("PortRange");
  254.         newNode.text = aPort[0] + ":" + aPort[1];
  255.         xml.appendChild(newNode);
  256.     }
  257.     else
  258.     {
  259.         // adding port - test for range
  260.         ports = xml.selectNodes("PortRange");
  261.         if (ports.length > 0) {
  262.             ports = xml.selectNodes("./*");
  263.             for (var nElem=0; nElem < ports.length; nElem++)
  264.             {
  265.                 xml.removeChild(ports[nElem]);
  266.             }
  267.         } else {
  268.             ports = xml.selectNodes("./Port");
  269.             for (var nElem=0; nElem < ports.length; nElem++)
  270.             {
  271.                 if (ports[nElem].nodeTypedValue == port)
  272.                     bFound = true;
  273.             }
  274.         }
  275.         if (!bFound)
  276.         {
  277.             newNode = xml.ownerDocument.createElement("Port");
  278.             newNode.text = port;
  279.             xml.appendChild(newNode);
  280.         }
  281.     }
  282. }
  283.