Asterisk - The Open Source Telephony Project  18.5.0
Macros | Functions | Variables
res_pjsip_endpoint_identifier_anonymous.c File Reference
#include "asterisk.h"
#include <pjsip.h>
#include "asterisk/res_pjsip.h"
#include "asterisk/module.h"
Include dependency graph for res_pjsip_endpoint_identifier_anonymous.c:

Go to the source code of this file.

Macros

#define DOMAIN_NAME_LEN   255
 

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
static struct ast_sip_endpointanonymous_identify (pjsip_rx_data *rdata)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static int find_transport_state_in_use (void *obj, void *arg, int flags)
 
static int get_endpoint_details (pjsip_rx_data *rdata, char *domain, size_t domain_size)
 
static int load_module (void)
 
static int unload_module (void)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "PJSIP Anonymous endpoint identifier" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "30ef0c93b36035ec78c9cfd712d36d9b" , .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .requires = "res_pjsip", }
 
static struct ast_sip_endpoint_identifier anonymous_identifier
 
static const struct ast_module_infoast_module_info = &__mod_info
 

Macro Definition Documentation

◆ DOMAIN_NAME_LEN

#define DOMAIN_NAME_LEN   255

Definition at line 60 of file res_pjsip_endpoint_identifier_anonymous.c.

Referenced by anonymous_identify().

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 144 of file res_pjsip_endpoint_identifier_anonymous.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 144 of file res_pjsip_endpoint_identifier_anonymous.c.

◆ anonymous_identify()

static struct ast_sip_endpoint* anonymous_identify ( pjsip_rx_data *  rdata)
static

Definition at line 62 of file res_pjsip_endpoint_identifier_anonymous.c.

References ao2_callback, ao2_cleanup, ao2_ref, ast_debug, ast_sip_get_disable_multi_domain(), ast_sip_get_sorcery(), ast_sip_get_transport_states(), ast_sorcery_object_get_id(), ast_sorcery_retrieve_by_id(), ast_strlen_zero, ast_sip_transport::domain, ast_sip_domain_alias::domain, DOMAIN_NAME_LEN, done, find_transport_state_in_use(), get_endpoint_details(), ast_sip_transport_state::id, NULL, and transport_states.

63 {
64  char domain_name[DOMAIN_NAME_LEN + 1];
65  struct ast_sip_endpoint *endpoint;
66 
67  if (get_endpoint_details(rdata, domain_name, sizeof(domain_name))) {
68  return NULL;
69  }
70 
72  struct ast_sip_domain_alias *alias;
74  struct ast_sip_transport_state *transport_state = NULL;
75  struct ast_sip_transport *transport = NULL;
76  char id[sizeof("anonymous@") + DOMAIN_NAME_LEN];
77 
78  /* Attempt to find the endpoint given the name and domain provided */
79  snprintf(id, sizeof(id), "anonymous@%s", domain_name);
80  endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", id);
81  if (endpoint) {
82  goto done;
83  }
84 
85  /* See if an alias exists for the domain provided */
86  alias = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "domain_alias",
87  domain_name);
88  if (alias) {
89  snprintf(id, sizeof(id), "anonymous@%s", alias->domain);
90  ao2_ref(alias, -1);
91  endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", id);
92  if (endpoint) {
93  goto done;
94  }
95  }
96 
97  /* See if the transport this came in on has a provided domain */
98  if ((transport_states = ast_sip_get_transport_states())
99  && (transport_state = ao2_callback(transport_states, 0, find_transport_state_in_use, rdata))
100  && (transport = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "transport", transport_state->id))
101  && !ast_strlen_zero(transport->domain)) {
102  snprintf(id, sizeof(id), "anonymous@%s", transport->domain);
103  endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", id);
104  }
105  ao2_cleanup(transport);
106  ao2_cleanup(transport_state);
107  ao2_cleanup(transport_states);
108  if (endpoint) {
109  goto done;
110  }
111  }
112 
113  /* Fall back to no domain */
114  endpoint = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", "anonymous");
115 
116 done:
117  if (endpoint) {
118  ast_debug(3, "Retrieved anonymous endpoint '%s'\n", ast_sorcery_object_get_id(endpoint));
119  }
120  return endpoint;
121 }
#define ao2_callback(c, flags, cb_fn, arg)
Definition: astobj2.h:1716
static struct ao2_container * transport_states
#define NULL
Definition: resample.c:96
#define ast_strlen_zero(foo)
Definition: strings.h:52
void * ast_sorcery_retrieve_by_id(const struct ast_sorcery *sorcery, const char *type, const char *id)
Retrieve an object using its unique identifier.
Definition: sorcery.c:1853
int done
Definition: test_amihooks.c:48
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
Structure for SIP transport information.
Definition: res_pjsip.h:87
#define ao2_ref(o, delta)
Definition: astobj2.h:464
const char * ast_sorcery_object_get_id(const void *object)
Get the unique identifier of a sorcery object.
Definition: sorcery.c:2312
unsigned int ast_sip_get_disable_multi_domain(void)
Retrieve the system setting &#39;disable multi domain&#39;.
An entity with which Asterisk communicates.
Definition: res_pjsip.h:812
struct ao2_container * ast_sip_get_transport_states(void)
Retrieves all transport states.
Transport to bind to.
Definition: res_pjsip.h:171
static int find_transport_state_in_use(void *obj, void *arg, int flags)
const ast_string_field domain
Definition: res_pjsip.h:191
static int get_endpoint_details(pjsip_rx_data *rdata, char *domain, size_t domain_size)
const ast_string_field domain
Definition: res_pjsip.h:265
struct ast_sorcery * ast_sip_get_sorcery(void)
Get a pointer to the SIP sorcery structure.
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
Generic container type.

