Exemplo n.º 1
0
 def do_bind_conversion_test(self, pduBindKlass, reqCommandIdHex,
                             respCommandIdHex):
     reqPdu = pduBindKlass(
         2,
         CommandStatus.ESME_ROK,
         system_id='test',
         password='******',
         system_type='OTA',
         interface_version=0x34,
         addr_ton=AddrTon.NATIONAL,
         addr_npi=AddrNpi.LAND_MOBILE,
         address_range='127.0.0.*',
     )
     self.do_conversion_test(
         PDUEncoder(), reqPdu,
         b'0000002d%s00000000000000027465737400736563726574004f5441003402063132372e302e302e2a00'
         % reqCommandIdHex)
     respPdu = reqPdu.require_ack(1,
                                  CommandStatus.ESME_ROK,
                                  system_id='TSI7588',
                                  sc_interface_version=0x34)
     self.do_conversion_test(
         PDUEncoder(), respPdu,
         b'0000001d%s000000000000000154534937353838000210000134' %
         respCommandIdHex)
Exemplo n.º 2
0
 def test_BindTransceiverResp_error_has_no_body_status_set_later(self):
     hex = b'00000010800000090000000e00000d80'
     pdu = BindTransceiverResp(3456, system_id="XYZ")
     pdu.status = CommandStatus.ESME_RINVPASWD
     # Even though the system_id param was set, it will not be encoded
     self.do_encode_test(PDUEncoder(), pdu, hex)
     # It will decode with no params set
     pduExpected = BindTransceiverResp(3456,
                                       status=CommandStatus.ESME_RINVPASWD)
     self.assertEqual(0, len(pduExpected.params))
     self.do_decode_test(PDUEncoder(), pduExpected, hex)
Exemplo n.º 3
0
 def test_SubmitSM_ringtone_conversion(self):
     pdu = SubmitSM(
         455569,
         service_type='',
         source_addr_ton=AddrTon.ALPHANUMERIC,
         source_addr_npi=AddrNpi.UNKNOWN,
         source_addr='mobileway',
         dest_addr_ton=AddrTon.INTERNATIONAL,
         dest_addr_npi=AddrNpi.ISDN,
         destination_addr='3369809342',
         esm_class=EsmClass(EsmClassMode.DEFAULT, EsmClassType.DEFAULT,
                            [EsmClassGsmFeatures.UDHI_INDICATOR_SET]),
         protocol_id=0,
         priority_flag=PriorityFlag.LEVEL_0,
         registered_delivery=RegisteredDelivery(
             RegisteredDeliveryReceipt.SMSC_DELIVERY_RECEIPT_REQUESTED),
         replace_if_present_flag=ReplaceIfPresentFlag.DO_NOT_REPLACE,
         data_coding=DataCoding(
             DataCodingScheme.GSM_MESSAGE_CLASS,
             DataCodingGsmMsg(DataCodingGsmMsgCoding.DATA_8BIT,
                              DataCodingGsmMsgClass.CLASS_1)),
         short_message=binascii.a2b_hex(
             b'06050415811581024a3a5db5a5cdcda5bdb8040084d8c51381481381481381481381481381381481581681781881881061881061b81081181081881061881061681081781081881061881061b81081181081881061881061681081781081b81881321081b81881221081b818811210824dc1446000'
         ))
     self.do_conversion_test(
         PDUEncoder(), pdu,
         b'000000a900000004000000000006f3910005006d6f62696c65776179000101333336393830393334320040000000000100f5007506050415811581024a3a5db5a5cdcda5bdb8040084d8c51381481381481381481381481381381481581681781881881061881061b81081181081881061881061681081781081881061881061b81081181081881061881061681081781081b81881321081b81881221081b818811210824dc1446000'
     )
Exemplo n.º 4
0
 def test_SubmitSM_conversion(self):
     pdu = SubmitSM(
         9284,
         service_type='',
         source_addr_ton=AddrTon.ALPHANUMERIC,
         source_addr_npi=AddrNpi.UNKNOWN,
         source_addr='mobileway',
         dest_addr_ton=AddrTon.INTERNATIONAL,
         dest_addr_npi=AddrNpi.ISDN,
         destination_addr='1208230',
         esm_class=EsmClass(EsmClassMode.DEFAULT, EsmClassType.DEFAULT),
         protocol_id=0,
         priority_flag=PriorityFlag.LEVEL_0,
         registered_delivery=RegisteredDelivery(
             RegisteredDeliveryReceipt.SMSC_DELIVERY_RECEIPT_REQUESTED),
         replace_if_present_flag=ReplaceIfPresentFlag.DO_NOT_REPLACE,
         data_coding=DataCoding(
             DataCodingScheme.GSM_MESSAGE_CLASS,
             DataCodingGsmMsg(DataCodingGsmMsgCoding.DEFAULT_ALPHABET,
                              DataCodingGsmMsgClass.CLASS_2)),
         short_message=b'HELLO',
     )
     self.do_conversion_test(
         PDUEncoder(), pdu,
         b'000000360000000400000000000024440005006d6f62696c65776179000101313230383233300000000000000100f2000548454c4c4f'
     )
