(file) Return to CIMObjectPath.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

Diff for /pegasus/src/Pegasus/Common/CIMObjectPath.cpp between version 1.60 and 1.61

version 1.60, 2007/05/25 16:18:53 version 1.61, 2007/06/26 20:26:13
Line 41 
Line 41 
 #include "XmlWriter.h" #include "XmlWriter.h"
 #include "XmlReader.h" #include "XmlReader.h"
 #include "ArrayInternal.h" #include "ArrayInternal.h"
   #include "HostLocator.h"
  
 PEGASUS_NAMESPACE_BEGIN PEGASUS_NAMESPACE_BEGIN
  
Line 445 
Line 446 
  
     static Boolean isValidHostname(const String& hostname)     static Boolean isValidHostname(const String& hostname)
     {     {
         //------------------------------------------------------------------          HostLocator addr(hostname);
         // Validate the hostname.  The hostname value may or may not be a  
         // fully-qualified domain name (e.g., xyz.company.com) or may be an  
         // IP address.  A port number may follow the hostname.  
         // Hostnames must match one of the following regular expressions:  
         // ^([A-Za-z0-9][A-Za-z0-9-]*)(\.[A-Za-z][A-Za-z0-9-]*)*(:[0-9]*)?$  
         // ^([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*)(:[0-9]*)?$  
         // Note for Bug#1462. Be careful here, from RFC 1123:  
         // - The syntax of a legal Internet host name was specified in  
         //   RFC-952 [DNS:4]. One aspect of host name syntax is hereby  
         //   changed: the restriction on the first character is relaxed to  
         //   allow either a letter or a digit.  
         // - If a dotted-decimal number can be entered without identifying  
         //   delimiters, then a full syntactic check must be made, because  
         //   a segment of a host domain name is now allowed to begin with a  
         //   digit and could legally be entirely numeric (see Section 6.1.2.4).  
         //   However, a valid host name can never have the dotted-decimal form  
         //   #.#.#.#, since at least the highest-level component label will be  
         //   alphabetic.  
         // The algorithm below has been updated accordingly.  
         //------------------------------------------------------------------  
  
         Uint32 i = 0;          return addr.isValid();
   
         Boolean isValid = false;  
   
         if (isascii(hostname[0]) && isdigit(hostname[0]))  
         {  
             //--------------------------------------------------------------  
             // Attempt to validate an IP address, but keep in mind that it  
             // might be a host name, since the leading character can now be  
             // a digit.  
             //--------------------------------------------------------------  
             isValid = true;  
   
             for (Uint32 octet=1; octet<=4; octet++)  
             {  
                 Uint32 octetValue = 0, j = 0;  
   
                 //----------------------------------------------------------  
                 // If a non-digit is encountered in the input parameter,  
                 // then break from here and attempt to validate as host name.  
                 //----------------------------------------------------------  
                 if (!(isascii(hostname[i]) && isdigit(hostname[i])))  
                 {  
                     isValid = false;  
                     break;  
                 }  
   
                 // skip over digits  
                 while (isascii(hostname[i]) && isdigit(hostname[i]))  
                 {  
                     if (j == 3)  
                     {  
                        isValid = false;  
                        break;  
                     }  
                     octetValue = octetValue*10 + (hostname[i] - '0');  
                     i++;  
                     j++;  
                 }  
   
                 if (octetValue > 255)  
                 {  
                     isValid = false;  
                     break;  
                 }  
   
                 // Check for invalid character in IP address  
                 if ((octet != 4) && (hostname[i++] != '.'))  
                 {  
                     isValid = false;  
                     break;  
                 }  
   
                 // Check for the case where it's a valid host name that happens  
                 // to have 4 (or more) leading all-numeric host segments.  
                 if ((octet == 4) && (hostname[i] != ':') &&  
                     hostname[i] != char(0))  
                 {  
                     isValid = false;  
                     break;  
                 }  
             }  
         }  
         if (!isValid)   // if it is not a valid IP address  
         {  
             i = 0;  // reset index for host name check  
   
             // Validate a host name  
             isValid = true;  
   
             Boolean expectHostSegment = true;  
             Boolean hostSegmentIsNumeric;  
   
             while (expectHostSegment == true)  
             {  
                 expectHostSegment = false;  
                 hostSegmentIsNumeric = true; // assume all-numeric host segment  
   
                 if (!(isascii(hostname[i]) &&  
                       (isalnum(hostname[i]) || (hostname[i] == '_'))))  
                 {  
                     return false;  
                 }  
   
                 while (isascii(hostname[i]) &&  
                        (isalnum(hostname[i]) || (hostname[i] == '-') ||  
                         (hostname[i] == '_')))  
                 {  
                     // If a non-digit is encountered, set "all-numeric"  
                     // flag to false  
                     if (isalpha(hostname[i]) || (hostname[i] == '-') ||  
                                                 (hostname[i] == '_'))  
                     {  
                         hostSegmentIsNumeric = false;  
                     }  
                     i++;  
                 }  
   
                 if (hostname[i] == '.')  
                 {  
                     i++;  
                     expectHostSegment = true;  
                 }  
             }  
             // If the last Host Segment is all numeric, then return false.  
             // RFC 1123 says "highest-level component label will be alphabetic".  
             if (hostSegmentIsNumeric)  
             {  
                 return false;  
             }  
         }  
   
         if (!isValid) // if not a valid IP address or host name  
         {  
             return false;  
         }  
   
         // Check for a port number:  
   
         if (hostname[i] == ':')  
         {  
             i++;  
             // First check that there is at least one digit specified for the  
             // port number if the ':' delimiter is present. Note that there is  
             // a question as to whether ':' can exist without the port number.  
             // ATTN: See bug 6424.  
             if (!(isascii(hostname[i]) && isdigit(hostname[i])))  
             {  
                 return false;  
             }  
   
             Uint32 port = (hostname[i] - '0');  
             i++;  
   
             // Check that remaining characters in port number are all digits,  
             // and that the port number can be represented by 16-bits.  
             while (isascii(hostname[i]) && isdigit(hostname[i]))  
             {  
                 port = port*10 + (hostname[i] - '0');  
                 if(port > 65535)  
                 {  
                     return false;  
                 }  
                 i++;  
             }  
         }  
   
         return (hostname[i] == char(0));  
     }     }
  
     //     //


Legend:
Removed from v.1.60  
changed lines
  Added in v.1.61

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2