◆ AST_MODULE_SELF_SYM()

struct ast_module* AST_MODULE_SELF_SYM ( void  )

Definition at line 144 of file res_pjsip_endpoint_identifier_anonymous.c.

◆ find_transport_state_in_use()

static int find_transport_state_in_use ( void *  obj,
void *  arg,
int  flags 
)
static

Definition at line 45 of file res_pjsip_endpoint_identifier_anonymous.c.

References CMP_MATCH, ast_sip_transport_state::factory, and ast_sip_transport_state::transport.

Referenced by anonymous_identify().

46 {
47  struct ast_sip_transport_state *transport_state = obj;
48  pjsip_rx_data *rdata = arg;
49 
50  if (transport_state->transport == rdata->tp_info.transport
51  || (transport_state->factory
52  && !pj_strcmp(&transport_state->factory->addr_name.host, &rdata->tp_info.transport->local_name.host)
53  && transport_state->factory->addr_name.port == rdata->tp_info.transport->local_name.port)) {
54  return CMP_MATCH;
55  }
56 
57  return 0;
58 }
Structure for SIP transport information.
Definition: res_pjsip.h:87
struct pjsip_transport * transport
Transport itself.
Definition: res_pjsip.h:89
struct pjsip_tpfactory * factory
Transport factory.
Definition: res_pjsip.h:91

◆ get_endpoint_details()

static int get_endpoint_details ( pjsip_rx_data *  rdata,
char *  domain,
size_t  domain_size 
)
static

Definition at line 33 of file res_pjsip_endpoint_identifier_anonymous.c.

References ast_copy_pj_str().

Referenced by anonymous_identify().

34 {
35  pjsip_uri *from = rdata->msg_info.from->uri;
36  pjsip_sip_uri *sip_from;
37  if (!PJSIP_URI_SCHEME_IS_SIP(from) && !PJSIP_URI_SCHEME_IS_SIPS(from)) {
38  return -1;
39  }
40  sip_from = (pjsip_sip_uri *) pjsip_uri_get_uri(from);
41  ast_copy_pj_str(domain, &sip_from->host, domain_size);
42  return 0;
43 }
void ast_copy_pj_str(char *dest, const pj_str_t *src, size_t size)
Copy a pj_str_t into a standard character buffer.
Definition: res_pjsip.c:5240
Domain data structure.
Definition: sip.h:888

◆ load_module()

static int load_module ( void  )
static

Definition at line 127 of file res_pjsip_endpoint_identifier_anonymous.c.

References AST_MODULE_LOAD_SUCCESS, and ast_sip_register_endpoint_identifier_with_name().

Referenced by unload_module().

128 {
131 }
static struct ast_sip_endpoint_identifier anonymous_identifier
int ast_sip_register_endpoint_identifier_with_name(struct ast_sip_endpoint_identifier *identifier, const char *name)
Register a SIP endpoint identifier with a name.
Definition: res_pjsip.c:3431

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 133 of file res_pjsip_endpoint_identifier_anonymous.c.

References AST_MODFLAG_DEFAULT, AST_MODULE_INFO(), AST_MODULE_SUPPORT_CORE, ast_sip_unregister_endpoint_identifier(), ASTERISK_GPL_KEY, and load_module().

134 {
136  return 0;
137 }
static struct ast_sip_endpoint_identifier anonymous_identifier
void ast_sip_unregister_endpoint_identifier(struct ast_sip_endpoint_identifier *identifier)
Unregister a SIP endpoint identifier.
Definition: res_pjsip.c:3513

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "PJSIP Anonymous endpoint identifier" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "30ef0c93b36035ec78c9cfd712d36d9b" , .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .requires = "res_pjsip", }
static

Definition at line 144 of file res_pjsip_endpoint_identifier_anonymous.c.

◆ anonymous_identifier

struct ast_sip_endpoint_identifier anonymous_identifier
static
Initial value:
= {
.identify_endpoint = anonymous_identify,
}
static struct ast_sip_endpoint * anonymous_identify(pjsip_rx_data *rdata)

Definition at line 123 of file res_pjsip_endpoint_identifier_anonymous.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 144 of file res_pjsip_endpoint_identifier_anonymous.c.