Hi,

I believe the problem is in the functions static void
get_x_kannel_from_xml in smsbox.c
around the line 804 (source code kannel 1.4.3)

        get_tag(tmp, octstr_imm("dlr-url"), dlr_url, 0, 0);
        O_DESTROY(tmp);

I think that that the same strategy adopted for the tag <ud> could be
used also for the dlr-url tag assuming that this will be uri-encoded.


Oscar



On Sun, Feb 21, 2010 at 6:35 PM, Nikos Balkanas <[email protected]> wrote:
> Sure. Start by checking the get_tag function in smsbox.c. Verify with
> debugger, since it is only my guess looking at the code.
>
> BR,
> Nikos
> ----- Original Message ----- From: "oscar cassetti"
> <[email protected]>
> To: "Nikos Balkanas" <[email protected]>
> Sent: Sunday, February 21, 2010 10:38 AM
> Subject: Re: XML Post and dlr-url
>
>
> Yes, I can use a workaround by passing only one parameter to GET query
> and use a internal separator within the string to actually separate
> the different parts.
>
> If you can point me where the problem is  (like function or source
> file) I could I have a look myself.
>
> Oscar
>
> On Sun, Feb 21, 2010 at 2:26 AM, Nikos Balkanas <[email protected]> wrote:
>>
>> OK. Looks like a bug. I'll take a look at it when I get some time. In the
>> meantime can you live with the illegal XML?
>>
>> Nikos
>> ----- Original Message ----- From: "oscar cassetti"
>> <[email protected]>
>> To: "Nikos Balkanas" <[email protected]>
>> Cc: <[email protected]>
>> Sent: Saturday, February 20, 2010 2:18 PM
>> Subject: Re: XML Post and dlr-url
>>
>>
>> But that's what I did in the second test. I didn't URL-escape
>> anything, I just let the Perl XML writer escape & with &amp; which is
>> the right thing to do.
>> However when kannel parses the <dlr-url> it doesn't un-escape the &amp; to
>> &.
>> As a result the query URL used by kannel looks like this one below
>>
>>
>> 2010-02-19 21:11:44 [1381] [9] DEBUG: Parsing URL
>>
>> `http://localhost/dump_me.php?send_history_id=13853220&amp;to_number=000000000000&amp;type=8':
>>
>> which produces on my entry point this
>>
>> GET =
>> Array
>> (
>> [send_history_id] => 13853220
>> [amp;to_number] => 000000000000
>> [amp;type] => 8
>> )
>>
>> Note the amp;to_number for example. If the dlr-url was escaped
>> properly this one should have just been to_number .
>>
>> Finally in third and last test I produced an illegal XML by not
>> escaping the & and it worked:
>>
>>
>> 2010-02-19 21:28:18 [1381] [9] DEBUG: Parsing URL
>>
>> `http://localhost/dump_me.php?send_history_id=13853221&to_number=3538706323
>> 46&type=8':
>>
>> and on my entry point
>> GET =
>> Array
>> (
>> [send_history_id] => 13853221
>> [to_number] => 000000000000
>> [type] => 8
>> )
>>
>>
>> The issue is that I need to use an invalid XML to produced the right
>> result. The problem is related to non un-escaping the <dlr-url>
>> element.
>>
>> Oscar
>>
>> On Sat, Feb 20, 2010 at 2:09 AM, Nikos Balkanas <[email protected]>
>> wrote:
>>>
>>> So, in XML POST you shouldn't urlencode anything. And it will work.
>>> What's
>>> your issue then?
>>>
>>> Nikos
>>> ----- Original Message ----- From: "oscar cassetti"
>>> <[email protected]>
>>> To: <[email protected]>
>>> Sent: Saturday, February 20, 2010 12:36 AM
>>> Subject: Re: XML Post and dlr-url
>>>
>>>
>>> Hi,
>>>
>>> I tried few things and I believe I found a bug in the way the
>>> <dlr-url> is parsed.
>>> (1)
>>> First of all I tried to URI-escape the entire dlr-url and it didn't work.
>>> Basically I passed this:
>>>
>>>
>>> <dlr-url>http%3A%2F%2Flocalhost%2Fdump_me.php%3Fsend_history_id%3D13853219%26to_number%3D000000000000%26t
>>> ype%3D%25d</dlr-url>
>>>
>>> And the same appears in the logs
>>>
>>> 2010-02-19 21:03:32 [1318] [3] DEBUG: XMLParsing: tag <dlr-url> value
>>> <http%3A%2F%2Flocalhost%2Fdump_me.php%3Fsend_history_id
>>>
>>> When Kannel is going to parse the url it rejects it:
>>>
>>> 2010-02-19 21:03:32 [1318] [3] DEBUG: Status: 400 Answer: <DLR-URL
>>> field misformed, rejected>
>>>
>>> In this case the message was not sent.
>>> (2)
>>> In a second test I didn't escape URI-escape. I let the Perl XML Writer
>>> to escape the content of <dlr-url> .
>>> In this case & is substituted by &amp; This can also be seen in smsbox
>>> logs.
>>>
>>> 2010-02-19 21:11:43 [1381] [3] DEBUG: XMLParsing: tag <dlr-url> value
>>>
>>>
>>> <http://localhost/dump_me.php?send_history_id=13853220&amp;to_number=000000000000&amp;type=%d>
>>>
>>> However when kannel parses the URL the &amp; is not changed back to & .
>>> So the result is the following URL is used.
>>>
>>> 2010-02-19 21:11:44 [1381] [9] DEBUG: Parsing URL
>>>
>>>
>>> `http://localhost/dump_me.php?send_history_id=13853220&amp;to_number=000000000000&amp;type=8':
>>>
>>> I wrote a simple script to catch the content of the GET when kannel
>>> query the <dlr-url> and the result is
>>>
>>> GET =
>>> Array
>>> (
>>> [send_history_id] => 13853220
>>> [amp;to_number] => 000000000000
>>> [amp;type] => 8
>>> )
>>>
>>> (3)
>>> Finally I tried to overwrite the <dlr-ulr> so I substituted &amp; with &
>>> so the request looks like this one below:
>>>
>>> <?xml version="1.0" encoding="UTF-8"?>
>>>
>>>
>>> <message><submit><da><number>000000000000</number></da><oa><number>000000000000</number></oa><ud>%E2%82%ACee</ud><statusrequest><dlr-mask>31</dlr-mask><dlr-url>http://localhost/dump_me.php?send_history_id=13853221&to_number=000000000000&type=%d</dlr-url></statusrequest><!--
>>> request from application to Kannel
>>>
>>>
>>> --><from><username>xxxxxxx</username><password>xxxxxxx</password></from></submit></message>
>>>
>>> Note that this XML is technically wrong. However this produces the
>>> right result as ti can be seen from the logs:
>>>
>>> 2010-02-19 21:28:17 [1381] [3] DEBUG: XMLParsing: tag <dlr-url> value
>>>
>>>
>>> <http://localhost/dump_me.php?send_history_id=13853221&to_number=000000000000&type=%d>
>>>
>>> 2010-02-19 21:28:18 [1381] [9] DEBUG: Parsing URL
>>>
>>>
>>> `http://localhost/dump_me.php?send_history_id=13853221&to_number=3538706323
>>> 46&type=8':
>>> 2010-02-19 21:28:18 [1381] [9] DEBUG: Scheme: http://
>>> 2010-02-19 21:28:18 [1381] [9] DEBUG: Host: localhost
>>> 2010-02-19 21:28:18 [1381] [9] DEBUG: Port: 80
>>> 2010-02-19 21:28:18 [1381] [9] DEBUG: Username: (null)
>>> 2010-02-19 21:28:18 [1381] [9] DEBUG: Password: (null)
>>> 2010-02-19 21:28:18 [1381] [9] DEBUG: Path: /dump_me.php
>>> 2010-02-19 21:28:18 [1381] [9] DEBUG: Query:
>>> send_history_id=13853221&to_number=353870632346&type=8
>>> 2010-02-19 21:28:18 [1381] [9] DEBUG: Fragment: (null)
>>>
>>> And also from my entry point I was able to get the three parameters
>>> correctly
>>>
>>> GET =
>>> Array
>>> (
>>> [send_history_id] => 13853221
>>> [to_number] => 000000000000
>>> [type] => 8
>>> )
>>>
>>> In summary I believe that an incorrect XML produces the right result.
>>> The problem looks to me e that the <dlr-ulr> is not escaped correctly.
>>>
>>> Here some details
>>> Kannel smsbox version 1.4.3
>>> xml2-config --version 2.6.32
>>>
>>> Any suggestion?
>>>
>>> Thank you,
>>> Oscar
>>>
>>> On Thu, Feb 18, 2010 at 3:09 PM, Nikos Balkanas <[email protected]>
>>> wrote:
>>>>
>>>> Well, urlencoding is not right, still. In your URL ytou need to encode
>>>> /,
>>>> &
>>>> and ?. Don't need to encode = or 8. But I think you want to encode
>>>> &type=%d.
>>>> That should be %26type=%%d
>>>>
>>>> So is this working or not? What do you mean by 3 parmaters, not 2? This
>>>> is
>>>> the dlr-url you send in your XML.
>>>>
>>>> BR,
>>>> Nikos
>>>>
>>>
>>>
>>
>>
>
>

Reply via email to