예제 #1
0
        public static StringBuffer ConvertIDNToASCII(String src, IDNA2003Options options)
        {
            char[]       srcArr      = src.ToCharArray();
            StringBuffer result      = new StringBuffer();
            int          sepIndex    = 0;
            int          oldSepIndex = 0;

            for (; ;)
            {
                sepIndex = GetSeparatorIndex(srcArr, sepIndex, srcArr.Length);
                String label = new String(srcArr, oldSepIndex, sepIndex - oldSepIndex);
                //make sure this is not a root label separator.
                if (!(label.Length == 0 && sepIndex == srcArr.Length))
                {
                    UCharacterIterator iter = UCharacterIterator.GetInstance(label);
                    result.Append(ConvertToASCII(iter, options));
                }
                if (sepIndex == srcArr.Length)
                {
                    break;
                }
                // increment the sepIndex to skip past the separator
                sepIndex++;
                oldSepIndex = sepIndex;
                result.Append((char)FULL_STOP);
            }
            return(result);
        }
예제 #2
0
        public static StringBuffer ConvertIDNToUnicode(String src, IDNA2003Options options)
        {
            char[]       srcArr      = src.ToCharArray();
            StringBuffer result      = new StringBuffer();
            int          sepIndex    = 0;
            int          oldSepIndex = 0;

            for (; ;)
            {
                sepIndex = GetSeparatorIndex(srcArr, sepIndex, srcArr.Length);
                String label = new String(srcArr, oldSepIndex, sepIndex - oldSepIndex);
                if (label.Length == 0 && sepIndex != srcArr.Length)
                {
                    throw new StringPrepParseException("Found zero length lable after NamePrep.", StringPrepErrorType.ZeroLengthLabel);
                }
                UCharacterIterator iter = UCharacterIterator.GetInstance(label);
                result.Append(ConvertToUnicode(iter, options));
                if (sepIndex == srcArr.Length)
                {
                    break;
                }
                // increment the sepIndex to skip past the separator
                sepIndex++;
                oldSepIndex = sepIndex;
                result.Append((char)FULL_STOP);
            }
            return(result);
        }
예제 #3
0
        public static int Compare(string s1, string s2, IDNA2003Options options)
        {
            StringBuffer s1Out = ConvertIDNToASCII(s1, options);
            StringBuffer s2Out = ConvertIDNToASCII(s2, options);

            return(CompareCaseInsensitiveASCII(s1Out, s2Out));
        }
예제 #4
0
        public static StringBuffer ConvertIDNToUnicode(String src, IDNA2003Options options)
        {
            char[]       srcArr      = src.ToCharArray();
            StringBuffer result      = new StringBuffer();
            int          sepIndex    = 0;
            int          oldSepIndex = 0;

            for (; ;)
            {
                sepIndex = GetSeparatorIndex(srcArr, sepIndex, srcArr.Length);
                string label = new string(srcArr, oldSepIndex, sepIndex - oldSepIndex);
                if (label.Length == 0 && sepIndex != srcArr.Length)
                {
                    throw new StringPrepParseException("Found zero length lable after NamePrep.", StringPrepErrorType.ZeroLengthLabel);
                }
                UCharacterIterator iter = UCharacterIterator.GetInstance(label);
                result.Append(ConvertToUnicode(iter, options));
                if (sepIndex == srcArr.Length)
                {
                    break;
                }
                // Unlike the ToASCII operation we don't normalize the label separators
                result.Append(srcArr[sepIndex]);
                // increment the sepIndex to skip past the separator
                sepIndex++;
                oldSepIndex = sepIndex;
            }
            if (result.Length > MAX_DOMAIN_NAME_LENGTH)
            {
                throw new StringPrepParseException("The output exceed the max allowed length.", StringPrepErrorType.DomainNameTooLongError);
            }
            return(result);
        }
