<div style="DIRECTION: ltr">
<div>Hello every one,</div>
<div>I change modules/auth_db/authorize.c to check pre-payed user's mount.It works,But&nbsp;I Get Memory leak.</div>
<div>I check the source many times,but I can't find the ploblem.</div>
<div>Can anyone else help me.</div>
<div>The following is my authorize,c file</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>##########################################################</div>
<div>
<p>#include &lt;string.h&gt;<br>#include &lt;stdlib.h&gt;<br>#include &quot;../../ut.h&quot;<br>#include &quot;../../str.h&quot;<br>#include &quot;../../db/db.h&quot;<br>#include &quot;../../dprint.h&quot;<br>#include &quot;../../parser/digest/digest.h&quot; 
<br>#include &quot;../../parser/parse_from.h&quot;<br>#include &quot;../../parser/parse_uri.h&quot;<br>#include &quot;../../parser/hf.h&quot;<br>#include &quot;../../parser/parser_f.h&quot;<br>#include &quot;../../usr_avp.h&quot; 
<br>#include &quot;../../mem/mem.h&quot;<br>#include &quot;authdb_mod.h&quot;<br>#include &quot;rfc2617.h&quot;</p>
<p><br>#define MESSAGE_500 &quot;Server Internal Error&quot;<br>#define MOUNT_COL &quot;Amount&quot;<br>#define MOUNT_COL_LEN (sizeof(MOUNT_COL)-1)<br>#define STATUS_COL &quot;Status&quot;<br>#define STATUS_COL_LEN (sizeof(STATUS_COL)-1) 
<br>#define ACCT_CODE_COL &quot;ACCT_CODE&quot;<br>#define ACCT_CODE_COL_LEN (sizeof(ACCT_CODE_COL)-1)<br>#define AGENT_CODE &quot;Agent_Code&quot;<br>#define AGENT_CODE_LEN (sizeof(AGENT_CODE)-1)<br>#define ROOT_AGENT &quot;Agent_Code_Root&quot; 
<br>#define ROOT_AGENT_LEN (sizeof(ROOT_AGENT)-1)<br>#define CARDNO &quot;Card_No&quot;<br>#define CARDNOLEN (sizeof(CARDNO)-1)<br>#define DOMAIN &quot;domain&quot;<br>#define DOMAINLEN (sizeof(DOMAIN)-1)<br>#define LOCALDOMAIN &quot; 
<a onclick="return top.js.OpenExtLink(window,event,this)" href="http://xtox.org/" target="_blank">xtox.org</a>&quot;</p>
<p>static db_con_t* db_handle=0; /* database connection handle */<br>static db_func_t&nbsp; auth_dbf;</p>
<p>/************************************************************<br>&nbsp; get user agent a mount from CASH_ACCT_INTO table</p>
<p>&nbsp; select Amount,Status from CASH_ACCT_INFO where acct_code = '10agent';<br>&nbsp; select Amount,Status from CASH_ACCT_INFO where acct_code_root = '10agentroor' </p>
<p>&nbsp;**********************************************************/</p>
<p>static inline int getagentmount(str agent)<br>{<br>&nbsp;db_key_t key[1];<br>&nbsp;db_val_t val[1];<br>&nbsp;db_key_t* col;<br>&nbsp;db_res_t* res;</p>
<p>&nbsp;double mount=0.0;<br>&nbsp;int status=3;<br>&nbsp;int n,nc;</p>
<p><br>&nbsp;str acct_code = {ACCT_CODE_COL,ACCT_CODE_COL_LEN}; //CASH_ACCT_INFO.ACCT_CODE<br>&nbsp;str mount_col = {MOUNT_COL,MOUNT_COL_LEN};//CASH_ACCT_INFO.Amount<br>&nbsp;str status_col = {STATUS_COL,STATUS_COL_LEN};//CASH_ACCT_INFO.Status 
<br>&nbsp;col = pkg_malloc(sizeof(*col)*2);<br>&nbsp;if(col == NULL)<br>&nbsp;{<br>&nbsp;&nbsp;return -1;<br>&nbsp;}<br>&nbsp;col[0] = mount_col.s;<br>&nbsp;col[1] = status_col.s;</p>
<p>&nbsp;key[0] = acct_code.s;</p>
<p>&nbsp;char agentcode[2000];<br>&nbsp;bzero(agentcode,sizeof(agentcode));<br>&nbsp;strcpy(agentcode,&quot;1000&quot;);<br>&nbsp;strncat(agentcode,agent.s,agent.len);</p>
<p>&nbsp;VAL_TYPE(val) = DB_STR;<br>&nbsp;VAL_NULL(val) = 0;<br>&nbsp;VAL_STR(val).s = (char*)agentcode;<br>&nbsp;VAL_STR(val).len = strlen(agentcode);<br>&nbsp;n=1;<br>&nbsp;nc=2;<br>&nbsp;if (auth_dbf.use_table(db_handle, &quot;CASH_ACCT_INFO&quot;) &lt; 0) { 
<br>&nbsp;&nbsp;pkg_free(col);<br>&nbsp;&nbsp;return -1;<br>&nbsp;}<br>&nbsp;if (auth_dbf.query(db_handle, key, 0, val, col, n, nc, 0, &amp;res) &lt; 0) {<br>&nbsp;&nbsp;pkg_free(col);<br>&nbsp;&nbsp;auth_dbf.free_result(db_handle,res);<br>&nbsp;&nbsp;return -1;<br>&nbsp;}<br>&nbsp;if ((RES_ROW_N(res) == 0)) { 
<br>&nbsp;&nbsp;pkg_free(col);<br>&nbsp;&nbsp;auth_dbf.free_result(db_handle,res);<br>&nbsp;&nbsp;return 1;<br>&nbsp;}<br>&nbsp;pkg_free(col);<br>&nbsp;mount = ROW_VALUES(RES_ROWS(res))[0].val.double_val;<br>&nbsp;status = ROW_VALUES(RES_ROWS(res))[1].val.int_val;</p>
<p><br>&nbsp;if((mount &gt; 1)&amp;&amp;(status&gt;0))<br>&nbsp;{<br>&nbsp;&nbsp;auth_dbf.free_result(db_handle,res);<br>&nbsp;&nbsp;return 2;&nbsp;<br>&nbsp;}<br>&nbsp;auth_dbf.free_result(db_handle,res);<br>&nbsp;return 0;<br>}</p>
<p><br>/*************************************************************<br>&nbsp; get username from tblDOMAIN_ACCT<br>&nbsp; Function name:getusername<br>Parameters: <br>str domain[in];<br>char* acct[in/out]:if get acct ,stored in this field 
<br>Return Value:<br>if find domain from tblDOMAIN_ACCT AND GetAccount return 1;<br>if find no acct return 0;<br>IF SOME ERROR OCCORS RETURN -1;</p>
<p><br>&nbsp;***********************************************************/</p>
<p>static inline int getusername(char* domain,char* acct)<br>{<br>&nbsp;db_key_t key[1];<br>&nbsp;db_val_t val[1];<br>&nbsp;db_key_t *col;<br>&nbsp;db_res_t *res;</p>
<p>&nbsp;str cardnocol = {CARDNO,CARDNOLEN};<br>&nbsp;str domaincol = {DOMAIN,DOMAINLEN};<br>&nbsp;col = pkg_malloc(sizeof(*col) * 1);//only one column (Card_No) to select from tblDOMAIN_ACCT<br>&nbsp;if(col == NULL)<br>&nbsp;{<br>&nbsp;&nbsp;return -1;<br>
&nbsp;}<br>&nbsp;col[0] = cardnocol.s;<br>&nbsp;key[0] = domaincol.s;<br>&nbsp;VAL_TYPE(val) = DB_STR;<br>&nbsp;VAL_NULL(val) = 0;<br>&nbsp;VAL_STR(val).s = domain;<br>&nbsp;VAL_STR(val).len = strlen(domain);</p>
<p>&nbsp;if (auth_dbf.use_table(db_handle, &quot;tblDOMAIN_ACCT&quot;) &lt; 0) {<br>&nbsp;&nbsp;pkg_free(col);<br>&nbsp;&nbsp;return -1;<br>&nbsp;}<br>&nbsp;if (auth_dbf.query(db_handle, key, 0, val, col, 1, 1, 0, &amp;res) &lt; 0) {<br>&nbsp;&nbsp;pkg_free(col);<br>
&nbsp;&nbsp;return -1;<br>&nbsp;}<br>&nbsp;if ((RES_ROW_N(res) == 0)) {<br>&nbsp;&nbsp;pkg_free(col);<br>&nbsp;&nbsp;auth_dbf.free_result(db_handle,res);<br>&nbsp;&nbsp;return 0;<br>&nbsp;}<br>&nbsp;pkg_free(col);</p>
<p>&nbsp;strcpy(acct,(char*)ROW_VALUES(RES_ROWS(res))[0].val.string_val);<br>&nbsp;auth_dbf.free_result(db_handle,res);<br>&nbsp;return 1;<br>}</p>
<p>&nbsp;</p>
<p>/**************************************************************<br>&nbsp; get user amount from CASH_ACCT_INFO table<br>&nbsp; it's sql is<br>&nbsp; select amount,status,Agent_Code,Agent_Code_Root from CASH_ACCT_INFO where acct_code = '20user' 
<br>&nbsp;************************************************************/<br>static inline int getmount(/*str username*/char* username,char* agent,char* agentroot)<br>{<br>&nbsp;db_key_t key[1];<br>&nbsp;db_val_t val[1];<br>&nbsp;db_key_t* col; 
<br>&nbsp;db_res_t* res;</p>
<p>&nbsp;double mount;<br>&nbsp;int n,nc;<br>&nbsp;int status;</p>
<p>&nbsp;str mount_col = {MOUNT_COL,MOUNT_COL_LEN};//CASH_ACCT_INFO.AMOUNT<br>&nbsp;str status_col = {STATUS_COL,STATUS_COL_LEN};//CASH_ACCT_INFO.Status<br>&nbsp;str acct_code = {ACCT_CODE_COL,ACCT_CODE_COL_LEN}; //CASH_ACCT_INFO.ACCT_CODE 
<br>&nbsp;str agent_code = {AGENT_CODE,AGENT_CODE_LEN};//CASH_ACCT_INFO.Agent_Code<br>&nbsp;str root_agent = {ROOT_AGENT,ROOT_AGENT_LEN};//CASH_ACCT_INFO.Agent_Code_Root</p>
<p>&nbsp;col = pkg_malloc(sizeof(*col) * 4 );//4 column to select Amout,Status,Agent_Code,Agent_Code_Root<br>&nbsp;if (col == NULL) {<br>&nbsp;&nbsp;LOG(L_ERR, &quot;getmount: Error while allocating memory\n&quot;);<br>&nbsp;&nbsp;return -1;<br>&nbsp;}<br>
&nbsp;col[0] = mount_col.s;<br>&nbsp;col[1] = status_col.s;<br>&nbsp;col[2] = agent_code.s;<br>&nbsp;col[3] = root_agent.s;</p>
<p>&nbsp;key[0] = acct_code.s;</p>
<p>&nbsp;char user[2500];<br>&nbsp;bzero(user,sizeof(user));<br>&nbsp;strcpy(user,&quot;2000&quot;);<br>&nbsp;strcat(user,username);<br>&nbsp;VAL_TYPE(val) = DB_STR;<br>&nbsp;VAL_NULL(val) = 0;<br>&nbsp;VAL_STR(val).s = (char*)user;<br>&nbsp;VAL_STR(val).len = strlen(user); 
<br>&nbsp;n = 1;<br>&nbsp;//nc = credentials_n + 1;<br>&nbsp;nc = 4;<br>&nbsp;if (auth_dbf.use_table(db_handle, &quot;CASH_ACCT_INFO&quot;) &lt; 0) {<br>&nbsp;&nbsp;pkg_free(col);<br>&nbsp;&nbsp;return -1;<br>&nbsp;}<br>&nbsp;if (auth_dbf.query(db_handle, key, 0, val, col, n, nc, 0, &amp;res) &lt; 0) { 
<br>&nbsp;&nbsp;pkg_free(col);<br>&nbsp;&nbsp;return -1;<br>&nbsp;}<br>&nbsp;if ((RES_ROW_N(res) == 0)) {<br>&nbsp;&nbsp;pkg_free(col);<br>&nbsp;&nbsp;auth_dbf.free_result(db_handle,res);<br>&nbsp;&nbsp;return 1;<br>&nbsp;}</p>
<p>&nbsp;pkg_free(col);<br>&nbsp;mount = ROW_VALUES(RES_ROWS(res))[0].val.double_val;<br>&nbsp;status = ROW_VALUES(RES_ROWS(res))[1].val.int_val;</p>
<p>&nbsp;if((mount &gt; 1)&amp;&amp;(status&gt;0))<br>&nbsp;{&nbsp;<br>&nbsp;&nbsp;str agent1,agentroot1;<br>&nbsp;&nbsp;agent1.s = (char*)ROW_VALUES(RES_ROWS(res))[2].val.string_val;<br>&nbsp;&nbsp;agent1.len = strlen(agent1.s);<br>&nbsp;&nbsp;agentroot1.s = (char*)ROW_VALUES(RES_ROWS(res))[3].val.string_val; 
<br>&nbsp;&nbsp;agentroot1.len = strlen(agentroot1.s);<br>&nbsp;&nbsp;strncpy(agent,agent1.s,agent1.len);<br>&nbsp;&nbsp;strncpy(agentroot,agentroot1.s,agentroot1.len);<br>&nbsp;&nbsp;auth_dbf.free_result(db_handle,res);<br>&nbsp;&nbsp;return 2;<br>&nbsp;}&nbsp;&nbsp;<br>&nbsp;else<br>&nbsp;{<br>
&nbsp;&nbsp;auth_dbf.free_result(db_handle,res);<br>&nbsp;&nbsp;return 0;<br>&nbsp;}<br>}</p>
<p><br>/*<br>&nbsp;* Calculate the response and compare with the given response string<br>&nbsp;* Authorization is successful if this two strings are same<br>&nbsp;*/<br>static inline int check_response(dig_cred_t* _cred, str* _method, char* _ha1) 
<br>{<br>&nbsp;HASHHEX resp, hent;</p>
<p>&nbsp;/*<br>&nbsp; * First, we have to verify that the response received has<br>&nbsp; * the same length as responses created by us<br>&nbsp; */<br>&nbsp;if (_cred-&gt;response.len != 32) {<br>&nbsp;&nbsp;DBG(&quot;check_response(): Receive response len != 32\n&quot;); 
<br>&nbsp;&nbsp;return 1;<br>&nbsp;}</p>
<p>&nbsp;/*<br>&nbsp; * Now, calculate our response from parameters received<br>&nbsp; * from the user agent<br>&nbsp; */<br>&nbsp;calc_response(_ha1, &amp;(_cred-&gt;nonce), <br>&nbsp;&nbsp;&nbsp;&amp;(_cred-&gt;nc), &amp;(_cred-&gt;cnonce), <br>&nbsp;&nbsp;&nbsp;&amp;(_cred-&gt; 
qop.qop_str), _cred-&gt;qop.qop_parsed == QOP_AUTHINT,<br>&nbsp;&nbsp;&nbsp;_method, &amp;(_cred-&gt;uri), hent, resp);</p>
<p>&nbsp;DBG(&quot;check_response(): Our result = \'%s\'\n&quot;, resp);</p>
<p>&nbsp;/*<br>&nbsp; * And simply compare the strings, the user is<br>&nbsp; * authorized if they match<br>&nbsp; */<br>&nbsp;if (!memcmp(resp, _cred-&gt;response.s, 32)) {<br>&nbsp;&nbsp;DBG(&quot;check_response(): Authorization is OK\n&quot;);<br>&nbsp;&nbsp;return 0; 
<br>&nbsp;} else {<br>&nbsp;&nbsp;DBG(&quot;check_response(): Authorization failed\n&quot;);<br>&nbsp;&nbsp;return 2;<br>&nbsp;}<br>}</p>
<p><br>/*<br>&nbsp;* Authorize digest credentials<br>&nbsp;*/<br>static inline int authorize(struct sip_msg* _m, str* _realm, char* _table, int _hftype)<br>{<br>&nbsp;char ha1[256];<br>&nbsp;int res, i;<br>&nbsp;struct hdr_field* h;<br>&nbsp;auth_body_t* cred; 
<br>&nbsp;auth_result_t ret;<br>&nbsp;str domain, value;<br>&nbsp;int_str iname, ivalue;<br>&nbsp;db_res_t* result;<br>&nbsp;str rpid;<br>&nbsp;domain = *_realm;</p>
<p>&nbsp;</p>
<p>&nbsp;ret = pre_auth_func(_m, &amp;domain, _hftype, &amp;h);</p>
<p>&nbsp;switch(ret) {<br>&nbsp;&nbsp;case ERROR:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>&nbsp;&nbsp;case NOT_AUTHORIZED:&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;case DO_AUTHORIZATION: break;<br>&nbsp;&nbsp;case AUTHORIZED:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1;<br>&nbsp;}<br>&nbsp;str furi;<br>&nbsp;struct sip_uri puri;<br>&nbsp;if(parse_from_header(_m)&lt;0) 
<br>&nbsp;{<br>&nbsp;&nbsp;return -1;<br>&nbsp;}<br>&nbsp;furi = get_from(_m)-&gt;uri;<br>&nbsp;if(parse_uri(furi.s,furi.len,&amp;puri) &lt; 0)<br>&nbsp;{<br>&nbsp;&nbsp;return -1;<br>&nbsp;}</p>
<p>&nbsp;char msgdomain[2055];<br>&nbsp;bzero(msgdomain,sizeof(msgdomain));<br>&nbsp;strncpy(msgdomain,puri.host.s,puri.host.len);<br>&nbsp;int m,len;<br>&nbsp;int p=0;<br>&nbsp;len=strlen(msgdomain);<br>&nbsp;for(m=0;m&lt;len;m++)<br>&nbsp;{<br>&nbsp;&nbsp;if(msgdomain[m]!='@') 
<br>&nbsp;&nbsp;&nbsp;msgdomain[p++]=msgdomain[m];<br>&nbsp;}<br>&nbsp;msgdomain[p]='\0';</p>
<p>&nbsp;cred = (auth_body_t*)h-&gt;parsed;<br>&nbsp;char acct[2000];<br>&nbsp;bzero(acct,sizeof(acct));<br>&nbsp;struct username* tmp = &amp;cred-&gt;digest.username;<br>&nbsp;if(strncmp(msgdomain,domain.s,strlen(msgdomain)))//domain is not&nbsp; local domain 
<br>&nbsp;{<br>&nbsp;&nbsp;if((res = getusername(msgdomain,acct)) == 1)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;tmp-&gt;user.s = (char*)acct;<br>&nbsp;&nbsp;&nbsp;tmp-&gt;user.len = strlen(acct);<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;return -1;<br>&nbsp;&nbsp;}<br>&nbsp;}<br>&nbsp;else<br>&nbsp;{<br>&nbsp;&nbsp;strncpy(acct,tmp-&gt; 
user.s,tmp-&gt;user.len);<br>&nbsp;}</p>
<p><br>&nbsp;res = get_ha1(tmp, &amp;domain, _table, ha1, &amp;result);<br>&nbsp;//res = get_ha1(&amp;cred-&gt;digest.username, &amp;domain, _table, ha1, &amp;result);<br>&nbsp;if (res &lt; 0) {<br>&nbsp;&nbsp;/* Error while accessing the database */ 
<br>&nbsp;&nbsp;if (sl_reply(_m, (char*)500, MESSAGE_500) == -1) {<br>&nbsp;&nbsp;&nbsp;LOG(L_ERR, &quot;authorize(): Error while sending 500 reply\n&quot;);<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return 0;<br>&nbsp;}<br>&nbsp;if (res &gt; 0) {<br>&nbsp;&nbsp;/* Username not found in the database */ 
<br>&nbsp;&nbsp;auth_dbf.free_result(db_handle, result);<br>&nbsp;&nbsp;return -1;<br>&nbsp;}</p>
<p><br>&nbsp;char agent[2000],agentroot[2000];<br>&nbsp;bzero(agent,sizeof(agent));<br>&nbsp;bzero(agentroot,sizeof(agentroot));</p>
<p><br>&nbsp;res = getmount(acct,agent,agentroot);<br>&nbsp;if(res &lt; 0)<br>&nbsp;{<br>&nbsp;&nbsp;auth_dbf.free_result(db_handle, result);<br>&nbsp;&nbsp;return 0;<br>&nbsp;}<br>&nbsp;if(res == 0)<br>&nbsp;{<br>&nbsp;&nbsp;auth_dbf.free_result(db_handle, result);<br>&nbsp;&nbsp;return -1; 
<br>&nbsp;}<br>&nbsp;if(res == 1)<br>&nbsp;{<br>&nbsp;&nbsp;auth_dbf.free_result(db_handle, result);<br>&nbsp;&nbsp;return -1;<br>&nbsp;}</p>
<p>&nbsp;if(res == 2)<br>&nbsp;{<br>&nbsp;&nbsp;str ll,ss;<br>&nbsp;&nbsp;ll.s = (char*)agent;<br>&nbsp;&nbsp;ll.len = strlen(ll.s);<br>&nbsp;&nbsp;ss.s = (char*)agentroot;<br>&nbsp;&nbsp;ss.len = strlen(ss.s);<br>&nbsp;&nbsp;if(getagentmount(ll) != 2)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;auth_dbf.free_result(db_handle, result); 
<br>&nbsp;&nbsp;&nbsp;return -1;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;if(strcmp(agent,agentroot))<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;if(getagentmount(ss) != 2)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;auth_dbf.free_result(db_handle, result);<br>&nbsp;&nbsp;&nbsp;&nbsp;return -1;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp;}</p>
<p><br>&nbsp;/* Recalculate response, it must be same to authorize successfully */<br>&nbsp;if (!check_response(&amp;(cred-&gt;digest), &amp;_m-&gt;first_line.u.request.method, ha1)) {<br>&nbsp;&nbsp;rpid.s = NULL;<br>&nbsp;&nbsp;rpid.len = 0;<br>&nbsp;&nbsp;for (i = 0; i &lt; avps_str_n; i++) { 
<br>&nbsp;&nbsp;&nbsp;if (avps_str[i].len != 4<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|| VAL_NULL(&amp;(result-&gt;rows[0].values[1 + avps_int_n + i]))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|| memcmp(avps_str[i].s, &quot;rpid&quot;, 4) != 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;continue;<br>&nbsp;&nbsp;&nbsp;rpid.s = (char*)VAL_STRING(&amp;(result-&gt;rows[0].values[1 + avps_int_n + i])); 
<br>&nbsp;&nbsp;&nbsp;if(rpid.s!=NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;rpid.len = strlen(rpid.s);<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;ret = post_auth_func(_m, h, &amp;rpid);<br>&nbsp;&nbsp;switch(ret) {<br>&nbsp;&nbsp;&nbsp;case ERROR:<br>&nbsp;&nbsp;&nbsp;&nbsp;auth_dbf.free_result(db_handle, result);<br>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>&nbsp;&nbsp;&nbsp;case NOT_AUTHORIZED: 
<br>&nbsp;&nbsp;&nbsp;&nbsp;auth_dbf.free_result(db_handle, result);<br>&nbsp;&nbsp;&nbsp;&nbsp;return -1;<br>&nbsp;&nbsp;&nbsp;case AUTHORIZED:<br>&nbsp;&nbsp;&nbsp;&nbsp;for (i = 0; i &lt; avps_int_n; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(VAL_NULL(&amp;(result-&gt;rows[0].values[1 + i])))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
iname.s = &amp;(avps_int[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ivalue.n = VAL_INT(&amp;(result-&gt;rows[0].values[1 + i]));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_avp(AVP_NAME_STR, iname, ivalue);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBG(&quot;authorize(): set integer AVP \'%.*s = %d\'\n&quot;,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
iname.s-&gt;len, ZSW(iname.s-&gt;s), ivalue.n);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;for (i = 0; i &lt; avps_str_n; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value.s = (char*)VAL_STRING(&amp;(result-&gt;rows[0].values[1 + avps_int_n + i]));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(VAL_NULL(&amp;(result-&gt;rows[0].values[1 + avps_int_n + i])) 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|| value.s==NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iname.s = &amp;(avps_str[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value.len = strlen(value.s);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ivalue.s = &amp;value;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_avp(AVP_NAME_STR | AVP_VAL_STR, iname, ivalue);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBG(&quot;authorize(): set string AVP \'%.*s = %.*s\'\n&quot;, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iname.s-&gt;len, ZSW(iname.s-&gt;s), value.len, ZSW(value.s));<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;auth_dbf.free_result(db_handle, result);<br>&nbsp;&nbsp;&nbsp;&nbsp;return 1;<br>&nbsp;&nbsp;&nbsp;default:<br>&nbsp;&nbsp;&nbsp;&nbsp;auth_dbf.free_result(db_handle, result);<br>&nbsp;&nbsp;&nbsp;&nbsp;return -1; 
<br>&nbsp;&nbsp;}<br>&nbsp;}</p>
<p>&nbsp;auth_dbf.free_result(db_handle, result);<br>&nbsp;return -1;<br>}</p>
<p><br>/*<br>&nbsp;* Authorize using Proxy-Authorize header field<br>&nbsp;*/<br>int proxy_authorize(struct sip_msg* _m, char* _realm, char* _table)<br>{<br>&nbsp;/* realm parameter is converted to str* in str_fixup */<br>&nbsp;return authorize(_m, (str*)_realm, _table, HDR_PROXYAUTH); 
<br>}</p>
<p><br>/*<br>&nbsp;* Authorize using WWW-Authorize header field<br>&nbsp;*/<br>int www_authorize(struct sip_msg* _m, char* _realm, char* _table)<br>{<br>&nbsp;return authorize(_m, (str*)_realm, _table, HDR_AUTHORIZATION);<br>}</p>
<p>&nbsp;</p>
<p>int auth_db_init(char* db_url)<br>{<br>&nbsp;if (auth_dbf.init==0){<br>&nbsp;&nbsp;LOG(L_CRIT, &quot;BUG: auth_db_bind: null dbf\n&quot;);<br>&nbsp;&nbsp;goto error;<br>&nbsp;}<br>&nbsp;db_handle=auth_dbf.init(db_url);<br>&nbsp;if (db_handle==0){<br>&nbsp;&nbsp;LOG(L_ERR, &quot;ERROR: auth_db_bind: unable to connect to the database\n&quot;); 
<br>&nbsp;&nbsp;goto error;<br>&nbsp;}<br>&nbsp;return 0;<br>error:<br>&nbsp;return -1;<br>}</p>
<p><br>int auth_db_bind(char* db_url)<br>{<br>&nbsp;if (bind_dbmod(db_url, &amp;auth_dbf)&lt;0){<br>&nbsp;&nbsp;LOG(L_ERR, &quot;ERROR: auth_db_bind: unable to bind to the database&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&quot; module\n&quot;);<br>&nbsp;&nbsp;return -1;<br>
&nbsp;}<br>&nbsp;return 0;<br>}</p>
<p><br>void auth_db_close()<br>{<br>&nbsp;if (db_handle &amp;&amp; auth_dbf.close){<br>&nbsp;&nbsp;auth_dbf.close(db_handle);<br>&nbsp;&nbsp;db_handle=0;<br>&nbsp;}<br>}</p>
<p><br>int auth_db_ver(char* db_url, str* name)<br>{<br>&nbsp;db_con_t* dbh;<br>&nbsp;int ver;</p>
<p>&nbsp;if (auth_dbf.init==0){<br>&nbsp;&nbsp;LOG(L_CRIT, &quot;BUG: auth_db_ver: unbound database\n&quot;);<br>&nbsp;&nbsp;return -1;<br>&nbsp;}<br>&nbsp;dbh=auth_dbf.init(db_url);<br>&nbsp;if (dbh==0){<br>&nbsp;&nbsp;LOG(L_ERR, &quot;ERROR: auth_db_ver: unable to open database connection\n&quot;); 
<br>&nbsp;&nbsp;return -1;<br>&nbsp;}<br>&nbsp;ver=table_version(&amp;auth_dbf, dbh, name);<br>&nbsp;auth_dbf.close(dbh);<br>&nbsp;return ver;<br>}<br>##########################################################</p></div></div>