res_pjsip: Added "subscribe_context" to endpoint

If specified, incoming SUBSCRIBE requests will be searched for the matching
extension in the indicated context. If no "subscribe_context" is specified,
then the "context" setting is used.

ASTERISK-25471 #close

Change-Id: I3fb7a15f5bc154079bd348c08b7ad1cdd2d5e514
changes/48/3148/1
Alexei Gradinari 9 years ago
parent 9e10aa8496
commit 1c949eea6c

@ -360,6 +360,17 @@ cdr_csv
post-1.8 CDR columns 'peeraccount', 'linkedid', and 'sequence'. post-1.8 CDR columns 'peeraccount', 'linkedid', and 'sequence'.
------------------------------------------------------------------------------
--- Functionality changes from Asterisk 13.10.0 to Asterisk 13.11.0 ----------
------------------------------------------------------------------------------
res_pjsip
------------------
* Added "subscribe_context" to endpoint.
If specified, incoming SUBSCRIBE requests will be searched for the matching
extension in the indicated context. If no "subscribe_context" is specified,
then the "context" setting is used.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
--- Functionality changes from Asterisk 13.9.0 to Asterisk 13.10.0 ----------- --- Functionality changes from Asterisk 13.9.0 to Asterisk 13.10.0 -----------
------------------------------------------------------------------------------ ------------------------------------------------------------------------------

@ -0,0 +1,21 @@
"""pjsip_add_subscribe_context
Revision ID: 9deac0ae4717
Revises: ef7efc2d3964
Create Date: 2016-07-04 12:11:28.117788
"""
# revision identifiers, used by Alembic.
revision = '9deac0ae4717'
down_revision = 'ef7efc2d3964'
from alembic import op
import sqlalchemy as sa
def upgrade():
op.add_column('ps_endpoints', sa.Column('subscribe_context', sa.String(40)))
def downgrade():
op.drop_column('ps_endpoints', 'subscribe_context')

@ -505,6 +505,8 @@ struct ast_sip_endpoint_subscription_configuration {
unsigned int minexpiry; unsigned int minexpiry;
/*! Message waiting configuration */ /*! Message waiting configuration */
struct ast_sip_mwi_configuration mwi; struct ast_sip_mwi_configuration mwi;
/* Context for SUBSCRIBE requests */
char context[AST_MAX_CONTEXT];
}; };
/*! /*!

@ -900,6 +900,15 @@
mask with a slash ('/') mask with a slash ('/')
</para></description> </para></description>
</configOption> </configOption>
<configOption name="subscribe_context">
<synopsis>Context for incoming MESSAGE requests.</synopsis>
<description><para>
If specified, incoming SUBSCRIBE requests will be searched for the matching
extension in the indicated context.
If no <replaceable>subscribe_context</replaceable> is specified,
then the <replaceable>context</replaceable> setting is used.
</para></description>
</configOption>
</configObject> </configObject>
<configObject name="auth"> <configObject name="auth">
<synopsis>Authentication type</synopsis> <synopsis>Authentication type</synopsis>
@ -1964,6 +1973,9 @@
<parameter name="ActiveChannels"> <parameter name="ActiveChannels">
<para>The number of active channels associated with this endpoint.</para> <para>The number of active channels associated with this endpoint.</para>
</parameter> </parameter>
<parameter name="SubscribeContext">
<para><xi:include xpointer="xpointer(/docs/configInfo[@name='res_pjsip']/configFile[@name='pjsip.conf']/configObject[@name='endpoint']/configOption[@name='subscribe_context']/synopsis/node())"/></para>
</parameter>
</syntax> </syntax>
</managerEventInstance> </managerEventInstance>
</managerEvent> </managerEvent>

@ -1859,6 +1859,7 @@ int ast_res_pjsip_initialize_configuration(void)
ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "contact_deny", "", endpoint_acl_handler, NULL, NULL, 0, 0); ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "contact_deny", "", endpoint_acl_handler, NULL, NULL, 0, 0);
ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "contact_permit", "", endpoint_acl_handler, NULL, NULL, 0, 0); ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "contact_permit", "", endpoint_acl_handler, NULL, NULL, 0, 0);
ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "contact_acl", "", endpoint_acl_handler, contact_acl_to_str, NULL, 0, 0); ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "contact_acl", "", endpoint_acl_handler, contact_acl_to_str, NULL, 0, 0);
ast_sorcery_object_field_register(sip_sorcery, "endpoint", "subscribe_context", "", OPT_CHAR_ARRAY_T, 0, CHARFLDSET(struct ast_sip_endpoint, subscription.context));
if (ast_sip_initialize_sorcery_transport()) { if (ast_sip_initialize_sorcery_transport()) {
ast_log(LOG_ERROR, "Failed to register SIP transport support with sorcery\n"); ast_log(LOG_ERROR, "Failed to register SIP transport support with sorcery\n");

@ -412,9 +412,11 @@ static void subscription_shutdown(struct ast_sip_subscription *sub)
static int new_subscribe(struct ast_sip_endpoint *endpoint, static int new_subscribe(struct ast_sip_endpoint *endpoint,
const char *resource) const char *resource)
{ {
if (!ast_exists_extension(NULL, endpoint->context, resource, PRIORITY_HINT, NULL)) { const char *context = S_OR(endpoint->subscription.context, endpoint->context);
if (!ast_exists_extension(NULL, context, resource, PRIORITY_HINT, NULL)) {
ast_log(LOG_NOTICE, "Extension state subscription failed: Extension %s does not exist in context '%s' or has no associated hint\n", ast_log(LOG_NOTICE, "Extension state subscription failed: Extension %s does not exist in context '%s' or has no associated hint\n",
resource, endpoint->context); resource, context);
return 404; return 404;
} }
@ -432,7 +434,9 @@ static int subscription_established(struct ast_sip_subscription *sip_sub)
return -1; return -1;
} }
ast_copy_string(exten_state_sub->context, endpoint->context, sizeof(exten_state_sub->context)); ast_copy_string(exten_state_sub->context,
S_OR(endpoint->subscription.context, endpoint->context),
sizeof(exten_state_sub->context));
ast_copy_string(exten_state_sub->exten, resource, sizeof(exten_state_sub->exten)); ast_copy_string(exten_state_sub->exten, resource, sizeof(exten_state_sub->exten));
if ((exten_state_sub->id = ast_extension_state_add_destroy_extended( if ((exten_state_sub->id = ast_extension_state_add_destroy_extended(

Loading…
Cancel
Save