예제 #5
0
        public static StringBuffer ConvertIDNToASCII(string src, IDNA2003Options options)
        {
            char[]       srcArr      = src.ToCharArray();
            StringBuffer result      = new StringBuffer();
            int          sepIndex    = 0;
            int          oldSepIndex = 0;

            for (; ;)
            {
                sepIndex = GetSeparatorIndex(srcArr, sepIndex, srcArr.Length);
                string label = new string(srcArr, oldSepIndex, sepIndex - oldSepIndex);
                //make sure this is not a root label separator.
                if (!(label.Length == 0 && sepIndex == srcArr.Length))
                {
                    UCharacterIterator iter = UCharacterIterator.GetInstance(label);
                    result.Append(ConvertToASCII(iter, options));
                }
                if (sepIndex == srcArr.Length)
                {
                    break;
                }

                // increment the sepIndex to skip past the separator
                sepIndex++;
                oldSepIndex = sepIndex;
                result.Append((char)FULL_STOP);
            }
            if (result.Length > MAX_DOMAIN_NAME_LENGTH)
            {
                throw new StringPrepParseException("The output exceed the max allowed length.", StringPrepErrorType.DomainNameTooLongError);
            }
            return(result);
        }
예제 #6
0
        //  TODO: optimize
        public static int Compare(UCharacterIterator i1, UCharacterIterator i2, IDNA2003Options options)
        {
            if (i1 == null || i2 == null)
            {
                throw new ArgumentException("One of the source buffers is null");
            }
            StringBuffer s1Out = ConvertIDNToASCII(i1.GetText(), options);
            StringBuffer s2Out = ConvertIDNToASCII(i2.GetText(), options);

            return(CompareCaseInsensitiveASCII(s1Out, s2Out));
        }
예제 #7
0
        //  TODO: optimize
        public static int Compare(String s1, String s2, IDNA2003Options options)
        {
            if (s1 == null || s2 == null)
            {
                throw new ArgumentException("One of the source buffers is null");
            }
            StringBuffer s1Out = ConvertIDNToASCII(s1, options);
            StringBuffer s2Out = ConvertIDNToASCII(s2, options);

            return(CompareCaseInsensitiveASCII(s1Out, s2Out));
        }
예제 #8
0
 public static StringBuffer ConvertIDNToUnicode(StringBuffer str, IDNA2003Options options)
 {
     return(ConvertIDNToUnicode(str.ToString(), options));
 }
예제 #9
0
 public static StringBuffer ConvertIDNToUnicode(UCharacterIterator iter, IDNA2003Options options)
 {
     return(ConvertIDNToUnicode(iter.GetText(), options));
 }
예제 #10
0
        public static StringBuffer ConvertToUnicode(UCharacterIterator iter, IDNA2003Options options)
        {
            // the source contains all ascii codepoints
            bool srcIsASCII = true;

            int ch;
            int saveIndex = iter.Index;

            // step 1: find out if all the codepoints in src are ASCII
            while ((ch = iter.Next()) != UCharacterIterator.DONE)
            {
                if (ch > 0x7F)
                {
                    srcIsASCII = false;
                    break;
                }
            }

            // The RFC states that
            // <quote>
            // ToUnicode never fails. If any step fails, then the original input
            // is returned immediately in that step.
            // </quote>
            do
            {
                StringBuffer processOut;
                if (srcIsASCII == false)
                {
                    // step 2: process the string
                    iter.Index = (saveIndex);
                    try
                    {
                        processOut = transform.Prepare(iter, (StringPrepOptions)options);
                    }
                    catch (StringPrepParseException e)
                    {
                        break;
                    }
                }
                else
                {
                    // just point to source
                    processOut = new StringBuffer(iter.GetText());
                }

                // step 3: verify ACE Prefix
                if (StartsWithPrefix(processOut))
                {
                    // step 4: Remove the ACE Prefix
                    String temp = processOut.ToString(ACE_PREFIX_LENGTH, processOut.Length - ACE_PREFIX_LENGTH);

                    // step 5: Decode using punycode
                    StringBuffer decodeOut = null;
                    try
                    {
                        decodeOut = PunycodeReference.Decode(new StringBuffer(temp), null);
                    }
                    catch (StringPrepParseException e)
                    {
                        break;
                    }

                    // step 6:Apply toASCII
                    StringBuffer toASCIIOut = ConvertToASCII(decodeOut, options);

                    // step 7: verify
                    if (CompareCaseInsensitiveASCII(processOut, toASCIIOut) != 0)
                    {
                        break;
                    }
                    // step 8: return output of step 5
                    return(decodeOut);
                }
            } while (false);

            return(new StringBuffer(iter.GetText()));
        }