Exemplo n.º 5
0
 def test_DeliverSM_with_subaddress(self):
     pdu = DeliverSM(
         1,
         service_type='BM8',
         source_addr_ton=AddrTon.INTERNATIONAL,
         source_addr_npi=AddrNpi.ISDN,
         source_addr='46123456789',
         dest_addr_ton=AddrTon.INTERNATIONAL,
         dest_addr_npi=AddrNpi.ISDN,
         destination_addr='14046653410',
         esm_class=EsmClass(EsmClassMode.DEFAULT, EsmClassType.DEFAULT),
         protocol_id=0,
         priority_flag=PriorityFlag.LEVEL_0,
         registered_delivery=RegisteredDelivery(
             RegisteredDeliveryReceipt.NO_SMSC_DELIVERY_RECEIPT_REQUESTED),
         replace_if_present_flag=ReplaceIfPresentFlag.DO_NOT_REPLACE,
         data_coding=DataCoding(
             DataCodingScheme.GSM_MESSAGE_CLASS,
             DataCodingGsmMsg(DataCodingGsmMsgCoding.DEFAULT_ALPHABET,
                              DataCodingGsmMsgClass.CLASS_2)),
         short_message=b"Hello I'm a bigg fan of you",
         source_subaddress=Subaddress(SubaddressTypeTag.USER_SPECIFIED,
                                      b'742'),
         dest_subaddress=Subaddress(SubaddressTypeTag.USER_SPECIFIED,
                                    b'4131'),
     )
     self.do_conversion_test(
         PDUEncoder(), pdu,
         b'00000066000000050000000000000001424d38000101343631323334353637383900010131343034363635333431300000000000000000f2001b48656c6c6f2049276d206120626967672066616e206f6620796f7502020004a037343202030005a034313331'
     )
Exemplo n.º 6
0
 def test_DeliverSM_sybase_MO_conversion(self):
     pdu = DeliverSM(
         1,
         service_type='CMT',
         source_addr_ton=AddrTon.INTERNATIONAL,
         source_addr_npi=AddrNpi.UNKNOWN,
         source_addr='3411149500001',
         dest_addr_ton=AddrTon.INTERNATIONAL,
         dest_addr_npi=AddrNpi.UNKNOWN,
         destination_addr='12345455',
         esm_class=EsmClass(EsmClassMode.DEFAULT, EsmClassType.DEFAULT),
         protocol_id=0,
         priority_flag=PriorityFlag.LEVEL_0,
         registered_delivery=RegisteredDelivery(
             RegisteredDeliveryReceipt.NO_SMSC_DELIVERY_RECEIPT_REQUESTED),
         replace_if_present_flag=ReplaceIfPresentFlag.DO_NOT_REPLACE,
         data_coding=DataCoding(
             DataCodingScheme.GSM_MESSAGE_CLASS,
             DataCodingGsmMsg(DataCodingGsmMsgCoding.DEFAULT_ALPHABET,
                              DataCodingGsmMsgClass.CLASS_2)),
         short_message=b'HELLO\x00',
     )
     self.do_conversion_test(
         PDUEncoder(), pdu,
         b'0000003f000000050000000000000001434d540001003334313131343935303030303100010031323334353435350000000000000000f2000648454c4c4f00'
     )
