Esempio n. 1
0
 def __init__(self,
              address=None,
              name=None,
              url=None,
              params=None,
              hadbrace=None):
     self.params = {}
     self.hadbrace = True
     if address == None:
         self.name = name
         self.url = url
         if params != None:
             self.params = params
         if hadbrace != None:
             self.hadbrace = hadbrace
         return
     # simple 'sip:foo' case
     if address.lower().startswith('sip:') and address.find('<') == -1:
         parts = address.split(';', 1)
         self.url = SipURL(parts[0])
         if len(parts) == 2:
             for l in parts[1].split(';'):
                 if not l:
                     continue
                 k, v = l.split('=')
                 self.params[k] = v
         self.hadbrace = False
         return
     self.name, url = address.split('<', 1)
     self.name = self.name.strip()
     if self.name.startswith('"'):
         self.name = self.name[1:]
     if self.name.endswith('"'):
         self.name = self.name[:-1]
     url, paramstring = url.split('>', 1)
     self.url = SipURL(url)
     paramstring = paramstring.strip()
     if paramstring:
         for l in paramstring.split(';'):
             if not l:
                 continue
             k, v = l.split('=')
             self.params[k] = v
Esempio n. 2
0
 def __init__(self, body=None, address=None):
     if body == '*':
         SipGenericHF.__init__(self, body)
         self.asterisk = True
         return
     SipAddressHF.__init__(self, body, address)
     if body == None and address == None:
         self.address = SipAddress(name='Anonymous',
                                   url=SipURL(host=SipConf.my_address,
                                              port=SipConf.my_port))
Esempio n. 3
0
 def __init__(self, address = None, name = None, url = None, params = None, hadbrace = None):
     self.params = {}
     self.hadbrace = True
     if address == None:
         self.name = name
         self.url = url
         if params != None:
             self.params = params
         if hadbrace != None:
             self.hadbrace = hadbrace
         return
     # simple 'sip:foo' case
     if address.lower().startswith('sip:') and address.find('<') == -1:
         parts = address.split(';', 1)
         self.url = SipURL(parts[0])
         if len(parts) == 2:
             for l in parts[1].split(';'):
                 if not l:
                     continue
                 k, v = l.split('=')
                 self.params[k] = v
         self.hadbrace = False
         return
     self.name, url = address.split('<', 1)
     self.name = self.name.strip()
     if self.name.startswith('"'):
         self.name = self.name[1:]
     if self.name.endswith('"'):
         self.name = self.name[:-1]
     url, paramstring = url.split('>', 1)
     self.url = SipURL(url)
     paramstring = paramstring.strip()
     if paramstring:
         for l in paramstring.split(';'):
             if not l:
                 continue
             k, v = l.split('=')
             self.params[k] = v
Esempio n. 4
0
 def setSL(self, startline):
     self.method, ruri, self.sipver = startline.split()
     self.ruri = SipURL(ruri)
