aboutsummaryrefslogtreecommitdiffstats
path: root/main/manager.c
diff options
context:
space:
mode:
Diffstat (limited to 'main/manager.c')
-rw-r--r--main/manager.c91
1 files changed, 67 insertions, 24 deletions
diff --git a/main/manager.c b/main/manager.c
index dffe92a15..5c8f893af 100644
--- a/main/manager.c
+++ b/main/manager.c
@@ -1984,7 +1984,8 @@ static enum ast_security_event_transport_type mansession_get_transport(const str
static struct sockaddr_in *mansession_encode_sin_local(const struct mansession *s,
struct sockaddr_in *sin_local)
{
- *sin_local = s->tcptls_session->parent->local_address;
+ ast_sockaddr_to_sin(&s->tcptls_session->parent->local_address,
+ sin_local);
return sin_local;
}
@@ -4598,14 +4599,18 @@ static int do_message(struct mansession *s)
static void *session_do(void *data)
{
struct ast_tcptls_session_instance *ser = data;
- struct mansession_session *session = build_mansession(ser->remote_address);
+ struct mansession_session *session;
struct mansession s = {
.tcptls_session = data,
};
int flags;
int res;
+ struct sockaddr_in ser_remote_address_tmp;
struct protoent *p;
+ ast_sockaddr_to_sin(&ser->remote_address, &ser_remote_address_tmp);
+ session = build_mansession(ser_remote_address_tmp);
+
if (session == NULL) {
goto done;
}
@@ -4640,7 +4645,7 @@ static void *session_do(void *data)
/* these fields duplicate those in the 'ser' structure */
session->fd = s.fd = ser->fd;
session->f = s.f = ser->f;
- session->sin = ser->remote_address;
+ session->sin = ser_remote_address_tmp;
s.session = session;
AST_LIST_HEAD_INIT_NOLOCK(&session->datastores);
@@ -5912,17 +5917,35 @@ out_401:
static int manager_http_callback(struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
{
- return generic_http_callback(ser, method, FORMAT_HTML, &ser->remote_address, uri, get_params, headers);
+ int retval;
+ struct sockaddr_in ser_remote_address_tmp;
+
+ ast_sockaddr_to_sin(&ser->remote_address, &ser_remote_address_tmp);
+ retval = generic_http_callback(ser, method, FORMAT_HTML, &ser_remote_address_tmp, uri, get_params, headers);
+ ast_sockaddr_from_sin(&ser->remote_address, &ser_remote_address_tmp);
+ return retval;
}
static int mxml_http_callback(struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
{
- return generic_http_callback(ser, method, FORMAT_XML, &ser->remote_address, uri, get_params, headers);
+ int retval;
+ struct sockaddr_in ser_remote_address_tmp;
+
+ ast_sockaddr_to_sin(&ser->remote_address, &ser_remote_address_tmp);
+ retval = generic_http_callback(ser, method, FORMAT_XML, &ser_remote_address_tmp, uri, get_params, headers);
+ ast_sockaddr_from_sin(&ser->remote_address, &ser_remote_address_tmp);
+ return retval;
}
static int rawman_http_callback(struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
{
- return generic_http_callback(ser, method, FORMAT_RAW, &ser->remote_address, uri, get_params, headers);
+ int retval;
+ struct sockaddr_in ser_remote_address_tmp;
+
+ ast_sockaddr_to_sin(&ser->remote_address, &ser_remote_address_tmp);
+ retval = generic_http_callback(ser, method, FORMAT_RAW, &ser_remote_address_tmp, uri, get_params, headers);
+ ast_sockaddr_from_sin(&ser->remote_address, &ser_remote_address_tmp);
+ return retval;
}
static struct ast_http_uri rawmanuri = {
@@ -5953,17 +5976,35 @@ static struct ast_http_uri managerxmluri = {
/* Callback with Digest authentication */
static int auth_manager_http_callback(struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
{
- return auth_http_callback(ser, method, FORMAT_HTML, &ser->remote_address, uri, get_params, headers);
+ int retval;
+ struct sockaddr_in ser_remote_address_tmp;
+
+ ast_sockaddr_to_sin(&ser->remote_address, &ser_remote_address_tmp);
+ retval = auth_http_callback(ser, method, FORMAT_HTML, &ser_remote_address_tmp, uri, get_params, headers);
+ ast_sockaddr_from_sin(&ser->remote_address, &ser_remote_address_tmp);
+ return retval;
}
static int auth_mxml_http_callback(struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
{
- return auth_http_callback(ser, method, FORMAT_XML, &ser->remote_address, uri, get_params, headers);
+ int retval;
+ struct sockaddr_in ser_remote_address_tmp;
+
+ ast_sockaddr_to_sin(&ser->remote_address, &ser_remote_address_tmp);
+ retval = auth_http_callback(ser, method, FORMAT_XML, &ser_remote_address_tmp, uri, get_params, headers);
+ ast_sockaddr_from_sin(&ser->remote_address, &ser_remote_address_tmp);
+ return retval;
}
static int auth_rawman_http_callback(struct ast_tcptls_session_instance *ser, const struct ast_http_uri *urih, const char *uri, enum ast_http_method method, struct ast_variable *get_params, struct ast_variable *headers)
{
- return auth_http_callback(ser, method, FORMAT_RAW, &ser->remote_address, uri, get_params, headers);
+ int retval;
+ struct sockaddr_in ser_remote_address_tmp;
+
+ ast_sockaddr_to_sin(&ser->remote_address, &ser_remote_address_tmp);
+ retval = auth_http_callback(ser, method, FORMAT_RAW, &ser_remote_address_tmp, uri, get_params, headers);
+ ast_sockaddr_from_sin(&ser->remote_address, &ser_remote_address_tmp);
+ return retval;
}
static struct ast_http_uri arawmanuri = {
@@ -6049,12 +6090,10 @@ static char *handle_manager_show_settings(struct ast_cli_entry *e, int cmd, stru
ast_cli(a->fd, "----------------\n");
ast_cli(a->fd, FORMAT, "Manager (AMI):", AST_CLI_YESNO(manager_enabled));
ast_cli(a->fd, FORMAT, "Web Manager (AMI/HTTP):", AST_CLI_YESNO(webmanager_enabled));
- ast_cli(a->fd, FORMAT, "TCP Bindaddress:", ast_inet_ntoa(ami_desc.local_address.sin_addr));
- ast_cli(a->fd, FORMAT2, "TCP Port:", ntohs(ami_desc.local_address.sin_port));
+ ast_cli(a->fd, FORMAT, "TCP Bindaddress:", ast_sockaddr_stringify(&ami_desc.local_address));
ast_cli(a->fd, FORMAT2, "HTTP Timeout (minutes):", httptimeout);
ast_cli(a->fd, FORMAT, "TLS Enable:", AST_CLI_YESNO(ami_tls_cfg.enabled));
- ast_cli(a->fd, FORMAT, "TLS Bindaddress:", ast_inet_ntoa(amis_desc.local_address.sin_addr));
- ast_cli(a->fd, FORMAT2, "TLS Port:", ntohs(amis_desc.local_address.sin_port));
+ ast_cli(a->fd, FORMAT, "TLS Bindaddress:", ast_sockaddr_stringify(&amis_desc.local_address));
ast_cli(a->fd, FORMAT, "TLS Certfile:", ami_tls_cfg.certfile);
ast_cli(a->fd, FORMAT, "TLS Privatekey:", ami_tls_cfg.pvtfile);
ast_cli(a->fd, FORMAT, "TLS Cipher:", ami_tls_cfg.cipher);
@@ -6093,6 +6132,8 @@ static int __init_manager(int reload)
struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 };
char a1[256];
char a1_hash[256];
+ struct sockaddr_in ami_desc_local_address_tmp = { 0, };
+ struct sockaddr_in amis_desc_local_address_tmp = { 0, };
manager_enabled = 0;
@@ -6151,10 +6192,8 @@ static int __init_manager(int reload)
/* default values */
ast_copy_string(global_realm, S_OR(ast_config_AST_SYSTEM_NAME, DEFAULT_REALM), sizeof(global_realm));
- memset(&ami_desc.local_address, 0, sizeof(struct sockaddr_in));
- memset(&amis_desc.local_address, 0, sizeof(amis_desc.local_address));
- amis_desc.local_address.sin_port = htons(5039);
- ami_desc.local_address.sin_port = htons(DEFAULT_MANAGER_PORT);
+ amis_desc_local_address_tmp.sin_port = htons(5039);
+ ami_desc_local_address_tmp.sin_port = htons(DEFAULT_MANAGER_PORT);
ami_tls_cfg.enabled = 0;
if (ami_tls_cfg.certfile) {
@@ -6186,11 +6225,12 @@ static int __init_manager(int reload)
} else if (!strcasecmp(var->name, "webenabled")) {
webmanager_enabled = ast_true(val);
} else if (!strcasecmp(var->name, "port")) {
- ami_desc.local_address.sin_port = htons(atoi(val));
+ ami_desc_local_address_tmp.sin_port = htons(atoi(val));
} else if (!strcasecmp(var->name, "bindaddr")) {
- if (!inet_aton(val, &ami_desc.local_address.sin_addr)) {
+ if (!inet_aton(val, &ami_desc_local_address_tmp.sin_addr)) {
ast_log(LOG_WARNING, "Invalid address '%s' specified, using 0.0.0.0\n", val);
- memset(&ami_desc.local_address.sin_addr, 0, sizeof(ami_desc.local_address.sin_addr));
+ memset(&ami_desc_local_address_tmp.sin_addr, 0,
+ sizeof(ami_desc_local_address_tmp.sin_addr));
}
} else if (!strcasecmp(var->name, "brokeneventsaction")) {
broken_events_action = ast_true(val);
@@ -6228,15 +6268,18 @@ static int __init_manager(int reload)
}
if (manager_enabled) {
- ami_desc.local_address.sin_family = AF_INET;
+ ami_desc_local_address_tmp.sin_family = AF_INET;
}
/* if the amis address has not been set, default is the same as non secure ami */
- if (!amis_desc.local_address.sin_addr.s_addr) {
- amis_desc.local_address.sin_addr = ami_desc.local_address.sin_addr;
+ if (!amis_desc_local_address_tmp.sin_addr.s_addr) {
+ amis_desc_local_address_tmp.sin_addr =
+ ami_desc_local_address_tmp.sin_addr;
}
if (ami_tls_cfg.enabled) {
- amis_desc.local_address.sin_family = AF_INET;
+ amis_desc_local_address_tmp.sin_family = AF_INET;
}
+ ast_sockaddr_from_sin(&ami_desc.local_address, &ami_desc_local_address_tmp);
+ ast_sockaddr_from_sin(&amis_desc.local_address, &amis_desc_local_address_tmp);
AST_RWLIST_WRLOCK(&users);