예제 #11
0
        public static StringBuffer ConvertToUnicode(StringBuffer src, IDNA2003Options options)
        {
            UCharacterIterator iter = UCharacterIterator.GetInstance(src);

            return(ConvertToUnicode(iter, options));
        }
예제 #12
0
 public static StringBuffer ConvertIDNtoASCII(StringBuffer str, IDNA2003Options options)
 {
     return(ConvertIDNToASCII(str.ToString(), options));
 }
예제 #13
0
        public static StringBuffer ConvertToASCII(UCharacterIterator srcIter, IDNA2003Options options)
        {
            char[]
            caseFlags = null;

            // the source contains all ascii codepoints
            bool srcIsASCII = true;
            // assume the source contains all LDH codepoints
            bool srcIsLDH = true;

            //get the options
            bool useSTD3ASCIIRules = ((options & USE_STD3_RULES) != 0);

            int ch;

            // step 1
            while ((ch = srcIter.Next()) != UCharacterIterator.DONE)
            {
                if (ch > 0x7f)
                {
                    srcIsASCII = false;
                }
            }
            int failPos = -1;

            srcIter.SetToStart();
            StringBuffer processOut = null;

            // step 2 is performed only if the source contains non ASCII
            if (!srcIsASCII)
            {
                // step 2
                processOut = transform.Prepare(srcIter, (StringPrepOptions)options);
            }
            else
            {
                processOut = new StringBuffer(srcIter.GetText());
            }
            int poLen = processOut.Length;

            if (poLen == 0)
            {
                throw new StringPrepParseException("Found zero length lable after NamePrep.", StringPrepErrorType.ZeroLengthLabel);
            }
            StringBuffer dest = new StringBuffer();

            // reset the variable to verify if output of prepare is ASCII or not
            srcIsASCII = true;

            // step 3 & 4
            for (int j = 0; j < poLen; j++)
            {
                ch = processOut[j];
                if (ch > 0x7F)
                {
                    srcIsASCII = false;
                }
                else if (IsLDHChar(ch) == false)
                {
                    // here we do not assemble surrogates
                    // since we know that LDH code points
                    // are in the ASCII range only
                    srcIsLDH = false;
                    failPos  = j;
                }
            }

            if (useSTD3ASCIIRules == true)
            {
                // verify 3a and 3b
                if (srcIsLDH == false || /* source contains some non-LDH characters */
                    processOut[0] == HYPHEN ||
                    processOut[processOut.Length - 1] == HYPHEN)
                {
                    /* populate the parseError struct */
                    if (srcIsLDH == false)
                    {
                        throw new StringPrepParseException("The input does not conform to the STD 3 ASCII rules",
                                                           StringPrepErrorType.STD3ASCIIRulesError,
                                                           processOut.ToString(),
                                                           (failPos > 0) ? (failPos - 1) : failPos);
                    }
                    else if (processOut[0] == HYPHEN)
                    {
                        throw new StringPrepParseException("The input does not conform to the STD 3 ASCII rules",
                                                           StringPrepErrorType.STD3ASCIIRulesError, processOut.ToString(), 0);
                    }
                    else
                    {
                        throw new StringPrepParseException("The input does not conform to the STD 3 ASCII rules",
                                                           StringPrepErrorType.STD3ASCIIRulesError,
                                                           processOut.ToString(),
                                                           (poLen > 0) ? poLen - 1 : poLen);
                    }
                }
            }
            if (srcIsASCII)
            {
                dest = processOut;
            }
            else
            {
                // step 5 : verify the sequence does not begin with ACE prefix
                if (!StartsWithPrefix(processOut))
                {
                    //step 6: encode the sequence with punycode
                    StringBuffer punyout = PunycodeReference.Encode(processOut, caseFlags);

                    // convert all codepoints to lower case ASCII
                    StringBuffer lowerOut = ToASCIILower(punyout);

                    //Step 7: prepend the ACE prefix
                    dest.Append(ACE_PREFIX, 0, ACE_PREFIX_LENGTH - 0); // ICU4N: Checked 3rd parameter
                                                                       //Step 6: copy the contents in b2 into dest
                    dest.Append(lowerOut);
                }
                else
                {
                    throw new StringPrepParseException("The input does not start with the ACE Prefix.",
                                                       StringPrepErrorType.AcePrefixError, processOut.ToString(), 0);
                }
            }
            if (dest.Length > MAX_LABEL_LENGTH)
            {
                throw new StringPrepParseException("The labels in the input are too long. Length > 64.",
                                                   StringPrepErrorType.LabelTooLongError, dest.ToString(), 0);
            }
            return(dest);
        }