Esempio n. 5
0
class SipRequest(SipMsg):
    method = None
    ruri = None
    sipver = None

    def __init__(self, buf = None, method = None, ruri = None, sipver = 'SIP/2.0', to = None, fr0m = None, via = None, cseq = None, \
                 callid = None, maxforwards = None, body = None, contact = None, routes = (), target = None, cguid = None):
        SipMsg.__init__(self, buf)
        if buf != None:
            return

        self.method = method
        self.ruri = ruri
        if target == None:
            if len(routes) == 0:
                self.setTarget(self.ruri.getAddr())
            else:
                self.setTarget(routes[0].getAddr())
        else:
            self.setTarget(target)
        self.sipver = sipver
        self.appendHeader(SipHeader(name = 'via', body = via))
        if via == None:
            self.getHFBody('via').genBranch()
        self.appendHeaders([SipHeader(name = 'route', body = x) for x in routes])
        self.appendHeader(SipHeader(name = 'max-forwards', body = maxforwards))
        self.appendHeader(SipHeader(name = 'from', body = fr0m))
        if to == None:
            to = SipTo(address = SipAddress(url = ruri))
        self.appendHeader(SipHeader(name = 'to', body = to))
        self.appendHeader(SipHeader(name = 'call-id', body = callid))
        self.appendHeader(SipHeader(name = 'cseq', body = SipCSeq(cseq = cseq, method = method)))
        if contact != None:
            self.appendHeader(SipHeader(name = 'contact', body = contact))
        if method in ('INVITE', 'REGISTER'):
            self.appendHeader(SipHeader(name = 'expires'))
        self.appendHeader(SipHeader(name = 'user-agent'))
        if cguid != None:
            self.appendHeader(SipHeader(name = 'cisco-guid', body = cguid))
            self.appendHeader(SipHeader(name = 'h323-conf-id', body = cguid))
        if body != None:
            self.setBody(body)

    def setSL(self, startline):
        self.method, ruri, self.sipver = startline.split()
        self.ruri = SipURL(ruri)

    def getSL(self):
        return self.method + ' ' + str(self.ruri) + ' ' + self.sipver

    def getMethod(self):
        return self.method

    def getRURI(self):
        return self.ruri

    def setRURI(self, ruri):
        self.ruri = ruri

    def genResponse(self, scode, reason, body = None):
        # Should be done at the transaction level
        # to = self.getHF('to').getBody().getCopy()
        # if code > 100 and to.getTag() == None:
        #    to.genTag()
        return SipResponse(scode = scode, reason = reason, sipver = self.sipver, fr0m = self.getHFBody('from').getCopy(), \
                           callid = self.getHFBody('call-id').getCopy(), vias = [x.getCopy() for x in self.getHFBodys('via')], \
                           to = self.getHFBody('to').getCopy(), cseq = self.getHFBody('cseq').getCopy(), \
                           rrs = [x.getCopy() for x in self.getHFBodys('record-route')], body = body)

    def genACK(self, to = None):
        if to == None:
            to = self.getHFBody('to').getCopy()
        return SipRequest(method = 'ACK', ruri = self.ruri.getCopy(), sipver = self.sipver, \
                          fr0m = self.getHFBody('from').getCopy(), to = to, \
                          via = self.getHFBody('via').getCopy(), callid = self.getHFBody('call-id').getCopy(), \
                          cseq = self.getHFBody('cseq').getCSeqNum(), maxforwards = self.getHFBody('max-forwards').getCopy())

    def genCANCEL(self):
        return SipRequest(method = 'CANCEL', ruri = self.ruri.getCopy(), sipver = self.sipver, \
                          fr0m = self.getHFBody('from').getCopy(), to = self.getHFBody('to').getCopy(), \
                          via = self.getHFBody('via').getCopy(), callid = self.getHFBody('call-id').getCopy(), \
                          cseq = self.getHFBody('cseq').getCSeqNum(), maxforwards = self.getHFBody('max-forwards').getCopy(), \
                          routes = [x.getCopy() for x in self.getHFBodys('route')], target = self.getTarget())

    def genRequest(self, method, cseq = None):
        if cseq == None:
            cseq = self.getHFBody('cseq').getCSeqNum()
        return SipRequest(method = method, ruri = self.ruri.getCopy(), sipver = self.sipver, \
                          fr0m = self.getHFBody('from').getCopy(), to = self.getHFBody('to').getCopy(), \
                          via = self.getHFBody('via').getCopy(), callid = self.getHFBody('call-id').getCopy(), \
                          cseq = cseq, maxforwards = self.getHFBody('max-forwards').getCopy())
Esempio n. 6
0
 def recvEvent(self, event):
     if isinstance(event, CCEventTry):
         if self.ua.setup_ts == None:
             self.ua.setup_ts = event.rtime
         self.ua.origin = 'callee'
         cId, cGUID, callingID, calledID, body, auth, callingName = event.getData(
         )
         if body != None and self.ua.on_local_sdp_change != None and body.needs_update:
             self.ua.on_local_sdp_change(body,
                                         lambda x: self.ua.recvEvent(event))
             return None
         if cId == None:
             self.ua.cId = SipCallId()
         else:
             self.ua.cId = cId.getCopy()
         self.ua.global_config['_sip_tm'].regConsumer(
             self.ua, str(self.ua.cId))
         self.ua.rTarget = SipURL(username=calledID,
                                  host=self.ua.rAddr0[0],
                                  port=self.ua.rAddr0[1])
         self.ua.rUri = SipTo(address=SipAddress(
             url=self.ua.rTarget.getCopy(), hadbrace=True))
         self.ua.rUri.getUrl().port = None
         self.ua.lUri = SipFrom(address=SipAddress(url=SipURL(
             username=callingID),
                                                   hadbrace=True,
                                                   name=callingName))
         self.ua.lUri.getUrl().port = None
         self.ua.lUri.setTag(self.ua.lTag)
         self.ua.lCSeq = 200
         self.ua.lContact = SipContact()
         self.ua.lContact.getUrl().username = callingID
         self.ua.routes = []
         self.ua.cGUID = cGUID
         self.ua.lSDP = body
         req = self.ua.genRequest('INVITE', body, reason=event.reason)
         self.ua.lCSeq += 1
         self.ua.tr = self.ua.global_config['_sip_tm'].newTransaction(req, self.ua.recvResponse, \
           laddress = self.ua.source_address)
         self.ua.auth = None
         if self.ua.expire_time != None:
             self.ua.expire_time += event.rtime
         if self.ua.no_progress_time != None:
             self.ua.no_progress_time += event.rtime
             if self.ua.expire_time != None and self.ua.no_progress_time >= self.ua.expire_time:
                 self.ua.no_progress_time = None
         if self.ua.no_reply_time != None:
             if self.ua.no_reply_time < 32:
                 self.ua.no_reply_time += event.rtime
                 if self.ua.expire_time != None and self.ua.no_reply_time >= self.ua.expire_time:
                     self.ua.no_reply_time = None
                 elif self.ua.no_progress_time != None and self.ua.no_reply_time >= self.ua.no_progress_time:
                     self.ua.no_reply_time = None
             else:
                 self.ua.no_reply_time = None
         if self.ua.no_reply_time != None:
             self.ua.no_reply_timer = TimeoutAbs(self.ua.no_reply_expires,
                                                 self.ua.no_reply_time)
         elif self.ua.no_progress_time != None:
             self.ua.no_progress_timer = TimeoutAbs(
                 self.ua.no_progress_expires, self.ua.no_progress_time)
         elif self.ua.expire_time != None:
             self.ua.expire_timer = TimeoutAbs(self.ua.expires,
                                               self.ua.expire_time)
         return (UacStateTrying, )
     if isinstance(event, CCEventFail) or isinstance(
             event, CCEventRedirect) or isinstance(event,
                                                   CCEventDisconnect):
         return (UaStateDead, self.ua.disc_cbs, event.rtime, event.origin)
     return None
