annotate extensions/app_sip/multimediaauth.c @ 360:1740bee6c821

Initial App_SIP import
author Alexandre Westfahl <awestfahl@freediameter.net>
date Fri, 02 Jul 2010 12:00:58 +0900
parents
children da11085cf6d9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
360
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
1 #include "diamsip.h"
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
2
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
3
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
4 int diamsip_MAR_cb( struct msg ** msg, struct avp * avp, struct session * sess, enum disp_action * act)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
5 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
6 struct msg *ans, *qry;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
7 struct avp *a2, *authdataitem;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
8 struct msg_hdr * header = NULL;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
9 struct avp_hdr * avphdr=NULL, *avpheader=NULL, *avpheader_auth=NULL,*digestheader=NULL;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
10 union avp_value val;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
11 int found_cnonce=0;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
12 struct avp * tempavp=NULL,*sipAuthentication=NULL,*sipAuthenticate=NULL;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
13 char * result;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
14 char password[51];
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
15 int idx=0, idx2=0, number_of_auth_items=0,i=0;;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
16 //Flags and variables for Database
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
17 int sipurinotstored=0, authenticationpending=0, querylen=0, usernamelen=0;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
18 char *query=NULL,*username=NULL;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
19
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
20 //The nonce we will store and retrieve in session
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
21 struct ds_nonce *storednonce=NULL;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
22
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
23
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
24 TRACE_ENTRY("%p %p %p %p", msg, avp, sess, act);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
25
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
26 if (msg == NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
27 return EINVAL;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
28
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
29
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
30 /* Create answer header */
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
31 qry = *msg;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
32 CHECK_FCT( fd_msg_new_answer_from_req ( fd_g_config->cnf_dict, msg, 0 ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
33 ans = *msg;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
34
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
35
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
36
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
37 /* Add the appropriate command code & Auth-Application-Id */
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
38 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
39
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
40 CHECK_FCT( fd_msg_hdr ( *msg, &header ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
41 header->msg_flags = CMD_FLAG_PROXIABLE;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
42 header->msg_code = 286;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
43 header->msg_appl = 6;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
44
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
45
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
46 /* Add the Auth-Application-Id */
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
47 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
48 CHECK_FCT( fd_msg_avp_new ( sip_dict.Auth_Application_Id, 0, &avp ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
49 val.i32 = header->msg_appl;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
50 CHECK_FCT( fd_msg_avp_setvalue ( avp, &val ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
51 CHECK_FCT( fd_msg_avp_add ( ans, MSG_BRW_LAST_CHILD, avp) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
52 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
53 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
54
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
55
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
56 /* Add the Auth-Session-State AVP */
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
57 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
58
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
59 CHECK_FCT( fd_msg_search_avp ( qry, sip_dict.Auth_Session_State, &avp) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
60 CHECK_FCT( fd_msg_avp_hdr( avp, &avphdr ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
61
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
62 CHECK_FCT( fd_msg_avp_new ( sip_dict.Auth_Session_State, 0, &avp ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
63 CHECK_FCT( fd_msg_avp_setvalue( avp, avphdr->avp_value ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
64 CHECK_FCT( fd_msg_avp_add( ans, MSG_BRW_LAST_CHILD, avp ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
65 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
66
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
67
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
68
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
69 /* Check if method is REGISTER then User-Name must be present */
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
70 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
71
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
72 CHECK_FCT( fd_msg_search_avp ( qry, sip_dict.SIP_Method, &avp) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
73 CHECK_FCT( fd_msg_avp_hdr( avp, &avpheader ));
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
74
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
75
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
76 char *method=NULL;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
77
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
78 CHECK_FCT( fd_msg_search_avp ( qry, sip_dict.User_Name, &avp) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
79 if(avp!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
80 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
81
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
82 int not_found=1;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
83 MYSQL_RES *res=NULL;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
84 MYSQL_ROW row;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
85
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
86 CHECK_FCT( fd_msg_avp_hdr( avp, &avphdr ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
87
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
88 //We allocate the double size of username because at worst it can be all quotes
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
89 username=malloc(avphdr->avp_value->os.len*2+1);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
90 //We purify username not to have forbidden characters
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
91 usernamelen=mysql_real_escape_string(conn, username, avphdr->avp_value->os.data, avphdr->avp_value->os.len);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
92
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
93
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
94 if((strncmp(avpheader->avp_value->os.data,"REGISTER",avpheader->avp_value->os.len)==0))
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
95 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
96 not_found=1;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
97
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
98 //We copy username in query
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
99 querylen=SQL_GETPASSWORD_LEN + usernamelen;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
100 query = malloc(querylen+2);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
101 snprintf(query, querylen+1, SQL_GETPASSWORD, username);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
102
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
103
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
104
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
105 //We make the query
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
106 request_mysql(query);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
107 res=mysql_use_result(conn);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
108 if(res==NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
109 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
110 //We couldn't make the request
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
111 result="DIAMETER_UNABLE_TO_COMPLY";
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
112 goto out;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
113 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
114
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
115
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
116
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
117 while ((row = mysql_fetch_row(res)) != NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
118 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
119 if(row[0]!="")
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
120 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
121 strcpy(password,row[0]);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
122 not_found=0;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
123 break;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
124 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
125 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
126 mysql_free_result(res);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
127 free(query);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
128
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
129 if(not_found)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
130 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
131 TRACE_DEBUG(FULL,"The user %s doesn't exist!",username);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
132 result="DIAMETER_ERROR_USER_UNKNOWN";
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
133 free(username);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
134 goto out;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
135 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
136
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
137
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
138
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
139 //Now that we know the user exist, we get the list of AOR owned by this user
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
140 querylen=SQL_GETSIPAOR_LEN + usernamelen;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
141 query = malloc(querylen+2);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
142 snprintf(query, querylen+1, SQL_GETSIPAOR, username);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
143
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
144 //We make the query
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
145 request_mysql(query);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
146 res=mysql_use_result(conn);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
147 if(res==NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
148 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
149 //We couldn't make the request
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
150 result="DIAMETER_UNABLE_TO_COMPLY";
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
151 goto out;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
152 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
153
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
154 //We retrieve the SIP-AOR from AVP to check if the user can us it
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
155 CHECK_FCT( fd_msg_search_avp ( qry, sip_dict.SIP_AOR, &avp) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
156 CHECK_FCT( fd_msg_avp_hdr( avp, &avphdr ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
157
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
158 not_found=1;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
159 while ((row = mysql_fetch_row(res)) != NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
160 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
161 if(strncmp(avphdr->avp_value->os.data,row[0],avphdr->avp_value->os.len)==0)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
162 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
163 not_found=0;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
164 break;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
165 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
166 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
167 mysql_free_result(res);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
168 free(query);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
169
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
170 if(not_found)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
171 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
172 TRACE_DEBUG(FULL,"The user %s can't use this SIP-AOR!",username);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
173 result="DIAMETER_ERROR_IDENTITIES_DONT_MATCH";
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
174 free(username);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
175 goto out;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
176 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
177
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
178 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
179
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
180 CHECK_FCT( fd_msg_search_avp ( qry, sip_dict.SIP_Server_URI, &avp) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
181 CHECK_FCT( fd_msg_avp_hdr( avp, &avphdr ));
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
182
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
183 if(avphdr!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
184 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
185 char *sipuri=NULL;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
186 int sipurilen=0;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
187
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
188 //We allocate the double size of SIP-URI because at worst it can be all quotes
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
189 sipuri=malloc(avphdr->avp_value->os.len*2+1);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
190 //We purify SIP-URI not to have forbidden characters
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
191 sipurilen=mysql_real_escape_string(conn, sipuri, avphdr->avp_value->os.data, avphdr->avp_value->os.len);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
192
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
193
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
194 //We get the SIP-URI assignated to the user
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
195 querylen=SQL_GETSIPURI_LEN + usernamelen;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
196 query = malloc(querylen+2);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
197 snprintf(query, querylen+1, SQL_GETSIPURI, username);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
198
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
199 //We make the query
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
200 request_mysql(query);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
201 res=mysql_use_result(conn);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
202 if(res==NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
203 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
204 //We couldn't make the request
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
205 result="DIAMETER_UNABLE_TO_COMPLY";
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
206 goto out;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
207 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
208 not_found=1;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
209 while ((row = mysql_fetch_row(res)) != NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
210 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
211 if(strncmp(avphdr->avp_value->os.data,row[0],avphdr->avp_value->os.len)==0)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
212 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
213 not_found=0;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
214 break;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
215 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
216 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
217 mysql_free_result(res);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
218 free(query);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
219
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
220 if(not_found)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
221 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
222 //We update the SIP_URI for the user and we flag "authentication in progress"
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
223 querylen=SQL_SETSIPURI_LEN + usernamelen + sipurilen;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
224 query = malloc(querylen+2);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
225 snprintf(query, querylen+1, SQL_SETSIPURI, sipuri, username);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
226
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
227 //We make the query
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
228 request_mysql(query);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
229
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
230 free(query);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
231 authenticationpending=1;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
232 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
233 free(sipuri);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
234
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
235 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
236 else
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
237 sipurinotstored=1;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
238
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
239 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
240 else
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
241 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
242 result="DIAMETER_USER_NAME_REQUIRED";
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
243 goto out;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
244 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
245
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
246
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
247 free(method);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
248
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
249 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
250
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
251
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
252 //TODO: remove loop for authdataitem because RFC say only one (wait for answer from Garcia)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
253 // How many Auth Data Items?
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
254 CHECK_FCT( fd_msg_search_avp ( qry, sip_dict.SIP_Number_Auth_Items, &avp) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
255 CHECK_FCT( fd_msg_avp_hdr( avp, &avpheader ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
256
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
257
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
258 if(avp!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
259 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
260 CHECK_FCT(fd_msg_search_avp ( qry, sip_dict.SIP_Auth_Data_Item, &avp));
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
261 CHECK_FCT( fd_msg_avp_hdr( avp, &avphdr ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
262
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
263 if(avp!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
264 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
265 //First is Authentication Scheme
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
266 CHECK_FCT(fd_msg_browse ( avp, MSG_BRW_FIRST_CHILD, &avp, NULL) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
267 CHECK_FCT( fd_msg_avp_hdr( avp, &avphdr ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
268
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
269 //Digest-Authentication?
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
270 if(avphdr->avp_value->i32==0)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
271 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
272
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
273 for(idx=0;idx<avpheader->avp_value->i32;idx++)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
274 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
275 //We look for SIP Auth items
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
276 CHECK_FCT(fd_msg_browse ( avp, MSG_BRW_WALK, &avp, NULL) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
277
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
278 if(avp!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
279 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
280
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
281 CHECK_FCT( fd_msg_avp_hdr( avp,&avphdr ));
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
282
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
283 if(avphdr->avp_code==380) //We only create Auth-Data-Item to answer Auth-Data-Item
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
284 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
285 /* Add the Auth-Data-Item AVP */
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
286 CHECK_FCT( fd_msg_avp_new ( sip_dict.SIP_Auth_Data_Item, 0, &authdataitem ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
287
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
288 /* Add the Authentication Scheme AVP */
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
289 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
290 CHECK_FCT( fd_msg_avp_new ( sip_dict.SIP_Authentication_Scheme, 0, &a2 ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
291 val.i32=0; //We only know Digest Authentication
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
292 CHECK_FCT( fd_msg_avp_setvalue( a2, &val ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
293 CHECK_FCT( fd_msg_avp_add( authdataitem, MSG_BRW_LAST_CHILD, a2 ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
294 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
295
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
296 //We need to know if there is a Cnonce attribute (only in the second MAR request)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
297
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
298 //CHECK_FCT(fd_msg_browse ( avp, MSG_BRW_WALK, &avp, NULL) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
299
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
300
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
301 CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_CNonce, &a2 ));
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
302
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
303 if(a2!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
304 found_cnonce=1;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
305 else
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
306 found_cnonce=0;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
307
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
308 if(!found_cnonce)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
309 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
310 /*
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
311 We are in the case of first access request so we need to challenge the user.
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
312 */
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
313 TRACE_DEBUG(FULL,"First Authorization in progress...");
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
314
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
315 /* Create a new session */ //this create a new session Id !!!
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
316 //CHECK_FCT_DO( fd_sess_new( &sess, fd_g_config->cnf_diamid, "diamsip", 7), goto out );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
317
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
318
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
319 /* Create the SIP-Authenticate AVP */
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
320 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
321 CHECK_FCT( fd_msg_avp_new ( sip_dict.SIP_Authenticate, 0, &sipAuthenticate ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
322 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
323
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
324 /* Add the Digest QOP AVP */
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
325 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
326 CHECK_FCT( fd_msg_avp_new ( sip_dict.Digest_QOP, 0, &a2 ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
327 val.os.data="auth";
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
328 val.os.len=strlen(val.os.data);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
329 CHECK_FCT( fd_msg_avp_setvalue( a2, &val ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
330 CHECK_FCT( fd_msg_avp_add( sipAuthenticate, MSG_BRW_LAST_CHILD, a2 ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
331 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
332 /* Add the Digest Nonce AVP */
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
333 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
334 uint8_t buffer[NONCE_SIZE];
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
335 char nonce[NONCE_SIZE * 2 + 1];
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
336
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
337
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
338 gcry_create_nonce ((uint8_t *)buffer, sizeof(buffer));
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
339
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
340 for(i=0;i<NONCE_SIZE;i++)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
341 sprintf(&nonce[2 * i], "%2.2hhx", buffer[i]);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
342
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
343 CHECK_FCT( fd_msg_avp_new ( sip_dict.Digest_Nonce, 0, &a2 ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
344
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
345
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
346 //We store the nonce (storednonce structure) inside the session
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
347 storednonce=malloc(sizeof(struct ds_nonce));
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
348 memset(storednonce,0,sizeof(struct ds_nonce));
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
349 CHECK_MALLOC(storednonce->nonce=malloc(NONCE_SIZE*2+1));
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
350 memcpy(storednonce->nonce,(char *)nonce,NONCE_SIZE*2+1);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
351 CHECK_FCT( fd_sess_state_store ( ds_sess_hdl, sess, &storednonce ));
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
352
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
353 val.os.data=nonce;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
354 val.os.len=NONCE_SIZE * 2;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
355
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
356 CHECK_FCT( fd_msg_avp_setvalue( a2, &val ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
357 CHECK_FCT( fd_msg_avp_add( sipAuthenticate, MSG_BRW_LAST_CHILD, a2 ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
358 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
359 /* Add the Digest Algorithm AVP */
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
360 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
361 CHECK_FCT( fd_msg_avp_new ( sip_dict.Digest_Algorithm, 0, &a2 ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
362 val.os.data="MD5";
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
363 val.os.len=strlen(val.os.data);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
364 CHECK_FCT( fd_msg_avp_setvalue( a2, &val ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
365 CHECK_FCT( fd_msg_avp_add( sipAuthenticate, MSG_BRW_LAST_CHILD, a2 ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
366
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
367 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
368 /* Add the Digest Realm AVP */
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
369 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
370 tempavp=avp;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
371
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
372 avpheader_auth=walk_digest(tempavp, 104);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
373 if(avpheader_auth!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
374 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
375 CHECK_FCT( fd_msg_avp_new ( sip_dict.Digest_Realm, 0, &a2 ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
376 CHECK_FCT( fd_msg_avp_setvalue( a2, avpheader_auth->avp_value ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
377 CHECK_FCT( fd_msg_avp_add( sipAuthenticate, MSG_BRW_LAST_CHILD, a2 ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
378
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
379 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
380 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
381
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
382
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
383 //We add SIP Authenticate to Auth Data Item
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
384 CHECK_FCT( fd_msg_avp_add( authdataitem, MSG_BRW_LAST_CHILD, sipAuthenticate ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
385 //We add Auth Data Item to Answer
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
386 CHECK_FCT( fd_msg_avp_add( ans, MSG_BRW_LAST_CHILD, authdataitem ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
387
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
388 number_of_auth_items++;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
389 if(sipurinotstored)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
390 result="DIAMETER_SUCCESS_AUTH_SENT_SERVER_NOT_STORED";
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
391 else
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
392 result="DIAMETER_MULTI_ROUND_AUTH";
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
393 found_cnonce=0;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
394 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
395 else
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
396 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
397 /*
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
398 We are in the case of access request after challenge so we need to check credentials.
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
399 */
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
400 TRACE_DEBUG(FULL,"Authentication after challenge");
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
401
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
402 /* Search the session, retrieve its data */
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
403 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
404 //int new=0;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
405
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
406 //TRACE_DEBUG(FULL,"new: *%d*",new);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
407 //ASSERT( new == 0 );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
408 CHECK_FCT( fd_sess_state_retrieve( ds_sess_hdl, sess, &storednonce ));
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
409 if(storednonce ==NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
410 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
411 result="DIAMETER_UNABLE_TO_COMPLY";
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
412
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
413 if(username!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
414 free(username);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
415 goto out;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
416 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
417 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
418
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
419 /* Create the SIP-Authentication-Info AVP */
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
420 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
421 CHECK_FCT( fd_msg_avp_new ( sip_dict.SIP_Authentication_Info, 0, &sipAuthentication ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
422 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
423
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
424
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
425
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
426 /* Add the Digest response Auth AVP */
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
427 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
428 //uint8_t bufferresp[DIGEST_LEN];
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
429 //char response[DIGEST_LEN*2+1];
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
430 int i=0;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
431
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
432 //We extract all the data we need
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
433 tempavp=avp;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
434
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
435 char * digest_username=NULL, *digest_uri=NULL, *digest_response=NULL, *digest_realm=NULL, *digest_nonce=NULL, *digest_method=NULL, *digest_qop=NULL, *digest_algorithm=NULL, *digest_cnonce=NULL, *digest_noncecount=NULL;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
436
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
437
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
438 CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_Nonce, &a2 ));
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
439 if(a2!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
440 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
441 CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
442 if(digestheader!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
443 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
444
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
445 digest_nonce = malloc(digestheader->avp_value->os.len + 1);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
446 memcpy(digest_nonce, digestheader->avp_value->os.data,
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
447 digestheader->avp_value->os.len);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
448 digest_nonce[digestheader->avp_value->os.len]='\0';
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
449 TRACE_DEBUG(FULL,"Element:*%s*",digest_nonce);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
450 TRACE_DEBUG(FULL,"Stored Nonce:*%s*",storednonce->nonce);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
451
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
452 if(strcmp(digest_nonce,storednonce->nonce)!=0)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
453 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
454 free(digest_nonce);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
455 free(storednonce->nonce);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
456 free(storednonce);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
457 result="DIAMETER_UNABLE_TO_COMPLY";
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
458
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
459 if(username!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
460 free(username);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
461 goto out;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
462 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
463
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
464 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
465
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
466 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
467 CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_Response, &a2 ));
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
468 if(a2!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
469 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
470 CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
471 if(digestheader!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
472 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
473 digest_response = malloc(digestheader->avp_value->os.len + 1);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
474 memcpy(digest_response, digestheader->avp_value->os.data,
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
475 digestheader->avp_value->os.len);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
476 digest_response[digestheader->avp_value->os.len]='\0';
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
477 TRACE_DEBUG(FULL,"Element:*%s*",digest_response);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
478 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
479
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
480 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
481 CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_Realm, &a2 ));
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
482 if(a2!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
483 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
484 CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
485 if(digestheader!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
486 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
487 digest_realm = malloc(digestheader->avp_value->os.len + 1);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
488 memcpy(digest_realm, digestheader->avp_value->os.data,
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
489 digestheader->avp_value->os.len);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
490 digest_realm[digestheader->avp_value->os.len]='\0';
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
491 TRACE_DEBUG(FULL,"Element:*%s*",digest_realm);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
492 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
493 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
494
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
495 CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_Method, &a2 ));
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
496 if(a2!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
497 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
498 CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
499 if(digestheader!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
500 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
501 digest_method = malloc(digestheader->avp_value->os.len + 1);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
502 memcpy(digest_method, digestheader->avp_value->os.data,
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
503 digestheader->avp_value->os.len);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
504 digest_method[digestheader->avp_value->os.len]='\0';
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
505 TRACE_DEBUG(FULL,"Element:*%s*",digest_method);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
506 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
507 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
508 else
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
509 digest_method="";
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
510
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
511 CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_URI, &a2 ));
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
512 if(a2!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
513 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
514 CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
515 if(digestheader!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
516 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
517 digest_uri = malloc(digestheader->avp_value->os.len + 1);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
518 memcpy(digest_uri, digestheader->avp_value->os.data,
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
519 digestheader->avp_value->os.len);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
520 digest_uri[digestheader->avp_value->os.len]='\0';
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
521 TRACE_DEBUG(FULL,"Element:*%s*",digest_uri);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
522 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
523 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
524
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
525 CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_QOP, &a2 ));
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
526 if(a2!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
527 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
528 CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
529 if(digestheader!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
530 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
531 digest_qop = malloc(digestheader->avp_value->os.len + 1);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
532 memcpy(digest_qop, digestheader->avp_value->os.data,
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
533 digestheader->avp_value->os.len);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
534 digest_qop[digestheader->avp_value->os.len]='\0';
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
535 TRACE_DEBUG(FULL,"Element:*%s*",digest_qop);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
536 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
537 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
538 else
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
539 digest_qop=NULL;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
540 CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_Algorithm, &a2 ));
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
541 if(a2!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
542 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
543 CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
544 if(digestheader!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
545 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
546 digest_algorithm = malloc(digestheader->avp_value->os.len + 1);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
547 memcpy(digest_algorithm, digestheader->avp_value->os.data,
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
548 digestheader->avp_value->os.len);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
549 digest_algorithm[digestheader->avp_value->os.len]='\0';
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
550 TRACE_DEBUG(FULL,"Element:*%s*",digest_algorithm);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
551 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
552 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
553 else
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
554 digest_algorithm=NULL;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
555 CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_CNonce, &a2 ));
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
556 if(a2!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
557 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
558 CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
559 if(digestheader!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
560 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
561 digest_cnonce = malloc(digestheader->avp_value->os.len + 1);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
562 memcpy(digest_cnonce, digestheader->avp_value->os.data,
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
563 digestheader->avp_value->os.len);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
564 digest_cnonce[digestheader->avp_value->os.len]='\0';
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
565 TRACE_DEBUG(FULL,"Element:*%s*",digest_cnonce);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
566 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
567 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
568 else
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
569 digest_cnonce="";
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
570 CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_Nonce_Count, &a2 ));
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
571 if(a2!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
572 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
573 CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
574 if(digestheader!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
575 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
576 digest_noncecount = malloc(digestheader->avp_value->os.len + 1);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
577 memcpy(digest_noncecount, digestheader->avp_value->os.data,
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
578 digestheader->avp_value->os.len);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
579 digest_noncecount[digestheader->avp_value->os.len]='\0';
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
580 TRACE_DEBUG(FULL,"Element:*%s*",digest_noncecount);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
581 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
582 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
583 else
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
584 digest_noncecount="";
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
585 CHECK_FCT(fd_avp_search_avp (avp, sip_dict.Digest_Username, &a2 ));
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
586 if(a2!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
587 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
588 CHECK_FCT( fd_msg_avp_hdr( a2, &digestheader ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
589 if(digestheader!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
590 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
591 digest_username = malloc(digestheader->avp_value->os.len + 1);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
592 memcpy(digest_username, digestheader->avp_value->os.data,
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
593 digestheader->avp_value->os.len);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
594 digest_username[digestheader->avp_value->os.len]='\0';
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
595 TRACE_DEBUG(FULL,"Element:*%s*",digest_username);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
596 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
597 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
598 //TODO: replace by authentication function
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
599
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
600 HASHHEX HA1;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
601 HASHHEX HA2 = "";
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
602 HASHHEX response, responseauth;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
603
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
604
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
605 DigestCalcHA1(digest_algorithm, digest_username, digest_realm, password, digest_nonce,digest_cnonce, HA1);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
606
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
607 DigestCalcResponse(HA1, digest_nonce, digest_noncecount, digest_cnonce, digest_qop,digest_method, digest_uri, HA2, response);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
608
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
609
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
610 // We check that the Digest-Response is the same (UA, Diameter)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
611 if(strcmp(response,digest_response)!=0)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
612 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
613 TRACE_DEBUG(FULL,"Response calculated by Diameter server:%s",response);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
614 TRACE_DEBUG(FULL,"Response calculated by UA:%s",digest_response);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
615 TRACE_DEBUG(INFO,"Digest-Response does not match!");
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
616 result="DIAMETER_UNABLE_TO_COMPLY";
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
617 free(digest_algorithm);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
618 free(digest_cnonce);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
619 free(digest_nonce);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
620 free(digest_noncecount);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
621 free(digest_method);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
622 free(digest_username);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
623 free(digest_uri);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
624 free(digest_qop);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
625 free(digest_response);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
626 free(digest_realm);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
627 free(storednonce->nonce);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
628 free(storednonce);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
629 if(username!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
630 free(username);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
631 goto out;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
632
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
633 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
634 //We calculate Digest_Response_Auth
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
635 DigestCalcResponseAuth(HA1, digest_nonce, digest_noncecount, digest_cnonce, digest_qop,digest_method, digest_uri, HA2, responseauth);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
636
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
637
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
638 if(strcmp(digest_qop,"auth-int")==0)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
639 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
640 //Digest-HA1 MUST be used instead of Digest-Response-Auth if Digest-Qop is 'auth-int'.
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
641 CHECK_FCT( fd_msg_avp_new ( sip_dict.Digest_HA1, 0, &a2 ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
642 val.os.data=HA1;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
643 val.os.len=HASHHEXLEN+1;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
644 CHECK_FCT( fd_msg_avp_setvalue( a2, &val ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
645 CHECK_FCT( fd_msg_avp_add( sipAuthentication, MSG_BRW_LAST_CHILD, a2 ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
646 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
647 else
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
648 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
649 //Digest-Response-Auth MUST be used instead of Digest-HA1 if Digest-Qop is 'auth'.
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
650 CHECK_FCT( fd_msg_avp_new ( sip_dict.Digest_Response_Auth, 0, &a2 ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
651 val.os.data=responseauth;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
652 val.os.len=DIGEST_LEN*2;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
653 CHECK_FCT( fd_msg_avp_setvalue( a2, &val ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
654 CHECK_FCT( fd_msg_avp_add( sipAuthentication, MSG_BRW_LAST_CHILD, a2 ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
655 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
656 free(digest_algorithm);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
657 free(digest_cnonce);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
658 free(digest_nonce);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
659 free(digest_noncecount);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
660 free(digest_method);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
661 free(digest_username);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
662 free(digest_uri);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
663 free(digest_qop);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
664 free(digest_response);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
665 free(digest_realm);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
666 free(storednonce->nonce);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
667 free(storednonce);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
668
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
669 number_of_auth_items++;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
670 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
671
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
672
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
673 //We add SIP Authentication-Info to Auth Data Item
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
674 CHECK_FCT( fd_msg_avp_add( authdataitem, MSG_BRW_LAST_CHILD, sipAuthentication ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
675 //We add Auth Data Item to Answer
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
676 CHECK_FCT( fd_msg_avp_add( ans, MSG_BRW_LAST_CHILD, authdataitem ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
677
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
678
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
679 if(username!=NULL && authenticationpending)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
680 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
681 //We clear the flag "authentication pending"
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
682 querylen=SQL_CLEARFLAG_LEN + usernamelen;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
683 query = malloc(querylen+2);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
684 snprintf(query, querylen+1, SQL_CLEARFLAG, username);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
685
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
686 //We make the query
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
687 request_mysql(query);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
688
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
689 free(query);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
690 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
691
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
692 if(sipurinotstored)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
693 result="DIAMETER_SUCCESS_SERVER_NAME_NOT_STORED";
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
694 else
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
695 result="DIAMETER_SUCCESS";
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
696 found_cnonce=0;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
697 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
698 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
699 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
700 else
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
701 TRACE_DEBUG(INFO,"No auth data items!");
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
702 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
703 /*Add SIP_Number_Auth_Items AVP */
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
704 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
705 CHECK_FCT( fd_msg_avp_new ( sip_dict.SIP_Number_Auth_Items, 0, &avp ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
706 val.i32 = number_of_auth_items;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
707 CHECK_FCT( fd_msg_avp_setvalue ( avp, &val ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
708 CHECK_FCT( fd_msg_avp_add ( ans, MSG_BRW_LAST_CHILD, avp) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
709 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
710
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
711
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
712 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
713 else
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
714 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
715 TRACE_DEBUG(INFO,"We only support DIGEST for now, unable to comply");
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
716 result="DIAMETER_ERROR_AUTH_SCHEME_NOT_SUPPORTED";
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
717 if(username!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
718 free(username);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
719 goto out;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
720 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
721 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
722 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
723 else
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
724 {
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
725 //TODO: remove this because Number_Auth_Items is not compulsory
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
726 TRACE_DEBUG(FULL,"Number-Auth-Items is not included.");
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
727 result="DIAMETER_UNABLE_TO_COMPLY";
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
728 if(username!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
729 free(username);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
730 goto out;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
731 }
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
732
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
733 if(username!=NULL)
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
734 free(username);
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
735
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
736
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
737 out:
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
738 /* Set the Origin-Host, Origin-Realm, Result-Code AVPs */
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
739 CHECK_FCT( fd_msg_rescode_set( ans, result, NULL, NULL, 1 ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
740
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
741
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
742 /* Send the answer */
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
743 CHECK_FCT( fd_msg_send( msg, NULL, NULL ) );
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
744
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
745
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
746 return 0;
1740bee6c821 Initial App_SIP import
Alexandre Westfahl <awestfahl@freediameter.net>
parents:
diff changeset
747 }
"Welcome to our mercurial repository"