예제 #14
0
        public static StringBuffer ConvertToUnicode(UCharacterIterator src, IDNA2003Options options)
        {
            bool[] caseFlags = null;

            // the source contains all ascii codepoints
            bool srcIsASCII = true;
            // assume the source contains all LDH codepoints
            //bool srcIsLDH = true;

            //get the options
            //bool useSTD3ASCIIRules = ((options & USE_STD3_RULES) != 0);

            //int failPos = -1;
            int ch;
            int saveIndex = src.Index;

            // step 1: find out if all the codepoints in src are ASCII
            while ((ch = src.Next()) != UCharacterIterator.DONE)
            {
                if (ch > 0x7F)
                {
                    srcIsASCII = false;
                }/*else if((srcIsLDH = isLDHChar(ch))==false){
                  * failPos = src.getIndex();
                  * }*/
            }
            StringBuffer processOut;

            if (srcIsASCII == false)
            {
                try
                {
                    // step 2: process the string
                    src.Index  = saveIndex;
                    processOut = namePrep.Prepare(src, (StringPrepOptions)options);
                }
                catch (StringPrepParseException ex)
                {
                    return(new StringBuffer(src.GetText()));
                }
            }
            else
            {
                //just point to source
                processOut = new StringBuffer(src.GetText());
            }
            // TODO:
            // The RFC states that
            // <quote>
            // ToUnicode never fails. If any step fails, then the original input
            // is returned immediately in that step.
            // </quote>

            //step 3: verify ACE Prefix
            if (StartsWithPrefix(processOut))
            {
                StringBuffer decodeOut = null;

                //step 4: Remove the ACE Prefix
                string temp = processOut.ToString(ACE_PREFIX.Length, processOut.Length - ACE_PREFIX.Length);

                //step 5: Decode using punycode
                try
                {
                    decodeOut = new StringBuffer(Punycode.Decode(temp, caseFlags).ToString());
                }
                catch (StringPrepParseException e)
                {
                    decodeOut = null;
                }

                //step 6:Apply toASCII
                if (decodeOut != null)
                {
                    StringBuffer toASCIIOut = ConvertToASCII(UCharacterIterator.GetInstance(decodeOut), options);

                    //step 7: verify
                    if (CompareCaseInsensitiveASCII(processOut, toASCIIOut) != 0)
                    {
                        //                    throw new StringPrepParseException("The verification step prescribed by the RFC 3491 failed",
                        //                                             StringPrepParseException.VERIFICATION_ERROR);
                        decodeOut = null;
                    }
                }

                //step 8: return output of step 5
                if (decodeOut != null)
                {
                    return(decodeOut);
                }
            }

            //        }else{
            //            // verify that STD3 ASCII rules are satisfied
            //            if(useSTD3ASCIIRules == true){
            //                if( srcIsLDH == false /* source contains some non-LDH characters */
            //                    || processOut.charAt(0) ==  HYPHEN
            //                    || processOut.charAt(processOut.Length-1) == HYPHEN){
            //
            //                    if(srcIsLDH==false){
            //                        throw new StringPrepParseException("The input does not conform to the STD 3 ASCII rules",
            //                                                 StringPrepParseException.STD3_ASCII_RULES_ERROR,processOut.toString(),
            //                                                 (failPos>0) ? (failPos-1) : failPos);
            //                    }else if(processOut.charAt(0) == HYPHEN){
            //                        throw new StringPrepParseException("The input does not conform to the STD 3 ASCII rules",
            //                                                 StringPrepParseException.STD3_ASCII_RULES_ERROR,
            //                                                 processOut.toString(),0);
            //
            //                    }else{
            //                        throw new StringPrepParseException("The input does not conform to the STD 3 ASCII rules",
            //                                                 StringPrepParseException.STD3_ASCII_RULES_ERROR,
            //                                                 processOut.toString(),
            //                                                 processOut.Length);
            //
            //                    }
            //                }
            //            }
            //            // just return the source
            //            return new StringBuffer(src.getText());
            //        }

            return(new StringBuffer(src.GetText()));
        }
