Index: asterisk-1.6.1.0~dfsg_devel/channels/chan_sip.c =================================================================== --- asterisk-1.6.1.0~dfsg_devel.orig/channels/chan_sip.c 2009-11-19 10:46:20.000000000 +0100 +++ asterisk-1.6.1.0~dfsg_devel/channels/chan_sip.c 2009-11-19 13:19:22.000000000 +0100 @@ -1041,6 +1041,8 @@ #define SIP_PROG_INBAND_NO (1 << 25) #define SIP_PROG_INBAND_YES (2 << 25) +#define SIP_ALLOW_AUTOMON (1 << 28) /*!< Whether the automon feature can be used by this peer */ + #define SIP_SENDRPID (1 << 29) /*!< DP: Remote Party-ID Support */ #define SIP_G726_NONSTANDARD (1 << 31) /*!< DP: Use non-standard packing for G726-32 data */ @@ -1048,7 +1050,7 @@ #define SIP_FLAGS_TO_COPY \ (SIP_PROMISCREDIR | SIP_TRUSTRPID | SIP_SENDRPID | SIP_DTMF | SIP_REINVITE | \ SIP_PROG_INBAND | SIP_USECLIENTCODE | SIP_NAT | SIP_G726_NONSTANDARD | \ - SIP_USEREQPHONE | SIP_INSECURE) + SIP_USEREQPHONE | SIP_INSECURE | SIP_ALLOW_AUTOMON) /*@}*/ /*! \name SIPflags2 @@ -3595,6 +3597,13 @@ res = 0; break; + case AST_OPTION_ALLOW_AUTOMON: + sip_pvt_lock(p); + res = 0; + if (ast_test_flag(&p->flags[0], SIP_ALLOW_AUTOMON)) + res = 1; + sip_pvt_unlock(p); + break; default: break; } @@ -14032,6 +14041,7 @@ ast_cli(fd, " Nat : %s\n", nat2str(ast_test_flag(&peer->flags[0], SIP_NAT))); ast_cli(fd, " ACL : %s\n", cli_yesno(peer->ha != NULL)); ast_cli(fd, " T38 pt UDPTL : %s\n", cli_yesno(ast_test_flag(&peer->flags[1], SIP_PAGE2_T38SUPPORT))); + ast_cli(fd, " Allow automon: %s\n", cli_yesno(ast_test_flag(&peer->flags[0], SIP_ALLOW_AUTOMON))); ast_cli(fd, " CanReinvite : %s\n", cli_yesno(ast_test_flag(&peer->flags[0], SIP_CAN_REINVITE))); ast_cli(fd, " PromiscRedir : %s\n", cli_yesno(ast_test_flag(&peer->flags[0], SIP_PROMISCREDIR))); ast_cli(fd, " User=Phone : %s\n", cli_yesno(ast_test_flag(&peer->flags[0], SIP_USEREQPHONE))); @@ -14135,6 +14145,7 @@ astman_append(s, "ACL: %s\r\n", (peer->ha?"Y":"N")); astman_append(s, "SIP-CanReinvite: %s\r\n", (ast_test_flag(&peer->flags[0], SIP_CAN_REINVITE)?"Y":"N")); astman_append(s, "SIP-PromiscRedir: %s\r\n", (ast_test_flag(&peer->flags[0], SIP_PROMISCREDIR)?"Y":"N")); + astman_append(s, "SIP-AllowAutomon: %s\r\n", (ast_test_flag(&peer->flags[0], SIP_ALLOW_AUTOMON)?"Y":"N")); astman_append(s, "SIP-UserPhone: %s\r\n", (ast_test_flag(&peer->flags[0], SIP_USEREQPHONE)?"Y":"N")); astman_append(s, "SIP-VideoSupport: %s\r\n", (ast_test_flag(&peer->flags[1], SIP_PAGE2_VIDEOSUPPORT)?"Y":"N")); astman_append(s, "SIP-TextSupport: %s\r\n", (ast_test_flag(&peer->flags[1], SIP_PAGE2_TEXTSUPPORT)?"Y":"N")); @@ -15312,6 +15323,12 @@ int j; struct ast_frame f = { AST_FRAME_DTMF, }; + if (!ast_test_flag(&p->flags[0], SIP_ALLOW_AUTOMON)) { + ast_log(LOG_WARNING, "Recording requested, but One Touch Monitoring not allowed for this peer. (See sip.conf)\n"); + transmit_response(p, "403 Forbidden", req); + return; + } + ast_rdlock_call_features(); feat = ast_find_call_feature("automon"); if (!feat || ast_strlen_zero(feat->exten)) { @@ -22256,6 +22273,8 @@ peer->callgroup = ast_get_group(v->value); } else if (!strcasecmp(v->name, "allowtransfer")) { peer->allowtransfer = ast_true(v->value) ? TRANSFER_OPENFORALL : TRANSFER_CLOSED; + } else if (!strcasecmp(v->name, "allowautomon")) { + ast_set2_flag(&peer->flags[0], ast_true(v->value), SIP_ALLOW_AUTOMON); } else if (!strcasecmp(v->name, "pickupgroup")) { peer->pickupgroup = ast_get_group(v->value); } else if (!strcasecmp(v->name, "allow")) { Index: asterisk-1.6.1.0~dfsg_devel/include/asterisk/frame.h =================================================================== --- asterisk-1.6.1.0~dfsg_devel.orig/include/asterisk/frame.h 2009-11-19 13:01:42.000000000 +0100 +++ asterisk-1.6.1.0~dfsg_devel/include/asterisk/frame.h 2009-11-19 13:08:04.000000000 +0100 @@ -405,6 +405,9 @@ */ #define AST_OPTION_T38_STATE 10 +/* Read-only. Whether touch monitoring is allowed */ +#define AST_OPTION_ALLOW_AUTOMON 11 + struct oprmode { struct ast_channel *peer; int mode; Index: asterisk-1.6.1.0~dfsg_devel/main/features.c =================================================================== --- asterisk-1.6.1.0~dfsg_devel.orig/main/features.c 2009-11-19 13:05:02.000000000 +0100 +++ asterisk-1.6.1.0~dfsg_devel/main/features.c 2009-11-19 13:09:58.000000000 +0100 @@ -937,6 +937,11 @@ const char *automon_message_start = NULL; const char *automon_message_stop = NULL; + if (!chan->tech->queryoption(chan, AST_OPTION_ALLOW_AUTOMON, NULL, 0)) { + ast_log(LOG_ERROR,"Cannot record the call. Monitoring on this channel is disabled.\n"); + return -1; + } + if (!monitor_ok) { ast_log(LOG_ERROR,"Cannot record the call. The monitor application is disabled.\n"); return -1;