Esempio n. 7
0
 def __init__(self,
              address=None,
              name=None,
              url=None,
              params=None,
              hadbrace=None,
              params_order=None,
              relaxedparser=False):
     self.params = {}
     self.params_order = []
     self.hadbrace = True
     if address == None:
         self.name = name
         self.url = url
         if params != None:
             self.params = params
         if params_order != None:
             self.params_order = params_order
         if hadbrace != None:
             self.hadbrace = hadbrace
         return
     # simple 'sip:foo' case
     if address.lower().startswith('sip:') and address.find('<') == -1:
         parts = address.split(';', 1)
         self.url = SipURL(parts[0], relaxedparser=relaxedparser)
         if len(parts) == 2:
             for l in parts[1].split(';'):
                 if not l:
                     continue
                 k_v = l.split('=', 1)
                 if len(k_v) == 2:
                     k, v = k_v
                 else:
                     k = k_v[0]
                     v = None
                 self.params[k] = v
                 if self.params_order.count(k) > 0:
                     self.params_order.remove(k)
                 self.params_order.append(k)
         self.hadbrace = False
         return
     if address.startswith('"'):
         qpos = findquotes(address)
         url = None
         if len(qpos) == 1:
             self.name = address[1:qpos[0]]
             url = address[qpos[0] + 1:].strip()
         else:
             for i in range(1, len(qpos)):
                 if address.find('<', 1, qpos[i]) != -1:
                     self.name = address[1:qpos[i - 1]]
                     url = address[qpos[i - 1] + 1:].strip()
                     break
             else:
                 self.name = address[1:qpos[i]]
                 url = address[qpos[i] + 1:].strip()
         if url == None:
             raise ValueError('Cannot separate name from URI: %s' % address)
         if url.startswith('<'):
             url = url[1:]
     else:
         self.name, url = address.split('<', 1)
         self.name = self.name.strip()
     url, paramstring = url.split('>', 1)
     self.url = SipURL(url, relaxedparser=relaxedparser)
     paramstring = paramstring.strip()
     if paramstring:
         for l in paramstring.split(';'):
             if not l:
                 continue
             k_v = l.split('=', 1)
             if len(k_v) == 2:
                 k, v = k_v
             else:
                 k = k_v[0]
                 v = None
             self.params[k] = v
             if self.params_order.count(k) > 0:
                 self.params_order.remove(k)
             self.params_order.append(k)
