aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2003-11-13 05:21:15 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2003-11-13 05:21:15 +0000
commit81269c51c6a9bc871e4dbcf1c282107b85c3ba2c (patch)
tree48dbee04d1a78b686c3b32f6ffa49c88268e29e7 /channels
parent2479e06ccaa0b2877c43df7e1fecb53423904a76 (diff)
Update so that "users" are implemented as well
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@1737 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rwxr-xr-xchannels/chan_iax.c97
-rwxr-xr-xchannels/chan_iax2.c143
2 files changed, 157 insertions, 83 deletions
diff --git a/channels/chan_iax.c b/channels/chan_iax.c
index d0edcc9e6..4b3b3c1c1 100755
--- a/channels/chan_iax.c
+++ b/channels/chan_iax.c
@@ -1603,16 +1603,19 @@ static struct iax_peer *mysql_peer(char *peer)
static struct iax_user *mysql_user(char *user)
{
struct iax_user *p;
+ struct iax_context *con;
int success = 0;
p = malloc(sizeof(struct iax_user));
memset(p, 0, sizeof(struct iax_user));
+ con = malloc(sizeof(struct iax_context));
+ memset(con, 0, sizeof(struct iax_context));
+ strcpy(con->context, "default");
+ p->contexts = con;
if (mysql && (strlen(user) < 128)) {
char query[512];
char *name;
int numfields, x;
- int port;
- time_t regseconds, nowtime;
MYSQL_RES *result;
MYSQL_FIELD *fields;
MYSQL_ROW rowval;
@@ -1631,34 +1634,22 @@ static struct iax_user *mysql_user(char *user)
if (!strcasecmp(fields[x].name, "secret")) {
strncpy(p->secret, rowval[x], sizeof(p->secret));
} else if (!strcasecmp(fields[x].name, "context")) {
- strncpy(p->context, rowval[x], sizeof(p->context) - 1);
- } else if (!strcasecmp(fields[x].name, "ipaddr")) {
- inet_aton(rowval[x], &p->addr.sin_addr);
- } else if (!strcasecmp(fields[x].name, "port")) {
- if (sscanf(rowval[x], "%i", &port) != 1)
- port = 0;
- p->addr.sin_port = htons(port);
- } else if (!strcasecmp(fields[x].name, "regseconds")) {
- if (sscanf(rowval[x], "%li", &regseconds) != 1)
- regseconds = 0;
+ strncpy(p->contexts->context, rowval[x], sizeof(p->contexts->context) - 1);
}
}
}
- time(&nowtime);
- if ((nowtime - regseconds) > AST_DEFAULT_REG_EXPIRE)
- memset(&p->addr, 0, sizeof(p->addr));
}
}
ast_mutex_unlock(&mysqllock);
}
if (!success) {
+ if (p->contexts)
+ free(p->contexts);
free(p);
p = NULL;
} else {
strncpy(p->name, user, sizeof(p->name) - 1);
- p->dynamic = 1;
p->delme = 1;
- p->capability = iax_capability;
strcpy(p->methods, "md5,plaintext");
}
return p;
@@ -2682,40 +2673,54 @@ static int check_access(int callno, struct sockaddr_in *sin, char *orequest, int
&& ast_apply_ha(user->ha, sin) /* Access is permitted from this IP */
&& (!strlen(iaxs[callno]->context) || /* No context specified */
apply_context(user->contexts, iaxs[callno]->context))) { /* Context is permitted */
- /* We found our match (use the first) */
-
- /* Store the requested username if not specified */
- if (!strlen(iaxs[callno]->username))
- strncpy(iaxs[callno]->username, user->name, sizeof(iaxs[callno]->username)-1);
- /* And use the default context */
- if (!strlen(iaxs[callno]->context)) {
- if (user->contexts)
- strncpy(iaxs[callno]->context, user->contexts->context, sizeof(iaxs[callno]->context)-1);
- else
- strncpy(iaxs[callno]->context, context, sizeof(iaxs[callno]->context)-1);
- }
- /* Copy the secret */
- strncpy(iaxs[callno]->secret, user->secret, sizeof(iaxs[callno]->secret)-1);
- /* And any input keys */
- strncpy(iaxs[callno]->inkeys, user->inkeys, sizeof(iaxs[callno]->inkeys));
- /* And the permitted authentication methods */
- strncpy(iaxs[callno]->methods, user->methods, sizeof(iaxs[callno]->methods)-1);
- /* If they have callerid, override the given caller id. Always store the ANI */
- if (strlen(iaxs[callno]->callerid)) {
- if (user->hascallerid)
- strncpy(iaxs[callno]->callerid, user->callerid, sizeof(iaxs[callno]->callerid)-1);
- strncpy(iaxs[callno]->ani, user->callerid, sizeof(iaxs[callno]->ani)-1);
- }
- if (strlen(user->accountcode))
- strncpy(iaxs[callno]->accountcode, user->accountcode, sizeof(iaxs[callno]->accountcode)-1);
- if (user->amaflags)
- iaxs[callno]->amaflags = user->amaflags;
- res = 0;
break;
}
user = user->next;
}
+#ifdef MYSQL_FRIENDS
+ if (!user && mysql && strlen(iaxs[callno]->username) && (strlen(iaxs[callno]->username) < 128)) {
+ user = mysql_user(iaxs[callno]->username);
+ if (user && strlen(iaxs[callno]->context) && /* No context specified */
+ !apply_context(user->contexts, iaxs[callno]->context)) { /* Context is permitted */
+ if (user->contexts)
+ free(user->contexts);
+ free(user);
+ user = NULL;
+ }
+ }
+#endif
ast_mutex_unlock(&userl.lock);
+ if (user) {
+ /* We found our match (use the first) */
+
+ /* Store the requested username if not specified */
+ if (!strlen(iaxs[callno]->username))
+ strncpy(iaxs[callno]->username, user->name, sizeof(iaxs[callno]->username)-1);
+ /* And use the default context */
+ if (!strlen(iaxs[callno]->context)) {
+ if (user->contexts)
+ strncpy(iaxs[callno]->context, user->contexts->context, sizeof(iaxs[callno]->context)-1);
+ else
+ strncpy(iaxs[callno]->context, context, sizeof(iaxs[callno]->context)-1);
+ }
+ /* Copy the secret */
+ strncpy(iaxs[callno]->secret, user->secret, sizeof(iaxs[callno]->secret)-1);
+ /* And any input keys */
+ strncpy(iaxs[callno]->inkeys, user->inkeys, sizeof(iaxs[callno]->inkeys));
+ /* And the permitted authentication methods */
+ strncpy(iaxs[callno]->methods, user->methods, sizeof(iaxs[callno]->methods)-1);
+ /* If they have callerid, override the given caller id. Always store the ANI */
+ if (strlen(iaxs[callno]->callerid)) {
+ if (user->hascallerid)
+ strncpy(iaxs[callno]->callerid, user->callerid, sizeof(iaxs[callno]->callerid)-1);
+ strncpy(iaxs[callno]->ani, user->callerid, sizeof(iaxs[callno]->ani)-1);
+ }
+ if (strlen(user->accountcode))
+ strncpy(iaxs[callno]->accountcode, user->accountcode, sizeof(iaxs[callno]->accountcode)-1);
+ if (user->amaflags)
+ iaxs[callno]->amaflags = user->amaflags;
+ res = 0;
+ }
return res;
}
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 0e0126625..5c986cdbe 100755
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -1601,6 +1601,61 @@ static struct iax2_peer *mysql_peer(char *peer)
}
return p;
}
+static struct iax2_user *mysql_user(char *user)
+{
+ struct iax2_user *p;
+ struct iax2_context *con;
+ int success = 0;
+
+ p = malloc(sizeof(struct iax2_user));
+ memset(p, 0, sizeof(struct iax2_user));
+ con = malloc(sizeof(struct iax2_context));
+ memset(con, 0, sizeof(struct iax2_context));
+ strcpy(con->context, "default");
+ p->contexts = con;
+ if (mysql && (strlen(user) < 128)) {
+ char query[512];
+ char *name;
+ int numfields, x;
+ MYSQL_RES *result;
+ MYSQL_FIELD *fields;
+ MYSQL_ROW rowval;
+ name = alloca(strlen(user) * 2 + 1);
+ mysql_real_escape_string(mysql, name, user, strlen(user));
+ snprintf(query, sizeof(query), "SELECT * FROM iaxfriends WHERE name=\"%s\"", name);
+ ast_mutex_lock(&mysqllock);
+ mysql_query(mysql, query);
+ if ((result = mysql_store_result(mysql))) {
+ if ((rowval = mysql_fetch_row(result))) {
+ numfields = mysql_num_fields(result);
+ fields = mysql_fetch_fields(result);
+ success = 1;
+ for (x=0;x<numfields;x++) {
+ if (rowval[x]) {
+ if (!strcasecmp(fields[x].name, "secret")) {
+ strncpy(p->secret, rowval[x], sizeof(p->secret));
+ } else if (!strcasecmp(fields[x].name, "context")) {
+ strncpy(p->contexts->context, rowval[x], sizeof(p->contexts->context) - 1);
+ }
+ }
+ }
+ }
+ }
+ ast_mutex_unlock(&mysqllock);
+ }
+ if (!success) {
+ if (p->contexts)
+ free(p->contexts);
+ free(p);
+ p = NULL;
+ } else {
+ strncpy(p->name, user, sizeof(p->name) - 1);
+ p->delme = 1;
+ p->capability = iax2_capability;
+ p->authmethods = IAX_AUTH_MD5 | IAX_AUTH_PLAINTEXT;
+ }
+ return p;
+}
#endif /* MYSQL_FRIENDS */
static int create_addr(struct sockaddr_in *sin, int *capability, int *sendani, int *maxtime, char *peer, char *context, int *trunk, int *notransfer, char *secret, int seclen)
@@ -2799,44 +2854,58 @@ static int check_access(int callno, struct sockaddr_in *sin, struct iax_ies *ies
&& ast_apply_ha(user->ha, sin) /* Access is permitted from this IP */
&& (!strlen(iaxs[callno]->context) || /* No context specified */
apply_context(user->contexts, iaxs[callno]->context))) { /* Context is permitted */
- /* We found our match (use the first) */
-
- /* Store the requested username if not specified */
- if (!strlen(iaxs[callno]->username))
- strncpy(iaxs[callno]->username, user->name, sizeof(iaxs[callno]->username)-1);
- /* Store whether this is a trunked call, too, of course, and move if appropriate */
- iaxs[callno]->trunk = user->trunk;
- iaxs[callno]->capability = user->capability;
- /* And use the default context */
- if (!strlen(iaxs[callno]->context)) {
- if (user->contexts)
- strncpy(iaxs[callno]->context, user->contexts->context, sizeof(iaxs[callno]->context)-1);
- else
- strncpy(iaxs[callno]->context, context, sizeof(iaxs[callno]->context)-1);
- }
- /* Copy the secret */
- strncpy(iaxs[callno]->secret, user->secret, sizeof(iaxs[callno]->secret)-1);
- /* And any input keys */
- strncpy(iaxs[callno]->inkeys, user->inkeys, sizeof(iaxs[callno]->inkeys));
- /* And the permitted authentication methods */
- iaxs[callno]->authmethods = user->authmethods;
- /* If they have callerid, override the given caller id. Always store the ANI */
- if (strlen(iaxs[callno]->callerid)) {
- if (user->hascallerid)
- strncpy(iaxs[callno]->callerid, user->callerid, sizeof(iaxs[callno]->callerid)-1);
- strncpy(iaxs[callno]->ani, user->callerid, sizeof(iaxs[callno]->ani)-1);
- }
- if (strlen(user->accountcode))
- strncpy(iaxs[callno]->accountcode, user->accountcode, sizeof(iaxs[callno]->accountcode)-1);
- if (user->amaflags)
- iaxs[callno]->amaflags = user->amaflags;
- iaxs[callno]->notransfer = user->notransfer;
- res = 0;
break;
}
user = user->next;
}
ast_mutex_unlock(&userl.lock);
+#ifdef MYSQL_FRIENDS
+ if (!user && mysql && strlen(iaxs[callno]->username) && (strlen(iaxs[callno]->username) < 128)) {
+ user = mysql_user(iaxs[callno]->username);
+ if (user && strlen(iaxs[callno]->context) && /* No context specified */
+ !apply_context(user->contexts, iaxs[callno]->context)) { /* Context is permitted */
+ if (user->contexts)
+ free(user->contexts);
+ free(user);
+ user = NULL;
+ }
+ }
+#endif
+ if (user) {
+ /* We found our match (use the first) */
+
+ /* Store the requested username if not specified */
+ if (!strlen(iaxs[callno]->username))
+ strncpy(iaxs[callno]->username, user->name, sizeof(iaxs[callno]->username)-1);
+ /* Store whether this is a trunked call, too, of course, and move if appropriate */
+ iaxs[callno]->trunk = user->trunk;
+ iaxs[callno]->capability = user->capability;
+ /* And use the default context */
+ if (!strlen(iaxs[callno]->context)) {
+ if (user->contexts)
+ strncpy(iaxs[callno]->context, user->contexts->context, sizeof(iaxs[callno]->context)-1);
+ else
+ strncpy(iaxs[callno]->context, context, sizeof(iaxs[callno]->context)-1);
+ }
+ /* Copy the secret */
+ strncpy(iaxs[callno]->secret, user->secret, sizeof(iaxs[callno]->secret)-1);
+ /* And any input keys */
+ strncpy(iaxs[callno]->inkeys, user->inkeys, sizeof(iaxs[callno]->inkeys));
+ /* And the permitted authentication methods */
+ iaxs[callno]->authmethods = user->authmethods;
+ /* If they have callerid, override the given caller id. Always store the ANI */
+ if (strlen(iaxs[callno]->callerid)) {
+ if (user->hascallerid)
+ strncpy(iaxs[callno]->callerid, user->callerid, sizeof(iaxs[callno]->callerid)-1);
+ strncpy(iaxs[callno]->ani, user->callerid, sizeof(iaxs[callno]->ani)-1);
+ }
+ if (strlen(user->accountcode))
+ strncpy(iaxs[callno]->accountcode, user->accountcode, sizeof(iaxs[callno]->accountcode)-1);
+ if (user->amaflags)
+ iaxs[callno]->amaflags = user->amaflags;
+ iaxs[callno]->notransfer = user->notransfer;
+ res = 0;
+ }
iaxs[callno]->trunk = iax2_getpeertrunk(*sin);
return res;
}
@@ -3035,6 +3104,8 @@ static int register_verify(int callno, struct sockaddr_in *sin, struct iax_ies *
sprintf(requeststr + (x << 1), "%2.2x", digest[x]);
if (strcasecmp(requeststr, md5secret)) {
ast_log(LOG_NOTICE, "Host %s failed MD5 authentication for '%s' (%s != %s)\n", inet_ntoa(sin->sin_addr), p->name, requeststr, md5secret);
+ if (p->delme)
+ free(p);
return -1;
} else
iaxs[callno]->state |= IAX_STATE_AUTHENTICATED;
@@ -5396,9 +5467,8 @@ static int set_config(char *config_file, struct sockaddr_in* sin){
} else {
amaflags = format;
}
- }
#ifdef MYSQL_FRIENDS
- else if (!strcasecmp(v->name, "dbuser")) {
+ } else if (!strcasecmp(v->name, "dbuser")) {
strncpy(mydbuser, v->value, sizeof(mydbuser) - 1);
} else if (!strcasecmp(v->name, "dbpass")) {
strncpy(mydbpass, v->value, sizeof(mydbpass) - 1);
@@ -5406,9 +5476,8 @@ static int set_config(char *config_file, struct sockaddr_in* sin){
strncpy(mydbhost, v->value, sizeof(mydbhost) - 1);
} else if (!strcasecmp(v->name, "dbname")) {
strncpy(mydbname, v->value, sizeof(mydbname) - 1);
- }
#endif
- //else if (strcasecmp(v->name,"type"))
+ } //else if (strcasecmp(v->name,"type"))
// ast_log(LOG_WARNING, "Ignoring %s\n", v->name);
v = v->next;
}