]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
<rdar://problem/16351701> Dial string is escaped twice by the parcent mark in IPPFAXOUT.
authormsweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>
Wed, 26 Mar 2014 21:15:32 +0000 (21:15 +0000)
committermsweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>
Wed, 26 Mar 2014 21:15:32 +0000 (21:15 +0000)
git-svn-id: svn+ssh://src.apple.com/svn/cups/cups.org/trunk@11743 a1ca3aef-8c08-0410-bb20-df032aa958be

backend/ipp.c

index fb4d9e6357fa2599446642d0d7ea2b7ebd410a04..ed4a5a0304f9e9219494868a768cca0524b5f6ce 100644 (file)
@@ -2893,14 +2893,51 @@ new_request(
       if ((keyword = cupsGetOption("phone", num_options, options)) != NULL)
       {
        ipp_t   *destination;           /* destination collection */
-       char    tel_uri[1024];          /* tel: URI */
+       char    phone[1024],            /* Phone number string */
+               ch,                     /* Character from phone string */
+               *ptr,                   /* Pointer into string */
+               tel_uri[1024];          /* tel: URI */
+        static const char * const allowed = "0123456789#*-+.()";
+                                       /* Allowed characters */
 
         destination = ippNew();
 
-        httpAssembleURI(HTTP_URI_CODING_ALL, tel_uri, sizeof(tel_uri), "tel",
-                        NULL, NULL, 0, keyword);
-        ippAddString(destination, IPP_TAG_JOB, IPP_TAG_URI, "destination-uri",
-                     NULL, tel_uri);
+       /*
+        * Unescape and filter out spaces and other characters that are not
+        * allowed in a tel: URI.
+        */
+
+        for (ptr = phone; *keyword && ptr < (phone + sizeof(phone) - 1);)
+        {
+          ch = *keyword++;
+          if (ch == '%')
+          {
+            if (*keyword >= '0' && *keyword <= '9')
+              ch = (*keyword++ - '0') << 4;
+            else if (*keyword >= 'a' && *keyword <= 'f')
+              ch = (*keyword++ - 'a' + 10) << 4;
+            else if (*keyword >= 'A' && *keyword <= 'F')
+              ch = (*keyword++ - 'A' + 10) << 4;
+            else
+              continue;
+
+            if (*keyword >= '0' && *keyword <= '9')
+              ch += *keyword++ - '0';
+            else if (*keyword >= 'a' && *keyword <= 'f')
+              ch += *keyword++ - 'a' + 10;
+            else if (*keyword >= 'A' && *keyword <= 'F')
+              ch += *keyword++ - 'A' + 10;
+            else
+              continue;
+          }
+
+          if (strchr(allowed, ch))
+            *ptr++ = ch;
+        }
+
+        *ptr = '\0';
+        httpAssembleURI(HTTP_URI_CODING_ALL, tel_uri, sizeof(tel_uri), "tel", NULL, NULL, 0, phone);
+        ippAddString(destination, IPP_TAG_JOB, IPP_TAG_URI, "destination-uri", NULL, tel_uri);
 
        if ((keyword = cupsGetOption("faxPrefix", num_options,
                                     options)) != NULL && *keyword)