add_work(&p_s_delete, delete_event, this, 0);
p_s_handle = 0;
p_s_magic = 0;
- memset(&p_s_auth_nonce, 0, sizeof(p_s_auth_nonce));
memset(&p_s_rtp_fd, 0, sizeof(p_s_rtp_fd));
memset(&p_s_rtcp_fd, 0, sizeof(p_s_rtcp_fd));
memset(&p_s_rtp_sin_local, 0, sizeof(p_s_rtp_sin_local));
authorization = sip->sip_authorization;
status = check_authorization(authorization, "REGISTER", inst->auth_user, inst->auth_password, inst->auth_realm, inst->auth_nonce, &auth_text);
if (status == 401) {
- generate_nonce(inst->auth_nonce);
+ if (!inst->auth_nonce[0])
+ generate_nonce(inst->auth_nonce);
SPRINT(auth_str, "Digest realm=\"%s\", nonce=\"%s\", algorithm=MD5, qop=\"auth\"", inst->auth_realm, inst->auth_nonce);
}
} else {
if (status == 200) {
SCPY(inst->remote_peer, uri);
- inst->auth_nonce[0] = '\0';
}
sip_trace_header(NULL, inst->interface_name, "RESPOND", DIRECTION_OUT);
PDEBUG(DEBUG_SIP, "invite received (%s->%s)\n", from, to);
sip_trace_header(this, inst->interface_name, "Authorization", DIRECTION_IN);
- if (inst->auth_realm[0]) {
+ if (inst->auth_realm[0] || p_state != PORT_STATE_IDLE) {
+ /* only authenticate remote, if we have a realm set and we don't have re-invite */
authorization = sip->sip_proxy_authorization;
- status = check_authorization(authorization, "INVITE", inst->auth_user, inst->auth_password, inst->auth_realm, p_s_auth_nonce, &auth_text);
- if (status == 401) {
- generate_nonce(p_s_auth_nonce);
- SPRINT(auth_str, "Digest realm=\"%s\", nonce=\"%s\", algorithm=MD5, qop=\"auth\"", inst->auth_realm, p_s_auth_nonce);
+ status = check_authorization(authorization, "INVITE", inst->auth_user, inst->auth_password, inst->auth_realm, inst->auth_nonce, &auth_text);
+ if (status == 407) {
+ if (!inst->auth_nonce[0])
+ generate_nonce(inst->auth_nonce);
+ SPRINT(auth_str, "Digest realm=\"%s\", nonce=\"%s\", algorithm=MD5, qop=\"auth\"", inst->auth_realm, inst->auth_nonce);
}
} else {
status = 200;
end_trace();
if (status == 200) {
- p_s_auth_nonce[0] = '\0';
+ } else {
+ sip_trace_header(this, inst->interface_name, "INVITE", DIRECTION_IN);
+ end_trace();
+
+ sip_trace_header(this, inst->interface_name, "RESPOND", DIRECTION_OUT);
+ add_trace("respond", "value", "%d", status);
+ add_trace("reason", NULL, "peer invited");
+ end_trace();
+
+ nua_respond(nh, status, auth_text, SIPTAG_CONTACT(sip->sip_contact), TAG_IF(auth_str[0], SIPTAG_PROXY_AUTHENTICATE_STR(auth_str)), TAG_END());
+ new_state(PORT_STATE_RELEASE);
+ trigger_work(&p_s_delete);
+ return;
}
sip_trace_header(this, inst->interface_name, "Payload received", DIRECTION_NONE);
add_trace("respond", "value", "%d", status);
end_trace();
+ if (status == 401 || status == 407) {
+ PDEBUG(DEBUG_SIP, "Invite challenge received\n");
+ challenge(inst, this, status, phrase, nua, magic, nh, hmagic, sip, tags);
+ return;
+ }
+
/* connect audio */
if (status == 183 || (status >= 200 && status <= 299)) {
int ret;
struct sip_inst *inst = (struct sip_inst *) magic;
class Port *port;
class Psip *psip = NULL;
- int rc;
PDEBUG(DEBUG_SIP, "Event %d from SIP stack received (handle=%p)\n", event, nh);
if (!nh)
return;
}
- switch (status) {
- case 401:
- case 407:
- rc = challenge(inst, psip, status, phrase, nua, magic, nh, hmagic, sip, tags);
- if (rc >= 0)
- return;
- }
-
switch (event) {
case nua_r_set_params:
PDEBUG(DEBUG_SIP, "setparam response\n");