Exemplo n.º 7
0
 def test_DeliverSM_handset_ack_conversion(self):
     pdu = DeliverSM(
         10,
         service_type='CMT',
         source_addr_ton=AddrTon.INTERNATIONAL,
         source_addr_npi=AddrNpi.UNKNOWN,
         source_addr='6515555678',
         dest_addr_ton=AddrTon.INTERNATIONAL,
         dest_addr_npi=AddrNpi.UNKNOWN,
         destination_addr='123',
         esm_class=EsmClass(EsmClassMode.DEFAULT,
                            EsmClassType.SMSC_DELIVERY_RECEIPT),
         protocol_id=0,
         priority_flag=PriorityFlag.LEVEL_0,
         registered_delivery=RegisteredDelivery(
             RegisteredDeliveryReceipt.NO_SMSC_DELIVERY_RECEIPT_REQUESTED),
         replace_if_present_flag=ReplaceIfPresentFlag.DO_NOT_REPLACE,
         data_coding=DataCoding(
             scheme_data=DataCodingDefault.SMSC_DEFAULT_ALPHABET),
         short_message=
         b'id:1891273321 sub:001 dlvrd:001 submit date:1305050826 done date:1305050826 stat:DELIVRD err:000 Text:DLVRD TO MOBILE\x00',
         message_state=MessageState.DELIVERED,
         receipted_message_id='70BA8A69',
     )
     self.do_conversion_test(
         PDUEncoder(), pdu,
         b'000000b900000005000000000000000a434d5400010036353135353535363738000100313233000400000000000000007669643a31383931323733333231207375623a30303120646c7672643a303031207375626d697420646174653a3133303530353038323620646f6e6520646174653a3133303530353038323620737461743a44454c49565244206572723a30303020546578743a444c56524420544f204d4f42494c45000427000102001e0009373042413841363900'
     )
Exemplo n.º 8
0
 def test_QuerySMResp_conversion(self):
     pdu = QuerySMResp(
         message_id='Smsc2003',
         final_date=None,
         message_state=MessageState.UNKNOWN,
         error_code=None,
     )
     self.do_conversion_test(
         PDUEncoder(), pdu,
         b'0000001c800000030000000000000000536d73633230303300000700')
Exemplo n.º 9
0
    def _send_requests(self, requests: List[PDURequest], merge=True):
        if not self.is_bound:
            raise Exception('Cannot send request to unbound client')

        encoder = PDUEncoder()

        if merge:
            buffer_list = [encoder.encode(pdu) for pdu in requests]
            self._transport.write(b''.join(buffer_list))
        else:
            for pdu in requests:
                self._transport.write(encoder.encode(pdu))
Exemplo n.º 10
0
 def __init__(self):
     self.log = logging.getLogger(LOG_CATEGORY)
     self.recvBuffer = ""
     self.connectionCorrupted = False
     self.pduReadTimer = None
     self.enquireLinkTimer = None
     self.inactivityTimer = None
     self.lastSeqNum = 0
     self.dataRequestHandler = None
     self.alertNotificationHandler = None
     self.inTxns = {}
     self.outTxns = {}
     self.sessionState = SMPPSessionStates.NONE
     self.encoder = PDUEncoder()
     self.disconnectedDeferred = defer.Deferred()
Exemplo n.º 11
0
 def test_AlertNotification_conversion(self):
     pdu = AlertNotification(
         source_addr_ton=AddrTon.NATIONAL,
         source_addr_npi=AddrNpi.ISDN,
         source_addr=
         'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
         esme_addr_ton=AddrTon.INTERNATIONAL,
         esme_addr_npi=AddrNpi.LAND_MOBILE,
         esme_addr=
         'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY',
         ms_availability_status=MsAvailabilityStatus.DENIED,
     )
     self.do_conversion_test(
         PDUEncoder(), pdu,
         b'0000008900000102000000000000000002015858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858585858580001065959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959000422000101'
     )
Exemplo n.º 12
0
 def __init__(self):
     self.recvBuffer = ""
     self.connectionCorrupted = False
     self.pduReadTimer = None
     self.enquireLinkTimer = None
     self.inactivityTimer = None
     self.dataRequestHandler = None
     self.lastSeqNum = 0
     self.inTxns = {}
     self.outTxns = {}
     self.sessionState = SMPPSessionStates.NONE
     self.encoder = PDUEncoder()
     self.disconnectedDeferred = defer.Deferred()
     # Overriden in tests
     self.callLater = reactor.callLater
     self.port = None
Exemplo n.º 13
0
 def __init__(self):
     self.recvBuffer = b""
     self.connectionCorrupted = False
     self.pduReadTimer = None
     self.enquireLinkTimer = None
     self.inactivityTimer = None
     self.dataRequestHandler = None
     self.lastSeqNum = 0
     self.inTxns = {}
     self.outTxns = {}
     self.sessionState = SMPPSessionStates.NONE
     self.encoder = PDUEncoder()
     self.disconnectedDeferred = defer.Deferred()
     # Overriden in tests
     #pylint: disable=no-member
     self.callLater = reactor.callLater
     self.port = None
     self.log = logging.getLogger(LOG_CATEGORY)
