def genRequest(self, method, body = None, nonce = None, realm = None, SipXXXAuthorization = SipAuthorization, \ reason = None, max_forwards = None): if self.outbound_proxy != None: target = self.outbound_proxy else: target = self.rAddr if max_forwards != None: max_forwards_hf = SipMaxForwards(number = max_forwards) else: max_forwards_hf = None req = SipRequest(method = method, ruri = self.rTarget, to = self.rUri, fr0m = self.lUri, cseq = self.lCSeq, callid = self.cId, contact = self.lContact, routes = self.routes, target = target, cguid = self.cGUID, user_agent = self.local_ua, maxforwards = max_forwards_hf) if nonce != None and realm != None and self.username != None and self.password != None: auth = SipXXXAuthorization(realm = realm, nonce = nonce, method = method, uri = str(self.rTarget), username = self.username, password = self.password) req.appendHeader(SipHeader(body = auth)) if body != None: req.setBody(body) if self.extra_headers != None: req.appendHeaders(self.extra_headers) if reason != None: req.appendHeader(SipHeader(body = reason)) self.reqs[self.lCSeq] = req return req
def genRequest(self, method, body = None, nonce = None, realm = None, SipXXXAuthorization = SipAuthorization, \ reason = None, max_forwards = None): if self.outbound_proxy != None: target = self.outbound_proxy else: target = self.rAddr if max_forwards != None: max_forwards_hf = SipMaxForwards(number=max_forwards) else: max_forwards_hf = None req = SipRequest(method=method, ruri=self.rTarget, to=self.rUri, fr0m=self.lUri, cseq=self.lCSeq, callid=self.cId, contact=self.lContact, routes=self.routes, target=target, cguid=self.cGUID, user_agent=self.local_ua, maxforwards=max_forwards_hf) if nonce != None and realm != None and self.username != None and self.password != None: auth = SipXXXAuthorization(realm=realm, nonce=nonce, method=method, uri=str(self.rTarget), username=self.username, password=self.password) req.appendHeader(SipHeader(body=auth)) if body != None: req.setBody(body) if self.extra_headers != None: req.appendHeaders(self.extra_headers) if reason != None: req.appendHeader(SipHeader(body=reason)) self.reqs[self.lCSeq] = req return req
class SipRegistrationAgent(object): global_config = None user = None passw = None rmsg = None dead = False atries = 0 source_address = None def __init__(self, global_config, aor, contact, user=None, passw=None, exp=180, rok_cb=None, rfail_cb=None, cb_arg=None, target=None): self.global_config = global_config self.user = user self.passw = passw self.rok_cb = rok_cb self.rfail_cb = rfail_cb self.cb_arg = cb_arg ruri = aor.getCopy() ruri.username = None aor.port = None tfaddr = SipAddress(url=aor) fr0m = SipFrom(address=tfaddr.getCopy()) fr0m.genTag() to = SipTo(address=tfaddr) contact = SipContact(address=SipAddress(url=contact)) contact.address.params['expires'] = '180' self.rmsg = SipRequest(method='REGISTER', ruri=ruri, fr0m=fr0m, contact=contact, to=to, target=target) def doregister(self): if self.dead: return self.global_config['_sip_tm'].newTransaction(self.rmsg, self.gotreply, \ laddress = self.source_address) self.rmsg.getHFBody('via').genBranch() self.rmsg.getHFBody('cseq').incCSeqNum() def stopregister(self): self.dead = True self.rmsg = None def gotreply(self, resp): if self.dead: return if resp.scode < 200: return if resp.scode >= 200 and resp.scode < 300 and resp.reason != 'Auth Failed': contact = None if resp.countHFs('contact') > 0: contact = resp.getHFBody('contact') if contact != None and 'expires' in contact.address.params: tout = int(contact.address.params['expires']) elif resp.countHFs('expires') > 0: tout = resp.getHFBody('expires').getNum() else: tout = 180 timer = Timeout(self.doregister, tout) if self.rok_cb != None: self.rok_cb(timer.etime.realt, contact, self.cb_arg) self.atries = 0 return if resp.scode == 401 and resp.countHFs('www-authenticate') != 0 and \ self.user != None and self.passw != None and self.atries < 3: challenge = resp.getHFBody('www-authenticate') auth = SipAuthorization(realm=challenge.getRealm(), nonce=challenge.getNonce(), method='REGISTER', uri=str(self.rmsg.ruri), username=self.user, password=self.passw) for authorization in self.rmsg.getHFs('authorization'): self.rmsg.removeHeader(authorization) self.rmsg.appendHeader(SipHeader(name='authorization', body=auth)) self.atries += 1 self.doregister() return if resp.scode == 407 and resp.countHFs('proxy-authenticate') != 0 and \ self.user != None and self.passw != None and self.atries < 3: challenge = resp.getHFBody('proxy-authenticate') auth = SipProxyAuthorization(realm=challenge.getRealm(), nonce=challenge.getNonce(), method='REGISTER', uri=str(self.rmsg.ruri), username=self.user, password=self.passw) for authorization in self.rmsg.getHFs('proxy-authorization'): self.rmsg.removeHeader(authorization) self.rmsg.appendHeader( SipHeader(name='proxy-authorization', body=auth)) self.atries += 1 self.doregister() return if self.rfail_cb != None: self.rfail_cb(resp.getSL(), self.cb_arg) Timeout(self.doregister, 60) self.atries = 0
class SipRegistrationAgent(object): global_config = None user = None passw = None rmsg = None dead = False atries = 0 source_address = None def __init__(self, global_config, aor, contact, user = None, passw = None, exp = 180, rok_cb = None, rfail_cb = None, cb_arg = None, target = None): self.global_config = global_config self.user = user self.passw = passw self.rok_cb = rok_cb self.rfail_cb = rfail_cb self.cb_arg = cb_arg ruri = aor.getCopy() ruri.username = None aor.port = None tfaddr = SipAddress(url = aor) fr0m = SipFrom(address = tfaddr.getCopy()) fr0m.genTag() to = SipTo(address = tfaddr) contact = SipContact(address = SipAddress(url = contact)) contact.address.params['expires'] = '180' self.rmsg = SipRequest(method = 'REGISTER', ruri = ruri, fr0m = fr0m, contact = contact, to = to, target = target) def doregister(self): if self.dead: return self.global_config['_sip_tm'].newTransaction(self.rmsg, self.gotreply, \ laddress = self.source_address) self.rmsg.getHFBody('via').genBranch() self.rmsg.getHFBody('cseq').incCSeqNum() def stopregister(self): self.dead = True self.rmsg = None def gotreply(self, resp): if self.dead: return if resp.scode < 200: return if resp.scode >= 200 and resp.scode < 300 and resp.reason != 'Auth Failed': contact = None if resp.countHFs('contact') > 0: contact = resp.getHFBody('contact') if contact != None and 'expires' in contact.address.params: tout = int(contact.address.params['expires']) elif resp.countHFs('expires') > 0: tout = resp.getHFBody('expires').getNum() else: tout = 180 timer = Timeout(self.doregister, tout) if self.rok_cb != None: self.rok_cb(timer.etime.realt, contact, self.cb_arg) self.atries = 0 return if resp.scode == 401 and resp.countHFs('www-authenticate') != 0 and \ self.user != None and self.passw != None and self.atries < 3: challenge = resp.getHFBody('www-authenticate') auth = SipAuthorization(realm = challenge.getRealm(), nonce = challenge.getNonce(), method = 'REGISTER', uri = str(self.rmsg.ruri), username = self.user, password = self.passw) for authorization in self.rmsg.getHFs('authorization'): self.rmsg.removeHeader(authorization) self.rmsg.appendHeader(SipHeader(name = 'authorization', body = auth)) self.atries += 1 self.doregister() return if resp.scode == 407 and resp.countHFs('proxy-authenticate') != 0 and \ self.user != None and self.passw != None and self.atries < 3: challenge = resp.getHFBody('proxy-authenticate') auth = SipProxyAuthorization(realm = challenge.getRealm(), nonce = challenge.getNonce(), method = 'REGISTER', uri = str(self.rmsg.ruri), username = self.user, password = self.passw) for authorization in self.rmsg.getHFs('proxy-authorization'): self.rmsg.removeHeader(authorization) self.rmsg.appendHeader(SipHeader(name = 'proxy-authorization', body = auth)) self.atries += 1 self.doregister() return if self.rfail_cb != None: self.rfail_cb(resp.getSL(), self.cb_arg) Timeout(self.doregister, 60) self.atries = 0