return check_user_full(p, req, sipmethod, uri, reliable, addr, NULL);
}
+static void send_check_user_failure_response(struct sip_pvt *p, struct sip_request *req, int res, enum xmittype reliable)
+{
+ const char *response;
+
+ switch (res) {
+ case AUTH_SECRET_FAILED:
+ case AUTH_USERNAME_MISMATCH:
+ case AUTH_NOT_FOUND:
+ case AUTH_UNKNOWN_DOMAIN:
+ case AUTH_PEER_NOT_DYNAMIC:
+ case AUTH_BAD_TRANSPORT:
+ ast_log(LOG_NOTICE, "Failed to authenticate device %s for %s, code = %d\n",
+ sip_get_header(req, "From"), sip_methods[p->method].text, res);
+ response = "403 Forbidden";
+ break;
+ case AUTH_SESSION_LIMIT:
+ /* Unexpected here, actually. As it's handled elsewhere. */
+ ast_log(LOG_NOTICE, "Call limit reached for device %s for %s, code = %d\n",
+ sip_get_header(req, "From"), sip_methods[p->method].text, res);
+ response = "480 Temporarily Unavailable";
+ break;
+ case AUTH_RTP_FAILED:
+ /* We don't want to send a 403 in the RTP_FAILED case.
+ * The cause could be any one of:
+ * - out of memory or rtp ports
+ * - dtls/srtp requested but not loaded/invalid
+ * Neither of them warrant a 403. A 503 makes more
+ * sense, as this node is broken/overloaded. */
+ ast_log(LOG_NOTICE, "RTP init failure for device %s for %s, code = %d\n",
+ sip_get_header(req, "From"), sip_methods[p->method].text, res);
+ response = "503 Service Unavailable";
+ break;
+ case AUTH_SUCCESSFUL:
+ case AUTH_CHALLENGE_SENT:
+ /* These should have been handled elsewhere. */
+ default:
+ ast_log(LOG_NOTICE, "Unexpected error for device %s for %s, code = %d\n",
+ sip_get_header(req, "From"), sip_methods[p->method].text, res);
+ response = "503 Service Unavailable";
+ }
+
+ if (reliable == XMIT_RELIABLE) {
+ transmit_response_reliable(p, response, req);
+ } else if (reliable == XMIT_UNRELIABLE) {
+ transmit_response(p, response, req);
+ }
+}
+
static int set_message_vars_from_req(struct ast_msg *msg, struct sip_request *req)
{
size_t x;
return;
}
if (res < 0) { /* Something failed in authentication */
- ast_log(LOG_NOTICE, "Failed to authenticate device %s\n", sip_get_header(req, "From"));
- transmit_response(p, "403 Forbidden", req);
+ send_check_user_failure_response(p, req, res, XMIT_UNRELIABLE);
sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
return;
}
return 0;
}
if (res < 0) { /* Something failed in authentication */
- ast_log(LOG_NOTICE, "Failed to authenticate device %s\n", sip_get_header(req, "From"));
- transmit_response(p, "403 Forbidden", req);
+ send_check_user_failure_response(p, req, res, XMIT_UNRELIABLE);
sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
return 0;
}
goto request_invite_cleanup;
}
if (res < 0) { /* Something failed in authentication */
- ast_log(LOG_NOTICE, "Failed to authenticate device %s\n", sip_get_header(req, "From"));
- transmit_response_reliable(p, "403 Forbidden", req);
+ send_check_user_failure_response(p, req, res, XMIT_RELIABLE);
p->invitestate = INV_COMPLETED;
sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
goto request_invite_cleanup;
p->lastinvite = seqno;
return 0;
} else if (auth_result < 0) {
- ast_log(LOG_NOTICE, "Failed to authenticate device %s\n", sip_get_header(req, "From"));
- transmit_response(p, "403 Forbidden", req);
+ send_check_user_failure_response(p, req, auth_result, XMIT_UNRELIABLE);
sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
ast_string_field_set(p, theirtag, NULL);
return 0;
if (res == AUTH_CHALLENGE_SENT) /* authpeer = NULL here */
return 0;
if (res != AUTH_SUCCESSFUL) {
- ast_log(LOG_NOTICE, "Failed to authenticate device %s for SUBSCRIBE\n", sip_get_header(req, "From"));
- transmit_response(p, "403 Forbidden", req);
-
+ send_check_user_failure_response(p, req, res, XMIT_UNRELIABLE);
pvt_set_needdestroy(p, "authentication failed");
return 0;
}