[Asterisk-Users] DISA and AGI: authenticate by caller ID? (resolved)
Matthew Simpson
matthew at txlink.net
Fri Jul 2 16:30:31 MST 2004
Here is some code to do authentication by caller ID for DISA through AGI.
My original code had a bug in the Mysql query code, and there was a hangup
in the wrong place
[that's what I get for coding something at 2:00am], but the attached code
works correctly.
Take note of the REGEXP for the CallerID variable. When I tested the code
from the PSTN
it worked because there was no name component, but it broke from SIP. If
you're calling SIP-->SIP you'll have the name in
that variable as well as the number, so I added code to snip everything but
the 10 digits. Adjust accordingly if you have more or less
than 10 digits. Also, I've thought of a bug already, if your caller ID name
has digits in it, it'll break the regexp. Adjust accordingly
if that is true about your installation.
Yours,
Matthew Simpson
TxLink Communications
IAX/SIP Termination and Origination
Wholesale Dialup Services
matthew at txlink.net
972-617-2877
http://www.txlink.net
You'll need a context called ldincoming [or equivalent] for the AGI to
transfer access to DISA like:
[ldincoming]
exten => 1011,1,DISA(no-password|disa)
exten => 1011,2,Hangup
You'll need a context called disa [or equivalent] with what you want to
allow the authenticated callers to access, mine looks like:
[disa]
include => tollfree
include => localonly
and then just call the agi in your dialplan with something like:
1234,1,AGI(cidauth.agi)
1234,2,Hangup
Here is the Mysql table:
mysql> describe cids;
+--------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+----------------+
| id | int(11) | | PRI | NULL | auto_increment |
| cid | char(10) | YES | | NULL | |
| active | int(11) | YES | | NULL | |
+--------+----------+------+-----+---------+----------------+
Insert each CID into the table that you want to have access. Active = 0 for
disabled, active = 1 for enabled.
Here is the perl code:
#!/usr/bin/perl
#
use Asterisk::AGI;
use DBI;
$db = "dbname";
$host = "dbhost";
$port = "3306";
$userid = "dbuser";
$password = "dbpass";
$connectionInfo = "DBI:mysql:database=$db;$host:$port";
$dbh = DBI->connect($connectionInfo,$userid,$password);
$AGI = new Asterisk::AGI;
my %input = $AGI->ReadParse();
$AGI->answer();
if (my $callerid = $input{'callerid'}) {
$callerid =~ m/(\d{10})/; # cut off the name
part of CID, numbers only
$callerid = $1;
$query = "SELECT active FROM cids WHERE cid='$callerid'";
$sth = $dbh->prepare($query);
$sth->execute();
$active = $sth->fetchrow_hashref();
if ($active->{"active"})
{
$AGI->set_context('ldincoming');
$AGI->set_extension('1011');
$AGI->set_priority(1);
exit;
}
}
# if we got here, there was no match found [auth failed], so play a message
saying so
# you could also log all auth failed [with caller ID ! :) ]
# you could also transfer caller to an operator
$AGI->stream_file('invalid');
$AGI->hangup();
exit;
More information about the asterisk-users
mailing list