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)
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)
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' )
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' )
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' )
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' )
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' )
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')
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))
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()
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' )
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
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)
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' )
def test_decode_command_length_too_long(self): self.do_decode_corrupt_data_error_test( PDUEncoder().decode, CommandStatus.ESME_RINVCMDLEN, b'00000011000000060000000000000000ff')
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
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)
def test_EnquireLink_conversion(self): pdu = EnquireLink(6, CommandStatus.ESME_ROK) self.do_conversion_test(PDUEncoder(), pdu, b'00000010000000150000000000000006')
def _send_PDU(self, pdu: PDU): self._transport.write(PDUEncoder().encode(pdu))
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')
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')
def test_EnquireLinkResp_conversion(self): pdu = EnquireLinkResp(7) self.do_conversion_test(PDUEncoder(), pdu, b'00000010800000150000000000000007')
def __init__(self): self.log = logging.getLogger(LOG_CATEGORY) self.recvBuffer = "" self.lastSeqNum = 0 self.encoder = PDUEncoder()
def _pdu2bin(self, pdu): return PDUEncoder().encode(pdu)
def _bin2pdu(self, bindata): io_pdu = StringIO(bindata) return PDUEncoder().decode(io_pdu)
def test_decodeHeader_command_length_too_short(self): self.do_decode_corrupt_data_error_test( PDUEncoder().decodeHeader, CommandStatus.ESME_RINVCMDLEN, b'0000000f000000060000000000000000')
def getPDU(self, hexStr): return PDUEncoder().decode(StringIO.StringIO(binascii.a2b_hex(hexStr)))
def test_decode_bad_message_length_msg_too_long(self): self.do_decode_corrupt_data_error_test( PDUEncoder().decode, CommandStatus.ESME_RINVCMDLEN, b'0000001c80000009000000000000000154534937353838000210000134')
def getPDU(self, hexStr): return PDUEncoder().decode(BytesIO(binascii.a2b_hex(hexStr)))
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')