Esempio n. 8
0
class SipAddress(object):
    name = None
    url = None
    params = None
    params_order = None
    hadbrace = None
    transtable = maketrans('-.!%*_+`\'~', 'a' * 10)

    def __init__(self,
                 address=None,
                 name=None,
                 url=None,
                 params=None,
                 hadbrace=None,
                 params_order=None,
                 relaxedparser=False):
        self.params = {}
        self.params_order = []
        self.hadbrace = True
        if address == None:
            self.name = name
            self.url = url
            if params != None:
                self.params = params
            if params_order != None:
                self.params_order = params_order
            if hadbrace != None:
                self.hadbrace = hadbrace
            return
        # simple 'sip:foo' case
        if address.lower().startswith('sip:') and address.find('<') == -1:
            parts = address.split(';', 1)
            self.url = SipURL(parts[0], relaxedparser=relaxedparser)
            if len(parts) == 2:
                for l in parts[1].split(';'):
                    if not l:
                        continue
                    k_v = l.split('=', 1)
                    if len(k_v) == 2:
                        k, v = k_v
                    else:
                        k = k_v[0]
                        v = None
                    self.params[k] = v
                    if self.params_order.count(k) > 0:
                        self.params_order.remove(k)
                    self.params_order.append(k)
            self.hadbrace = False
            return
        if address.startswith('"'):
            qpos = findquotes(address)
            url = None
            if len(qpos) == 1:
                self.name = address[1:qpos[0]]
                url = address[qpos[0] + 1:].strip()
            else:
                for i in range(1, len(qpos)):
                    if address.find('<', 1, qpos[i]) != -1:
                        self.name = address[1:qpos[i - 1]]
                        url = address[qpos[i - 1] + 1:].strip()
                        break
                else:
                    self.name = address[1:qpos[i]]
                    url = address[qpos[i] + 1:].strip()
            if url == None:
                raise ValueError('Cannot separate name from URI: %s' % address)
            if url.startswith('<'):
                url = url[1:]
        else:
            self.name, url = address.split('<', 1)
            self.name = self.name.strip()
        url, paramstring = url.split('>', 1)
        self.url = SipURL(url, relaxedparser=relaxedparser)
        paramstring = paramstring.strip()
        if paramstring:
            for l in paramstring.split(';'):
                if not l:
                    continue
                k_v = l.split('=', 1)
                if len(k_v) == 2:
                    k, v = k_v
                else:
                    k = k_v[0]
                    v = None
                self.params[k] = v
                if self.params_order.count(k) > 0:
                    self.params_order.remove(k)
                self.params_order.append(k)

    def __str__(self):
        return self.localStr()

    def localStr(self, local_addr=None, local_port=None):
        if self.hadbrace:
            od = '<'
            cd = '>'
        else:
            od = ''
            cd = ''
        s = ''
        if self.name != None and len(self.name) > 0:
            if not self.name.translate(self.transtable).isalnum():
                s += '"%s" ' % self.name
            else:
                s += self.name + ' '
            od = '<'
            cd = '>'
        s += od + self.url.localStr(local_addr, local_port) + cd
        for k in self.params_order:
            v = self.params[k]
            if v != None:
                s += ';' + k + '=' + v
            else:
                s += ';' + k
        return s

    def getCopy(self):
        return SipAddress(name = self.name, url = self.url.getCopy(), params = self.params.copy(), \
          hadbrace = self.hadbrace, params_order = self.params_order[:])

    def getParam(self, name):
        return self.params.get(name, None)

    def setParam(self, name, value=None):
        self.params[name] = value
        if self.params_order.count(name) == 0:
            self.params_order.append(name)

    def delParam(self, name):
        del self.params[name]
        self.params_order.remove(name)
Esempio n. 9
0
 def setSL(self, startline):
     self.method, ruri, self.sipver = startline.split()
     self.ruri = SipURL(ruri)
Esempio n. 10
0
class SipAddress(object):
    name = None
    url = None
    params = None
    hadbrace = None
    transtable = maketrans('-.!%*_+`\'~', 'a' * 10)

    def __init__(self,
                 address=None,
                 name=None,
                 url=None,
                 params=None,
                 hadbrace=None):
        self.params = {}
        self.hadbrace = True
        if address == None:
            self.name = name
            self.url = url
            if params != None:
                self.params = params
            if hadbrace != None:
                self.hadbrace = hadbrace
            return
        # simple 'sip:foo' case
        if address.lower().startswith('sip:') and address.find('<') == -1:
            parts = address.split(';', 1)
            self.url = SipURL(parts[0])
            if len(parts) == 2:
                for l in parts[1].split(';'):
                    if not l:
                        continue
                    k, v = l.split('=')
                    self.params[k] = v
            self.hadbrace = False
            return
        self.name, url = address.split('<', 1)
        self.name = self.name.strip()
        if self.name.startswith('"'):
            self.name = self.name[1:]
        if self.name.endswith('"'):
            self.name = self.name[:-1]
        url, paramstring = url.split('>', 1)
        self.url = SipURL(url)
        paramstring = paramstring.strip()
        if paramstring:
            for l in paramstring.split(';'):
                if not l:
                    continue
                k, v = l.split('=')
                self.params[k] = v

    def __str__(self):
        return self.localStr()

    def localStr(self, local_addr=None, local_port=None):
        if self.hadbrace:
            od = '<'
            cd = '>'
        else:
            od = ''
            cd = ''
        s = ''
        if self.name != None and len(self.name) > 0:
            if not self.name.translate(self.transtable).isalnum():
                s += '"%s" ' % self.name
            else:
                s += self.name + ' '
            od = '<'
            cd = '>'
        s += od + self.url.localStr(local_addr, local_port) + cd
        for k, v in self.params.items():
            s += ';' + k + '=' + v
        return s

    def getCopy(self):
        return SipAddress(name=self.name,
                          url=self.url.getCopy(),
                          params=self.params.copy(),
                          hadbrace=self.hadbrace)

    def getParam(self, name):
        try:
            return self.params[name]
        except KeyError:
            return None

    def setParam(self, name, value):
        self.params[name] = value

    def delParam(self, name):
        del self.params[name]
Esempio n. 11
0
 def __init__(self, body=None, address=None):
     SipAddressHF.__init__(self, body, address)
     if body == None and address == None:
         self.address = SipAddress(name='Anonymous',
                                   url=SipURL(host=SipConf.my_address,
                                              port=SipConf.my_port))