Exemplo n.º 14
0
 def test_DeliverSM_syniverse_MO_conversion(self):
     pdu = DeliverSM(
         2676551972,
         service_type='AWSBD',
         source_addr_ton=AddrTon.INTERNATIONAL,
         source_addr_npi=AddrNpi.ISDN,
         source_addr='16505551234',
         dest_addr_ton=AddrTon.INTERNATIONAL,
         dest_addr_npi=AddrNpi.ISDN,
         destination_addr='17735554070',
         esm_class=EsmClass(EsmClassMode.DEFAULT, EsmClassType.DEFAULT),
         protocol_id=0,
         priority_flag=PriorityFlag.LEVEL_0,
         registered_delivery=RegisteredDelivery(
             RegisteredDeliveryReceipt.NO_SMSC_DELIVERY_RECEIPT_REQUESTED),
         replace_if_present_flag=ReplaceIfPresentFlag.DO_NOT_REPLACE,
         data_coding=DataCoding(scheme_data=DataCodingDefault.LATIN_1),
         short_message=b'there is no spoon',
     )
     self.do_conversion_test(
         PDUEncoder(), pdu,
         b'0000004d00000005000000009f88f12441575342440001013136353035353531323334000101313737333535353430373000000000000000000300117468657265206973206e6f2073706f6f6e'
     )
Exemplo n.º 15
0
 def test_decode_command_length_too_long(self):
     self.do_decode_corrupt_data_error_test(
         PDUEncoder().decode, CommandStatus.ESME_RINVCMDLEN,
         b'00000011000000060000000000000000ff')
Exemplo n.º 16
0
source_addr_npi=AddrNpi.UNKNOWN,
source_addr='sarafu',
dest_addr_ton=AddrTon.INTERNATIONAL,
dest_addr_npi=AddrNpi.ISDN,
destination_addr='07727',
esm_class=EsmClass(EsmClassMode.DEFAULT, EsmClassType.DEFAULT),
protocol_id=0,
priority_flag=PriorityFlag.LEVEL_0,
registered_delivery=RegisteredDelivery(RegisteredDeliveryReceipt.SMSC_DELIVERY_RECEIPT_REQUESTED),
replace_if_present_flag=ReplaceIfPresentFlag.DO_NOT_REPLACE,
data_coding=DataCoding(DataCodingScheme.GSM_MESSAGE_CLASS, DataCodingGsmMsg(DataCodingGsmMsgCoding.DEFAULT_ALPHABET, DataCodingGsmMsgClass.CLASS_2)),
short_message='HELLO',
)
print "PDU: %s" % pdu

binary = PDUEncoder().encode(pdu)
hexStr = binascii.b2a_hex(binary)
print "HEX: %s" % hexStr

# r may represent request 




hex = '0000004d00000005000000009f88f12441575342440001013136353035353531323334000101313737333535353430373000000000000000000300117468657265206973206e6f2073706f6f6e'
binary = binascii.a2b_hex(hex)
file = StringIO.StringIO(binary)

pdu = PDUEncoder().decode(file)
print "PDU: %s" % pdu
Exemplo n.º 17
0
    async def handle_data_received(self, data: bytes):
        self.app.logger.debug(f'Received {len(data)} bytes.')
        self.app.logger.debug(data)

        file = io.BytesIO(data)

        pdu = PDUEncoder().decode(file)

        self.app.logger.debug(f'Command received: {pdu.command_id}')

        if pdu.command_id == CommandId.submit_sm:
            submit_sm = SubmitSM(sequence_number=pdu.sequence_number,
                                 **pdu.params)
            sms = SMStringEncoder().decode_SM(submit_sm).str

            self._send_response(
                submit_sm.require_ack(
                    sequence_number=submit_sm.sequence_number))

            # Check if the message is only a part from a series
            while (submit_sm.params.get('more_messages_to_send') ==
                   MoreMessagesToSend.MORE_MESSAGES):

                pdu = PDUEncoder().decode(file)
                if pdu.command_id != CommandId.submit_sm:
                    raise Exception(
                        f'Received {pdu.command_id} instead '
                        f'of {CommandId.submit_sm} for concatenated messages')
                submit_sm = SubmitSM(sequence_number=pdu.sequence_number,
                                     **pdu.params)
                sms += SMStringEncoder().decode_SM(submit_sm).str

                self._send_response(
                    submit_sm.require_ack(
                        sequence_number=submit_sm.sequence_number))

            await self.app.handle_sms_received(
                client=self._client,
                source_number=submit_sm.params['source_addr'],
                dest_number=submit_sm.params['destination_addr'],
                text=sms)
        elif pdu.command_id == CommandId.bind_transceiver:
            request = BindTransceiver(sequence_number=pdu.sequence_number,
                                      **pdu.params)

            if self.is_bound:
                smpp_status = CommandStatus.ESME_RALYBND
            else:
                client = SmppClient(
                    protocol=self,
                    system_id=request.params['system_id'],
                    password=request.params['password'],
                    system_type=request.params['system_type'],
                    interface_version=request.params['interface_version'],
                    addr_ton=request.params['addr_ton'],
                    addr_npi=request.params['addr_npi'])

                self._client = client
                try:
                    client = await self.app.handle_bound_client(client=client)
                except Exception as e:
                    self.app.logger.error(
                        f'Exception in handle_bound_client: {e}')
                    smpp_status = CommandStatus.ESME_RBINDFAIL
                else:
                    if client:
                        self.is_bound = True
                        smpp_status = CommandStatus.ESME_ROK
                    else:
                        self.is_bound = False
                        # Generic bind error
                        smpp_status = CommandStatus.ESME_RBINDFAIL

            resp = BindTransceiverResp(sequence_number=request.sequence_number,
                                       status=smpp_status,
                                       system_id=self.app.name)
            self._send_response(resp)

        elif pdu.command_id == CommandId.unbind:
            self.is_bound = False

            request = Unbind(sequence_number=pdu.sequence_number, **pdu.params)
            resp = UnbindResp(sequence_number=request.sequence_number)

            self._send_response(resp)

            await self.app.handle_unbound_client(self._client)

        else:
            await self.request_handler(pdu)
