iro/offer/sipgate.py
author Sandro Knauß <bugs@sandroknauss.de>
Tue, 15 Apr 2025 01:22:19 +0200
changeset 316 63c681b8e92c
parent 312 42fd5075a5d1
permissions -rw-r--r--
fix link to about.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
294
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 272
diff changeset
     1
# Copyright (c) 2012 netzguerilla.net <iro@netzguerilla.net>
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 272
diff changeset
     2
# 
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 272
diff changeset
     3
# This file is part of Iro.
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 272
diff changeset
     4
# 
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 272
diff changeset
     5
# Permission is hereby granted, free of charge, to any person obtaining a copy of
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 272
diff changeset
     6
# this software and associated documentation files (the "Software"), to deal in
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 272
diff changeset
     7
# the Software without restriction, including without limitation the rights to use,
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 272
diff changeset
     8
# copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 272
diff changeset
     9
# #Software, and to permit persons to whom the Software is furnished to do so,
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 272
diff changeset
    10
# subject to the following conditions:
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 272
diff changeset
    11
# 
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 272
diff changeset
    12
# The above copyright notice and this permission notice shall be included in
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 272
diff changeset
    13
# all copies or substantial portions of the Software.
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 272
diff changeset
    14
# 
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 272
diff changeset
    15
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 272
diff changeset
    16
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 272
diff changeset
    17
# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 272
diff changeset
    18
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 272
diff changeset
    19
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 272
diff changeset
    20
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 272
diff changeset
    21
272
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    22
from functools import partial
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    23
from twisted.web.xmlrpc import Proxy
312
Sandro Knauß <bugs@sandroknauss.de>
parents: 294
diff changeset
    24
import xmlrpc.client as xmlrpclib
272
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    25
from decimal import Decimal
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    26
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    27
from .provider import providers, Provider
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    28
from ..config import Option
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    29
from ..validate import vFloat
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    30
from ..model.status import Status
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    31
from ..error import NoTyp
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    32
from .. import __version__
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    33
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    34
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    35
class Sipgate(Provider):
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    36
    """
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    37
        s. auch http.tuxad.com/sipgate.html
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    38
        und http://lists.sipgate.net/pipermail/sipgate-developers/2007-September/000016.html
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    39
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    40
        http://www.sipgate.de/beta/public/static/downloads/basic/api/sipgate_api_documentation.pdf
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    41
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    42
        See :doc:`provider` for a tutorial, how to create a new provider backend. This turorial implements this provider.
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    43
    """
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    44
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    45
    url="https://%s:%s@samurai.sipgate.net/RPC2"
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    46
    """XML-RPC url for sipgate"""
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    47
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    48
    def __init__(self,name):
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    49
        options =[("username", Option(lambda x,y: x,long="Loginname for sipgate", must=True)),
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    50
                  ("password", Option(lambda x,y: x,long="Password for sipgate", must=True)),
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    51
                  ("price_sms", Option(vFloat, long="price for one sms", default="0.079")),
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    52
                  ("price_fax", Option(vFloat, long="price for one fax", default="0.03")),
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    53
                  ]
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    54
        Provider.__init__(self, name, {"sms" : [None], "fax":[None]}, options)
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    55
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    56
    def proxy(self):
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    57
        """returns a XML-RPC proxy object to sipgate API."""
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    58
        return Proxy(self.url%(self.username, self.password))
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    59
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    60
    def load(self,cfg):
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    61
        """Loads configuration into object.
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    62
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    63
        :param dict cfg: The Configuration dict. Normally you use ``configParser.items("section")``.
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    64
        """
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    65
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    66
        Provider.load(self,cfg)
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    67
        #return self.clientIdentify()
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    68
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    69
    def clientIdentify(self):
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    70
        """identificaton of client to sipgate server."""
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    71
        args_identify = {
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    72
                "ClientName"    : "Iro",
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    73
                "ClientVersion" : __version__,
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    74
                "ClientVendor"  : "netzguerilla.net"
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    75
                }
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    76
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    77
        return self.proxy().callRemote("samurai.ClientIdentify", args_identify)
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    78
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    79
    def sms(self, recipient, sms):
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    80
        """send one SMS to recimpient.
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    81
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    82
        :param `iro.telnumber.Telnumber` recipient: mobilenumber of recipient
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    83
        :param `iro.model.message.SMS` sms: the sms to send
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    84
        :return: a deferrer
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    85
        """
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    86
        args={
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    87
                "TOS" : "text",
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    88
                "Content" : sms.getContent(),
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    89
                "RemoteUri" : "sip:%s%s@sipgate.net"%(recipient.land, recipient.number),
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    90
                }
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    91
        return self.proxy().callRemote("samurai.SessionInitiate",args)
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    92
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    93
    def fax(self, recipient, fax):
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    94
        """send one fax to recimpient.
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    95
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    96
        :param `iro.telnumber.Telnumber` recipient: faxnumber of recipient
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    97
        :param `iro.model.message.Fax` fax: the fax to send
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    98
        :return: a deferrer.
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    99
        """
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   100
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   101
        args={
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   102
            "TOS" : "fax",
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   103
            "Content" : xmlrpclib.Binary(fax.getAttachment(0)),
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   104
            "RemoteUri" : "sip:%s%s@sipgate.net"%(recipient.land, recipient.number),
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   105
            }
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   106
        return self.proxy().callRemote("samurai.SessionInitiate",args)
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   107
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   108
    def _status(self,value,typ):
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   109
        """returns a :class:`~iro.model.status.Status` object.
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   110
        :raises: :exc:`iro.error.NoTyp`
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   111
        """
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   112
        if typ not  in self.typs.keys():
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   113
            raise NoTyp(typ)
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   114
        return Status(self, None, Decimal(getattr(self,"price_"+typ)), 1, value["SessionID"])
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   115
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   116
    def send(self, typ, recipient, msg):
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   117
        """send msg to recipient.
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   118
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   119
        :param string typ: Typ of message.
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   120
        :param `iro.telnumber.Telnumber` recipient: telnumber of recipient
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   121
        :param msg: the msg to send
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   122
        :type msg: :class:`iro.model.message.Fax` or :class:`iro.model.message.SMS`
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   123
        :return: a deferrer, that returns a :class:`~iro.model.status.Status` object
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   124
        :raises: :exc:`iro.error.NoTyp`
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   125
        """
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   126
        if typ not  in self.typs.keys():
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   127
            raise NoTyp(typ)
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   128
        d = getattr(self,typ)(recipient, msg)
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   129
        d.addCallback(self._status, typ)
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   130
        return d
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   131
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   132
    def getSendFunc(self, typ, route):
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   133
        """returns :meth:`send` method with bound typ, if typ and route is valid."""
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   134
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   135
        Provider.getSendFunc(self, typ, route)
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   136
        return partial(self.send, typ)
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   137
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   138
providers["sipgate"] = Sipgate
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   139