Esempio n. 12
0
class SipRequest(SipMsg):
    method = None
    ruri = None
    sipver = None
    user_agent = None

    def __init__(
        self,
        buf=None,
        method=None,
        ruri=None,
        sipver="SIP/2.0",
        to=None,
        fr0m=None,
        via=None,
        cseq=None,
        callid=None,
        maxforwards=None,
        body=None,
        contact=None,
        routes=(),
        target=None,
        cguid=None,
        user_agent=None,
        expires=None,
    ):
        SipMsg.__init__(self, buf)
        if buf != None:
            return
        self.method = method
        self.ruri = ruri
        if target == None:
            if len(routes) == 0:
                self.setTarget(self.ruri.getAddr())
            else:
                self.setTarget(routes[0].getAddr())
        else:
            self.setTarget(target)
        self.sipver = sipver
        self.appendHeader(SipHeader(name="via", body=via))
        if via == None:
            self.getHFBody("via").genBranch()
        self.appendHeaders([SipHeader(name="route", body=x) for x in routes])
        self.appendHeader(SipHeader(name="max-forwards", body=maxforwards))
        self.appendHeader(SipHeader(name="from", body=fr0m))
        if to == None:
            to = SipTo(address=SipAddress(url=ruri))
        self.appendHeader(SipHeader(name="to", body=to))
        self.appendHeader(SipHeader(name="call-id", body=callid))
        self.appendHeader(SipHeader(name="cseq", body=SipCSeq(cseq=cseq, method=method)))
        if contact != None:
            self.appendHeader(SipHeader(name="contact", body=contact))
        if expires == None and method == "INVITE":
            expires = SipHeader(name="expires")
            self.appendHeader(expires)
        elif expires != None:
            expires = SipHeader(name="expires", body=expires)
            self.appendHeader(expires)
        if user_agent != None:
            self.user_agent = user_agent
            self.appendHeader(SipHeader(name="user-agent", bodys=user_agent))
        else:
            self.appendHeader(SipHeader(name="user-agent"))
        if cguid != None:
            self.appendHeader(SipHeader(name="cisco-guid", body=cguid))
            self.appendHeader(SipHeader(name="h323-conf-id", body=cguid))
        if body != None:
            self.setBody(body)

    def setSL(self, startline):
        self.method, ruri, self.sipver = startline.split()
        self.ruri = SipURL(ruri)

    def getSL(self):
        return self.method + " " + str(self.ruri) + " " + self.sipver

    def getMethod(self):
        return self.method

    def getRURI(self):
        return self.ruri

    def setRURI(self, ruri):
        self.ruri = ruri

    def genResponse(self, scode, reason, body=None, server=None):
        # Should be done at the transaction level
        # to = self.getHF('to').getBody().getCopy()
        # if code > 100 and to.getTag() == None:
        #    to.genTag()
        return SipResponse(
            scode=scode,
            reason=reason,
            sipver=self.sipver,
            fr0m=self.getHFBCopy("from"),
            callid=self.getHFBCopy("call-id"),
            vias=self.getHFBCopys("via"),
            to=self.getHFBCopy("to"),
            cseq=self.getHFBCopy("cseq"),
            rrs=self.getHFBCopys("record-route"),
            body=body,
            server=server,
        )

    def genACK(self, to=None):
        if to == None:
            to = self.getHFBody("to").getCopy()
        maxforwards = self.getHFBodys("max-forwards")
        if len(maxforwards) > 0:
            maxforward = maxforwards[0].getCopy()
        else:
            maxforward = None
        return SipRequest(
            method="ACK",
            ruri=self.ruri.getCopy(),
            sipver=self.sipver,
            fr0m=self.getHFBCopy("from"),
            to=to,
            via=self.getHFBCopy("via"),
            callid=self.getHFBCopy("call-id"),
            cseq=self.getHFBody("cseq").getCSeqNum(),
            maxforwards=maxforward,
            user_agent=self.user_agent,
        )

    def genCANCEL(self):
        maxforwards = self.getHFBodys("max-forwards")
        if len(maxforwards) > 0:
            maxforward = maxforwards[0].getCopy()
        else:
            maxforward = None
        return SipRequest(
            method="CANCEL",
            ruri=self.ruri.getCopy(),
            sipver=self.sipver,
            fr0m=self.getHFBCopy("from"),
            to=self.getHFBCopy("to"),
            via=self.getHFBCopy("via"),
            callid=self.getHFBCopy("call-id"),
            cseq=self.getHFBody("cseq").getCSeqNum(),
            maxforwards=maxforward,
            routes=self.getHFBCopys("route"),
            target=self.getTarget(),
            user_agent=self.user_agent,
        )

    def genRequest(self, method, cseq=None):
        if cseq == None:
            cseq = self.getHFBody("cseq").getCSeqNum()
        maxforwards = self.getHFBodys("max-forwards")
        if len(maxforwards) > 0:
            maxforward = maxforwards[0].getCopy()
        else:
            maxforward = None
        expires = self.getHFBodys("expires")
        if len(expires) > 0:
            expires = expires[0].getCopy()
        else:
            expires = None
        return SipRequest(
            method=method,
            ruri=self.ruri.getCopy(),
            sipver=self.sipver,
            fr0m=self.getHFBCopy("from"),
            to=self.getHFBCopy("to"),
            via=self.getHFBCopy("via"),
            callid=self.getHFBCopy("call-id"),
            cseq=cseq,
            maxforwards=maxforward,
            user_agent=self.user_agent,
            expires=expires,
        )
