[Asterisk-cvs] asterisk/channels chan_sip.c,1.708,1.709
kpfleming at lists.digium.com
kpfleming at lists.digium.com
Wed Apr 27 12:14:31 CDT 2005
Update of /usr/cvsroot/asterisk/channels
In directory mongoose.digium.com:/tmp/cvs-serv31335/channels
Modified Files:
chan_sip.c
Log Message:
allow fine-grained 'insecure' settings (bug #4024)
Index: chan_sip.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_sip.c,v
retrieving revision 1.708
retrieving revision 1.709
diff -u -d -r1.708 -r1.709
--- chan_sip.c 27 Apr 2005 15:11:46 -0000 1.708
+++ chan_sip.c 27 Apr 2005 17:04:17 -0000 1.709
@@ -338,10 +338,8 @@
#define SIP_CAN_REINVITE (1 << 20) /* allow peers to be reinvited to send media directly p2p */
#define SIP_REINVITE_UPDATE (2 << 20) /* use UPDATE (RFC3311) when reinviting this peer */
/* "insecure" settings */
-#define SIP_INSECURE (3 << 22) /* three settings, uses two bits */
-#define SIP_SECURE (0 << 22)
-#define SIP_INSECURE_NORMAL (1 << 22)
-#define SIP_INSECURE_VERY (2 << 22)
+#define SIP_INSECURE_PORT (1 << 22) /* don't require matching port for incoming requests */
+#define SIP_INSECURE_INVITE (1 << 23) /* don't require authentication for incoming INVITEs */
/* Sending PROGRESS in-band settings */
#define SIP_PROG_INBAND (3 << 24) /* three settings, uses two bits */
#define SIP_PROG_INBAND_NEVER (0 << 24)
@@ -1350,7 +1348,7 @@
/* We know name is the first field, so we can cast */
struct sip_peer *p = (struct sip_peer *)name;
return !(!inaddrcmp(&p->addr, sin) ||
- (ast_test_flag(p, SIP_INSECURE) &&
+ (ast_test_flag(p, SIP_INSECURE_PORT) &&
(p->addr.sin_addr.s_addr == sin->sin_addr.s_addr)));
}
@@ -1471,7 +1469,9 @@
if (p) {
found++;
- ast_copy_flags(r, p, SIP_PROMISCREDIR | SIP_USEREQPHONE | SIP_DTMF | SIP_NAT | SIP_REINVITE | SIP_INSECURE);
+ ast_copy_flags(r, p,
+ SIP_PROMISCREDIR | SIP_USEREQPHONE | SIP_DTMF | SIP_NAT | SIP_REINVITE |
+ SIP_INSECURE_PORT | SIP_INSECURE_INVITE);
r->capability = p->capability;
if (r->rtp) {
ast_log(LOG_DEBUG, "Setting NAT on RTP to %d\n", (ast_test_flag(r, SIP_NAT) & SIP_NAT_ROUTE));
@@ -5985,8 +5985,8 @@
strncpy(p->peermd5secret, peer->md5secret, sizeof(p->peermd5secret)-1);
p->peermd5secret[sizeof(p->peermd5secret)-1] = '\0';
p->callingpres = peer->callingpres;
- if (ast_test_flag(peer, SIP_INSECURE) == SIP_INSECURE_VERY) {
- /* Pretend there is no required authentication if insecure is "very" */
+ if (ast_test_flag(peer, SIP_INSECURE_INVITE)) {
+ /* Pretend there is no required authentication */
p->peersecret[0] = '\0';
p->peermd5secret[0] = '\0';
}
@@ -6452,17 +6452,16 @@
}
/*--- insecure2str: Convert Insecure setting to printable string ---*/
-static const char *insecure2str(int mode)
+static const char *insecure2str(int port, int invite)
{
- switch (mode) {
- case SIP_SECURE:
+ if (port && invite)
+ return "port,invite";
+ else if (port)
+ return "port";
+ else if (invite)
+ return "invite";
+ else
return "no";
- case SIP_INSECURE_NORMAL:
- return "yes";
- case SIP_INSECURE_VERY:
- return "very";
- }
- return "<error>";
}
/*--- sip_prune_realtime: Remove temporary realtime object from memory (CLI) ---*/
@@ -6596,7 +6595,7 @@
ast_cli(fd, " Callerid : %s\n", ast_callerid_merge(cbuf, sizeof(cbuf), peer->cid_name, peer->cid_num, "<unspecified>"));
ast_cli(fd, " Expire : %d\n", peer->expire);
ast_cli(fd, " Expiry : %d\n", peer->expiry);
- ast_cli(fd, " Insecure : %s\n", insecure2str(ast_test_flag(peer, SIP_INSECURE)));
+ ast_cli(fd, " Insecure : %s\n", insecure2str(ast_test_flag(peer, SIP_INSECURE_PORT), ast_test_flag(peer, SIP_INSECURE_INVITE)));
ast_cli(fd, " Nat : %s\n", nat2str(ast_test_flag(peer, SIP_NAT)));
ast_cli(fd, " ACL : %s\n", (peer->ha?"Yes":"No"));
ast_cli(fd, " CanReinvite : %s\n", (ast_test_flag(peer, SIP_CAN_REINVITE)?"Yes":"No"));
@@ -6679,7 +6678,7 @@
ast_cli(fd, "Callerid: %s\r\n", ast_callerid_merge(cbuf, sizeof(cbuf), peer->cid_name, peer->cid_num, ""));
ast_cli(fd, "RegExpire: %ld seconds\r\n", ast_sched_when(sched,peer->expire));
ast_cli(fd, "RegExpiry: %d\r\n", peer->expiry);
- ast_cli(fd, "SIP-AuthInsecure: %s\r\n", insecure2str(ast_test_flag(peer, SIP_INSECURE)));
+ ast_cli(fd, "SIP-AuthInsecure: %s\r\n", insecure2str(ast_test_flag(peer, SIP_INSECURE_PORT), ast_test_flag(peer, SIP_INSECURE_INVITE)));
ast_cli(fd, "SIP-NatSupport: %s\r\n", nat2str(ast_test_flag(peer, SIP_NAT)));
ast_cli(fd, "ACL: %s\r\n", (peer->ha?"Y":"N"));
ast_cli(fd, "SIP-CanReinvite: %s\r\n", (ast_test_flag(peer, SIP_CAN_REINVITE)?"Y":"N"));
@@ -9544,12 +9543,27 @@
else
ast_set2_flag(flags, ast_true(v->value), SIP_CAN_REINVITE);
} else if (!strcasecmp(v->name, "insecure")) {
- ast_set_flag(mask, SIP_INSECURE);
- ast_clear_flag(flags, SIP_INSECURE);
+ ast_set_flag(mask, SIP_INSECURE_PORT | SIP_INSECURE_INVITE);
+ ast_clear_flag(flags, SIP_INSECURE_PORT | SIP_INSECURE_INVITE);
if (!strcasecmp(v->value, "very"))
- ast_set_flag(flags, SIP_INSECURE_VERY);
- else
- ast_set2_flag(flags, ast_true(v->value), SIP_INSECURE_NORMAL);
+ ast_set_flag(flags, SIP_INSECURE_PORT | SIP_INSECURE_INVITE);
+ else if (ast_true(v->value))
+ ast_set_flag(flags, SIP_INSECURE_PORT);
+ else if (!ast_false(v->value)) {
+ char buf[64];
+ char *word, *next;
+
+ strncpy(buf, v->value, sizeof(buf)-1);
+ next = buf;
+ while ((word = strsep(&next, ","))) {
+ if (!strcasecmp(word, "port"))
+ ast_set_flag(flags, SIP_INSECURE_PORT);
+ else if (!strcasecmp(word, "invite"))
+ ast_set_flag(flags, SIP_INSECURE_INVITE);
+ else
+ ast_log(LOG_WARNING, "Unknown insecure mode '%s' on line %d\n", v->value, v->lineno);
+ }
+ }
} else if (!strcasecmp(v->name, "progressinband")) {
ast_set_flag(mask, SIP_PROG_INBAND);
ast_clear_flag(flags, SIP_PROG_INBAND);
@@ -9707,7 +9721,9 @@
/* set the usage flag to a sane staring value*/
user->inUse = 0;
user->outUse = 0;
- ast_copy_flags(user, &global_flags, SIP_PROMISCREDIR | SIP_TRUSTRPID | SIP_USECLIENTCODE | SIP_DTMF | SIP_NAT | SIP_REINVITE | SIP_INSECURE | SIP_PROG_INBAND | SIP_OSPAUTH);
+ ast_copy_flags(user, &global_flags,
+ SIP_PROMISCREDIR | SIP_TRUSTRPID | SIP_USECLIENTCODE | SIP_DTMF | SIP_NAT |
+ SIP_REINVITE | SIP_INSECURE_PORT | SIP_INSECURE_INVITE | SIP_PROG_INBAND | SIP_OSPAUTH);
user->capability = global_capability;
user->prefs = prefs;
/* set default context */
@@ -9802,7 +9818,10 @@
peer->expire = -1;
peer->pokeexpire = -1;
strncpy(peer->name, name, sizeof(peer->name)-1);
- ast_copy_flags(peer, &global_flags, SIP_PROMISCREDIR | SIP_USEREQPHONE | SIP_TRUSTRPID | SIP_USECLIENTCODE | SIP_DTMF | SIP_NAT | SIP_REINVITE | SIP_INSECURE | SIP_PROG_INBAND | SIP_OSPAUTH);
+ ast_copy_flags(peer, &global_flags,
+ SIP_PROMISCREDIR | SIP_USEREQPHONE | SIP_TRUSTRPID | SIP_USECLIENTCODE |
+ SIP_DTMF | SIP_NAT | SIP_REINVITE | SIP_INSECURE_PORT | SIP_INSECURE_INVITE |
+ SIP_PROG_INBAND | SIP_OSPAUTH);
strncpy(peer->context, default_context, sizeof(peer->context)-1);
strncpy(peer->language, default_language, sizeof(peer->language)-1);
strncpy(peer->musicclass, global_musicclass, sizeof(peer->musicclass)-1);
@@ -9892,7 +9911,10 @@
oldha = peer->ha;
peer->ha = NULL;
peer->addr.sin_family = AF_INET;
- ast_copy_flags(peer, &global_flags, SIP_PROMISCREDIR | SIP_TRUSTRPID | SIP_USECLIENTCODE | SIP_DTMF | SIP_REINVITE | SIP_INSECURE | SIP_PROG_INBAND | SIP_OSPAUTH);
+ ast_copy_flags(peer, &global_flags,
+ SIP_PROMISCREDIR | SIP_TRUSTRPID | SIP_USECLIENTCODE |
+ SIP_DTMF | SIP_REINVITE | SIP_INSECURE_PORT | SIP_INSECURE_INVITE |
+ SIP_PROG_INBAND | SIP_OSPAUTH);
peer->capability = global_capability;
peer->rtptimeout = global_rtptimeout;
peer->rtpholdtimeout = global_rtpholdtimeout;
More information about the svn-commits
mailing list