[Users] The usrloc table, Oracle, and Asterisk

Juan Carlos Castro y Castro jcastro at instant.com.br
Fri Dec 15 18:17:01 CET 2006


I gave up and let Oracle deal with the "if". Alas, it doesn't have a 
neat IIF(cond,expr1,expr2) function. Instead, I had to use the unholy 
monstrosity below. But it works. Now let me see if at least I can refine 
it so there isn't "3600" written all over the place.

avp_db_query("UPDATE sip_conf SET ipaddr='$si', port='$sp', 
regseconds=$Ts+decode(($hdr(expires)-3600)-abs($hdr(expires)-3600), 0, 
3600, $hdr(expires)), useragent='$ua' WHERE name='$au'");

FUGLY, ain't it?

Bogdan-Andrei Iancu escreveu:
> Hi,
>
> you cannot catch the reply from REGISTER as it is statelessly sent by 
> the save() function. Also you cannot use avps in reply_route because 
> of lack of synchronization - this route is not locked when executed, 
> and it can be processed in parallel for multiple received replies.
>
> regards,
> bogdan
>
> Juan Carlos Castro y Castro wrote:
>
>> Argh. I can't use avp_db_query from inside an on_reply_route. What do 
>> I do?
>>
>> Dec 15 10:55:32 vntst2 openser: parse error (109,18-19): Command 
>> cannot be used in the block
>>
>> Juan Carlos Castro y Castro escreveu:
>>
>>> Any way I could catch the final OK message instead of the REGISTER 
>>> message? Right now, I'm using the code below. Now I see that's not 
>>> good because I get the Expires from the client which may be higher 
>>> than the real Expires.
>>>
>>>        if( method=="REGISTER" ) {
>>>                if (!www_authorize("myrealm", "sip_conf")) {
>>>                        www_challenge("myrealm", "0");
>>>                        exit;
>>>                };
>>>
>>>                save("location");
>>>                avp_db_query("UPDATE sipfriends SET ipaddr='$si', 
>>> port='$sp', regseconds=$Ts+$hdr(expires), useragent='$ua' WHERE 
>>> name='$au'");
>>>                exit;
>>>        };
>>>
>>>
>>> Bogdan-Andrei Iancu escreveu:
>>>
>>>> Hi Jerome,
>>>>
>>>> you are right - a server may change the expire advertised by the 
>>>> client. If it is the case or not, it's a matter of configuration in 
>>>> OpenSER - see the min_expires and max_expires in the registrar module.
>>>>    http://www.openser.org/docs/modules/1.2.x/registrar.html
>>>>
>>>> if this params are not set, there is no risk of using the value 
>>>> advertised by the client.
>>>>
>>>> regards,
>>>> bogdan
>>>>
>>>> Jerome Martin wrote:
>>>>
>>>>> On Thu, 2006-12-14 at 17:32 -0200, Juan Carlos Castro y Castro wrote:
>>>>>  
>>>>>
>>>>>> Forget I said that! There's $Ts + $hdr("Expires")! That'll teach 
>>>>>> me to always RTFA before answering!
>>>>>>   
>>>>>
>>>>>
>>>>> Well, you need to be carefull about $hdr("Expires"). This is NOT the
>>>>> only way a UA can specify an expiration delay for a REGISTER request.
>>>>>
>>>>> If you take a look at the relevant parts of rfc3261
>>>>> ( http://www.ietf.org/rfc/rfc3261.txt ), you'll see that using an
>>>>> Expires header is only one way of specifying a desired expired 
>>>>> duration
>>>>> for the REGISTER. The other way is by using a Contact header 
>>>>> parameter
>>>>> (page 60 of the rfc) :
>>>>>
>>>>>  
>>>>>
>>>>>> 10.2.1.1 Setting the Expiration Interval of Contact Addresses
>>>>>>
>>>>>>   When a client sends a REGISTER request, it MAY suggest an 
>>>>>> expiration
>>>>>>   interval that indicates how long the client would like the
>>>>>>   registration to be valid.  (As described in Section 10.3, the
>>>>>>   registrar selects the actual time interval based on its local
>>>>>>   policy.)
>>>>>>
>>>>>>   There are two ways in which a client can suggest an expiration
>>>>>>   interval for a binding: through an Expires header field or an
>>>>>>   "expires" Contact header parameter.  The latter allows expiration
>>>>>>   intervals to be suggested on a per-binding basis when more than 
>>>>>> one
>>>>>>   binding is given in a single REGISTER request, whereas the former
>>>>>>   suggests an expiration interval for all Contact header field 
>>>>>> values
>>>>>>   that do not contain the "expires" parameter.
>>>>>>   
>>>>>
>>>>>
>>>>> Also note that the expire parameter to a Contact header is totally 
>>>>> case-unsensitive ( page 32 of the RFC) :
>>>>>
>>>>>
>>>>>  
>>>>>
>>>>>>   When comparing header fields, field names are always case-
>>>>>>   insensitive.  Unless otherwise stated in the definition of a
>>>>>>   particular header field, field values, parameter names, and 
>>>>>> parameter
>>>>>>   values are case-insensitive.  Tokens are always case-insensitive.
>>>>>>   Unless specified otherwise, values expressed as quoted strings are
>>>>>>   case-sensitive.  For example,
>>>>>>
>>>>>>      Contact: <sip:alice at atlanta.com>;expires=3600
>>>>>>
>>>>>>   is equivalent to
>>>>>>
>>>>>>      CONTACT: <sip:alice at atlanta.com>;ExPiReS=3600
>>>>>>   
>>>>>
>>>>>
>>>>> A good example of a very popular SIP UA always using the Contact 
>>>>> header parameter method is the Linksys PAP2 ATA. On the other 
>>>>> hand, there are also
>>>>> many popular ATAs that use the Expires header method, i.e. 
>>>>> Audiocodes MP1XX ATAs. So unless you're in a very controlled 
>>>>> environment and you don't
>>>>> care at all to be generic and RFC3261-compliant, you must support 
>>>>> both. But
>>>>> be carefull, in my experience this almost always bites you back 
>>>>> one day or the other.
>>>>>
>>>>> Hope this helps,
>>>>> Best Regards,
>>>>>
>>>>> Jérôme Martin
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>  
>>>>>
>>>>
>>>>
>>>
>>>
>>> _______________________________________________
>>> Users mailing list
>>> Users at openser.org
>>> http://openser.org/cgi-bin/mailman/listinfo/users
>>>
>>
>>
>
>





More information about the sr-users mailing list