Esempio n. 13
0
class SipAddress(object):
    name = None
    url = None
    params = None
    hadbrace = None
    transtable = maketrans('-.!%*_+`\'~', 'a' * 10)

    def __init__(self, address = None, name = None, url = None, params = None, hadbrace = None):
        self.params = {}
        self.hadbrace = True
        if address == None:
            self.name = name
            self.url = url
            if params != None:
                self.params = params
            if hadbrace != None:
                self.hadbrace = hadbrace
            return
        # simple 'sip:foo' case
        if address.lower().startswith('sip:') and address.find('<') == -1:
            parts = address.split(';', 1)
            self.url = SipURL(parts[0])
            if len(parts) == 2:
                for l in parts[1].split(';'):
                    if not l:
                        continue
                    k, v = l.split('=')
                    self.params[k] = v
            self.hadbrace = False
            return
        self.name, url = address.split('<', 1)
        self.name = self.name.strip()
        if self.name.startswith('"'):
            self.name = self.name[1:]
        if self.name.endswith('"'):
            self.name = self.name[:-1]
        url, paramstring = url.split('>', 1)
        self.url = SipURL(url)
        paramstring = paramstring.strip()
        if paramstring:
            for l in paramstring.split(';'):
                if not l:
                    continue
                k, v = l.split('=')
                self.params[k] = v

    def __str__(self):
        return self.localStr()

    def localStr(self, local_addr = None, local_port = None):
        if self.hadbrace:
            od = '<'
            cd = '>'
        else:
            od = ''
            cd = ''
        s = ''
        if self.name != None and len(self.name) > 0:
            if not self.name.translate(self.transtable).isalnum():
                s += '"%s" ' % self.name
            else:
                s += self.name + ' '
            od = '<'
            cd = '>'
        s += od + self.url.localStr(local_addr, local_port) + cd
        for k, v in self.params.items():
            s += ';' + k + '=' + v
        return s

    def getCopy(self):
        return SipAddress(name = self.name, url = self.url.getCopy(), params = self.params.copy(), hadbrace = self.hadbrace)

    def getParam(self, name):
        try:
            return self.params[name]
        except KeyError:
            return None

    def setParam(self, name, value):
        self.params[name] = value

    def delParam(self, name):
        del self.params[name]
Esempio n. 14
0
class SipAddress(object):
    name = None
    url = None
    params = None
    params_order = None
    hadbrace = None
    transtable = maketrans('-.!%*_+`\'~', 'a' * 10)

    def __init__(self, address = None, name = None, url = None, params = None,
      hadbrace = None, params_order = None, relaxedparser = False):
        self.params = {}
        self.params_order = []
        self.hadbrace = True
        if address == None:
            self.name = name
            self.url = url
            if params != None:
                self.params = params
            if params_order != None:
                self.params_order = params_order
            if hadbrace != None:
                self.hadbrace = hadbrace
            return
        # simple 'sip:foo' case
        if address.lower().startswith('sip:') and address.find('<') == -1:
            parts = address.split(';', 1)
            self.url = SipURL(parts[0], relaxedparser = relaxedparser)
            if len(parts) == 2:
                for l in parts[1].split(';'):
                    if not l:
                        continue
                    k_v = l.split('=', 1)
                    if len(k_v) == 2:
                        k, v = k_v
                    else:
                        k = k_v[0]
                        v = None
                    self.params[k] = v
                    if self.params_order.count(k) > 0:
                        self.params_order.remove(k)
                    self.params_order.append(k)
            self.hadbrace = False
            return
        if address.startswith('"'):
            qpos = findquotes(address)
            url = None
            if len(qpos) == 1:
                self.name = address[1:qpos[0]]
                url = address[qpos[0] + 1:].strip()
            else:
                for i in range(1, len(qpos)):
                    if address.find('<', 1, qpos[i]) != -1:
                        self.name = address[1:qpos[i - 1]]
                        url = address[qpos[i - 1] + 1:].strip()
                        break
                else:
                    self.name = address[1:qpos[i]]
                    url = address[qpos[i] + 1:].strip()
            if url == None:
                raise ValueError('Cannot separate name from URI: %s' % address)
            if url.startswith('<'):
                url = url[1:]
        else:
            self.name, url = address.split('<', 1)
            self.name = self.name.strip()
        url, paramstring = url.split('>', 1)
        self.url = SipURL(url, relaxedparser = relaxedparser)
        paramstring = paramstring.strip()
        if paramstring:
            for l in paramstring.split(';'):
                if not l:
                    continue
                k_v = l.split('=', 1)
                if len(k_v) == 2:
                    k, v = k_v
                else:
                    k = k_v[0]
                    v = None
                self.params[k] = v
                if self.params_order.count(k) > 0:
                    self.params_order.remove(k)
                self.params_order.append(k)

    def __str__(self):
        return self.localStr()

    def localStr(self, local_addr = None, local_port = None):
        if self.hadbrace:
            od = '<'
            cd = '>'
        else:
            od = ''
            cd = ''
        s = ''
        if self.name != None and len(self.name) > 0:
            if not self.name.translate(self.transtable).isalnum():
                s += '"%s" ' % self.name
            else:
                s += self.name + ' '
            od = '<'
            cd = '>'
        s += od + self.url.localStr(local_addr, local_port) + cd
        for k in self.params_order:
            v = self.params[k]
            if v != None:
                s += ';' + k + '=' + v
            else:
                s += ';' + k
        return s

    def getCopy(self):
        return SipAddress(name = self.name, url = self.url.getCopy(), params = self.params.copy(), \
          hadbrace = self.hadbrace, params_order = self.params_order[:])

    def getParam(self, name):
        return self.params.get(name, None)

    def setParam(self, name, value = None):
        self.params[name] = value
        if self.params_order.count(name) == 0:
            self.params_order.append(name)

    def delParam(self, name):
        del self.params[name]
        self.params_order.remove(name)
