mirror of https://github.com/sipwise/sems.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
3.8 KiB
114 lines
3.8 KiB
conf_auth Readme
|
|
|
|
conf_auth application: PIN collect, authentication and B2BUA
|
|
connect with timeout
|
|
|
|
The conf_auth application is an ivr application which plays
|
|
a welcome message to the caller, collects a PIN, verifies
|
|
this PIN agains a XMLRPC authentication server, and if correct
|
|
connects in back-to-back user agent mode to a uri returned
|
|
from the authentication server. The call is terminated after
|
|
a timeout, if the authentication server did return a timeout
|
|
value. If the caller while collecting the PIN does not enter
|
|
any digit for a number of seconds, she or he is prompted with
|
|
a hint message.
|
|
|
|
As this script combines diverse SEMS/ivr functionality (TTS,
|
|
DTMF collect, b2bua, timer), it may well serve as a basis for
|
|
customized services, and actually it is rather meant as a
|
|
demonstration of these possibilities.
|
|
|
|
The authentication server here needs to serve only one method:
|
|
AuthorizeConference. This method takes as argument the From URI,
|
|
Request URI, and PIN, and returns either a tuple of
|
|
['FAIL', <file_name>] where <file_name> is the file which should
|
|
be played to tell the user that the entered PIN is not correct, or
|
|
['OK', <to>, <to_uri>, <timer_timeout>, <max_participants>]
|
|
where
|
|
<to> : To in the second call leg
|
|
<to_uri> : Uri of the second call leg
|
|
<timer_timeout> : Timeout of call (0 if no timer)
|
|
<max_participants> : unused
|
|
|
|
An example python authentication server is given below.
|
|
|
|
#---------- auth_srv.py -------------------------------------
|
|
!/usr/bin/python
|
|
|
|
import sys
|
|
sys.path.insert(0, '../')
|
|
import xmlrpc
|
|
import traceback
|
|
import select
|
|
import string
|
|
import csv
|
|
|
|
PORT = 23456
|
|
TIMEOUT = 1.0
|
|
LOGLEVEL = 3 # this is the default log level
|
|
TEST_NAME = 'shilad'
|
|
TEST_PASS = 'shilad'
|
|
|
|
PINS = {
|
|
'sip:uli@iptel.org' + 'sip:conf1@confserver.net' + '1234' \
|
|
: ['test <sip:1@192.168.5.100>','sip:1@192.168.5.100']
|
|
}
|
|
|
|
|
|
# you may uncomment the 'setAuth()' line to use the example
|
|
# authentication function 'authenticate()' supplied below
|
|
#
|
|
def exampleServer():
|
|
|
|
global exitFlag
|
|
|
|
exitFlag = 0
|
|
s = xmlrpc.server()
|
|
# s.setAuth(authenticate)
|
|
s.addMethods({
|
|
'AuthorizeConference' : confAuthMethod,
|
|
'add_pin' : addPinMethod,
|
|
'list_pins' : listPinsMethod
|
|
})
|
|
s.bindAndListen(PORT)
|
|
while 1:
|
|
try:
|
|
s.work() # you could set a timeout if desired
|
|
except:
|
|
e = sys.exc_info()
|
|
if e[0] in (KeyboardInterrupt, SystemExit):
|
|
raise e[0], e[1], e[2]
|
|
traceback.print_exc()
|
|
if exitFlag:
|
|
break
|
|
|
|
def authenticate(uri, name, password):
|
|
if name == TEST_NAME and password == TEST_PASS:
|
|
return (1, 'a domain')
|
|
else:
|
|
return (0, 'a domain')
|
|
|
|
def confAuthMethod(serv, src, uri, method, params):
|
|
print 'params are', params
|
|
test_key = params[0] + params[1] + params[2]
|
|
print 'test_key = ', test_key
|
|
if not PINS.has_key(test_key):
|
|
return ['FAIL', 'wav/failed.wav']
|
|
else:
|
|
return ['OK', PINS[test_key][0], PINS[test_key][1], 30, 5 ]
|
|
|
|
def addPinMethod(serv, src, uri, method, params):
|
|
print 'params are', params
|
|
add_key = params[0] + params[1] + params[2]
|
|
print 'add_key = ', add_key
|
|
PINS[add_key] = [params[3], params[4]]
|
|
return ['ok']
|
|
|
|
def listPinsMethod(serv, src, uri, method, params):
|
|
return PINS
|
|
|
|
if __name__ == '__main__':
|
|
exampleServer()
|
|
|
|
#---------- auth_srv.py -------------------------------------
|