Changeset 420:c8a61dabea55 in freeDiameter for extensions/app_sip
- Timestamp:
- Jul 19, 2010, 4:46:33 PM (14 years ago)
- Branch:
- default
- Phase:
- public
- Location:
- extensions/app_sip
- Files:
-
- 4 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
extensions/app_sip/CMakeLists.txt
r419 r420 21 21 multimediaauth.c 22 22 registrationtermination.c 23 pushprofile.c 24 locationinfo.c 25 locationinfosl.c 23 26 ) 24 27 -
extensions/app_sip/diamsip.c
r419 r420 36 36 #include "diamsip.h" 37 37 38 //Diameter-SIP server 38 39 struct disp_hdl * diamsip_MAR_hdl=NULL; 39 40 struct disp_hdl * diamsip_LIR_hdl=NULL; … … 42 43 struct disp_hdl * diamsip_PPA_hdl=NULL; 43 44 struct disp_hdl * diamsip_RTA_hdl=NULL; 45 46 //Suscriber Locator 47 struct disp_hdl * diamsipSL_LIR_hdl=NULL; 48 44 49 45 50 … … 71 76 TRACE_DEBUG(FULL,"# mysql_server: *%s*",as_conf->mysql_server); 72 77 TRACE_DEBUG(FULL,"# mysql_port: *%d*",as_conf->mysql_port); 78 TRACE_DEBUG(FULL,"# mysql_port: *%d*",as_conf->mysql_prefix); 73 79 TRACE_DEBUG(FULL,"***End of Diameter-SIP configuration extension***"); 74 80 } … … 90 96 struct dict_object * app=NULL; 91 97 struct disp_when data; 92 pthread_t rtr_thread ;98 pthread_t rtr_thread, ppr_thread; 93 99 94 100 /* Initialize configuration */ … … 104 110 TRACE_DEBUG(INFO, "We need a configuration file for Diameter-SIP extension. See doc/ for an example."); 105 111 } 112 113 //TODO: replace by configuration file!! 114 strcpy(as_conf->mysql_prefix,"as_"); 106 115 107 116 //We can dump the configuration extracted from app_sip.conf … … 118 127 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Destination-Host", &sip_dict.Destination_Host, ENOENT) ); 119 128 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Session-Id", &sip_dict.Session_Id, ENOENT) ); 129 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Redirect-Host", &sip_dict.Redirect_Host, ENOENT) ); 130 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Redirect-Host-Usage", &sip_dict.Redirect_Host_Usage, ENOENT) ); 120 131 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "SIP-Auth-Data-Item", &sip_dict.SIP_Auth_Data_Item, ENOENT) ); 121 132 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "SIP-Authorization", &sip_dict.SIP_Authorization, ENOENT) ); … … 143 154 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Digest-QoP", &sip_dict.Digest_QOP, ENOENT) ); 144 155 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "User-Name", &sip_dict.User_Name, ENOENT) ); 145 146 156 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Digest-HA1", &sip_dict.Digest_HA1, ENOENT) ); 147 157 … … 151 161 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_APPLICATION, APPLICATION_BY_NAME, "Diameter Session Initiation Protocol (SIP) Application", &data.app, ENOENT) ); 152 162 153 154 //**Command Codes 155 //MAR 156 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Multimedia-Auth-Request", &data.command, ENOENT) ); 157 CHECK_FCT( fd_disp_register( diamsip_MAR_cb, DISP_HOW_CC, &data, &diamsip_MAR_hdl ) ); 158 //RTA 159 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Registration-Termination-Answer", &data.command, ENOENT) ); 160 CHECK_FCT( fd_disp_register( diamsip_RTA_cb, DISP_HOW_CC, &data, &diamsip_RTA_hdl ) ); 161 163 if(as_conf->mode==1) 164 { 165 //**Command Codes 166 //MAR 167 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Multimedia-Auth-Request", &data.command, ENOENT) ); 168 CHECK_FCT( fd_disp_register( diamsip_MAR_cb, DISP_HOW_CC, &data, &diamsip_MAR_hdl ) ); 169 //RTA 170 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Registration-Termination-Answer", &data.command, ENOENT) ); 171 CHECK_FCT( fd_disp_register( diamsip_RTA_cb, DISP_HOW_CC, &data, &diamsip_RTA_hdl ) ); 172 //PPA 173 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Push-Profile-Answer", &data.command, ENOENT) ); 174 CHECK_FCT( fd_disp_register( diamsip_PPA_cb, DISP_HOW_CC, &data, &diamsip_PPA_hdl ) ); 175 //LIR 176 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Location-Info-Request", &data.command, ENOENT) ); 177 CHECK_FCT( fd_disp_register( diamsip_LIR_cb, DISP_HOW_CC, &data, &diamsip_LIR_hdl ) ); 178 } 179 if(as_conf->mode==2) 180 { 181 //LIR 182 CHECK_FCT( fd_dict_search( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Location-Info-Request", &data.command, ENOENT) ); 183 CHECK_FCT( fd_disp_register( diamsipSL_LIR_cb, DISP_HOW_CC, &data, &diamsipSL_LIR_hdl ) ); 184 } 162 185 //Callback for unexpected messages 163 186 CHECK_FCT( fd_disp_register( diamsip_default_cb, DISP_HOW_APPID, &data, &diamsip_default_hdl ) ); … … 166 189 //We start database connection 167 190 if(start_mysql_connection()) 168 return 1;191 return EINVAL; 169 192 170 193 CHECK_FCT(fd_sess_handler_create(&ds_sess_hdl, free)); … … 174 197 { 175 198 TRACE_DEBUG(INFO,"Creation of thread failed, abort!"); 176 return 1; 199 return EINVAL; 200 } 201 //Creation of thread for Push Profile 202 if(pthread_create(&ppr_thread, NULL,ppr_socket, NULL)) 203 { 204 TRACE_DEBUG(INFO,"Creation of thread failed, abort!"); 205 return EINVAL; 177 206 } 178 207 … … 188 217 void fd_ext_fini(void) 189 218 { 190 219 //TODO:unregister other callbacks 191 220 192 221 (void) fd_disp_unregister(&diamsip_MAR_hdl); -
extensions/app_sip/diamsip.h
r419 r420 53 53 #define MODE_SL 0x2 54 54 55 //Redirect_Host_Usage 56 #define ALL_USER 6 55 57 56 58 /* The module configuration */ … … 62 64 char * mysql_database; 63 65 char * mysql_server; 64 uint16_t mysql_port; 66 char mysql_prefix[10]; //default: as_ 67 uint16_t mysql_port; //if 0, default port will be used 65 68 66 69 }; … … 78 81 void clear_digest(uint8_t * digest, char * readable_digest, int digestlength); 79 82 struct avp_hdr * walk_digest(struct avp *avp, int avp_code); 83 84 85 //MySQL part 80 86 int start_mysql_connection(); 81 87 void request_mysql(char *query); 82 88 void close_mysql_connection(); 89 int get_diameter_uri(const unsigned char *sip_aor, const size_t sipaorlen, char ** diameter_uri, size_t *diameterurilen); 90 83 91 84 92 void DigestCalcHA1(char * pszAlg,char * pszUserName,char * pszRealm,char * pszPassword,char * pszNonce,char * pszCNonce,HASHHEX SessionKey); … … 90 98 //thread procedure 91 99 void *rtr_socket(void *); 100 void *ppr_socket(void *); 92 101 93 102 struct rtrsipaor … … 101 110 int reason; 102 111 }; 112 struct pprsipaor 113 { 114 char username[200]; 115 char label1[200]; 116 char value1[200]; 117 char label2[200]; 118 char value2[200]; 119 char desthost[200]; 120 }; 103 121 int diamsip_RTR_cb(struct rtrsipaor structure); 122 int diamsip_PPR_cb(struct pprsipaor structure); 104 123 #define PORT 666 //TODO:put in conf file 105 124 … … 109 128 int diamsip_MAR_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act); 110 129 int diamsip_RTA_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act); 130 int diamsip_PPA_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act); 131 int diamsip_LIR_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act); 132 133 //Suscriber Locator 134 int diamsipSL_LIR_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, enum disp_action * act); 135 //int diamsipSL_SAR_cb( struct msg ** msg, struct avp * paramavp, struct session * sess, enum disp_action * act); 136 111 137 #define SQL_GETPASSWORD "SELECT `password` FROM ds_users WHERE `username` ='%s'" 112 138 #define SQL_GETPASSWORD_LEN 52 113 139 114 #define SQL_GETSIPURI "SELECT `sip_server_uri` FROM ds_users WHERE `username` ='%s'"140 #define SQL_GETSIPURI "SELECT `sip_server_uri` FROM ds_users WHERE `username` ='%s'" 115 141 #define SQL_GETSIPURI_LEN 60 142 143 #define SQL_GETDIAMURI "SELECT `diameter_uri` FROM sl_sip_aor_map WHERE `sip_aor` ='%s'" 144 #define SQL_GETDIAMURI_LEN 61 116 145 117 146 #define SQL_SETSIPURI "UPDATE ds_users SET `sip_server_uri`='%s', `flag`=1 WHERE `username` ='%s'" … … 140 169 struct dict_object * User_Name; 141 170 struct dict_object * Session_Id; 171 struct dict_object * Redirect_Host; 172 struct dict_object * Redirect_Host_Usage; 142 173 struct dict_object * SIP_Auth_Data_Item; 143 174 struct dict_object * SIP_Authorization; -
extensions/app_sip/libdiamsip.c
r409 r420 34 34 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * 35 35 *********************************************************************************************************/ 36 #include <mysql.h>36 //#include <mysql.h> 37 37 #include "diamsip.h" 38 38 … … 185 185 186 186 } 187 188 int get_diameter_uri(const unsigned char *sip_aor, const size_t sipaorlen, char ** diameter_uri, size_t *diameterurilen) 189 { 190 CHECK_PARAMS(sip_aor && sipaorlen); 191 192 size_t querylen, sipaorpurelen; 193 char *query, *sipaor_pure; 194 int not_found=1; 195 196 197 198 199 //a sip aor must begin by "sip:" or "sips:" so it must at least be longer than 4 chars 200 if(sipaorlen<5) 201 return 2; 202 203 //NOTE: each method has to purify sip_aor itself. You must remove quotes or special chars for security 204 205 switch(as_conf->datasource) 206 { 207 //MySQL 208 case ASMYSQL: 209 210 querylen=SQL_GETDIAMURI_LEN + sipaorlen; 211 212 213 //We allocate the double size of SIP-URI because at worst it can be all quotes 214 CHECK_MALLOC(sipaor_pure=malloc(sipaorlen*2+1)); 215 //We purify SIP-URI not to have forbidden characters 216 sipaorpurelen=mysql_real_escape_string(conn, sipaor_pure, (const char *)sip_aor, sipaorlen); 217 218 219 query = malloc(querylen+sipaorpurelen+ 2); 220 snprintf(query, querylen+1, SQL_GETDIAMURI, sipaor_pure); 221 222 MYSQL_RES *res; 223 MYSQL_ROW row; 224 225 226 //We make the query 227 request_mysql(query); 228 res=mysql_use_result(conn); 229 if(res==NULL) 230 { 231 //We couldn't make the request 232 diameter_uri=NULL; 233 return 2; 234 } 235 TRACE_DEBUG(INFO,"***********%d|%d****************\n%s\n*********************************",sipaorlen,sipaorpurelen,query); 236 while ((row = mysql_fetch_row(res)) != NULL) 237 { 238 *diameterurilen=strlen(row[0]); 239 if(*diameterurilen>0) 240 { 241 CHECK_MALLOC(*diameter_uri=malloc(*diameterurilen+1)); 242 strcpy(*diameter_uri,row[0]); 243 not_found=0; 244 break; 245 } 246 } 247 mysql_free_result(res); 248 free(query); 249 free(sipaor_pure); 250 break; 251 252 default: 253 254 //We must never go here, if so, we must stop diameter_sip 255 diameter_uri=NULL; 256 return 2; 257 258 break; 259 } 260 261 //0 if it was found 262 return not_found; 263 264 } 265 266 187 267 /* 188 268 void nonce_add_element(char * nonce) -
extensions/app_sip/multimediaauth.c
r409 r420 57 57 58 58 59 TRACE_ENTRY("%p %p %p %p", msg, avp, sess, act);59 TRACE_ENTRY("%p %p %p %p", msg, paramavp, sess, act); 60 60 61 61 if (msg == NULL) … … 223 223 224 224 //We allocate the double size of SIP-URI because at worst it can be all quotes 225 sipuri=malloc(avphdr->avp_value->os.len*2+1);225 CHECK_MALLOC(sipuri=malloc(avphdr->avp_value->os.len*2+1)); 226 226 //We purify SIP-URI not to have forbidden characters 227 227 sipurilen=mysql_real_escape_string(conn, sipuri, (const char *)avphdr->avp_value->os.data, avphdr->avp_value->os.len); … … 230 230 //We get the SIP-URI assignated to the user 231 231 querylen=SQL_GETSIPURI_LEN + usernamelen; 232 query = malloc(querylen+2);232 CHECK_MALLOC(query = malloc(querylen+2)); 233 233 snprintf(query, querylen+1, SQL_GETSIPURI, username); 234 234 -
extensions/app_sip/registrationtermination.c
r419 r420 48 48 { 49 49 SOCKET sock; 50 51 52 50 SOCKADDR_IN sin, csin; 51 struct rtrsipaor rtrsip; 52 int rcvbytes=0; 53 53 sock = socket(AF_INET, SOCK_STREAM, 0); 54 54 sin.sin_addr.s_addr = inet_addr("127.0.0.1"); 55 56 57 55 sin.sin_family = AF_INET; 56 sin.sin_port = htons(PORT); 57 socklen_t sinsize = sizeof(csin); 58 58 int accepted=0; 59 59 60 TRACE_DEBUG(INFO,"############********************THREAD OPEN \n********************\n********************\n");61 62 60 if(!bind(sock, (SOCKADDR*)&sin, sizeof(sin))) 63 61 { … … 73 71 { 74 72 rcvbytes=recv(accepted, &rtrsip, sizeof(struct rtrsipaor),0); 75 76 73 77 74 if(rcvbytes>-1) 78 75 { 76 //We received something, we can send an RTR 79 77 diamsip_RTR_cb(rtrsip); 80 81 82 78 } 83 79 } 84 80 } 85 86 87 81 } 88 82 else … … 90 84 91 85 92 93 94 95 TRACE_DEBUG(INFO,"############********************THREAD CLOSED \n********************\n********************\n");96 86 pthread_exit(NULL); 97 87 … … 130 120 131 121 132 TRACE_DEBUG( INFO,"We have %d SIP_AOR",num_aor);122 TRACE_DEBUG(FULL,"Request for %d SIP_AOR to be deregistred.",num_aor); 133 123 134 124 if((got_username + num_aor)==0) … … 167 157 } 168 158 159 //Add the Auth-Application-Id 160 { 161 CHECK_FCT( fd_msg_avp_new ( sip_dict.Auth_Application_Id, 0, &avp ) ); 162 value.i32 = 6; 163 CHECK_FCT( fd_msg_avp_setvalue ( avp, &value ) ); 164 CHECK_FCT( fd_msg_avp_add ( message, MSG_BRW_LAST_CHILD, avp) ); 165 } 169 166 170 167 //Auth_Session_State … … 253 250 } 254 251 252 //TODO:remove for debug 255 253 fd_msg_dump_walk(INFO,message); 256 254 CHECK_FCT( fd_msg_send( &message, NULL, NULL ));
Note: See TracChangeset
for help on using the changeset viewer.