Esempio n. 15
0
class SipRequest(SipMsg):
    method = None
    ruri = None
    sipver = None
    user_agent = None

    def __init__(self, buf = None, method = None, ruri = None, sipver = 'SIP/2.0', to = None, fr0m = None, via = None, cseq = None, \
                 callid = None, maxforwards = None, body = None, contact = None, routes = (), target = None, cguid = None,
                 user_agent = None, expires = None):
        SipMsg.__init__(self, buf)
        if buf != None:
            return
        self.method = method
        self.ruri = ruri
        if target == None:
            if len(routes) == 0:
                self.setTarget(self.ruri.getAddr())
            else:
                self.setTarget(routes[0].getAddr())
        else:
            self.setTarget(target)
        self.sipver = sipver
        self.appendHeader(SipHeader(name = 'via', body = via))
        if via == None:
            self.getHFBody('via').genBranch()
        self.appendHeaders([SipHeader(name = 'route', body = x) for x in routes])
        self.appendHeader(SipHeader(name = 'max-forwards', body = maxforwards))
        self.appendHeader(SipHeader(name = 'from', body = fr0m))
        if to == None:
            to = SipTo(address = SipAddress(url = ruri))
        self.appendHeader(SipHeader(name = 'to', body = to))
        self.appendHeader(SipHeader(name = 'call-id', body = callid))
        self.appendHeader(SipHeader(name = 'cseq', body = SipCSeq(cseq = cseq, method = method)))
        if contact != None:
            self.appendHeader(SipHeader(name = 'contact', body = contact))
        if expires == None and method == 'INVITE':
            expires = SipHeader(name = 'expires')
            self.appendHeader(expires)
        elif expires != None:
            expires = SipHeader(name = 'expires', body = expires)
            self.appendHeader(expires)
        if user_agent != None:
            self.user_agent = user_agent
            self.appendHeader(SipHeader(name = 'user-agent', bodys = user_agent))
        else:
            self.appendHeader(SipHeader(name = 'user-agent'))
        if cguid != None:
            self.appendHeader(SipHeader(name = 'cisco-guid', body = cguid))
            self.appendHeader(SipHeader(name = 'h323-conf-id', body = cguid))
        if body != None:
            self.setBody(body)

    def setSL(self, startline):
        self.method, ruri, self.sipver = startline.split()
        self.ruri = SipURL(ruri)

    def getSL(self):
        return self.method + ' ' + str(self.ruri) + ' ' + self.sipver

    def getMethod(self):
        return self.method

    def getRURI(self):
        return self.ruri

    def setRURI(self, ruri):
        self.ruri = ruri

    def genResponse(self, scode, reason, body = None, server = None):
        # Should be done at the transaction level
        # to = self.getHF('to').getBody().getCopy()
        # if code > 100 and to.getTag() == None:
        #    to.genTag()
        return SipResponse(scode = scode, reason = reason, sipver = self.sipver, fr0m = self.getHFBCopy('from'), \
                           callid = self.getHFBCopy('call-id'), vias = self.getHFBCopys('via'), \
                           to = self.getHFBCopy('to'), cseq = self.getHFBCopy('cseq'), \
                           rrs = self.getHFBCopys('record-route'), body = body, \
                           server = server)

    def genACK(self, to = None):
        if to == None:
            to = self.getHFBody('to').getCopy()
        maxforwards = self.getHFBodys('max-forwards')
        if len(maxforwards) > 0:
            maxforward = maxforwards[0].getCopy()
        else:
            maxforward = None
        return SipRequest(method = 'ACK', ruri = self.ruri.getCopy(), sipver = self.sipver, \
                          fr0m = self.getHFBCopy('from'), to = to, \
                          via = self.getHFBCopy('via'), callid = self.getHFBCopy('call-id'), \
                          cseq = self.getHFBody('cseq').getCSeqNum(), maxforwards = maxforward, \
                          user_agent = self.user_agent)

    def genCANCEL(self):
        maxforwards = self.getHFBodys('max-forwards')
        if len(maxforwards) > 0:
            maxforward = maxforwards[0].getCopy()
        else:
            maxforward = None
        return SipRequest(method = 'CANCEL', ruri = self.ruri.getCopy(), sipver = self.sipver, \
                          fr0m = self.getHFBCopy('from'), to = self.getHFBCopy('to'), \
                          via = self.getHFBCopy('via'), callid = self.getHFBCopy('call-id'), \
                          cseq = self.getHFBody('cseq').getCSeqNum(), maxforwards = maxforward, \
                          routes = self.getHFBCopys('route'), target = self.getTarget(), \
                          user_agent = self.user_agent)

    def genRequest(self, method, cseq = None):
        if cseq == None:
            cseq = self.getHFBody('cseq').getCSeqNum()
        maxforwards = self.getHFBodys('max-forwards')
        if len(maxforwards) > 0:
            maxforward = maxforwards[0].getCopy()
        else:
            maxforward = None
        expires = self.getHFBodys('expires')
        if len(expires) > 0:
            expires = expires[0].getCopy()
        else:
            expires = None
        return SipRequest(method = method, ruri = self.ruri.getCopy(), sipver = self.sipver, \
                          fr0m = self.getHFBCopy('from'), to = self.getHFBCopy('to'), \
                          via = self.getHFBCopy('via'), callid = self.getHFBCopy('call-id'), \
                          cseq = cseq, maxforwards = maxforward, \
                          user_agent = self.user_agent, expires = expires)
