Merge Tony's uservars (bug #2882)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4267 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.2-netsec
Mark Spencer 21 years ago
parent 13814b20a1
commit ee47520f28

@ -15,6 +15,7 @@
#include <asterisk/frame.h>
#include <asterisk/channel.h>
#include <asterisk/channel_pvt.h>
#include <asterisk/config_pvt.h>
#include <asterisk/logger.h>
#include <asterisk/module.h>
#include <asterisk/pbx.h>
@ -207,6 +208,7 @@ struct iax2_user {
struct iax2_user *next;
int notransfer;
int usejitterbuf;
struct ast_variable *vars;
};
struct iax2_peer {
@ -479,6 +481,7 @@ struct chan_iax2_pvt {
struct iax2_dpcache *dpentries;
int notransfer; /* do we want native bridging */
int usejitterbuf; /* use jitter buffer on this channel? */
struct ast_variable *vars;
};
static struct ast_iax2_queue {
@ -1417,8 +1420,13 @@ retry:
if (pvt->reg) {
pvt->reg->callno = 0;
}
if (!owner)
if (!owner) {
if (pvt->vars) {
ast_destroy_realtime(pvt->vars);
pvt->vars = NULL;
}
free(pvt);
}
}
if (owner) {
ast_mutex_unlock(&owner->lock);
@ -2672,6 +2680,8 @@ static struct ast_channel *ast_iax2_new(int callno, int state, int capability)
{
struct ast_channel *tmp;
struct chan_iax2_pvt *i;
struct ast_variable *v = NULL;
/* Don't hold call lock */
ast_mutex_unlock(&iaxsl[callno]);
tmp = ast_channel_alloc(1);
@ -2737,6 +2747,9 @@ static struct ast_channel *ast_iax2_new(int callno, int state, int capability)
tmp = NULL;
}
}
for (v = i->vars ; v ; v = v->next)
pbx_builtin_setvar_helper(tmp,v->name,v->value);
}
return tmp;
}
@ -3574,6 +3587,7 @@ static int check_access(int callno, struct sockaddr_in *sin, struct iax_ies *ies
int bestscore = 0;
int gotcapability=0;
char iabuf[INET_ADDRSTRLEN];
struct ast_variable *v = NULL, *tmpvar = NULL;
if (!iaxs[callno])
return res;
@ -3676,7 +3690,14 @@ static int check_access(int callno, struct sockaddr_in *sin, struct iax_ies *ies
}
if (user) {
/* We found our match (use the first) */
/* copy vars */
for (v = user->vars ; v ; v = v->next) {
if((tmpvar = ast_new_variable(v->name, v->value))) {
tmpvar->next = iaxs[callno]->vars;
iaxs[callno]->vars = tmpvar;
}
}
/* Store the requested username if not specified */
if (ast_strlen_zero(iaxs[callno]->username))
strncpy(iaxs[callno]->username, user->name, sizeof(iaxs[callno]->username)-1);
@ -6573,6 +6594,8 @@ static struct iax2_user *build_user(const char *name, struct ast_variable *v, in
struct iax2_context *oldcon = NULL;
int format;
int found;
char *varname = NULL, *varval = NULL;
struct ast_variable *tmpvar = NULL;
prev = NULL;
ast_mutex_lock(&userl.lock);
@ -6626,6 +6649,16 @@ static struct iax2_user *build_user(const char *name, struct ast_variable *v, in
} else if (!strcasecmp(v->name, "permit") ||
!strcasecmp(v->name, "deny")) {
user->ha = ast_append_ha(v->name, v->value, user->ha);
} else if (!strcasecmp(v->name, "setvar")) {
varname = ast_strdupa(v->value);
if (varname && (varval = strchr(varname,'='))) {
*varval = '\0';
varval++;
if((tmpvar = ast_new_variable(varname, varval))) {
tmpvar->next = user->vars;
user->vars = tmpvar;
}
}
} else if (!strcasecmp(v->name, "allow")) {
format = ast_getformatbyname(v->value);
if (format < 1)
@ -6741,6 +6774,10 @@ static void destroy_user(struct iax2_user *user)
{
ast_free_ha(user->ha);
free_context(user->contexts);
if(user->vars) {
ast_destroy_realtime(user->vars);
user->vars = NULL;
}
free(user);
}

@ -18,6 +18,7 @@
#include <asterisk/lock.h>
#include <asterisk/channel.h>
#include <asterisk/channel_pvt.h>
#include <asterisk/config_pvt.h>
#include <asterisk/config.h>
#include <asterisk/logger.h>
#include <asterisk/module.h>
@ -352,6 +353,7 @@ static struct sip_pvt {
struct ast_rtp *vrtp; /* Video RTP session */
struct sip_pkt *packets; /* Packets scheduled for re-transmission */
struct sip_history *history; /* History of this SIP dialog */
struct ast_variable *vars;
struct sip_pvt *next; /* Next call in chain */
} *iflist = NULL;
@ -405,6 +407,7 @@ struct sip_user {
int progressinband;
struct ast_ha *ha; /* ACL setting */
int temponly; /* Flag for temporary users (realtime) */
struct ast_variable *vars;
struct sip_user *next;
};
@ -1151,6 +1154,10 @@ static struct sip_peer *find_peer(const char *peer, struct sockaddr_in *sin)
static void destroy_user(struct sip_user *user)
{
ast_free_ha(user->ha);
if(user->vars) {
ast_destroy_realtime(user->vars);
user->vars = NULL;
}
free(user);
}
@ -1557,6 +1564,10 @@ static void __sip_destroy(struct sip_pvt *p, int lockowner)
free(cp);
}
ast_mutex_destroy(&p->lock);
if(p->vars) {
ast_destroy_realtime(p->vars);
p->vars = NULL;
}
free(p);
}
}
@ -1957,8 +1968,9 @@ static int sip_indicate(struct ast_channel *ast, int condition)
static struct ast_channel *sip_new(struct sip_pvt *i, int state, char *title)
{
struct ast_channel *tmp;
struct ast_variable *v = NULL;
int fmt;
ast_mutex_unlock(&i->lock);
/* Don't hold a sip pvt lock while we allocate a channel */
tmp = ast_channel_alloc(1);
@ -2062,6 +2074,8 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, char *title)
tmp = NULL;
}
}
for (v = i->vars ; v ; v = v->next)
pbx_builtin_setvar_helper(tmp,v->name,v->value);
} else
ast_log(LOG_WARNING, "Unable to allocate channel structure\n");
return tmp;
@ -2294,6 +2308,10 @@ static struct sip_pvt *sip_alloc(char *callid, struct sockaddr_in *sin, int useg
if (!p->rtp) {
ast_log(LOG_WARNING, "Unable to create RTP session: %s\n", strerror(errno));
ast_mutex_destroy(&p->lock);
if(p->vars) {
ast_destroy_realtime(p->vars);
p->vars = NULL;
}
free(p);
return NULL;
}
@ -5257,6 +5275,7 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, char *cmd
char *t;
char calleridname[50];
int debug=sip_debug_test_addr(sin);
struct ast_variable *tmpvar = NULL, *v = NULL;
/* Terminate URI */
t = uri;
@ -5304,6 +5323,13 @@ static int check_user_full(struct sip_pvt *p, struct sip_request *req, char *cmd
user = find_user(of);
/* Find user based on user name in the from header */
if (user && ast_apply_ha(user->ha, sin)) {
/* copy vars */
for (v = user->vars ; v ; v = v->next) {
if((tmpvar = ast_new_variable(v->name, v->value))) {
tmpvar->next = p->vars;
p->vars = tmpvar;
}
}
p->nat = user->nat;
#ifdef OSP_SUPPORT
p->ospauth = user->ospauth;
@ -8126,6 +8152,9 @@ static struct sip_user *build_user(const char *name, struct ast_variable *v)
struct sip_user *user;
int format;
struct ast_ha *oldha = NULL;
char *varname = NULL, *varval = NULL;
struct ast_variable *tmpvar = NULL;
user = (struct sip_user *)malloc(sizeof(struct sip_user));
if (user) {
memset(user, 0, sizeof(struct sip_user));
@ -8150,6 +8179,17 @@ static struct sip_user *build_user(const char *name, struct ast_variable *v)
while(v) {
if (!strcasecmp(v->name, "context")) {
strncpy(user->context, v->value, sizeof(user->context) - 1);
} else if (!strcasecmp(v->name, "setvar")) {
varname = ast_strdupa(v->value);
if (varname && (varval = strchr(varname,'='))) {
*varval = '\0';
varval++;
if((tmpvar = ast_new_variable(varname, varval))) {
tmpvar->next = user->vars;
user->vars = tmpvar;
}
}
} else if (!strcasecmp(v->name, "permit") ||
!strcasecmp(v->name, "deny")) {
user->ha = ast_append_ha(v->name, v->value, user->ha);
@ -9203,6 +9243,10 @@ int unload_module()
p = p->next;
/* Free associated memory */
ast_mutex_destroy(&pl->lock);
if(pl->vars) {
ast_destroy_realtime(pl->vars);
pl->vars = NULL;
}
free(pl);
}
iflist = NULL;

Loading…
Cancel
Save