Exemplo n.º 18
0
 def test_EnquireLink_conversion(self):
     pdu = EnquireLink(6, CommandStatus.ESME_ROK)
     self.do_conversion_test(PDUEncoder(), pdu,
                             b'00000010000000150000000000000006')
Exemplo n.º 19
0
 def _send_PDU(self, pdu: PDU):
     self._transport.write(PDUEncoder().encode(pdu))
Exemplo n.º 20
0
 def test_BindTransceiverResp_error_has_no_body(self):
     pdu = BindTransceiverResp(3456, status=CommandStatus.ESME_RINVPASWD)
     self.assertEqual(0, len(pdu.params))
     self.do_conversion_test(PDUEncoder(), pdu,
                             b'00000010800000090000000e00000d80')
Exemplo n.º 21
0
 def test_SubmitSMResp_error_has_no_body(self):
     pdu = SubmitSMResp(1234, status=CommandStatus.ESME_RMSGQFUL)
     self.assertTrue(len(SubmitSMResp.mandatory_params) > 0)
     self.assertEqual(0, len(pdu.params))
     self.do_conversion_test(PDUEncoder(), pdu,
                             b'000000108000000400000014000004d2')
Exemplo n.º 22
0
 def test_EnquireLinkResp_conversion(self):
     pdu = EnquireLinkResp(7)
     self.do_conversion_test(PDUEncoder(), pdu,
                             b'00000010800000150000000000000007')
Exemplo n.º 23
0
 def __init__(self):
     self.log = logging.getLogger(LOG_CATEGORY)
     self.recvBuffer = ""
     self.lastSeqNum = 0
     self.encoder = PDUEncoder()
Exemplo n.º 24
0
 def _pdu2bin(self, pdu):
     return PDUEncoder().encode(pdu)
Exemplo n.º 25
0
 def _bin2pdu(self, bindata):
     io_pdu = StringIO(bindata)
     return PDUEncoder().decode(io_pdu)
Exemplo n.º 26
0
 def test_decodeHeader_command_length_too_short(self):
     self.do_decode_corrupt_data_error_test(
         PDUEncoder().decodeHeader, CommandStatus.ESME_RINVCMDLEN,
         b'0000000f000000060000000000000000')
Exemplo n.º 27
0
 def getPDU(self, hexStr):
     return PDUEncoder().decode(StringIO.StringIO(binascii.a2b_hex(hexStr)))
Exemplo n.º 28
0
 def test_decode_bad_message_length_msg_too_long(self):
     self.do_decode_corrupt_data_error_test(
         PDUEncoder().decode, CommandStatus.ESME_RINVCMDLEN,
         b'0000001c80000009000000000000000154534937353838000210000134')
Exemplo n.º 29
0
 def getPDU(self, hexStr):
     return PDUEncoder().decode(BytesIO(binascii.a2b_hex(hexStr)))
Exemplo n.º 30
0
 def test_decode_bad_message_ends_in_middle_of_option(self):
     self.do_decode_corrupt_data_error_test(
         PDUEncoder().decode, CommandStatus.ESME_RINVMSGLEN,
         b'0000001b8000000900000000000000015453493735383800021000')