Esempio n. 16
0
 def __init__(self, address = None, name = None, url = None, params = None,
   hadbrace = None, params_order = None, relaxedparser = False):
     self.params = {}
     self.params_order = []
     self.hadbrace = True
     if address == None:
         self.name = name
         self.url = url
         if params != None:
             self.params = params
         if params_order != None:
             self.params_order = params_order
         if hadbrace != None:
             self.hadbrace = hadbrace
         return
     # simple 'sip:foo' case
     if address.lower().startswith('sip:') and address.find('<') == -1:
         parts = address.split(';', 1)
         self.url = SipURL(parts[0], relaxedparser = relaxedparser)
         if len(parts) == 2:
             for l in parts[1].split(';'):
                 if not l:
                     continue
                 k_v = l.split('=', 1)
                 if len(k_v) == 2:
                     k, v = k_v
                 else:
                     k = k_v[0]
                     v = None
                 self.params[k] = v
                 if self.params_order.count(k) > 0:
                     self.params_order.remove(k)
                 self.params_order.append(k)
         self.hadbrace = False
         return
     if address.startswith('"'):
         qpos = findquotes(address)
         url = None
         if len(qpos) == 1:
             self.name = address[1:qpos[0]]
             url = address[qpos[0] + 1:].strip()
         else:
             for i in range(1, len(qpos)):
                 if address.find('<', 1, qpos[i]) != -1:
                     self.name = address[1:qpos[i - 1]]
                     url = address[qpos[i - 1] + 1:].strip()
                     break
             else:
                 self.name = address[1:qpos[i]]
                 url = address[qpos[i] + 1:].strip()
         if url == None:
             raise ValueError('Cannot separate name from URI: %s' % address)
         if url.startswith('<'):
             url = url[1:]
     else:
         self.name, url = address.split('<', 1)
         self.name = self.name.strip()
     url, paramstring = url.split('>', 1)
     self.url = SipURL(url, relaxedparser = relaxedparser)
     paramstring = paramstring.strip()
     if paramstring:
         for l in paramstring.split(';'):
             if not l:
                 continue
             k_v = l.split('=', 1)
             if len(k_v) == 2:
                 k, v = k_v
             else:
                 k = k_v[0]
                 v = None
             self.params[k] = v
             if self.params_order.count(k) > 0:
                 self.params_order.remove(k)
             self.params_order.append(k)
Esempio n. 17
0
 def __init__(self, body = None, address = None):
     if body == '*':
         raise ESipHeaderIgnore()
     SipAddressHF.__init__(self, body, address)
     if body == None and address == None:
         self.address = SipAddress(name = 'Anonymous', url = SipURL(host = SipConf.my_address, port = SipConf.my_port))