AST_STIR_SHAKEN_VS_NO_DEST_TN,
AST_STIR_SHAKEN_VS_INVALID_HEADER,
AST_STIR_SHAKEN_VS_INVALID_GRANT,
+ AST_STIR_SHAKEN_VS_INVALID_OR_NO_CID,
AST_STIR_SHAKEN_VS_RESPONSE_CODE_MAX
};
int ast_stir_shaken_vs_get_use_rfc9410_responses(
struct ast_stir_shaken_vs_ctx *ctx);
+/*!
+ * \brief Get caller_id from context
+ *
+ * \param ctx VS context
+ *
+ * \retval Caller ID or NULL
+ */
+const char *ast_stir_shaken_vs_get_caller_id(
+ struct ast_stir_shaken_vs_ctx *ctx);
+
/*!
* \brief Add a STIR/SHAKEN verification result to a channel
*
SIP_RESPONSE_CODE_OK = 200,
SIP_RESPONSE_CODE_STALE_DATE = 403,
SIP_RESPONSE_CODE_USE_IDENTITY_HEADER = 428,
+ SIP_RESPONSE_CODE_ANONYMITY_DISALLOWED = 433,
SIP_RESPONSE_CODE_BAD_IDENTITY_INFO = 436,
SIP_RESPONSE_CODE_UNSUPPORTED_CREDENTIAL = 437,
SIP_RESPONSE_CODE_INVALID_IDENTITY_HEADER = 438,
- SIP_RESPONSE_CODE_USE_SUPPORTED_PASSPORT_FORMAT = 428,
SIP_RESPONSE_CODE_INTERNAL_ERROR = 500,
};
/* Response strings from RFC8224 */
#define SIP_RESPONSE_CODE_STALE_DATE_STR "Stale Date"
#define SIP_RESPONSE_CODE_USE_IDENTITY_HEADER_STR "Use Identity Header"
-#define SIP_RESPONSE_CODE_USE_SUPPORTED_PASSPORT_FORMAT_STR "Use Supported PASSporT Format"
+#define SIP_RESPONSE_CODE_ANONYMITY_DISALLOWED_STR "Anonymity Disallowed"
#define SIP_RESPONSE_CODE_BAD_IDENTITY_INFO_STR "Bad Identity Info"
#define SIP_RESPONSE_CODE_UNSUPPORTED_CREDENTIAL_STR "Unsupported Credential"
#define SIP_RESPONSE_CODE_INVALID_IDENTITY_HEADER_STR "Invalid Identity Header"
response_to_str(SIP_RESPONSE_CODE_OK)
response_to_str(SIP_RESPONSE_CODE_STALE_DATE)
response_to_str(SIP_RESPONSE_CODE_USE_IDENTITY_HEADER)
+ response_to_str(SIP_RESPONSE_CODE_ANONYMITY_DISALLOWED)
response_to_str(SIP_RESPONSE_CODE_BAD_IDENTITY_INFO)
response_to_str(SIP_RESPONSE_CODE_UNSUPPORTED_CREDENTIAL)
response_to_str(SIP_RESPONSE_CODE_INVALID_IDENTITY_HEADER)
translate_code(INVALID_GRANT, INVALID_IDENTITY_HEADER)
translate_code(INVALID_OR_NO_GRANTS, INVALID_IDENTITY_HEADER)
translate_code(CID_ORIG_TN_MISMATCH, INVALID_IDENTITY_HEADER)
+ translate_code(INVALID_OR_NO_CID, ANONYMITY_DISALLOWED)
translate_code(RESPONSE_CODE_MAX, INVALID_IDENTITY_HEADER)
}
}
/*
- * Shortcut: If there's no callerid or profile name,
- * just bail now.
+ * Shortcut: If there's no profile name just bail now.
*/
- if (ast_strlen_zero(caller_id)
- || ast_strlen_zero(session->endpoint->stir_shaken_profile)) {
- SCOPE_EXIT_RTN_VALUE(0, "%s: No callerid or profile name. No action needed\n", session_name);
+ if (ast_strlen_zero(session->endpoint->stir_shaken_profile)) {
+ SCOPE_EXIT_RTN_VALUE(0, "%s: No profile name on endpoint. No action needed\n", session_name);
}
vs_rc = ast_stir_shaken_vs_ctx_create(caller_id, chan,
session_name);
}
+ if (ast_strlen_zero(ast_stir_shaken_vs_get_caller_id(ctx))) {
+ p_rc = process_failure(ctx, caller_id, session, rdata,
+ AST_STIR_SHAKEN_VS_INVALID_OR_NO_CID);
+ if (p_rc == PROCESS_FAILURE_CONTINUE) {
+ SCOPE_EXIT_RTN_VALUE(0, "%s: Invalid or no callerid found. Call continuing\n",
+ session_name);
+ }
+ SCOPE_EXIT_LOG_RTN_VALUE(1, LOG_ERROR, "%s: Invalid or no callerid found. Call terminated\n",
+ session_name);
+ }
+
identity_hdr_val = ast_sip_rdata_get_header_value(rdata, identity_hdr_str);
if (ast_strlen_zero(identity_hdr_val)) {
p_rc = process_failure(ctx, caller_id, session, rdata,
[AST_STIR_SHAKEN_VS_NO_DEST_TN] = "missing_dest_tn",
[AST_STIR_SHAKEN_VS_INVALID_HEADER] = "invalid_header",
[AST_STIR_SHAKEN_VS_INVALID_GRANT] = "invalid_grant",
+ [AST_STIR_SHAKEN_VS_INVALID_OR_NO_CID] = "invalid_or_no_callerid",
};
const char *vs_response_code_to_str(
return ctx->eprofile->vcfg_common.use_rfc9410_responses;
}
+const char *ast_stir_shaken_vs_get_caller_id(
+ struct ast_stir_shaken_vs_ctx *ctx)
+{
+ return ctx->caller_id;
+}
+
void ast_stir_shaken_vs_ctx_set_response_code(
struct ast_stir_shaken_vs_ctx *ctx,
enum ast_stir_shaken_vs_response_code vs_rc)
LOG_ERROR, "%s: Must provide tag\n", t);
}
- if (ast_strlen_zero(canon_caller_id)) {
- SCOPE_EXIT_LOG_RTN_VALUE(AST_STIR_SHAKEN_VS_INVALID_ARGUMENTS,
- LOG_ERROR, "%s: Must provide caller_id\n", t);
- }
-
ctx = ao2_alloc_options(sizeof(*ctx), ctx_destructor,
AO2_ALLOC_OPT_LOCK_NOLOCK);
if (!ctx) {