예제 #15
0
        private void DoTestIDNToASCII(String src, String expected, IDNA2003Options options, Object expectedException)
        {
            if (!IDNAReference.IsReady)
            {
                Logln("Transliterator is not available on this environment.  Skipping doTestIDNToASCII.");
                return;
            }

            StringBuffer       inBuf  = new StringBuffer(src);
            UCharacterIterator inIter = UCharacterIterator.GetInstance(src);

            try
            {
                StringBuffer @out = IDNAReference.ConvertIDNToASCII(src, options);
                if (expected != null && @out != null && [email protected]().Equals(expected))
                {
                    Errln("convertToIDNAReferenceASCII did not return expected result with options : " + options +
                          " Expected: " + expected + " Got: " + @out);
                }
                if (expectedException != null && !unassignedException.Equals(expectedException))
                {
                    Errln("convertToIDNAReferenceASCII did not get the expected exception. The operation succeeded!");
                }
            }
            catch (StringPrepParseException ex)
            {
                if (expectedException == null || !ex.Equals(expectedException))
                {
                    Errln("convertToIDNAReferenceASCII did not get the expected exception for source: " + src + " Got:  " + ex.ToString());
                }
            }
            try
            {
                StringBuffer @out = IDNAReference.ConvertIDNtoASCII(inBuf, options);
                if (expected != null && @out != null && [email protected]().Equals(expected))
                {
                    Errln("convertToIDNAReferenceASCII did not return expected result with options : " + options +
                          " Expected: " + expected + " Got: " + @out);
                }
                if (expectedException != null && !unassignedException.Equals(expectedException))
                {
                    Errln("convertToIDNAReferenceSCII did not get the expected exception. The operation succeeded!");
                }
            }
            catch (StringPrepParseException ex)
            {
                if (expectedException == null || !ex.Equals(expectedException))
                {
                    Errln("convertToIDNAReferenceSCII did not get the expected exception for source: " + src + " Got:  " + ex.ToString());
                }
            }

            try
            {
                StringBuffer @out = IDNAReference.ConvertIDNtoASCII(inIter, options);
                if (expected != null && @out != null && [email protected]().Equals(expected))
                {
                    Errln("convertIDNToASCII did not return expected result with options : " + options +
                          " Expected: " + expected + " Got: " + @out);
                }

                if (expectedException != null && !unassignedException.Equals(expectedException))
                {
                    Errln("convertIDNToASCII did not get the expected exception. The operation succeeded!");
                }
            }
            catch (StringPrepParseException ex)
            {
                if (expectedException == null || !ex.Equals(expectedException))
                {
                    Errln("convertIDNToASCII did not get the expected exception for source: " + src + " Got:  " + ex.ToString());
                }
            }
        }