From ec78468ef4c6bf5449a82fd49e3406ac9d074df1 Mon Sep 17 00:00:00 2001 From: bashmak Date: Fri, 29 Dec 2017 16:17:00 +0300 Subject: [PATCH] Add receiving sms messages from asterisk via ami --- dialing.py | 141 ++ dialing_app/locale/ru/LC_MESSAGES/django.po | 77 +- .../migrations/0002_auto_20171229_1353.py | 35 + dialing_app/models.py | 18 + dialing_app/templates/ext.html | 9 +- dialing_app/templates/inbox_sms.html | 30 + dialing_app/urls.py | 3 +- dialing_app/views.py | 11 +- djing/settings_example.py | 2 + messaging/__init__.py | 3 + messaging/mms/__init__.py | 63 + messaging/mms/iterator.py | 71 + messaging/mms/message.py | 555 +++++ messaging/mms/mms_pdu.py | 996 ++++++++ messaging/mms/wsp_pdu.py | 2055 +++++++++++++++++ messaging/sms/__init__.py | 7 + messaging/sms/base.py | 14 + messaging/sms/consts.py | 17 + messaging/sms/deliver.py | 264 +++ messaging/sms/gsm0338.py | 292 +++ messaging/sms/pdu.py | 10 + messaging/sms/submit.py | 330 +++ messaging/sms/udh.py | 79 + messaging/sms/wap.py | 38 + messaging/test/__init__.py | 0 .../27d0a048cd79555de05283a22372b0eb.mms | Bin 0 -> 758 bytes messaging/test/mms-data/BTMMS.MMS | Bin 0 -> 20799 bytes messaging/test/mms-data/NOWMMS.MMS | Bin 0 -> 15326 bytes messaging/test/mms-data/SEC-SGHS300M.mms | Bin 0 -> 88 bytes messaging/test/mms-data/SIMPLE.MMS | Bin 0 -> 121 bytes .../test/mms-data/SonyEricssonT310-R201.mms | Bin 0 -> 9345 bytes messaging/test/mms-data/TOMSLOT.MMS | Bin 0 -> 43553 bytes messaging/test/mms-data/gallery2test.mms | Bin 0 -> 19028 bytes messaging/test/mms-data/iPhone.mms | Bin 0 -> 214033 bytes .../mms-data/images_are_cut_off_debug.mms | Bin 0 -> 88762 bytes messaging/test/mms-data/m.mms | Bin 0 -> 27807 bytes messaging/test/mms-data/openwave.mms | Bin 0 -> 542 bytes messaging/test/mms-data/projekt_exempel.mms | Bin 0 -> 2498 bytes messaging/test/test_gsm_encoding.py | 267 +++ messaging/test/test_mms.py | 378 +++ messaging/test/test_sms.py | 481 ++++ messaging/test/test_udh.py | 24 + messaging/test/test_wap.py | 140 ++ messaging/utils.py | 267 +++ requirements.txt | 1 + systemd_units/djing_dial.service | 12 + 46 files changed, 6660 insertions(+), 30 deletions(-) create mode 100755 dialing.py create mode 100644 dialing_app/migrations/0002_auto_20171229_1353.py create mode 100644 dialing_app/templates/inbox_sms.html create mode 100644 messaging/__init__.py create mode 100644 messaging/mms/__init__.py create mode 100644 messaging/mms/iterator.py create mode 100644 messaging/mms/message.py create mode 100644 messaging/mms/mms_pdu.py create mode 100644 messaging/mms/wsp_pdu.py create mode 100644 messaging/sms/__init__.py create mode 100644 messaging/sms/base.py create mode 100644 messaging/sms/consts.py create mode 100644 messaging/sms/deliver.py create mode 100644 messaging/sms/gsm0338.py create mode 100644 messaging/sms/pdu.py create mode 100644 messaging/sms/submit.py create mode 100644 messaging/sms/udh.py create mode 100644 messaging/sms/wap.py create mode 100644 messaging/test/__init__.py create mode 100644 messaging/test/mms-data/27d0a048cd79555de05283a22372b0eb.mms create mode 100644 messaging/test/mms-data/BTMMS.MMS create mode 100644 messaging/test/mms-data/NOWMMS.MMS create mode 100644 messaging/test/mms-data/SEC-SGHS300M.mms create mode 100644 messaging/test/mms-data/SIMPLE.MMS create mode 100644 messaging/test/mms-data/SonyEricssonT310-R201.mms create mode 100644 messaging/test/mms-data/TOMSLOT.MMS create mode 100644 messaging/test/mms-data/gallery2test.mms create mode 100644 messaging/test/mms-data/iPhone.mms create mode 100644 messaging/test/mms-data/images_are_cut_off_debug.mms create mode 100644 messaging/test/mms-data/m.mms create mode 100644 messaging/test/mms-data/openwave.mms create mode 100644 messaging/test/mms-data/projekt_exempel.mms create mode 100644 messaging/test/test_gsm_encoding.py create mode 100644 messaging/test/test_mms.py create mode 100644 messaging/test/test_sms.py create mode 100644 messaging/test/test_udh.py create mode 100644 messaging/test/test_wap.py create mode 100644 messaging/utils.py create mode 100644 systemd_units/djing_dial.service diff --git a/dialing.py b/dialing.py new file mode 100755 index 0000000..f8eb26e --- /dev/null +++ b/dialing.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -* +import os +import django +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings") +django.setup() +from messaging.sms import SmsSubmit, SmsDeliver +import re +import asterisk.manager +from time import sleep +from dialing_app.models import SMSModel +from django.conf import settings + +DJING_USERNAME_PASSWORD = getattr(settings, 'DJING_USERNAME_PASSWORD', ('admin', 'admin')) + + +class SMS(object): + def __init__(self, text, who, dev): + self.text = text + self.who = who + self.dev = dev + + def __add__(self, other): + if not isinstance(other, SMS): + raise TypeError + if self.who == other.who and self.dev == other.dev: + self.text += other.text + return self + + def __str__(self): + return "%s: %s" % (self.who, self.text) + + +class ChunkedMsg(object): + def __init__(self, sms_count, ref, sms): + self.sms_count = sms_count + self.ref = ref + self.sms = sms + + +class MyAstManager(asterisk.manager.Manager): + sms_chunks = list() + + def new_chunked_sms(self, count, ref, sms): + msg = ChunkedMsg(count, ref, sms) + self.sms_chunks.append(msg) + + @staticmethod + def save_sms(sms): + print('Inbox %s:' % sms.who, sms.text) + if not isinstance(sms, SMS): + raise TypeError + SMSModel.objects.create( + who=sms.who, + dev=sms.dev, + text=sms.text + ) + + def push_text(self, sms, ref, cnt): + if not isinstance(sms, SMS): + raise TypeError + chunk = [c for c in self.sms_chunks if c.ref == ref] + chunk_len = len(chunk) + if chunk_len == 1: + chunk = chunk[0] + chunk.sms += sms + if chunk.sms_count == cnt: + self.save_sms(chunk.sms) + self.sms_chunks.remove(chunk) + + elif chunk_len == 0: + self.new_chunked_sms(cnt, ref, sms) + + + +manager = MyAstManager() + + +def validate_tel(tel, reg=re.compile(r'^\+7978\d{7}$')): + return bool(re.match(reg, tel)) + + +def send_sms(dev, recipient, utext): + if not validate_tel(recipient): + print("Tel %s is not valid" % recipient) + return + sms = SmsSubmit(recipient, utext) + for pdu in sms.to_pdu(): + response = manager.command('dongle pdu %s %s' % (dev, pdu.pdu)) + print(response.data) + + +def handle_shutdown(event, manager): + print("Recieved shutdown event") + manager.close() + # we could analize the event and reconnect here + + +def handle_inbox_long_sms_message(event, manager): + if event.has_header('Message'): + pdu = event.get_header('Message') + pdu = re.sub(r'^\+CMGR\:\s\d\,\,\d{1,3}\\r\\n', '', pdu) + sd = SmsDeliver(pdu) + data = sd.data + chunks_count = data.get('cnt') + sms = SMS( + text=data.get('text'), + who=data.get('number'), + dev=event.get_header('Device') + ) + if chunks_count is not None: + # more than 1 message + manager.push_text(sms=sms, ref=data.get('ref'), cnt=chunks_count) + else: + # one message + manager.save_sms(sms) + + +if __name__ == '__main__': + try: + manager.connect('10.12.1.2') + manager.login(*DJING_USERNAME_PASSWORD) + + # register some callbacks + manager.register_event('Shutdown', handle_shutdown) + manager.register_event('DongleNewCMGR', handle_inbox_long_sms_message) # PDU Here + + # get a status report + response = manager.status() + print(response) + while True: + sleep(60) + + except asterisk.manager.ManagerSocketException as e: + print("Error connecting to the manager: %s" % e.strerror) + except asterisk.manager.ManagerAuthException as e: + print("Error logging in to the manager: %s" % e.strerror) + except asterisk.manager.ManagerException as e: + print("Error: %s" % e.strerror) + finally: + manager.logoff() diff --git a/dialing_app/locale/ru/LC_MESSAGES/django.po b/dialing_app/locale/ru/LC_MESSAGES/django.po index 7e810aa..1137788 100644 --- a/dialing_app/locale/ru/LC_MESSAGES/django.po +++ b/dialing_app/locale/ru/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-05-22 11:59+0300\n" +"POT-Creation-Date: 2017-12-29 13:59+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Dmitry Novikov nerosketch@gmail.com\n" "Language: \n" @@ -19,85 +19,108 @@ msgstr "" "%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n" "%100>=11 && n%100<=14)? 2 : 3);\n" -#: dialing_app/models.py:8 dialing_app/models.py:43 +#: models.py:8 models.py:43 msgid "No answer" msgstr "Не отвечен" -#: dialing_app/models.py:9 dialing_app/models.py:45 +#: models.py:9 models.py:45 msgid "Failed" msgstr "С ошибкой" -#: dialing_app/models.py:10 dialing_app/models.py:47 +#: models.py:10 models.py:47 msgid "Busy" msgstr "Занято" -#: dialing_app/models.py:11 dialing_app/models.py:49 +#: models.py:11 models.py:49 msgid "Answered" msgstr "Отвечен" -#: dialing_app/models.py:12 dialing_app/models.py:51 +#: models.py:12 models.py:51 msgid "Unknown" msgstr "Не определён" -#: dialing_app/templates/index.html:9 -msgid "Dialing" -msgstr "Звонки" +#: models.py:79 +msgid "Can view sms" +msgstr "Может просматривать смс" + +#: models.py:81 models.py:82 +msgid "SMS" +msgstr "СМС" -#: dialing_app/templates/index.html:12 +#: templates/ext.html:7 templates/ext.html.py:21 views.py:19 msgid "Last calls" msgstr "Последние звонки" -#: dialing_app/templates/index.html:20 +#: templates/ext.html:28 views.py:46 +msgid "Voice mail request" +msgstr "Заявки на подключение" + +#: templates/ext.html:35 views.py:57 +msgid "Voice mail report" +msgstr "Заявки на поломки" + +#: templates/index.html:10 templates/vmail.html.py:10 msgid "Play" msgstr "Слушать" -#: dialing_app/templates/index.html:21 +#: templates/index.html:11 templates/vmail.html.py:11 msgid "calldate" msgstr "дата звонка" -#: dialing_app/templates/index.html:22 +#: templates/index.html:12 templates/vmail.html.py:12 msgid "src" msgstr "кто" -#: dialing_app/templates/index.html:23 +#: templates/index.html:13 msgid "dst" msgstr "куда" -#: dialing_app/templates/index.html:24 +#: templates/index.html:14 templates/vmail.html.py:13 msgid "duration" msgstr "продолжительность" -#: dialing_app/templates/index.html:25 +#: templates/index.html:15 templates/vmail.html.py:14 msgid "start" msgstr "начало" -#: dialing_app/templates/index.html:26 +#: templates/index.html:16 templates/vmail.html.py:15 msgid "answer" msgstr "ответ" -#: dialing_app/templates/index.html:27 +#: templates/index.html:17 templates/vmail.html.py:16 msgid "end" msgstr "конец" -#: dialing_app/templates/index.html:28 +#: templates/index.html:18 templates/vmail.html.py:17 msgid "disposition" msgstr "состояние" -#: dialing_app/templates/index.html:50 +#: templates/index.html:24 views.py:74 +msgid "Find dials" +msgstr "Найти звонки" + +#: templates/index.html:26 +msgid "Telephone" +msgstr "Телефон" + +#: templates/index.html:47 +msgid "Download" +msgstr "Скачать" + +#: templates/index.html:63 templates/vmail.html.py:42 msgid "Calls was not found" msgstr "Звонки не найдены" -#: dialing_app/views.py:27 +#: views.py:32 msgid "Multiple users with the telephone number" msgstr "Несколько абонентов с указанным номером телефона" -#: dialing_app/views.py:29 +#: views.py:34 msgid "User with the telephone number not found" msgstr "Абонент с таким номером телефона не найден" -msgid "Voice mail request" -msgstr "Заявки на подключение" - -msgid "Voice mail report" -msgstr "Заявки на поломки" +msgid "Dialing" +msgstr "Звонки" +msgid "Inbox sms" +msgstr "Входящие смс" \ No newline at end of file diff --git a/dialing_app/migrations/0002_auto_20171229_1353.py b/dialing_app/migrations/0002_auto_20171229_1353.py new file mode 100644 index 0000000..7f69e88 --- /dev/null +++ b/dialing_app/migrations/0002_auto_20171229_1353.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9 on 2017-12-29 13:53 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dialing_app', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='SMSModel', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('when', models.DateTimeField(auto_now_add=True)), + ('who', models.CharField(max_length=32)), + ('dev', models.CharField(max_length=20)), + ('text', models.CharField(max_length=255)), + ], + options={ + 'verbose_name': 'SMS', + 'verbose_name_plural': 'SMS', + 'db_table': 'sms', + 'permissions': (('can_view_sms', 'Can view sms'),), + }, + ), + migrations.AlterModelOptions( + name='asteriskcdr', + options={'managed': False}, + ), + ] diff --git a/dialing_app/models.py b/dialing_app/models.py index 3f939b4..d320b48 100644 --- a/dialing_app/models.py +++ b/dialing_app/models.py @@ -65,3 +65,21 @@ class AsteriskCDR(models.Model): class Meta: db_table = 'cdr' managed = False + + +class SMSModel(models.Model): + when = models.DateTimeField(auto_now_add=True) + who = models.CharField(max_length=32) + dev = models.CharField(max_length=20) + text = models.CharField(max_length=255) + + class Meta: + db_table = 'sms' + permissions = ( + ('can_view_sms', _('Can view sms')), + ) + verbose_name = _('SMS') + verbose_name_plural = _('SMS') + + def __str__(self): + return self.text diff --git a/dialing_app/templates/ext.html b/dialing_app/templates/ext.html index a5c9401..b9fd956 100644 --- a/dialing_app/templates/ext.html +++ b/dialing_app/templates/ext.html @@ -29,13 +29,20 @@ - {% url 'dialapp:vmail_report' as dialmail %} + {% url 'dialapp:vmail_report' as dialmail %} {% trans 'Voice mail report' %} + {% url 'dialapp:inbox_sms' as dialsmsin %} + + + {% trans 'Inbox sms' %} + + + diff --git a/dialing_app/templates/inbox_sms.html b/dialing_app/templates/inbox_sms.html new file mode 100644 index 0000000..e95cb33 --- /dev/null +++ b/dialing_app/templates/inbox_sms.html @@ -0,0 +1,30 @@ +{% extends request.is_ajax|yesno:'nullcont.htm,ext.html' %} +{% load i18n %} +{% block content %} + +
+
+

{% trans 'Inbox sms' %}

+
+
+ + {% for msg in sms_messages %} + +
+
From {{ msg.who }} + {{ msg.when|date:'d M, H:i:s' }} via {{ msg.dev }} +
+ +

{{ msg.text }}

+
+ + {% empty %} +
+

{% trans 'Message history is empty' %}

+
+ {% endfor %} + +
+
+ +{% endblock %} diff --git a/dialing_app/urls.py b/dialing_app/urls.py index 6dc3fe8..ce611b4 100644 --- a/dialing_app/urls.py +++ b/dialing_app/urls.py @@ -7,5 +7,6 @@ urlpatterns = [ url(r'^filter$', views.vfilter, name='vfilter'), url(r'^to_abon(?P\+?\d+)$', views.to_abon, name='to_abon'), url(r'^requests$', views.vmail_request, name='vmail_request'), - url(r'^reports$', views.vmail_report, name='vmail_report') + url(r'^reports$', views.vmail_report, name='vmail_report'), + url(r'^sms/in$', views.inbox_sms, name='inbox_sms') ] diff --git a/dialing_app/views.py b/dialing_app/views.py index 4386a07..c8c16b8 100644 --- a/dialing_app/views.py +++ b/dialing_app/views.py @@ -7,7 +7,7 @@ from django.db.models import Q from abonapp.models import Abon from mydefs import only_admins, pag_mn -from .models import AsteriskCDR +from .models import AsteriskCDR, SMSModel @login_required @@ -75,3 +75,12 @@ def vfilter(request): 's': s }) + +@login_required +@permission_required('dialing_app.can_view_sms') +def inbox_sms(request): + msgs = SMSModel.objects.all() + msgs = pag_mn(request, msgs) + return render(request, 'inbox_sms.html', { + 'sms_messages': msgs + }) diff --git a/djing/settings_example.py b/djing/settings_example.py index 0931626..8a8a929 100644 --- a/djing/settings_example.py +++ b/djing/settings_example.py @@ -181,3 +181,5 @@ DEFAULT_SNMP_PASSWORD = 'public' TELEGRAM_BOT_TOKEN = 'bot token' TELEPHONE_REGEXP = r'^\+[7,8,9,3]\d{10,11}$' + +DJING_USERNAME_PASSWORD = ('username', 'secret') diff --git a/messaging/__init__.py b/messaging/__init__.py new file mode 100644 index 0000000..5e9a3bc --- /dev/null +++ b/messaging/__init__.py @@ -0,0 +1,3 @@ +# see LICENSE + +VERSION = (0, 5, 12) diff --git a/messaging/mms/__init__.py b/messaging/mms/__init__.py new file mode 100644 index 0000000..738c8ee --- /dev/null +++ b/messaging/mms/__init__.py @@ -0,0 +1,63 @@ +# This library is free software. +# +# It was originally distributed under the terms of the GNU Lesser +# General Public License Version 2. +# +# python-messaging opts to apply the terms of the ordinary GNU +# General Public License v2, as permitted by section 3 of the LGPL +# v2.1. This re-licensing allows the entirety of python-messaging to +# be distributed according to the terms of GPL-2. +# +# See the COPYING file included in this archive +# +# Copyright (C) 2007 Francois Aucamp +# +""" +Multimedia Messaging Service (MMS) library + +The :mod:`messaging.mms` module provides several classes for the creation +and manipulation of MMS messages (multimedia messages) used in mobile +devices such as cellular telephones. + +Multimedia Messaging Service (MMS) is a messaging service for the mobile +environment standardized by the WAP Forum and 3GPP. To the end-user MMS is +very similar to the text-based Short Message Service (SMS): it provides +automatic immediate delivery for user-created content from device to device. + +In addition to text, however, MMS messages can contain multimedia content such +as still images, audio clips and video clips, which are binded together +into a "mini presentation" (or slideshow) that controls for example, the order +in which images are to appear on the screen, how long they will be displayed, +when an audio clip should be played, etc. Furthermore, MMS messages do not have +the 160-character limit of SMS messages. + +An MMS message is a multimedia presentation in one entity; it is not a text +file with attachments. + +This library enables the creation of MMS messages with full support for +presentation layout, and multimedia data parts such as JPEG, GIF, AMR, MIDI, +3GP, etc. It also allows the decoding and unpacking of received MMS messages. + +@version: 0.2 +@author: Francois Aucamp C{} +@license: GNU General Public License, version 2 +@note: References used in the code and this document: + +.. [1] MMS Conformance Document version 2.0.0, 6 February 2002 + U{www.bogor.net/idkf/bio2/mobile-docs/mms_conformance_v2_0_0.pdf} + +.. [2] Forum Nokia, "How To Create MMS Services, Version 4.0" + U{http://forum.nokia.com/info/sw.nokia.com/id/a57a4f20-b7f2-475b-b426-19eff18a5afb/How_To_Create_MMS_Services_v4_0_en2.pdf.html} + +.. [3] Wap Forum/Open Mobile ALliance, "WAP-206 MMS Client Transactions" + U{http://www.openmobilealliance.org/tech/affiliates/LicenseAgreement.asp?DocName=/wap/wap-206-mmsctr-20020115-a.pdf} + +.. [4] Wap Forum/Open Mobile Alliance, "WAP-209 MMS Encapsulation Protocol" + U{http://www.openmobilealliance.org/tech/affiliates/LicenseAgreement.asp?DocName=/wap/wap-209-mmsencapsulation-20020105-a.pdf} + +.. [5] Wap Forum/Open Mobile Alliance, "WAP-230 Wireless Session Protocol Specification" + U{http://www.openmobilealliance.org/tech/affiliates/LicenseAgreement.asp?DocName=/wap/wap-230-wsp-20010705-a.pdf} + +.. [6] IANA: "Character Sets" + U{http://www.iana.org/assignments/character-sets} +""" diff --git a/messaging/mms/iterator.py b/messaging/mms/iterator.py new file mode 100644 index 0000000..cd49505 --- /dev/null +++ b/messaging/mms/iterator.py @@ -0,0 +1,71 @@ +# This library is free software. +# +# It was originally distributed under the terms of the GNU Lesser +# General Public License Version 2. +# +# python-messaging opts to apply the terms of the ordinary GNU +# General Public License v2, as permitted by section 3 of the LGPL +# v2.1. This re-licensing allows the entirety of python-messaging to +# be distributed according to the terms of GPL-2. +# +# See the COPYING file included in this archive +# +# The docstrings in this module contain epytext markup; API documentation +# may be created by processing this file with epydoc: http://epydoc.sf.net +"""Iterator with "value preview" capability.""" + + +class PreviewIterator(object): + """An ``iter`` wrapper class providing a "previewable" iterator. + + This "preview" functionality allows the iterator to return successive + values from its ``iterable`` object, without actually mvoving forward + itself. This is very usefuly if the next item(s) in an iterator must + be used for something, after which the iterator should "undo" those + read operations, so that they can be read again by another function. + + From the user point of view, this class supersedes the builtin iter() + function: like iter(), it is called as PreviewIter(iterable). + """ + def __init__(self, data): + self._it = iter(data) + self._cached_values = [] + self._preview_pos = 0 + + def __iter__(self): + return self + + def next(self): + self.reset_preview() + if len(self._cached_values) > 0: + return self._cached_values.pop(0) + else: + return self._it.next() + + def preview(self): + """ + Return the next item in the ``iteratable`` object + + But it does not modify the actual iterator (i.e. do not + intefere with :func:`next`. + + Successive calls to :func:`preview` will return successive values from + the ``iterable`` object, exactly in the same way :func:`next` does. + + However, :func:`preview` will always return the next item from + ``iterable`` after the item returned by the previous :func:`preview` + or :func:`next` call, whichever was called the most recently. + To force the "preview() iterator" to synchronize with the "next() + iterator" (without calling :func:`next`), use :func:`reset_preview`. + """ + if self._preview_pos < len(self._cached_values): + value = self._cached_values[self._preview_pos] + else: + value = self._it.next() + self._cached_values.append(value) + + self._preview_pos += 1 + return value + + def reset_preview(self): + self._preview_pos = 0 diff --git a/messaging/mms/message.py b/messaging/mms/message.py new file mode 100644 index 0000000..6cff8a0 --- /dev/null +++ b/messaging/mms/message.py @@ -0,0 +1,555 @@ +# This library is free software. +# +# It was originally distributed under the terms of the GNU Lesser +# General Public License Version 2. +# +# python-messaging opts to apply the terms of the ordinary GNU +# General Public License v2, as permitted by section 3 of the LGPL +# v2.1. This re-licensing allows the entirety of python-messaging to +# be distributed according to the terms of GPL-2. +# +# See the COPYING file included in this archive +# +# The docstrings in this module contain epytext markup; API documentation +# may be created by processing this file with epydoc: http://epydoc.sf.net +"""High-level MMS message classes""" + +from __future__ import with_statement +import array +import mimetypes +import os +import xml.dom.minidom + + +class MMSMessage: + """ + I am an MMS message + + References used in this class: [1][2][3][4][5] + """ + def __init__(self): + self._pages = [] + self._data_parts = [] + self._metaTags = {} + self._mms_message = None + self.headers = { + 'Message-Type': 'm-send-req', + 'Transaction-Id': '1234', + 'MMS-Version': '1.0', + 'Content-Type': ('application/vnd.wap.multipart.mixed', {}), + } + self.width = 176 + self.height = 220 + self.transactionID = '12345' + self.subject = 'test' + + @property + def content_type(self): + """ + Returns the Content-Type of this data part header + + No parameter information is returned; to get that, access the + "Content-Type" header directly (which has a tuple value) from + the message's ``headers`` attribute. + + This is equivalent to calling DataPart.headers['Content-Type'][0] + """ + return self.headers['Content-Type'][0] + + def add_page(self, page): + """ + Adds `page` to the message + + :type page: MMSMessagePage + :param page: The message slide/page to add + """ + if self.content_type != 'application/vnd.wap.multipart.related': + value = ('application/vnd.wap.multipart.related', {}) + self.headers['Content-Type'] = value + + self._pages.append(page) + + @property + def pages(self): + """Returns a list of all the pages in this message""" + return self._pages + + def add_data_part(self, data_part): + """Adds a single data part (DataPart object) to the message, without + connecting it to a specific slide/page in the message. + + A data part encapsulates some form of attachment, e.g. an image, audio + etc. It is not necessary to explicitly add data parts to the message + using this function if :func:`add_page` is used; this method is mainly + useful if you want to create MMS messages without SMIL support, + i.e. messages of type "application/vnd.wap.multipart.mixed" + + :param data_part: The data part to add + :type data_part: DataPart + """ + self._data_parts.append(data_part) + + @property + def data_parts(self): + """ + Returns a list of all the data parts in this message + + including data parts that were added to slides in this message""" + parts = [] + if len(self._pages): + parts.append(self.smil()) + for slide in self._mms_message._pages: + parts.extend(slide.data_parts()) + + parts.extend(self._data_parts) + return parts + + def smil(self): + """Returns the text of the message's SMIL file""" + impl = xml.dom.minidom.getDOMImplementation() + smil_doc = impl.createDocument(None, "smil", None) + + # Create the SMIL header + head_node = smil_doc.createElement('head') + # Add metadata to header + for tag_name in self._metaTags: + meta_node = smil_doc.createElement('meta') + meta_node.setAttribute(tag_name, self._metaTags[tag_name]) + head_node.appendChild(meta_node) + + # Add layout info to header + layout_node = smil_doc.createElement('layout') + root_layout_node = smil_doc.createElement('root-layout') + root_layout_node.setAttribute('width', str(self.width)) + root_layout_node.setAttribute('height', str(self.height)) + layout_node.appendChild(root_layout_node) + + areas = (('Image', '0', '0', '176', '144'), + ('Text', '176', '144', '176', '76')) + + for region_id, left, top, width, height in areas: + region_node = smil_doc.createElement('region') + region_node.setAttribute('id', region_id) + region_node.setAttribute('left', left) + region_node.setAttribute('top', top) + region_node.setAttribute('width', width) + region_node.setAttribute('height', height) + layout_node.appendChild(region_node) + + head_node.appendChild(layout_node) + smil_doc.documentElement.appendChild(head_node) + + # Create the SMIL body + body_node = smil_doc.createElement('body') + # Add pages to body + for page in self._pages: + par_node = smil_doc.createElement('par') + par_node.setAttribute('duration', str(page.duration)) + # Add the page content information + if page.image is not None: + #TODO: catch unpack exception + part, begin, end = page.image + if 'Content-Location' in part.headers: + src = part.headers['Content-Location'] + elif 'Content-ID' in part.headers: + src = part.headers['Content-ID'] + else: + src = part.data + + image_node = smil_doc.createElement('img') + image_node.setAttribute('src', src) + image_node.setAttribute('region', 'Image') + if begin > 0 or end > 0: + if end > page.duration: + end = page.duration + + image_node.setAttribute('begin', str(begin)) + image_node.setAttribute('end', str(end)) + + par_node.appendChild(image_node) + + if page.text is not None: + part, begin, end = page.text + src = part.data + text_node = smil_doc.createElement('text') + text_node.setAttribute('src', src) + text_node.setAttribute('region', 'Text') + if begin > 0 or end > 0: + if end > page.duration: + end = page.duration + + text_node.setAttribute('begin', str(begin)) + text_node.setAttribute('end', str(end)) + + par_node.appendChild(text_node) + + if page.audio is not None: + part, begin, end = page.audio + if 'Content-Location' in part.headers: + src = part.headers['Content-Location'] + elif 'Content-ID' in part.headers: + src = part.headers['Content-ID'] + else: + src = part.data + + audio_node = smil_doc.createElement('audio') + audio_node.setAttribute('src', src) + if begin > 0 or end > 0: + if end > page.duration: + end = page.duration + + audio_node.setAttribute('begin', str(begin)) + audio_node.setAttribute('end', str(end)) + + par_node.appendChild(text_node) + par_node.appendChild(audio_node) + + body_node.appendChild(par_node) + + smil_doc.documentElement.appendChild(body_node) + return smil_doc.documentElement.toprettyxml() + + def encode(self): + """ + Return a binary representation of this MMS message + + This uses the `~:class:messaging.mms.mms_pdu.MMSEncoder` internally + + :return: The binary-encoded MMS data, as an array of bytes + :rtype: array.array('B') + """ + from messaging.mms import mms_pdu + encoder = mms_pdu.MMSEncoder() + return encoder.encode(self) + + def to_file(self, filename): + """ + Writes this MMS message to `filename` in binary-encoded form + + This uses the `~:class:messaging.mms.mms_pdu.MMSEncoder` internally + + :param filename: The path where to store the message data + :type filename: str + + :rtype array.array('B') + :return: The binary-encode MMS data, as an array of bytes + """ + with open(filename, 'wb') as f: + self.encode().tofile(f) + + @staticmethod + def from_data(data): + """ + Returns a new `:class:MMSMessage` out of ``data`` + + This uses the `~:class:messaging.mms.mms_pdu.MMSEncoder` internally + + :param data: The data to load + :type filename: array.array + """ + from messaging.mms import mms_pdu + decoder = mms_pdu.MMSDecoder() + return decoder.decode_data(data) + + @staticmethod + def from_file(filename): + """ + Returns a new `:class:MMSMessage` out of file ``filename`` + + This uses the `~:class:messaging.mms.mms_pdu.MMSEncoder` internally + + :param filename: The name of the file to load + :type filename: str + """ + from messaging.mms import mms_pdu + decoder = mms_pdu.MMSDecoder() + return decoder.decode_file(filename) + + +class MMSMessagePage: + """ + A single page/slide in an MMS Message. + + In order to ensure that the MMS message can be correctly displayed by most + terminals, each page's content is limited to having 1 image, 1 audio clip + and 1 block of text, as stated in [1]. + + The default slide duration is set to 4 seconds; use :func:`set_duration` + to change this. + """ + def __init__(self): + self.duration = 4000 + self.image = None + self.audio = None + self.text = None + + @property + def data_parts(self): + """Returns a list of the data parst in this slide""" + return [part for part in (self.image, self.audio, self.text) + if part is not None] + + def number_of_parts(self): + """ + Returns the number of data parts in this slide + + @rtype: int + """ + num_parts = 0 + for item in (self.image, self.audio, self.text): + if item is not None: + num_parts += 1 + + return num_parts + + #TODO: find out what the "ref" element in SMIL does + #TODO: add support for "alt" element; also make sure what it does + def add_image(self, filename, time_begin=0, time_end=0): + """ + Adds an image to this slide. + + :param filename: The name of the image file to add. Supported formats + are JPEG, GIF and WBMP. + :type filename: str + :param time_begin: The time (in milliseconds) during the duration of + this slide to begin displaying the image. If this is + 0 or less, the image will be displayed from the + moment the slide is opened. + :type time_begin: int + :param time_end: The time (in milliseconds) during the duration of this + slide at which to stop showing (i.e. hide) the image. + If this is 0 or less, or if it is greater than the + actual duration of this slide, it will be shown until + the next slide is accessed. + :type time_end: int + + :raise TypeError: An inappropriate variable type was passed in of the + parameters + """ + if not isinstance(filename, str): + raise TypeError("filename must be a string") + + if not isinstance(time_begin, int) or not isinstance(time_end, int): + raise TypeError("time_begin and time_end must be ints") + + if not os.path.isfile(filename): + raise OSError("filename must be a file") + + if time_end > 0 and time_end < time_begin: + raise ValueError('time_end cannot be lower than time_begin') + + self.image = (DataPart(filename), time_begin, time_end) + + def add_audio(self, filename, time_begin=0, time_end=0): + """ + Adds an audio clip to this slide. + + :param filename: The name of the audio file to add. Currently the only + supported format is AMR. + :type filename: str + :param time_begin: The time (in milliseconds) during the duration of + this slide to begin playback of the audio clip. If + this is 0 or less, the audio clip will be played the + moment the slide is opened. + :type time_begin: int + :param time_end: The time (in milliseconds) during the duration of this + slide at which to stop playing (i.e. mute) the audio + clip. If this is 0 or less, or if it is greater than + the actual duration of this slide, the entire audio + clip will be played, or until the next slide is + accessed. + :type time_end: int + :raise TypeError: An inappropriate variable type was passed in of the + parameters + """ + if not isinstance(filename, str): + raise TypeError("filename must be a string") + + if not isinstance(time_begin, int) or not isinstance(time_end, int): + raise TypeError("time_begin and time_end must be ints") + + if not os.path.isfile(filename): + raise OSError("filename must be a file") + + if time_end > 0 and time_end < time_begin: + raise ValueError('time_end cannot be lower than time_begin') + + self.audio = (DataPart(filename), time_begin, time_end) + + def add_text(self, text, time_begin=0, time_end=0): + """ + Adds a block of text to this slide. + + :param text: The text to add to the slide. + :type text: str + :param time_begin: The time (in milliseconds) during the duration of + this slide to begin displaying the text. If this is + 0 or less, the text will be displayed from the + moment the slide is opened. + :type time_begin: int + :param time_end: The time (in milliseconds) during the duration of this + slide at which to stop showing (i.e. hide) the text. + If this is 0 or less, or if it is greater than the + actual duration of this slide, it will be shown until + the next slide is accessed. + :type time_end: int + + :raise TypeError: An inappropriate variable type was passed in of the + parameters + """ + if not isinstance(text, str): + raise TypeError("Text must be a string") + + if not isinstance(time_begin, int) or not isinstance(time_end, int): + raise TypeError("time_begin and time_end must be ints") + + if time_end > 0 and time_end < time_begin: + raise ValueError('time_end cannot be lower than time_begin') + + time_data = DataPart() + time_data.set_text(text) + self.text = (time_data, time_begin, time_end) + + def set_duration(self, duration): + """ Sets the maximum duration of this slide (i.e. how long this slide + should be displayed) + + @param duration: the maxium slide duration, in milliseconds + @type duration: int + + @raise TypeError: must be an integer + @raise ValueError: the requested duration is invalid (must be a + non-zero, positive integer) + """ + if not isinstance(duration, int): + raise TypeError("Duration must be an int") + + if duration < 1: + raise ValueError('duration may not be 0 or negative') + + self.duration = duration + + +class DataPart(object): + """ + I am a data entry in the MMS body + + A DataPart object encapsulates any data content that is to be added + to the MMS (e.g. an image , raw image data, audio clips, text, etc). + + A DataPart object can be queried using the Python built-in :func:`len` + function. + + This encapsulation allows custom header/parameter information to be set + for each data entry in the MMS. Refer to [5] for more information on + these. + """ + def __init__(self, filename=None): + """ @param srcFilename: If specified, load the content of the file + with this name + @type srcFilename: str + """ + super(DataPart, self).__init__() + + self.content_type_parameters = {} + self.headers = {'Content-Type': ('application/octet-stream', {})} + self._filename = None + self._data = None + + if filename is not None: + self.from_file(filename) + + def _get_content_type(self): + """ Returns the string representation of this data part's + "Content-Type" header. No parameter information is returned; + to get that, access the "Content-Type" header directly (which has a + tuple value)from this part's C{headers} attribute. + + This is equivalent to calling DataPart.headers['Content-Type'][0] + """ + return self.headers['Content-Type'][0] + + def _set_content_type(self, value): + """Sets the content type string, with no parameters """ + self.headers['Content-Type'] = value, {} + + content_type = property(_get_content_type, _set_content_type) + + def from_file(self, filename): + """ + Load the data contained in the specified file + + This function clears any previously-set header entries. + + :param filename: The name of the file to open + :type filename: str + + :raises OSError: The filename is invalid + """ + if not os.path.isfile(filename): + raise OSError('The file "%s" does not exist' % filename) + + # Clear any headers that are currently set + self.headers = {} + self._data = None + self.headers['Content-Location'] = os.path.basename(filename) + content_type = (mimetypes.guess_type(filename)[0] + or 'application/octet-stream', {}) + self.headers['Content-Type'] = content_type + self._filename = filename + + def set_data(self, data, content_type, ct_parameters=None): + """ + Explicitly set the data contained by this part + + This function clears any previously-set header entries. + + :param data: The data to hold + :type data: str + :param content_type: The MIME content type of the specified data + :type content_type: str + :param ct_parameters: Any content type header paramaters to add + :type ct_parameters: dict + """ + self.headers = {} + self._filename = None + self._data = data + + if ct_parameters is None: + ct_parameters = {} + + self.headers['Content-Type'] = content_type, ct_parameters + + def set_text(self, text): + """ + Convenience wrapper method for set_data() + + This method sets the :class:`DataPart` object to hold the + specified text string, with MIME content type "text/plain". + + @param text: The text to hold + @type text: str + """ + self.set_data(text, 'text/plain') + + def __len__(self): + """Provides the length of the data encapsulated by this object""" + if self._filename is not None: + return int(os.stat(self._filename)[6]) + else: + return len(self.data) + + @property + def data(self): + """A buffer containing the binary data of this part""" + if self._data is not None: + if type(self._data) == array.array: + self._data = self._data.tostring() + return self._data + + elif self._filename is not None: + with open(self._filename, 'r') as f: + self._data = f.read() + return self._data + + return '' diff --git a/messaging/mms/mms_pdu.py b/messaging/mms/mms_pdu.py new file mode 100644 index 0000000..ed44c46 --- /dev/null +++ b/messaging/mms/mms_pdu.py @@ -0,0 +1,996 @@ +# This library is free software. +# +# It was originally distributed under the terms of the GNU Lesser +# General Public License Version 2. +# +# python-messaging opts to apply the terms of the ordinary GNU +# General Public License v2, as permitted by section 3 of the LGPL +# v2.1. This re-licensing allows the entirety of python-messaging to +# be distributed according to the terms of GPL-2. +# +# See the COPYING file included in this archive +"""MMS Data Unit structure encoding and decoding classes""" + +from __future__ import with_statement +import array +import os +import random + +from messaging.utils import debug +from messaging.mms import message, wsp_pdu +from messaging.mms.iterator import PreviewIterator + + +def flatten_list(x): + """Flattens ``x`` into a single list""" + result = [] + for el in x: + if hasattr(el, "__iter__") and not isinstance(el, basestring): + result.extend(flatten_list(el)) + else: + result.append(el) + return result + + +mms_field_names = { + 0x01: ('Bcc', 'encoded_string_value'), + 0x02: ('Cc', 'encoded_string_value'), + 0x03: ('Content-Location', 'uri_value'), + 0x04: ('Content-Type', 'content_type_value'), + 0x05: ('Date', 'date_value'), + 0x06: ('Delivery-Report', 'boolean_value'), + 0x07: ('Delivery-Time', 'delivery_time_value'), + 0x08: ('Expiry', 'expiry_value'), + 0x09: ('From', 'from_value'), + 0x0a: ('Message-Class', 'message_class_value'), + 0x0b: ('Message-ID', 'text_string'), + 0x0c: ('Message-Type', 'message_type_value'), + 0x0d: ('MMS-Version', 'version_value'), + 0x0e: ('Message-Size', 'long_integer'), + 0x0f: ('Priority', 'priority_value'), + 0x10: ('Read-Reply', 'boolean_value'), + 0x11: ('Report-Allowed', 'boolean_value'), + 0x12: ('Response-Status', 'response_status_value'), + 0x13: ('Response-Text', 'encoded_string_value'), + 0x14: ('Sender-Visibility', 'sender_visibility_value'), + 0x15: ('Status', 'status_value'), + 0x16: ('Subject', 'encoded_string_value'), + 0x17: ('To', 'encoded_string_value'), + 0x18: ('Transaction-Id', 'text_string'), +} + + +class MMSDecoder(wsp_pdu.Decoder): + """A decoder for MMS messages""" + + def __init__(self, filename=None): + """ + :param filename: If specified, decode the content of the MMS + message file with this name + :type filename: str + """ + self._mms_data = array.array('B') + self._mms_message = message.MMSMessage() + self._parts = [] + + def decode_file(self, filename): + """ + Load the data contained in the specified ``filename``, and decode it. + + :param filename: The name of the MMS message file to open + :type filename: str + + :raise OSError: The filename is invalid + + :return: The decoded MMS data + :rtype: MMSMessage + """ + num_bytes = os.stat(filename)[6] + data = array.array('B') + + with open(filename, 'rb') as f: + data.fromfile(f, num_bytes) + + return self.decode_data(data) + + def decode_data(self, data): + """ + Decode the specified MMS message data + + :param data: The MMS message data to decode + :type data: array.array('B') + + :return: The decoded MMS data + :rtype: MMSMessage + """ + self._mms_message = message.MMSMessage() + self._mms_data = data + body_iter = self.decode_message_header() + self.decode_message_body(body_iter) + return self._mms_message + + def decode_message_header(self): + """ + Decodes the (full) MMS header data + + This must be called before :func:`_decodeBody`, as it sets + certain internal variables relating to data lengths, etc. + """ + data_iter = PreviewIterator(self._mms_data) + + # First 3 headers (in order + ############################ + # - X-Mms-Message-Type + # - X-Mms-Transaction-ID + # - X-Mms-Version + # TODO: reimplement strictness - currently we allow these 3 headers + # to be mixed with any of the other headers (this allows the + # decoding of "broken" MMSs, but is technically incorrect) + + # Misc headers + ############## + # The next few headers will not be in a specific order, except for + # "Content-Type", which should be the last header + # According to [4], MMS header field names will be short integers + content_type_found = False + header = '' + while content_type_found == False: + try: + header, value = self.decode_header(data_iter) + except StopIteration: + break + + if header == mms_field_names[0x04][0]: + content_type_found = True + else: + self._mms_message.headers[header] = value + + if header == 'Content-Type': + # Otherwise it might break Content-Location + # content_type, params = value + self._mms_message.headers[header] = value + + return data_iter + + def decode_message_body(self, data_iter): + """ + Decodes the MMS message body + + :param data_iter: an iterator over the sequence of bytes of the MMS + body + :type data_iter: iter + """ + ######### MMS body: headers ########### + # Get the number of data parts in the MMS body + try: + num_entries = self.decode_uint_var(data_iter) + except StopIteration: + return + + #print 'Number of data entries (parts) in MMS body:', num_entries + + ########## MMS body: entries ########## + # For every data "part", we have to read the following sequence: + # , + # , + # , + # + for part_num in xrange(num_entries): + #print '\nPart %d:\n------' % part_num + headers_len = self.decode_uint_var(data_iter) + data_len = self.decode_uint_var(data_iter) + + # Prepare to read content-type + other possible headers + ct_field_bytes = [] + for i in xrange(headers_len): + ct_field_bytes.append(data_iter.next()) + + ct_iter = PreviewIterator(ct_field_bytes) + # Get content type + ctype, ct_parameters = self.decode_content_type_value(ct_iter) + headers = {'Content-Type': (ctype, ct_parameters)} + + # Now read other possible headers until bytes + # have been read + while True: + try: + hdr, value = self.decode_header(ct_iter) + headers[hdr] = value + except StopIteration: + break + + # Data (note: this is not null-terminated) + data = array.array('B') + for i in xrange(data_len): + data.append(data_iter.next()) + + part = message.DataPart() + part.set_data(data, ctype) + part.content_type_parameters = ct_parameters + part.headers = headers + self._mms_message.add_data_part(part) + + @staticmethod + def decode_header(byte_iter): + """ + Decodes a header entry from an MMS message + + starting at the byte pointed to by :func:`byte_iter.next` + + From [4], section 7.1:: + + Header = MMS-header | Application-header + + The return type of the "header value" depends on the header + itself; it is thus up to the function calling this to determine + what that type is (or at least compensate for possibly + different return value types). + + :raise DecodeError: This uses :func:`decode_mms_header` and + :func:`decode_application_header`, and will raise this + exception under the same circumstances as + :func:`decode_application_header`. ``byte_iter`` will + not be modified in this case. + + :return: The decoded header entry from the MMS, in the format: + (, ) + :rtype: tuple + """ + try: + return MMSDecoder.decode_mms_header(byte_iter) + except wsp_pdu.DecodeError: + return wsp_pdu.Decoder.decode_header(byte_iter) + + @staticmethod + def decode_mms_header(byte_iter): + """ + Decodes the MMS header pointed by ``byte_iter`` + + This method takes into account the assigned number values for MMS + field names, as specified in [4], section 7.3, table 8. + + From [4], section 7.1:: + + MMS-header = MMS-field-name MMS-value + MMS-field-name = Short-integer + MMS-value = Bcc-value | Cc-value | Content-location-value | Content-type-value | etc + + + :raise wsp_pdu.DecodeError: The MMS field name could not be parsed. + ``byte_iter`` will not be modified. + + :return: The decoded MMS header, in the format: + (, ) + :rtype: tuple + """ + # Get the MMS-field-name + mms_field_name = '' + preview = byte_iter.preview() + byte = wsp_pdu.Decoder.decode_short_integer_from_byte(preview) + + if byte in mms_field_names: + byte_iter.next() + mms_field_name = mms_field_names[byte][0] + else: + byte_iter.reset_preview() + raise wsp_pdu.DecodeError('Invalid MMS Header: could ' + 'not decode MMS field name') + + # Now get the MMS-value + mms_value = '' + try: + name = mms_field_names[byte][1] + mms_value = getattr(MMSDecoder, 'decode_%s' % name)(byte_iter) + except wsp_pdu.DecodeError, msg: + raise wsp_pdu.DecodeError('Invalid MMS Header: Could ' + 'not decode MMS-value: %s' % msg) + except: + raise RuntimeError('A fatal error occurred, probably due to an ' + 'unimplemented decoding operation. Tried to ' + 'decode header: %s' % mms_field_name) + + return mms_field_name, mms_value + + @staticmethod + def decode_encoded_string_value(byte_iter): + """ + Decodes the encoded string value pointed by ``byte_iter`` + + From [4], section 7.2.9:: + + Encoded-string-value = Text-string | Value-length Char-set Text-string + + The Char-set values are registered by IANA as MIBEnum value. + + This function is not fully implemented, in that it does not + have proper support for the Char-set values; it basically just + reads over that sequence of bytes, and ignores it (see code for + details) - any help with this will be greatly appreciated. + + :return: The decoded text string + :rtype: str + """ + try: + # First try "Value-length Char-set Text-string" + value_length = wsp_pdu.Decoder.decode_value_length(byte_iter) + # TODO: add proper support for charsets... + try: + charset = wsp_pdu.Decoder.decode_well_known_charset(byte_iter) + except wsp_pdu.DecodeError, msg: + raise Exception('encoded_string_value decoding error - ' + 'Could not decode Charset value: %s' % msg) + + return wsp_pdu.Decoder.decode_text_string(byte_iter) + except wsp_pdu.DecodeError: + # Fall back on just "Text-string" + return wsp_pdu.Decoder.decode_text_string(byte_iter) + + @staticmethod + def decode_boolean_value(byte_iter): + """ + Decodes the boolean value pointed by ``byte_iter`` + + From [4], section 7.2.6:: + + Delivery-report-value = Yes | No + Yes = + No = + + A lot of other yes/no fields use this encoding (read-reply, + report-allowed, etc) + + :raise wsp_pdu.DecodeError: The boolean value could not be parsed. + ``byte_iter`` will not be modified. + + :return: The value for the field + :rtype: bool + """ + byte = byte_iter.preview() + if byte not in (128, 129): + byte_iter.reset_preview() + raise wsp_pdu.DecodeError('Error parsing boolean value ' + 'for byte: %s' % hex(byte)) + byte = byte_iter.next() + return byte == 128 + + @staticmethod + def decode_delivery_time_value(byte_iter): + value_length = wsp_pdu.Decoder.decode_value_length(byte_iter) + token = byte_iter.next() + value = wsp_pdu.Decoder.decode_long_integer(byte_iter) + if token == 128: + token_type = 'absolute' + elif token == 129: + token_type = 'relative' + else: + raise wsp_pdu.DecodeError('Delivery-Time type token value is undefined' + ' (%s), should be either 128 or 129' % token) + return (token_type, value) + + @staticmethod + def decode_from_value(byte_iter): + """ + Decodes the "From" value pointed by ``byte_iter`` + + From [4], section 7.2.11:: + + From-value = Value-length (Address-present-token Encoded-string-value | Insert-address-token ) + Address-present-token = + Insert-address-token = + + :return: The "From" address value + :rtype: str + """ + value_length = wsp_pdu.Decoder.decode_value_length(byte_iter) + # See what token we have + byte = byte_iter.next() + if byte == 129: # Insert-address-token + return '' + + return MMSDecoder.decode_encoded_string_value(byte_iter) + + @staticmethod + def decode_message_class_value(byte_iter): + """ + Decodes the "Message-Class" value pointed by ``byte_iter`` + + From [4], section 7.2.12:: + + Message-class-value = Class-identifier | Token-text + Class-identifier = Personal | Advertisement | Informational | Auto + Personal = + Advertisement = + Informational = + Auto = + + The token-text is an extension method to the message class. + + :return: The decoded message class + :rtype: str + """ + class_identifiers = { + 128: 'Personal', + 129: 'Advertisement', + 130: 'Informational', + 131: 'Auto', + } + byte = byte_iter.preview() + if byte in class_identifiers: + byte_iter.next() + return class_identifiers[byte] + + byte_iter.reset_preview() + return wsp_pdu.Decoder.decode_token_text(byte_iter) + + @staticmethod + def decode_message_type_value(byte_iter): + """ + Decodes the "Message-Type" value pointed by ``byte_iter`` + + Defined in [4], section 7.2.14. + + :return: The decoded message type, or '' + :rtype: str + """ + message_types = { + 0x80: 'm-send-req', + 0x81: 'm-send-conf', + 0x82: 'm-notification-ind', + 0x83: 'm-notifyresp-ind', + 0x84: 'm-retrieve-conf', + 0x85: 'm-acknowledge-ind', + 0x86: 'm-delivery-ind', + } + + byte = byte_iter.preview() + if byte in message_types: + byte_iter.next() + return message_types[byte] + + byte_iter.reset_preview() + return '' + + @staticmethod + def decode_priority_value(byte_iter): + """ + Decode the "Priority" value pointed by ``byte_iter`` + + Defined in [4], section 7.2.17 + + :raise wsp_pdu.DecodeError: The priority value could not be decoded; + ``byte_iter`` is not modified in this case. + + :return: The decoded priority value + :rtype: str + """ + priorities = {128: 'Low', 129: 'Normal', 130: 'High'} + + byte = byte_iter.preview() + if byte in priorities: + byte = byte_iter.next() + return priorities[byte] + + byte_iter.reset_preview() + raise wsp_pdu.DecodeError('Error parsing Priority value ' + 'for byte: %s' % byte) + + @staticmethod + def decode_sender_visibility_value(byte_iter): + """ + Decodes the sender visibility value pointed by ``byte_iter`` + + Defined in [4], section 7.2.22:: + + Sender-visibility-value = Hide | Show + Hide = + Show = + + :raise wsp_pdu.DecodeError: The sender visibility value could not be + parsed. ``byte_iter`` will not be modified + in this case. + + :return: The sender visibility: 'Hide' or 'Show' + :rtype: str + """ + byte = byte_iter.preview() + if byte not in (128, 129): + byte_iter.reset_preview() + raise wsp_pdu.DecodeError('Error parsing sender visibility ' + 'value for byte: %s' % hex(byte)) + + byte = byte_iter.next() + value = 'Hide' if byte == 128 else 'Show' + return value + + @staticmethod + def decode_response_status_value(byte_iter): + """ + Decodes the "Response Status" value pointed by ``byte_iter`` + + Defined in [4], section 7.2.20 + + + :raise wsp_pdu.DecodeError: The sender visibility value could not be + parsed. ``byte_iter`` will not be modified in + this case. + + :return: The decoded Response-status-value + :rtype: str + """ + response_status_values = { + 0x80: 'Ok', + 0x81: 'Error-unspecified', + 0x82: 'Error-service-denied', + 0x83: 'Error-message-format-corrupt', + 0x84: 'Error-sending-address-unresolved', + 0x85: 'Error-message-not-found', + 0x86: 'Error-network-problem', + 0x87: 'Error-content-not-accepted', + 0x88: 'Error-unsupported-message', + } + byte = byte_iter.preview() + byte_iter.next() + # Return error unspecified if it couldn't be decoded + return response_status_values.get(byte, 0x81) + + @staticmethod + def decode_status_value(byte_iter): + """ + Used to decode the "Status" MMS header. + + Defined in [4], section 7.2.23 + + :raise wsp_pdu.DecodeError: The sender visibility value could not be + parsed. ``byte_iter`` will not be + modified in this case. + + :return: The decoded Status-value + :rtype: str + """ + status_values = { + 0x80: 'Expired', + 0x81: 'Retrieved', + 0x82: 'Rejected', + 0x83: 'Deferred', + 0x84: 'Unrecognised', + } + + byte = byte_iter.next() + # Return an unrecognised state if it couldn't be decoded + return status_values.get(byte, 0x84) + + @staticmethod + def decode_expiry_value(byte_iter): + """ + Used to decode the "Expiry" MMS header. + + From [4], section 7.2.10:: + + Expiry-value = Value-length (Absolute-token Date-value | Relative-token Delta-seconds-value) + Absolute-token = + Relative-token = + + :raise wsp_pdu.DecodeError: The Expiry-value could not be decoded + + :return: The decoded Expiry-value, either as a date, or as a delta-seconds value + :rtype: str or int + """ + value_length = MMSDecoder.decode_value_length(byte_iter) + token = byte_iter.next() + + if token == 0x80: # Absolute-token + return MMSDecoder.decode_date_value(byte_iter) + elif token == 0x81: # Relative-token + return MMSDecoder.decode_delta_seconds_value(byte_iter) + + raise wsp_pdu.DecodeError('Unrecognized token value: %s' % hex(token)) + + +class MMSEncoder(wsp_pdu.Encoder): + """MMS Encoder""" + + def __init__(self): + self._mms_message = message.MMSMessage() + + def encode(self, mms_message): + """ + Encodes the specified MMS message ``mms_message`` + + :param mms_message: The MMS message to encode + :type mms_message: MMSMessage + + :return: The binary-encoded MMS data, as a sequence of bytes + :rtype: array.array('B') + """ + self._mms_message = mms_message + msg_data = self.encode_message_header() + msg_data.extend(self.encode_message_body()) + return msg_data + + def encode_message_header(self): + """ + Binary-encodes the MMS header data. + + The encoding used for the MMS header is specified in [4]. + All "constant" encoded values found/used in this method + are also defined in [4]. For a good example, see [2]. + + :return: the MMS PDU header, as an array of bytes + :rtype: array.array('B') + """ + # See [4], chapter 8 for info on how to use these + # from_types = {'Address-present-token': 0x80, + # 'Insert-address-token': 0x81} + + # content_types = {'application/vnd.wap.multipart.related': 0xb3} + + # Create an array of 8-bit values + message_header = array.array('B') + + headers_to_encode = self._mms_message.headers + + # If the user added any of these to the message manually + # (X- prefix) use those instead + for hdr in ('X-Mms-Message-Type', 'X-Mms-Transaction-Id', + 'X-Mms-Version'): + if hdr in headers_to_encode: + if hdr == 'X-Mms-Version': + clean_header = 'MMS-Version' + else: + clean_header = hdr.replace('X-Mms-', '', 1) + + headers_to_encode[clean_header] = headers_to_encode[hdr] + del headers_to_encode[hdr] + + # First 3 headers (in order), according to [4]: + ################################################ + # - X-Mms-Message-Type + # - X-Mms-Transaction-ID + # - X-Mms-Version + + ### Start of Message-Type verification + if 'Message-Type' not in headers_to_encode: + # Default to 'm-retrieve-conf'; we don't need a To/CC field for + # this (see WAP-209, section 6.3, table 5) + headers_to_encode['Message-Type'] = 'm-retrieve-conf' + + # See if the chosen message type is valid, given the message's + # other headers. NOTE: we only distinguish between 'm-send-req' + # (requires a destination number) and 'm-retrieve-conf' + # (requires no destination number) - if "Message-Type" is + # something else, we assume the message creator knows + # what she is doing + if headers_to_encode['Message-Type'] == 'm-send-req': + found_dest_address = False + for address_type in ('To', 'Cc', 'Bc'): + if address_type in headers_to_encode: + found_dest_address = True + break + + if not found_dest_address: + headers_to_encode['Message-Type'] = 'm-retrieve-conf' + ### End of Message-Type verification + + ### Start of Transaction-Id verification + if 'Transaction-Id' not in headers_to_encode: + trans_id = str(random.randint(1000, 9999)) + headers_to_encode['Transaction-Id'] = trans_id + ### End of Transaction-Id verification + + ### Start of MMS-Version verification + if 'MMS-Version' not in headers_to_encode: + headers_to_encode['MMS-Version'] = '1.0' + + # Encode the first three headers, in correct order + for hdr in ('Message-Type', 'Transaction-Id', 'MMS-Version'): + message_header.extend( + MMSEncoder.encode_header(hdr, headers_to_encode[hdr])) + del headers_to_encode[hdr] + + # Encode all remaining MMS message headers, except "Content-Type" + # -- this needs to be added last, according [2] and [4] + for hdr in headers_to_encode: + if hdr != 'Content-Type': + message_header.extend( + MMSEncoder.encode_header(hdr, headers_to_encode[hdr])) + + # Ok, now only "Content-type" should be left + content_type, ct_parameters = headers_to_encode['Content-Type'] + message_header.extend(MMSEncoder.encode_mms_field_name('Content-Type')) + ret = MMSEncoder.encode_content_type_value(content_type, ct_parameters) + message_header.extend(flatten_list(ret)) + + return message_header + + def encode_message_body(self): + """ + Binary-encodes the MMS body data + + The MMS body's header should not be confused with the actual + MMS header, as returned by :func:`encode_header`. + + The encoding used for the MMS body is specified in [5], + section 8.5. It is only referenced in [4], however [2] + provides a good example of how this ties in with the MMS + header encoding. + + The MMS body is of type `application/vnd.wap.multipart` ``mixed`` + or ``related``. As such, its structure is divided into a header, and + the data entries/parts:: + + [ header ][ entries ] + ^^^^^^^^^^^^^^^^^^^^^ + MMS Body + + The MMS Body header consists of one entry[5]:: + + name type purpose + ------- ------- ----------- + num_entries uint_var num of entries in the multipart entity + + The MMS body's multipart entries structure:: + + name type purpose + ------- ----- ----------- + HeadersLen uint_var length of the ContentType and + Headers fields combined + DataLen uint_var length of the Data field + ContentType Multiple octets the content type of the data + Headers ( + - length of + ) octets the part's headers + Data octets the part's data + + :return: The binary-encoded MMS PDU body, as an array of bytes + :rtype: array.array('B') + """ + message_body = array.array('B') + + #TODO: enable encoding of MMSs without SMIL file + ########## MMS body: header ########## + # Parts: SMIL file + + num_entries = 1 + for page in self._mms_message._pages: + num_entries += page.number_of_parts() + + for data_part in self._mms_message._data_parts: + num_entries += 1 + + message_body.extend(self.encode_uint_var(num_entries)) + + ########## MMS body: entries ########## + # For every data "part", we have to add the following sequence: + # , + # , + # , + # . + + # Gather the data parts, adding the MMS message's SMIL file + smil_part = message.DataPart() + smil = self._mms_message.smil() + smil_part.set_data(smil, 'application/smil') + #TODO: make this dynamic.... + smil_part.headers['Content-ID'] = '<0000>' + parts = [smil_part] + for slide in self._mms_message._pages: + for part_tuple in (slide.image, slide.audio, slide.text): + if part_tuple is not None: + parts.append(part_tuple[0]) + + for part in parts: + name, val_type = part.headers['Content-Type'] + part_content_type = self.encode_content_type_value(name, val_type) + + encoded_part_headers = [] + for hdr in part.headers: + if hdr == 'Content-Type': + continue + encoded_part_headers.extend( + wsp_pdu.Encoder.encode_header(hdr, part.headers[hdr])) + + # HeadersLen entry (length of the ContentType and + # Headers fields combined) + headers_len = len(part_content_type) + len(encoded_part_headers) + message_body.extend(self.encode_uint_var(headers_len)) + # DataLen entry (length of the Data field) + message_body.extend(self.encode_uint_var(len(part))) + # ContentType entry + message_body.extend(part_content_type) + # Headers + message_body.extend(encoded_part_headers) + # Data (note: we do not null-terminate this) + for char in part.data: + message_body.append(ord(char)) + + return message_body + + @staticmethod + def encode_header(header_field_name, header_value): + """ + Encodes a header entry for an MMS message + + The return type of the "header value" depends on the header + itself; it is thus up to the function calling this to determine + what that type is (or at least compensate for possibly different + return value types). + + From [4], section 7.1:: + + Header = MMS-header | Application-header + MMS-header = MMS-field-name MMS-value + MMS-field-name = Short-integer + MMS-value = Bcc-value | Cc-value | Content-location-value | Content-type-value | etc + + :raise DecodeError: This uses :func:`decode_mms_header` and + :func:`decode_application_header`, and will raise this + exception under the same circumstances as + :func:`decode_application_header`. ``byte_iter`` will + not be modified in this case. + + :return: The decoded header entry from the MMS, in the format: + (, ) + :rtype: tuple + """ + encoded_header = [] + # First try encoding the header as a "MMS-header"... + for assigned_number in mms_field_names: + header = mms_field_names[assigned_number][0] + if header == header_field_name: + encoded_header.extend( + wsp_pdu.Encoder.encode_short_integer(assigned_number)) + # Now encode the value + expected_type = mms_field_names[assigned_number][1] + try: + ret = getattr(MMSEncoder, + 'encode_%s' % expected_type)(header_value) + encoded_header.extend(ret) + except wsp_pdu.EncodeError, msg: + raise wsp_pdu.EncodeError('Error encoding parameter ' + 'value: %s' % msg) + except: + debug('A fatal error occurred, probably due to an ' + 'unimplemented encoding operation') + raise + + break + + # See if the "MMS-header" encoding worked + if not len(encoded_header): + # ...it didn't. Use "Application-header" encoding + header_name = wsp_pdu.Encoder.encode_token_text(header_field_name) + encoded_header.extend(header_name) + # Now add the value + encoded_header.extend( + wsp_pdu.Encoder.encode_text_string(header_value)) + + return encoded_header + + @staticmethod + def encode_mms_field_name(field_name): + """ + Encodes an MMS header field name + + From [4], section 7.1:: + + MMS-field-name = Short-integer + + :raise EncodeError: The specified header field name is not a + well-known MMS header. + + :param field_name: The header field name to encode + :type field_name: str + + :return: The encoded header field name, as a sequence of bytes + :rtype: list + """ + encoded_mms_field_name = [] + + for assigned_number in mms_field_names: + if mms_field_names[assigned_number][0] == field_name: + encoded_mms_field_name.extend( + wsp_pdu.Encoder.encode_short_integer(assigned_number)) + break + + if not len(encoded_mms_field_name): + raise wsp_pdu.EncodeError('The specified header field name is not ' + 'a well-known MMS header field name') + + return encoded_mms_field_name + + @staticmethod + def encode_from_value(from_value=''): + """ + Encodes the "From" address value + + From [4], section 7.2.11:: + + From-value = Value-length (Address-present-token Encoded-string-value | Insert-address-token ) + Address-present-token = + Insert-address-token = + + :param from_value: The "originator" of the MMS message. This may be an + empty string, in which case a token will be encoded + informing the MMSC to insert the address of the + device that sent this message (default). + :type from_value: str + + :return: The encoded "From" address value, as a sequence of bytes + :rtype: list + """ + encoded_from_value = [] + if len(from_value) == 0: + value_length = wsp_pdu.Encoder.encode_value_length(1) + encoded_from_value.extend(value_length) + encoded_from_value.append(129) # Insert-address-token + else: + encoded_address = MMSEncoder.encode_encoded_string_value(from_value) + # the "+1" is for the Address-present-token + length = len(encoded_address) + 1 + value_length = wsp_pdu.Encoder.encode_value_length(length) + encoded_from_value.extend(value_length) + encoded_from_value.append(128) # Address-present-token + encoded_from_value.extend(encoded_address) + + return encoded_from_value + + @staticmethod + def encode_encoded_string_value(string_value): + """ + Encodes ``string_value`` + + This is a simple wrapper to :func:`encode_text_string` + + From [4], section 7.2.9:: + + Encoded-string-value = Text-string | Value-length Char-set Text-string + + The Char-set values are registered by IANA as MIBEnum value. + + :param string_value: The text string to encode + :type string_value: str + + :return: The encoded string value, as a sequence of bytes + :rtype: list + """ + return wsp_pdu.Encoder.encode_text_string(string_value) + + @staticmethod + def encode_message_type_value(message_type): + """ + Encodes the Message-Type value ``message_type`` + + Unknown message types are discarded; thus they will be encoded + as 0x80 ("m-send-req") by this function + + Defined in [4], section 7.2.14. + + :param message_type: The MMS message type to encode + :type message_type: str + + :return: The encoded message type, as a sequence of bytes + :rtype: list + """ + message_types = { + 'm-send-req': 0x80, + 'm-send-conf': 0x81, + 'm-notification-ind': 0x82, + 'm-notifyresp-ind': 0x83, + 'm-retrieve-conf': 0x84, + 'm-acknowledge-ind': 0x85, + 'm-delivery-ind': 0x86, + } + + return [message_types.get(message_type, 0x80)] + + @staticmethod + def encode_status_value(status_value): + status_values = { + 'Expired': 0x80, + 'Retrieved': 0x81, + 'Rejected': 0x82, + 'Deferred': 0x83, + 'Unrecognised': 0x84, + } + + # Return an unrecognised state if it couldn't be decoded + return [status_values.get(status_value, 'Unrecognised')] diff --git a/messaging/mms/wsp_pdu.py b/messaging/mms/wsp_pdu.py new file mode 100644 index 0000000..bacd46d --- /dev/null +++ b/messaging/mms/wsp_pdu.py @@ -0,0 +1,2055 @@ +# This library is free software. +# +# It was originally distributed under the terms of the GNU Lesser +# General Public License Version 2. +# +# python-messaging opts to apply the terms of the ordinary GNU +# General Public License v2, as permitted by section 3 of the LGPL +# v2.1. This re-licensing allows the entirety of python-messaging to +# be distributed according to the terms of GPL-2. +# +# See the COPYING file included in this archive +# +# The docstrings in this module contain epytext markup; API documentation +# may be created by processing this file with epydoc: http://epydoc.sf.net +""" +WSP Data Unit structure encoding and decoding classes + +Throughout the classes defined in this module, the following "primitive data +type" terminology applies, as specified in [5], section 8.1.1:: + + Data Type Definition + bit 1 bit of data + octet 8 bits of opaque data + uint8 8-bit unsigned integer + uint16 16-bit unsigned integer + uint32 32-bit unsigned integer + uintvar variable length unsigned integer + +This Encoder and Decoder classes provided in this module firstly provides +public methods for decoding and encoding each of these data primitives (where +needed). + +Next, they provide methods encapsulating the basic WSP Header encoding rules +as defined in section 8.4.2.1 of [5]. + +Finally, the classes defined here provide methods for decoding/parsing +specific WSP header fields. + +References used in the code and this document: + +[5] Wap Forum/Open Mobile Alliance, "WAP-230 Wireless Session Protocol Specification" + U{http://www.openmobilealliance.org/tech/affiliates/LicenseAgreement.asp?DocName=/wap/wap-230-wsp-20010705-a.pdf} +""" + +import array +from datetime import datetime + +from messaging.utils import debug +from messaging.mms.iterator import PreviewIterator + +wsp_pdu_types = { + 0x01: 'Connect', + 0x02: 'ConnectReply', + 0x03: 'Redirect', + 0x04: 'Reply', + 0x05: 'Disconnect', + 0x06: 'Push', + 0x07: 'ConfirmedPush', + 0x08: 'Suspend', + 0x09: 'Resume', + 0x40: 'Get', + 0x60: 'Post', +} + +# Well-known parameter assignments ([5], table 38) +well_known_parameters = { + 0x00: ('Q', 'q_value'), + 0x01: ('Charset', 'well_known_charset'), + 0x02: ('Level', 'version_value'), + 0x03: ('Type', 'integer_value'), + 0x05: ('Name', 'text_string'), + 0x06: ('Filename', 'text_string'), + 0x07: ('Differences', 'Field-name'), + 0x08: ('Padding', 'short_integer'), + 0x09: ('Type', 'constrained_encoding'), # encoding version 1.2 + 0x0a: ('Start', 'text_string'), + 0x0b: ('Start-info', 'text_string'), + 0x0c: ('Comment', 'text_string'), # encoding version 1.3 + 0x0d: ('Domain', 'text_string'), + 0x0e: ('Max-Age', 'delta_seconds_value'), + 0x0f: ('Path', 'text_string'), + 0x10: ('Secure', 'no_value'), + 0x11: ('SEC', 'short_integer'), # encoding version 1.4 + 0x12: ('MAC', 'text_value'), + 0x13: ('Creation-date', 'date_value'), + 0x14: ('Modification-date', 'date_value'), + 0x15: ('Read-date', 'date_value'), + 0x16: ('Size', 'integer_value'), + 0x17: ('Name', 'text_value'), + 0x18: ('Filename', 'text_value'), + 0x19: ('Start', 'text_value'), + 0x1a: ('Start-info', 'text_value'), + 0x1b: ('Comment', 'text_value'), + 0x1c: ('Domain', 'text_value'), + 0x1d: ('Path', 'text_value'), +} + + +# Content type assignments ([5], table 40) +well_known_content_types = [ + '*/*', 'text/*', 'text/html', 'text/plain', + 'text/x-hdml', 'text/x-ttml', 'text/x-vCalendar', + 'text/x-vCard', 'text/vnd.wap.wml', + 'text/vnd.wap.wmlscript', 'text/vnd.wap.wta-event', + 'multipart/*', 'multipart/mixed', 'multipart/form-data', + 'multipart/byterantes', 'multipart/alternative', + 'application/*', 'application/java-vm', + 'application/x-www-form-urlencoded', + 'application/x-hdmlc', 'application/vnd.wap.wmlc', + 'application/vnd.wap.wmlscriptc', + 'application/vnd.wap.wta-eventc', + 'application/vnd.wap.uaprof', + 'application/vnd.wap.wtls-ca-certificate', + 'application/vnd.wap.wtls-user-certificate', + 'application/x-x509-ca-cert', + 'application/x-x509-user-cert', + 'image/*', 'image/gif', 'image/jpeg', 'image/tiff', + 'image/png', 'image/vnd.wap.wbmp', + 'application/vnd.wap.multipart.*', + 'application/vnd.wap.multipart.mixed', + 'application/vnd.wap.multipart.form-data', + 'application/vnd.wap.multipart.byteranges', + 'application/vnd.wap.multipart.alternative', + 'application/xml', 'text/xml', + 'application/vnd.wap.wbxml', + 'application/x-x968-cross-cert', + 'application/x-x968-ca-cert', + 'application/x-x968-user-cert', + 'text/vnd.wap.si', + 'application/vnd.wap.sic', + 'text/vnd.wap.sl', + 'application/vnd.wap.slc', + 'text/vnd.wap.co', + 'application/vnd.wap.coc', + 'application/vnd.wap.multipart.related', + 'application/vnd.wap.sia', + 'text/vnd.wap.connectivity-xml', + 'application/vnd.wap.connectivity-wbxml', + 'application/pkcs7-mime', + 'application/vnd.wap.hashed-certificate', + 'application/vnd.wap.signed-certificate', + 'application/vnd.wap.cert-response', + 'application/xhtml+xml', + 'application/wml+xml', + 'text/css', + 'application/vnd.wap.mms-message', + 'application/vnd.wap.rollover-certificate', + 'application/vnd.wap.locc+wbxml', + 'application/vnd.wap.loc+xml', + 'application/vnd.syncml.dm+wbxml', + 'application/vnd.syncml.dm+xml', + 'application/vnd.syncml.notification', + 'application/vnd.wap.xhtml+xml', + 'application/vnd.wv.csp.cir', + 'application/vnd.oma.dd+xml', + 'application/vnd.oma.drm.message', + 'application/vnd.oma.drm.content', + 'application/vnd.oma.drm.rights+xml', + 'application/vnd.oma.drm.rights+wbxml', +] + +# Well-known character sets (table 42 of [5]) +# Format { : } +# Note that the assigned number is the same as the IANA MIBEnum value +# "gsm-default-alphabet" is not included, as it is not assigned any +# value in [5]. Also note, this is by no means a complete list +well_known_charsets = { + 0x07EA: 'big5', + 0x03E8: 'iso-10646-ucs-2', + 0x04: 'iso-8859-1', + 0x05: 'iso-8859-2', + 0x06: 'iso-8859-3', + 0x07: 'iso-8859-4', + 0x08: 'iso-8859-5', + 0x09: 'iso-8859-6', + 0x0A: 'iso-8859-7', + 0x0B: 'iso-8859-8', + 0x0C: 'iso-8859-9', + 0x11: 'shift_JIS', + 0x03: 'us-ascii', + 0x6A: 'utf-8', +} + +# Header Field Name assignments ([5], table 39) +header_field_names = [ + 'Accept', 'Accept-Charset', 'Accept-Encoding', + 'Accept-Language', 'Accept-Ranges', 'Age', + 'Allow', 'Authorization', 'Cache-Control', + 'Connection', 'Content-Base', 'Content-Encoding', + 'Content-Language', 'Content-Length', + 'Content-Location', 'Content-MD5', 'Content-Range', + 'Content-Type', 'Date', 'Etag', 'Expires', 'From', + 'Host', 'If-Modified-Since', 'If-Match', + 'If-None-Match', 'If-Range', 'If-Unmodified-Since', + 'Location', 'Last-Modified', 'Max-Forwards', 'Pragma', + 'Proxy-Authenticate', 'Proxy-Authorization', 'Public', + 'Range', 'Referer', 'Retry-After', 'Server', + 'Transfer-Encoding', 'Upgrade', 'User-Agent', + 'Vary', 'Via', 'Warning', 'WWW-Authenticate', + 'Content-Disposition', + # encoding version 1.2 + 'X-Wap-Application-Id', 'X-Wap-Content-URI', + 'X-Wap-Initiator-URI', 'Accept-Application', + 'Bearer-Indication', 'Push-Flag', 'Profile', + 'Profile-Diff', 'Profile-Warning', + # encoding version 1.3 + 'Expect', 'TE', 'Trailer', 'Accept-Charset', + 'Accept-Encoding', 'Cache-Control', + 'Content-Range', 'X-Wap-Tod', 'Content-ID', + 'Set-Cookie', 'Cookie', 'Encoding-Version', + # encoding version 1.4 + 'Profile-Warning', 'Content-Disposition', + 'X-WAP-Security', 'Cache-Control', +] + + +# TODO: combine this dict with the header_field_names table (same as well +# known parameter assignments) +# Temporary fix to allow different types of header field values to be +# dynamically decoded +header_field_encodings = {'Accept': 'accept_value', 'Pragma': 'pragma_value'} + + +def get_header_field_names(version='1.2'): + """ + Formats list of assigned values for header field names, for the + specified WSP encoding version. + + :param version: The WSP encoding version to use. This defaults + to "1.2", but may be "1.1", "1.2", "1.3" or + "1.4" (see table 39 in [5] for details). + :type version: str + + :raise ValueError: The specified encoding version is invalid. + + :return: A list containing the WSP header field names with assigned + numbers for the specified encoding version (and lower). + :rtype: list + """ + if version not in ('1.1', '1.2', '1.3', '1.4'): + raise ValueError('version must be "1.1",' + '"1.2", "1.3" or "1.4"') + + version = int(version.split('.')[1]) + + versioned_field_names = header_field_names[:] + if version == 3: + versioned_field_names = versioned_field_names[:0x44] + elif version == 2: + versioned_field_names = versioned_field_names[:0x38] + elif version == 1: + versioned_field_names = versioned_field_names[:0x2f] + + return versioned_field_names + + +def get_well_known_parameters(version='1.2'): + """ + Return a list of assigned values for parameter names for ``version`` + + Formats list of assigned values for well-known parameter names, + for the specified WSP encoding version. + + :param version: The WSP encoding version to use. This defaults + to "1.2", but may be "1.1", "1.2", "1.3" or + "1.4" (see table 38 in [5] for details). + :type version: str + + :raise ValueError: The specified encoding version is invalid. + + :return: A dictionary containing the well-known parameters with + assigned numbers for the specified encoding version (and + lower). Entries in this dict follow the format:: + + : (, ) + :rtype: dict + """ + if version not in ('1.1', '1.2', '1.3', '1.4'): + raise ValueError('version must be "1.1",' + '"1.2", "1.3" or "1.4"') + else: + version = int(version.split('.')[1]) + + versioned_params = well_known_parameters.copy() + if version <= 3: + for assigned_number in range(0x11, 0x1e): + del versioned_params[assigned_number] + + if version <= 2: + for assigned_number in range(0x0c, 0x11): + del versioned_params[assigned_number] + + if version == 1: + for assigned_number in range(0x09, 0x0c): + del versioned_params[assigned_number] + + return versioned_params + + +class DecodeError(Exception): + """ + Raised when a decoding operation failed + + Most probably due to an invalid byte in the sequence provided for decoding + """ + + +class EncodeError(Exception): + """ + Raised when an encoding operation failed + + Most probably due to an invalid value provided for encoding + """ + + +class Decoder: + """A WSP Data unit decoder""" + + @staticmethod + def decode_uint_8(byte_iter): + """ + Decodes an 8-bit uint from the byte pointed to by ``byte_iter`` + + This function will move the iterator passed as ``byte_iter`` one + byte forward. + + :param byte_iter: an iterator over a sequence of bytes + :type byte_iter: iter + + :return: the decoded 8-bit unsigned integer + :rtype: int + """ + # Make the byte unsigned + return next(byte_iter) & 0xf + + @staticmethod + def decode_uint_var(byte_iter): + """ + Decodes the uint starting at the byte pointed to by ``byte_iter`` + + See :func:`wsp.Encoder.encode_uint_var` for a detailed description of + the encoding scheme used for ``uint_var`` sequences. + + This function will move the iterator passed as ``byte_iter`` to + the last octet in the uintvar sequence; thus, after calling this, + that iterator's `next()` function will return the first byte + **after** the uintvar sequence. + + :param byte_iter: an iterator over a sequence of bytes + :type byte_iter: iter + + :return: the decoded unsigned integer + :rtype: int + """ + uint = 0 + byte = next(byte_iter) + while (byte >> 7) == 0x01: + uint = uint << 7 + uint |= byte & 0x7f + byte = next(byte_iter) + + uint = uint << 7 + uint |= byte & 0x7f + return uint + + @staticmethod + def decode_short_integer(byte_iter): + """ + Decodes the short-integer value starting at ``byte_iter`` + + The encoding for a long integer is specified in [5], section 8.4.2.1:: + + Short-integer = OCTET + + Integers in range 0-127 shall be encoded as a one octet value with + the most significant bit set to one (1xxx xxxx) and with the value + in the remaining least significant bits. + + :raise DecodeError: Not a valid short-integer; the most significant + isn't set to 1. ``byte_iter`` will not be + modified if this is raised + + :return: The decoded short integer + :rtype: int + """ + byte = byte_iter.preview() + if not byte & 0x80: + byte_iter.reset_preview() + raise DecodeError('Not a valid short-integer: MSB not set') + + byte = next(byte_iter) + return byte & 0x7f + + @staticmethod + def decode_short_integer_from_byte(byte): + """ + Decodes the short-integer value contained in the specified byte value + + :param byte: the byte value to decode + :type byte: int + + :raise DecodeError: Not a valid short-integer; the MSB isn't set to 1. + :return: The decoded short integer + :rtype: int + """ + if not byte & 0x80: + raise DecodeError('Not a valid short-integer: MSB not set') + + return byte & 0x7f + + @staticmethod + def decode_long_integer(byte_iter): + """ + Decodes the long int value pointed to by ``byte_iter`` + + If this function returns successfully, it will move the + iterator passed as ``byte_iter`` to the last octet in the + encoded long integer sequence; thus, after calling this, that + iterator's `next()` function will return the first byte + **after** the encoded long integer sequence. + + The encoding for a long integer is specified in [5], section 8.4.2.1, + and follows the form:: + + Long-integer = [Short-length] [Multi-octet-integer] + ^^^^^^ ^^^^^^^^^^^^^^^^^^^^^ + 1 byte bytes + + The Short-length indicates the length of the Multi-octet-integer. + + :raise DecodeError: The byte pointed to by ``byte_iter.next`` does + not indicate the start of a valid long-integer + sequence (short-length is invalid). If this is + raised, the iterator passed as ``byte_iter`` will + not be modified. + + :param byte_iter: an iterator over a sequence of bytes + :type byte_iter: iter + + :return: The decoded long integer + :rtype: int + """ + try: + shortLength = Decoder.decode_short_length(byte_iter) + except DecodeError: + raise DecodeError('short-length byte is invalid') + + longInt = 0 + # Decode the Multi-octect-integer + for i in range(shortLength): + longInt = longInt << 8 + longInt |= next(byte_iter) + + return longInt + + @staticmethod + def decode_text_string(byte_iter): + """ + Decodes the null-terminated, binary-encoded string value starting + at the byte pointed to by ``byte_iter``. + + this function will move the iterator passed as ``byte_iter`` to + the last octet in the encoded string sequence; thus, after + calling this, that iterator's `next()` function will return + the first byte **after** the encoded string sequence. + + This follows the basic encoding rules specified in [5], section + 8.4.2.1 + + :param byte_iter: an iterator over a sequence of bytes + :type byte_iter: iter + + :return: The decoded text string + :rtype: str + """ + decoded_string = '' + byte = next(byte_iter) + # Remove Quote character (octet 127), if present + if byte == 127: + byte = next(byte_iter) + + while byte != 0x00: + decoded_string += chr(byte) + byte = next(byte_iter) + + return decoded_string + + @staticmethod + def decode_quoted_string(byte_iter): + """ + From [5], section 8.4.2.1:: + + Quoted-string = *TEXT End-of-string + + The TEXT encodes an RFC2616 Quoted-string with the enclosing + quotation-marks <"> removed + + :return: The decoded text string + :rtype: str + """ + # look for the quote character + byte = byte_iter.preview() + if byte != 34: + byte_iter.reset_preview() + raise DecodeError('Invalid quoted string: must ' + 'start with ') + + next(byte_iter) + # CHECK: should the quotation chars be pre- and appended before + # returning *technically* we should not check for quote characters. + return Decoder.decode_text_string(byte_iter) + + @staticmethod + def decode_token_text(byte_iter): + """ From [5], section 8.4.2.1: + Token-text = Token End-of-string + + :raise DecodeError: invalid token; byte_iter is not modified + + :return: The token string if successful, otherwise the read byte + :rtype: str or int + """ + separators = (11, 32, 40, 41, 44, 47, 58, 59, 60, 61, 62, 63, 64, 91, + 92, 93, 123, 125) + token = '' + byte = byte_iter.preview() + if byte <= 31 or byte in separators: + byte_iter.reset_preview() + raise DecodeError('Invalid token') + + byte = next(byte_iter) + while byte > 31 and byte not in separators: + token += chr(byte) + byte = next(byte_iter) + + return token + + @staticmethod + def decode_extension_media(byte_iter): + """ + Decode the extension media pointed by ``byte_iter`` + + This encoding is used for media values, which have no well-known + binary encoding + + From [5], section 8.4.2.1:: + + Extension-media = *TEXT End-of-string + + + :raise DecodeError: The TEXT started with an invalid character. + ``byte_iter`` is not modified if this happens. + + :return: The decoded media type value + :rtype: str + """ + media_value = '' + byte = byte_iter.preview() + if byte < 32 or byte == 127: + byte_iter.reset_preview() + raise DecodeError('Invalid Extension-media: TEXT ' + 'starts with invalid character: %d' % byte) + + byte = next(byte_iter) + while byte != 0x00: + media_value += chr(byte) + byte = next(byte_iter) + + return media_value + + @staticmethod + def decode_constrained_encoding(byte_iter): + """Constrained-encoding = Extension-Media --or-- Short-integer + This encoding is used for token values, which have no well-known + binary encoding, or when the assigned number of the well-known + encoding is small enough to fit into Short-integer. + + :return: The decoding constrained-encoding token value + :rtype: str or int + """ + result = None + try: + # First try and see if this is just a short-integer + result = Decoder.decode_short_integer(byte_iter) + except DecodeError: + # Ok, it should be Extension-Media then + try: + result = Decoder.decode_extension_media(byte_iter) + except DecodeError: + # Give up + raise DecodeError('Not a valid Constrained-encoding sequence') + + return result + + @staticmethod + def decode_short_length(byte_iter): + """ From [5], section 8.4.2.2: + Short-length = + + :raise DecodeError: The byte is not a valid short-length value; + it is not in octet range 0-30. In this case, the + iterator passed as ``byte_iter`` is not modified. + + :note: If this function returns successfully, the iterator passed as + ``byte_iter`` is moved one byte forward. + + :return: The decoded short-length + :rtype: int + """ + # Make sure it's a valid short-length + byte = byte_iter.preview() + if byte > 30: + byte_iter.reset_preview() + raise DecodeError('Not a valid short-length: ' + 'should be in octet range 0-30') + + return next(byte_iter) + + @staticmethod + def decode_value_length(byte_iter): + """ + Decodes the value length indicator starting at ``byte_iter`` + + "Value length" is used to indicate the length of a value to follow, as + used in the `Content-Type` header in the MMS body, for example. + + The encoding for a value length indicator is specified in [5], + section 8.4.2.2, and follows the form:: + + Value-length = [Short-length] --or-- [Length-quote] [Length] + ^^^^^^ ^^^^^^ ^^^^^^ + 1 byte 1 byte x bytes + uint_var-integer + + :raise DecodeError: The value_length could not be decoded. If this + happens, ``byte_iter`` is not modified. + + :return: The decoded value length indicator + :rtype: int + """ + length_value = 0 + # Check for short-length + try: + length_value = Decoder.decode_short_length(byte_iter) + except DecodeError: + byte = byte_iter.preview() + # CHECK: this strictness MAY cause issues, but it is correct + if byte == 31: + next(byte_iter) # skip past the length-quote + length_value = Decoder.decode_uint_var(byte_iter) + else: + byte_iter.reset_preview() + raise DecodeError('Invalid Value-length: not short-length, ' + 'and no length-quote present') + + return length_value + + @staticmethod + def decode_integer_value(byte_iter): + """ + Decodes the integer value pointed by ``byte_iter`` + + From [5], section 8.4.2.3:: + + Integer-Value = Short-integer | Long-integer + + If successful, this function will move the iterator passed as + ``byte_iter`` to the last octet in the integer value sequence; + thus, after calling this, that iterator's `next()` function + will return the first byte **after** the integer value sequence. + + :raise DecodeError: The sequence of bytes starting at ``byte_iter`` + does not contain a valid integer value. If this + is raised, the iterator is not modified. + + :return: The decoded integer value + :rtype: int + """ + integer = 0 + # First try and see if it's a short-integer + try: + integer = Decoder.decode_short_integer(byte_iter) + except DecodeError: + try: + integer = Decoder.decode_long_integer(byte_iter) + except DecodeError: + raise DecodeError('Not a valid integer value') + + return integer + + @staticmethod + def decode_content_type_value(byte_iter): + """ + Decodes an encoded content type value. + + From [5], section 8.4.2.24:: + + Content-type-value = Constrained-media | Content-general-form + + The short form of the Content-type-value MUST only be used when the + well-known media is in the range of 0-127 or a text string. In all + other cases the general form MUST be used. + + :return: The media type (content type), and a dictionary of + parameters to this content type (which is empty if there + are no parameters). This parameter dictionary is in the + format: + {: }. + The final returned tuple is in the format: + (, ) + :rtype: tuple + """ + # First try do decode it as Constrained-media + content_type = '' + params = {} + try: + content_type = Decoder.decode_constrained_media(byte_iter) + except DecodeError: + # Try the general form + content_type, params = Decoder.decode_content_general_form(byte_iter) + + return content_type, params + + @staticmethod + def decode_well_known_media(byte_iter): + """ + Decodes the well known media pointed by ``byte_iter`` + From [5], section 8.4.2.7:: + + Well-known-media = Integer-value + + It is encoded using values from the "Content Type Assignments" table + (see [5], table 40). + + :param byte_iter: an iterator over a sequence of bytes + :type byte_iter: iter + + :raise DecodeError: This is raised if the integer value representing + the well-known media type cannot be decoded + correctly, or the well-known media type value + could not be found in the table of assigned + content types. + If this exception is raised, the iterator passed + as ``byte_iter`` is not modified. + + If successful, this function will move the iterator passed as + ``byte_iter`` to the last octet in the content type value + sequence; thus, after calling this, that iterator's `next()` + function will return the first byte B{after}the content type + value sequence. + + :return: the decoded MIME content type name + :rtype: str + """ + try: + value = Decoder.decode_integer_value(byte_iter) + except DecodeError: + raise DecodeError('Invalid well-known media: could not read ' + 'integer value representing it') + + try: + return well_known_content_types[value] + except IndexError: + raise DecodeError('Invalid well-known media: could not ' + 'find content type in table of assigned values') + + @staticmethod + def decode_media_type(byte_iter): + """ + Decodes the media type pointed by ``byte_iter`` + + Used by :func:`decode_content_general_form` + + From [5], section 8.2.4.24:: + + Media-type = (Well-known-media | Extension-Media) *(Parameter) + + :param byte_iter: an iterator over a sequence of bytes + :type byte_iter: iter + + :return: The decoded media type + :rtype: str + """ + try: + return Decoder.decode_well_known_media(byte_iter) + except DecodeError: + return Decoder.decode_extension_media(byte_iter) + + @staticmethod + def decode_constrained_media(byte_iter): + """ + Decodes the constrained media pointed pointed by ``byte_iter`` + + It is encoded using values from the "Content Type Assignments" table. + + From [5], section 8.4.2.7:: + + Constrained-media = Constrained-encoding + + :raise DecodeError: Invalid constrained media sequence + + :return: The decoded media type + :rtype: str + """ + try: + media_value = Decoder.decode_constrained_encoding(byte_iter) + except DecodeError as msg: + raise DecodeError('Invalid Constrained-media: %s' % msg) + + if isinstance(media_value, int): + try: + return well_known_content_types[media_value] + except IndexError: + raise DecodeError('Invalid constrained media: could not ' + 'find well-known content type') + + return media_value + + @staticmethod + def decode_content_general_form(byte_iter): + """ + Decodes the content general form pointed by ``byte_iter`` + + From [5], section 8.4.2.24:: + + Content-general-form = Value-length Media-type + + Used in decoding Content-type fields and their parameters; + see :func:`decode_content_type_value`. Used by + :func:`decode_content_type_value`. + + :return: The media type (content type), and a dictionary of + parameters to this content type (which is empty if there + are no parameters). This parameter dictionary is in the + format: + {: }. + The final returned tuple is in the format: + (, ) + :rtype: tuple + """ + # This is the length of the (encoded) media-type and all parameters + value_length = Decoder.decode_value_length(byte_iter) + + # Read parameters, etc, until is reached + ct_field_bytes = array.array('B') + for i in range(value_length): + ct_field_bytes.append(next(byte_iter)) + + ct_iter = PreviewIterator(ct_field_bytes) + # Now, decode all the bytes read + media_type = Decoder.decode_media_type(ct_iter) + # Decode the included paramaters (if any) + parameters = {} + while True: + try: + parameter, value = Decoder.decode_parameter(ct_iter) + parameters[parameter] = value + except StopIteration: + break + + return media_type, parameters + + @staticmethod + def decode_parameter(byte_iter): + """ + From [5], section 8.4.2.4:: + + Parameter = Typed-parameter | Untyped-parameter + + :return: The name of the parameter, and its value, in the format: + (, ) + :rtype: tuple + """ + try: + return Decoder.decode_typed_parameter(byte_iter) + except DecodeError: + return Decoder.decode_untyped_parameter(byte_iter) + + @staticmethod + def decode_typed_parameter(byte_iter): + """ + Decodes the typed parameter pointed by ``byte_iter`` + + The actual expected type of the value is implied by the well-known + parameter. + + This is used in decoding parameters; see :func:`decode_parameter` + + From [5], section 8.4.2.4:: + + Typed-parameter = Well-known-parameter-token Typed-value + + :return: The name of the parameter, and its value, in the format: + (, ) + :rtype: tuple + """ + token, value_type = Decoder.decode_well_known_parameter(byte_iter) + typed_value = '' + try: + typed_value = getattr(Decoder, 'decode_%s' % value_type)(byte_iter) + except DecodeError as msg: + raise DecodeError('Could not decode Typed-parameter: %s' % msg) + except: + debug('A fatal error occurred, probably due to an ' + 'unimplemented decoding operation') + raise + + return token, typed_value + + @staticmethod + def decode_untyped_parameter(byte_iter): + """ + Decodes the untyped parameter pointed by ``byte_iter`` + + This is used in decoding parameters; see :func:`decode_parameter` + + The type of the value is unknown, but it shall be encoded as an + integer, if that is possible. + + From [5], section 8.4.2.4:: + + Untyped-parameter = Token-text Untyped-value + + :return: The name of the parameter, and its value, in the format: + (, ) + :rtype: tuple + """ + token = Decoder.decode_token_text(byte_iter) + value = Decoder.decode_untyped_value(byte_iter) + return token, value + + @staticmethod + def decode_untyped_value(byte_iter): + """ + Decodes the untyped value pointed by ``byte_iter`` + + This is used in decoding parameter values; see + :func:`decode_untyped_parameter` + + From [5], section 8.4.2.4:: + + Untyped-value = Integer-value | Text-value + + :return: The decoded untyped-value + :rtype: int or str + """ + try: + return Decoder.decode_integer_value(byte_iter) + except DecodeError: + return Decoder.decode_text_value(byte_iter) + + @staticmethod + def decode_well_known_parameter(byte_iter, version='1.2'): + """Decodes the name and expected value type of a parameter of (for + example) a "Content-Type" header entry, taking into account the WSP + short form (assigned numbers) of well-known parameter names, as + specified in section 8.4.2.4 and table 38 of [5]. + + The code values used for parameters are specified in [5], table 38 + + From [5], section 8.4.2.4:: + + Well-known-parameter-token = Integer-value + + :raise ValueError: The specified encoding version is invalid. + :raise DecodeError: This is raised if the integer value representing + the well-known parameter name cannot be decoded + correctly, or the well-known paramter token value + could not be found in the table of assigned + content types. + If this exception is raised, the iterator passed + as ``byte_iter`` is not modified. + + :param version: The WSP encoding version to use. This defaults + to "1.2", but may be "1.1", "1.2", "1.3" or + 1.4" (see table 39 in [5] for details). + :type version: str + + :return: the decoded parameter name, and its expected value type, in + the format (, ) + :rtype: tuple + """ + parameter_name = expected_value = '' + try: + parameter_value = Decoder.decode_integer_value(byte_iter) + except DecodeError: + raise DecodeError('Invalid well-known parameter token: could ' + 'not read integer value representing it') + + wk_params = get_well_known_parameters(version) + if parameter_value in wk_params: + parameter_name, expected_value = wk_params[parameter_value] + else: + #If this is reached, the parameter isn't a WSP well-known one + raise DecodeError('Invalid well-known parameter token: could ' + 'not find in table of assigned numbers ' + '(encoding version %s)' % version) + + return parameter_name, expected_value + + #TODO: somehow this should be more dynamic; we need to know what type + # is EXPECTED (hence the TYPED value) + @staticmethod + def decode_typed_value(byte_iter): + """ + Decodes the typed value pointed by ``byte_iter`` + + In addition to the expected type, there may be no value. + If the value cannot be encoded using the expected type, it shall be + encoded as text. + + This is used in decoding parameters, see :func:`decode_parameter` + From [5], section 8.4.2.4:: + + Typed-value = Compact-value | Text-value + + :return: The decoded Parameter Typed-value + :rtype: str + """ + typedValue = '' + try: + typedValue = Decoder.decode_compact_value(byte_iter) + except DecodeError: + try: + typedValue = Decoder.decode_text_value(byte_iter) + except DecodeError: + raise DecodeError('Could not decode the Parameter Typed-value') + + return typedValue + + # TODO: somehow this should be more dynamic; we need to know what + # type is EXPECTED + @staticmethod + def decode_compact_value(byte_iter): + """ + Decodes the compact value pointed by ``byte_iter`` + + This is used in decoding parameters, see :func:`decodeTypeValue` + + From [5], section 8.4.2.4:: + + Compact-value = Integer-value | Date-value | Delta-seconds-value | Q-value | Version-value | Uri-value + + :raise DecodeError: Failed to decode the Parameter Compact-value; + if this happens, ``byte_iter`` is unmodified + + :return: The decoded Compact-value (this is specific to the + parameter type + :rtype: str or int + """ + compact_value = None + try: + # First, see if it's an integer value + # This solves the checks for: Integer-value, Date-value, + # Delta-seconds-value, Q-value, Version-value + compact_value = Decoder.decode_integer_value(byte_iter) + except DecodeError: + try: + # Try parsing it as a Uri-value + compact_value = Decoder.decode_uri_value(byte_iter) + except DecodeError: + raise DecodeError('Could not decode Parameter Compact-value') + + return compact_value + + @staticmethod + def decode_date_value(byte_iter): + """ + Decode the data value pointed by ``byte_iter`` + + The encoding of dates shall be done in number of seconds from + 1970-01-01, 00:00:00 GMT. + + From [5], section 8.4.2.3:: + + Date-value = Long-integer + + :raise DecodeError: This method uses `decode_long_integer()`, and thus + raises this under the same conditions. + + :rtype: datetime.datetime + """ + return datetime.utcfromtimestamp(Decoder.decode_long_integer(byte_iter)) + + @staticmethod + def decode_delta_seconds_value(byte_iter): + """ + Decodes the delta seconds value pointed by ``byte_iter`` + + From [5], section 8.4.2.3:: + + Delta-seconds-value = Integer-value + + :raise DecodeError: This method uses `decode_integer_value`, and thus + raises this under the same conditions. + :return: the decoded delta-seconds-value + :rtype: int + """ + return Decoder.decode_integer_value(byte_iter) + + @staticmethod + def decode_q_value(byte_iter): + """ From [5], section 8.4.2.1: + The encoding is the same as in uint_var-integer, but with restricted + size. When quality factor 0 and quality factors with one or two + decimal digits are encoded, they shall be multiplied by 100 and + incremented by one, so that they encode as a one-octet value in + range 1-100, ie, 0.1 is encoded as 11 (0x0B) and 0.99 encoded as + 100 (0x64). Three decimal quality factors shall be multiplied with + 1000 and incremented by 100, and the result shall be encoded as a + one-octet or two-octet uintvar, eg, 0.333 shall be encoded as 0x83 + 0x31. Quality factor 1 is the default value and shall never be sent. + + :return: The decode quality factor (Q-value) + :rtype: float + """ + q_value_int = Decoder.decode_uint_var(byte_iter) + # TODO: limit the amount of decimal points + if q_value_int > 100: + return float(q_value_int - 100) / 1000.0 + + return float(q_value_int - 1) / 100.0 + + @staticmethod + def decode_version_value(byte_iter): + """ + Decodes the version-value. + + From [5], section 8.4.2.3:: + + Version-value = Short-integer | Text-string + + :return: the decoded version value in the format, usually in the + format: "." + :rtype: str + """ + try: + byteValue = Decoder.decode_short_integer(byte_iter) + major = (byteValue & 0x70) >> 4 + minor = byteValue & 0x0f + return '%d.%d' % (major, minor) + except DecodeError: + return Decoder.decode_text_string(byte_iter) + + @staticmethod + def decode_uri_value(byte_iter): + """ + Stub for Uri-value decoding; see :func:`decode_text_string` + """ + return Decoder.decode_text_string(byte_iter) + + @staticmethod + def decode_text_value(byte_iter): + """ + Stub for Parameter Text-value decoding. + + This is used when decoding parameter values; see + :func:`decode_typed_value` + + From [5], section 8.4.2.3:: + + Text-value = No-value | Token-text | Quoted-string + + :return: The decoded Parameter Text-value + :rtype: str + """ + try: + return Decoder.decode_token_text(byte_iter) + except DecodeError: + try: + return Decoder.decode_quoted_string(byte_iter) + except DecodeError: + # Ok, so it's a "No-value" + return '' + + @staticmethod + def decode_no_value(byte_iter): + """ + Verifies that the byte pointed to by ``byte_iter`` is 0x00. + + If successful, this function will move ``byte_iter`` one byte forward + + :raise DecodeError: If 0x00 is not found; ``byte_iter`` is not modified + if this is raised. + + :return: No-value, which is 0x00 + :rtype: int + """ + byte_iter, local_iter = next(byte_iter) + if next(local_iter) != 0x00: + raise DecodeError('Expected No-value') + + next(byte_iter) + return 0x00 + + @staticmethod + def decode_accept_value(byte_iter): + """ + most of these things are currently decoded, but discarded (e.g + accept-parameters); we only return the media type + + From [5], section 8.4.2.7:: + + Accept-value = Constrained-media | Accept-general-form + Accept-general-form = Value-length Media-range [Accept-parameters] + Media-range = (Well-known-media | Extension-Media) *(Parameter) + Accept-parameters = Q-token Q-value *(Accept-extension) + Accept-extension = Parameter + Q-token = + + :raise DecodeError: The decoding failed. ``byte_iter`` will not be + modified in this case. + :return: the decoded Accept-value (media/content type) + :rtype: str + """ + # Try to use Constrained-media encoding + try: + accept_value = Decoder.decode_constrained_media(byte_iter) + except DecodeError: + # ...now try Accept-general-form + value_length = Decoder.decode_value_length(byte_iter) + try: + media = Decoder.decode_well_known_media(byte_iter) + except DecodeError: + media = Decoder.decode_extension_media(byte_iter) + + # Check for the Q-Token (to see if there are Accept-parameters) + if byte_iter.preview() == 128: + next(byte_iter) + q_value = Decoder.decode_q_value(byte_iter) + try: + accept_extension = Decoder.decode_parameter(byte_iter) + except DecodeError: + # Just set an empty iterable + accept_extension = [] + + byte_iter.reset_preview() + accept_value = media + + return accept_value + + @staticmethod + def decode_pragma_value(byte_iter): + """ + Decodes the pragma value pointed by ``byte_iter`` + + Defined in [5], section 8.4.2.38:: + + Pragma-value = No-cache | (Value-length Parameter) + + From [5], section 8.4.2.15:: + + No-cache = + + :raise DecodeError: The decoding failed. ``byte_iter`` will not be + modified in this case. + :return: the decoded Pragma-value, in the format: + (, ) + :rtype: tuple + """ + byte = byte_iter.preview() + if byte == 0x80: # No-cache + next(byte_iter) + # TODO: Not sure if this parameter name (or even usage) is correct + name, value = 'Cache-control', 'No-cache' + else: + byte_iter.reset_preview() + value_length = Decoder.decode_value_length(byte_iter) + name, value = Decoder.decode_parameter(byte_iter) + + return name, value + + @staticmethod + def decode_well_known_charset(byte_iter): + """ + From [5], section 8.4.2.8:: + + Well-known-charset = Any-charset | Integer-value + Any-charset = + + It is encoded using values from "Character Set Assignments" table. + + Equivalent to the special RFC2616 charset value "*" + """ + # Look for the Any-charset value + byte = byte_iter.preview() + byte_iter.reset_preview() + if byte == 127: + next(byte_iter) + decoded_charset = '*' + else: + charset_value = Decoder.decode_integer_value(byte_iter) + if charset_value in well_known_charsets: + decoded_charset = well_known_charsets[charset_value] + else: + # This charset is not in our table... so just use the + # value (at least for now) + decoded_charset = str(charset_value) + + return decoded_charset + + @staticmethod + def decode_well_known_header(byte_iter): + """ + Currently, "Wap-value" is decoded as a Text-string in most cases + + From [5], section 8.4.2.6:: + + Well-known-header = Well-known-field-name Wap-value + Well-known-field-name = Short-integer + Wap-value = + + + :return: The header name, and its value, in the format: + (, ) + :rtype: tuple + """ + field_value = Decoder.decode_short_integer(byte_iter) + hdr_fields = get_header_field_names() + # TODO: *technically* this can fail, but then we have already + # read a byte... should fix? + if field_value not in range(len(hdr_fields)): + raise DecodeError('Invalid Header Field value: %d' % field_value) + + field_name = hdr_fields[field_value] + + # TODO: make this flow better, and implement it in + # decode_application_header also + # Currently we decode most headers as text_strings, except + # where we have a specific decoding algorithm implemented + if field_name in header_field_encodings: + wap_value_type = header_field_encodings[field_name] + try: + decoded_value = getattr(Decoder, + 'decode_%s' % wap_value_type)(byte_iter) + except DecodeError as msg: + raise DecodeError('Could not decode Wap-value: %s' % msg) + except: + debug('An error occurred, probably due to an ' + 'unimplemented decoding operation. Tried to ' + 'decode header: %s' % field_name) + raise + + else: + decoded_value = Decoder.decode_text_string(byte_iter) + + return field_name, decoded_value + + @staticmethod + def decode_application_header(byte_iter): + """ + From [5], section 8.4.2.6:: + + Application-header = Token-text Application-specific-value + + From [4], section 7.1:: + Application-header = Token-text Application-specific-value + Application-specific-value = Text-string + + This is used when decoding generic WSP headers; see + :func:`decode_header`. We follow [4], and decode the + "Application-specific-value" as a Text-string + + :return: The application-header, and its value, in the format: + (, ) + :rtype: tuple + """ + try: + app_header = Decoder.decode_token_text(byte_iter) + #FNA: added for brute-forcing + except DecodeError: + app_header = Decoder.decode_text_string(byte_iter) + + app_specific_value = Decoder.decode_text_string(byte_iter) + return app_header, app_specific_value + + @staticmethod + def decode_header(byte_iter): + """ + Decodes a WSP header entry + + "Shift-sequence" encoding has not been implemented. Currently, + almost all header values are treated as text-strings + + From [5], section 8.4.2.6:: + + Header = Message-header | Shift-sequence + Message-header = Well-known-header | Application-header + Well-known-header = Well-known-field-name Wap-value + Application-header = Token-text Application-specific-value + + + :return: The decoded headername, and its value, in the format: + (, ) + :rtype: tuple + """ + # First try decoding the header as a well-known-header + try: + return Decoder.decode_well_known_header(byte_iter) + except DecodeError: + # ...now try Application-header encoding + return Decoder.decode_application_header(byte_iter) + + +class Encoder: + """A WSP Data unit decoder""" + + @staticmethod + def encode_uint_8(uint): + """ + Encodes an 8-bit unsigned integer + + :param uint: The integer to encode + :type byte_iter: int + + :return: the encoded uint_8, as a sequence of bytes + :rtype: list + """ + # Make the byte unsigned + return [uint & 0xff] + + @staticmethod + def encode_uint_var(uint): + """ + Variable Length Unsigned Integer encoding algorithm + + This binary-encodes the given unsigned integer number as specified + in section 8.1.2 of [5]. Basically, each encoded byte has the + following structure:: + + [0][ Payload ] + | ^^^^^^^ + | 7 bits (actual data) + | + Continue bit + + The uint is split into 7-bit segments, and the "continue bit" of each + used octet is set to '1' to indicate more is to follow; the last used + octet's "continue bit" is set to 0. + + :return: the binary-encoded uint_var, as a list of byte values + :rtype: list + """ + uint_var = [uint & 0x7f] + # Since this is the lowest entry, we do not set the continue bit to 1 + uint = uint >> 7 + # ...but for the remaining octets, we have to + while uint > 0: + uint_var.insert(0, 0x80 | (uint & 0x7f)) + uint = uint >> 7 + + return uint_var + + @staticmethod + def encode_text_string(string): + """ Encodes a "Text-string" value. + + This follows the basic encoding rules specified in [5], section + 8.4.2.1 + + :param string: The text string to encode + :type string: str + + :return: the null-terminated, binary-encoded version of the + specified Text-string, as a list of byte values + :rtype: list + """ + encoded_string = [ord(c) for c in string] + encoded_string.append(0x00) + return encoded_string + + @staticmethod + def encode_short_integer(integer): + """ + Encodes the specified short-integer ``integer`` value + + Integers in range 0-127 shall be encoded as a one octet value with + the most significant bit set to one (1xxx xxxx) and with the value + in the remaining least significant bits. + + The encoding for a long integer is specified in [5], section 8.4.2.1:: + + Short-integer = OCTET + + :param integer: The short-integer value to encode + :type integer: int + + :raise EncodeError: Not a valid short-integer; the integer must be in + the range of 0-127 + + :return: The encoded short integer, as a list of byte values + :rtype: list + """ + if integer < 0 or integer > 127: + raise EncodeError('Short-integer value must be in ' + 'range 0-127: %d' % integer) + + # Make sure the MSB is set + return [integer | 0x80] + + @staticmethod + def encode_long_integer(integer): + """ + Encodes a Long-integer value ``integer`` + + The encoding for a long integer is specified in [5], section 8.4.2.1; + for a description of this encoding scheme, see + :func:`wsp.Decoder.decode_long_integer`. + + From [5], section 8.4.2.2:: + + Long-integer = Short-length Multi-octet-integer + Short-length = + + :raise EncodeError: is not of type "int" + + :param integer: The integer value to encode + :type integer: int + + :return: The encoded Long-integer, as a sequence of byte values + :rtype: list + """ + if not isinstance(integer, int): + raise EncodeError(' must be of type "int"') + + encoded_long_int = [] + longInt = integer + # Encode the Multi-octect-integer + while longInt > 0: + byte = 0xff & longInt + encoded_long_int.append(byte) + longInt = longInt >> 8 + + # Now add the SHort-length value, and make sure it's ok + shortLength = len(encoded_long_int) + if shortLength > 30: + raise EncodeError('Cannot encode Long-integer value: Short-length ' + 'is too long; should be in octet range 0-30') + encoded_long_int.insert(0, shortLength) + return encoded_long_int + + @staticmethod + def encode_version_value(version): + """ + Encodes the version-value. + + Example: An MMS version of "1.0" consists of a major version of 1 and a + minor version of 0, and would be encoded as 0x90. However, a version + of "1.2.4" would be encoded as the Text-string "1.2.4". + + From [5], section 8.4.2.3:: + Version-value = Short-integer | Text-string + + :param version: The version number to encode, e.g. "1.0" + :type version: str + + :raise TypeError: The specified version value was not of type `str` + + :return: the encoded version value, as a list of byte values + :rtype: list + """ + if not isinstance(version, str): + raise TypeError('Parameter must be of type "str"') + + encoded_version_val = [] + # First try short-integer encoding + try: + if len(version.split('.')) <= 2: + major_version = int(version.split('.')[0]) + if major_version < 1 or major_version > 7: + raise ValueError('Major version must be in range 1-7') + + major = major_version << 4 + if len(version.split('.')) == 2: + minor_version = int(version.split('.')[1]) + if minor_version < 0 or minor_version > 14: + raise ValueError('Minor version must be in range 0-14') + else: + minor_version = 15 + + minor = minor_version + encoded_version_val = Encoder.encode_short_integer(major | minor) + except: + # The value couldn't be encoded as a short-integer; use + # a text-string instead + encoded_version_val = Encoder.encode_text_string(version) + + return encoded_version_val + + @staticmethod + def encode_media_type(content_type): + """ + Encodes the specified MIME ``content_type`` ("Media-type" value) + + "Well-known-media" takes into account the WSP short form of well-known + content types, as specified in section 8.4.2.24 and table 40 of [5]. + + From [5], section 8.2.4.24:: + + Media-type = (Well-known-media | Extension-Media) *(Parameter) + + :param content_type: The MIME content type to encode + :type content_type: str + + :return: The binary-encoded content type, as a list of (integer) byte + values + :rtype: list + """ + if content_type in well_known_content_types: + # Short-integer encoding + val = Encoder.encode_short_integer( + well_known_content_types.index(content_type)) + else: + val = Encoder.encode_text_string(content_type) + + return [val] + + @staticmethod + def encode_parameter(parameter_name, parameter_value, version='1.2'): + """ + Encodes ``parameter_name`` and ``parameter_value`` using ``version`` + + Binary-encodes the name of a parameter of -say- a "Content-Type" + header entry, taking into account the WSP short form of + well-known parameter names, as specified in section 8.4.2.4 and table + 38 of [5]. + + From [5], section 8.4.2.4:: + + Parameter = Typed-parameter | Untyped-parameter + Typed-parameter = Well-known-parameter-token Typed-value + Untyped-parameter = Token-text Untyped-value + Untyped-value = Integer-value | Text-value + + :param parameter_name: The name of the parameter to encode + :type parameter_name: str + :param parameter_value: The value of the parameter + :type parameter_value: str or int + + :param version: The WSP encoding version to use. This defaults + to "1.2", but may be "1.1", "1.2", "1.3" or + "1.4" (see table 38 in [5] for details). + :type version: str + + :raise ValueError: The specified encoding version is invalid. + + :return: The binary-encoded parameter name, as a list of (integer) + byte values + :rtype: list + """ + wk_params = get_well_known_parameters(version) + encoded_parameter = [] + # Try to encode the parameter using a "Typed-parameter" value + wkParamNumbers = list(wk_params.keys()) + wkParamNumbers.sort(reverse=True) + for assigned_number in wkParamNumbers: + if wk_params[assigned_number][0] == parameter_name: + # Ok, it's a Typed-parameter; encode the parameter name + encoded_parameter.extend( + Encoder.encode_short_integer(assigned_number)) + # and now the value + expected_type = wk_params[assigned_number][1] + try: + ret = getattr(Encoder, + 'encode_%s' % expected_type)(parameter_value) + encoded_parameter.extend(ret) + except EncodeError as msg: + raise EncodeError('Error encoding param value: %s' % msg) + except: + debug('A fatal error occurred, probably due to an ' + 'unimplemented encoding operation') + raise + break + + # See if the "Typed-parameter" encoding worked + if len(encoded_parameter) == 0: + # it didn't. Use "Untyped-parameter" encoding + encoded_parameter.extend(Encoder.encode_token_text(parameter_name)) + value = [] + # First try to encode the untyped-value as an integer + try: + value = Encoder.encode_integer_value(parameter_value) + except EncodeError: + value = Encoder.encode_text_string(parameter_value) + + encoded_parameter.extend(value) + + return encoded_parameter + + # TODO: check up on the encoding/decoding of Token-text, in particular, + # how does this differ from text-string? does it have 0x00 at the end? + @staticmethod + def encode_token_text(text): + """ From [5], section 8.4.2.1: + Token-text = Token End-of-string + + :raise EncodeError: Specified text cannot be encoding as a token + + :return: The encoded token string, as a list of byte values + :rtype: list + """ + separators = (11, 32, 40, 41, 44, 47, 58, 59, 60, 61, 62, 63, 64, + 91, 92, 93, 123, 125) + # Sanity check + for char in separators: + if chr(char) in text: + raise EncodeError('Char "%s" in text string; cannot ' + 'encode as Token-text' % chr(char)) + + return Encoder.encode_text_string(text) + + @staticmethod + def encode_integer_value(integer): + """Encodes an integer value + + From [5], section 8.4.2.3: + Integer-Value = Short-integer | Long-integer + + This function will first try to encode the specified integer value + into a short-integer, and failing that, will encode into a + long-integer value. + + :param integer: The integer to encode + :type integer: int + + :raise EncodeError: The parameter is not of type `int` + + :return: The encoded integer value, as a list of byte values + :rtype: list + """ + if not isinstance(integer, int): + raise EncodeError(' must be of type "int"') + + # First try and see if it's a short-integer + try: + return Encoder.encode_short_integer(integer) + except EncodeError: + return Encoder.encode_long_integer(integer) + + @staticmethod + def encode_text_value(text): + """Stub for encoding Text-values; see :func:`encode_text_string`""" + return Encoder.encode_text_string(text) + + @staticmethod + def encode_no_value(value=None): + """ + Encodes a No-value ``value``, which is 0x00 + + This function mainly exists for use by automatically-selected + encoding routines (see :func:`encode_parameter`) for an example. + + :param value: This value is ignored; it is present so that this + method complies with the format of the other `encode` + methods. + + :return: A list containing a single "No-value", which is 0x00 + :rtype: list + """ + return [0x00] + + @staticmethod + def encode_header(field_name, value): + """ + Encodes a WSP header entry ``field_name``, and its ``value`` + + "Shift-sequence" encoding has not been implemented. Currently, + almost all header values are encoded as text-strings + + From [5], section 8.4.2.6:: + + Header = Message-header | Shift-sequence + Message-header = Well-known-header | Application-header + Well-known-header = Well-known-field-name Wap-value + Application-header = Token-text Application-specific-value + + :return: The encoded header, and its value, as a sequence of + byte values + :rtype: list + """ + encoded_header = [] + # First try encoding the header name as a "well-known-header"... + wkHdrFields = get_header_field_names() + if field_name in wkHdrFields: + header_field_value = Encoder.encode_short_integer( + wkHdrFields.index(field_name)) + encoded_header.extend(header_field_value) + else: + # otherwise, encode it as an "application header" + encoded_header_name = Encoder.encode_token_text(field_name) + encoded_header.extend(encoded_header_name) + + # Now add the value + # TODO: make this flow better (see also Decoder.decode_header) + # most header values are encoded as text_strings, except where we + # have a specific Wap-value encoding implementation + if field_name in header_field_encodings: + wap_value_type = header_field_encodings[field_name] + try: + ret = getattr(Encoder, 'encode_%s' % wap_value_type)(value) + encoded_header.extend(ret) + except EncodeError as msg: + raise EncodeError('Error encoding Wap-value: %s' % msg) + except: + debug('A fatal error occurred, probably due to an ' + 'unimplemented encoding operation') + raise + else: + encoded_header.extend(Encoder.encode_text_string(value)) + + return encoded_header + + @staticmethod + def encode_content_type_value(media_type, parameters): + """ + Encodes a content type, and its parameters + + The short form of the Content-type-value MUST only be used when the + well-known media is in the range of 0-127 or a text string. In all + other cases the general form MUST be used. + + From [5], section 8.4.2.24:: + + Content-type-value = Constrained-media | Content-general-form + + :return: The encoded Content-type-value (including parameters, if + any), as a sequence of bytes + :rtype: list + """ + # First try do encode it using Constrained-media encoding + try: + if len(parameters): + raise EncodeError('Need to use ' + 'Content-general-form for parameters') + + return Encoder.encode_constrained_media(media_type) + except EncodeError: + # Try the general form + return Encoder.encode_content_general_form(media_type, parameters) + + @staticmethod + def encode_constrained_media(media_type): + """ + Encodes the constrained media ``media_type`` + + It is encoded using values from the "Content Type Assignments" table. + + From [5], section 8.4.2.7:: + + Constrained-media = Constrained-encoding + + :param media_type: The media type to encode + :type media_type: str + + :raise EncodeError: Media value is unsuitable for Constrained-encoding + + :return: The encoded media type, as a sequence of bytes + :rtype: list + """ + # See if this value is in the table of well-known content types + if media_type in well_known_content_types: + value = well_known_content_types.index(media_type) + else: + value = media_type + + return Encoder.encode_constrained_encoding(value) + + @staticmethod + def encode_constrained_encoding(value): + """ + Constrained-encoding = Extension-Media --or-- Short-integer + + This encoding is used for token values, which have no well-known + binary encoding, or when the assigned number of the well-known + encoding is small enough to fit into Short-integer. + + :param value: The value to encode + :type value: int or str + + :raise EncodeError: cannot be encoded as a + Constrained-encoding sequence + + :return: The encoded constrained-encoding token value, as a sequence + of bytes + :rtype: list + """ + encoded_value = None + if isinstance(value, int): + # First try and encode the value as a short-integer + encoded_value = Encoder.encode_short_integer(value) + else: + # Ok, it should be Extension-Media then + try: + encoded_value = Encoder.encode_extension_media(value) + except EncodeError: + # Give up + raise EncodeError('Cannot encode %s as a ' + 'Constrained-encoding sequence' % str(value)) + + return encoded_value + + @staticmethod + def encode_extension_media(media_value): + """ + Encodes the extension media ``media_value`` + + This encoding is used for media values, which have no well-known + binary encoding + + From [5], section 8.4.2.1:: + + Extension-media = *TEXT End-of-string + + :param media_value: The media value (string) to encode + :type media_value: str + + :raise EncodeError: The value cannot be encoded as TEXT; probably it + starts with/contains an invalid character + + :return: The encoded media type value, as a sequence of bytes + :rtype: str + """ + if not isinstance(media_value, str): + try: + media_value = str(media_value) + except: + raise EncodeError('Invalid Extension-media: Cannot convert ' + 'value to text string') + char = media_value[0] + if ord(char) < 32 or ord(char) == 127: + raise EncodeError('Invalid Extension-media: TEXT starts with ' + 'invalid character: %s' % ord(char)) + + return Encoder.encode_text_string(media_value) + + @staticmethod + def encode_content_general_form(media_type, parameters): + """ + From [5], section 8.4.2.24:: + + Content-general-form = Value-length Media-type + + Used in decoding Content-type fields and their parameters; + see :func:`decode_content_type_value`. Used by + :func:`decode_content_type_value`. + + :return: The encoded Content-general-form, as a sequence of bytes + :rtype: list + """ + enconded_content_general_form = [] + encoded_media_type = [] + # Encode the actual content type + encoded_media_type = Encoder.encode_media_type(media_type) + # Encode all parameters + encoded_parameters = [Encoder.encode_parameter(name, parameters[name]) + for name in parameters] + + value_length = len(encoded_media_type) + len(encoded_parameters) + encoded_value_length = Encoder.encode_value_length(value_length) + enconded_content_general_form.extend(encoded_value_length) + enconded_content_general_form.extend(encoded_media_type) + enconded_content_general_form.extend(encoded_parameters) + + return enconded_content_general_form + + @staticmethod + def encode_value_length(length): + """ + Encodes the specified length value as a value length indicator + + "Value length" is used to indicate the length of a value to follow, as + used in the `Content-Type` header in the MMS body, for example. + + The encoding for a value length indicator is specified in [5], + section 8.4.2.2, and follows the form:: + + Value-length = [Short-length] --or-- [Length-quote] [Length] + ^^^^^^ ^^^^^^ ^^^^^^ + 1 byte 1 byte x bytes + uint_var-integer + + :raise EncodeError: The value_length could not be encoded. + + :return: The encoded value length indicator, as a sequence of bytes + :rtype: list + """ + encoded_value_length = [] + # Try and encode it as a short-length + try: + encoded_value_length = Encoder.encode_short_length(length) + except EncodeError: + # Encode it with a Length-quote and uint_var + encoded_value_length.append(31) # Length-quote + encoded_value_length.extend(Encoder.encode_uint_var(length)) + + return encoded_value_length + + @staticmethod + def encode_short_length(length): + """ + From [5], section 8.4.2.2:: + + Short-length = + + :raise EncodeError: The specified cannot be encoded as a + short-length value; it is not in octet range 0-30. + + :return: The encoded short-length, as a sequence of bytes + :rtype: list + """ + if length < 0 or length > 30: + raise EncodeError('Cannot encode short-length; length should ' + 'be in the 0-30 range') + + return [length] + + @staticmethod + def encode_accept_value(accept_value): + """ + From [5], section 8.4.2.7:: + + Accept-value = Constrained-media | Accept-general-form + Accept-general-form = Value-length Media-range [Accept-parameters] + Media-range = (Well-known-media | Extension-Media) *(Parameter) + Accept-parameters = Q-token Q-value *(Accept-extension) + Accept-extension = Parameter + Q-token = + + :note: This implementation does not currently support encoding of + "Accept-parameters". + + :param accept_value: The Accept-value to encode (media/content type) + :type accept_value: str + + :raise EncodeError: The encoding failed. + + :return: The encoded Accept-value, as a sequence of bytes + :rtype: list + """ + encoded_accept_value = [] + # Try to use Constrained-media encoding + try: + encoded_accept_value = Encoder.encode_constrained_media(accept_value) + except EncodeError: + # ...now try Accept-general-form + try: + encoded_media_range = Encoder.encode_media_type(accept_value) + except EncodeError as msg: + raise EncodeError('Cannot encode Accept-value: %s' % msg) + + value_length = Encoder.encode_value_length(len(encoded_media_range)) + encoded_accept_value = value_length + encoded_accept_value.extend(encoded_media_range) + + return encoded_accept_value diff --git a/messaging/sms/__init__.py b/messaging/sms/__init__.py new file mode 100644 index 0000000..f00ad10 --- /dev/null +++ b/messaging/sms/__init__.py @@ -0,0 +1,7 @@ +# See LICENSE + +from messaging.sms.submit import SmsSubmit +from messaging.sms.deliver import SmsDeliver +from messaging.sms.gsm0338 import is_gsm_text + +__all__ = ["SmsSubmit", "SmsDeliver", "is_gsm_text"] diff --git a/messaging/sms/base.py b/messaging/sms/base.py new file mode 100644 index 0000000..b7b1d59 --- /dev/null +++ b/messaging/sms/base.py @@ -0,0 +1,14 @@ +# see LICENSE + + +class SmsBase(object): + + def __init__(self): + self.udh = None + self.number = None + self.text = None + self.fmt = None + self.dcs = None + self.pid = None + self.csca = None + self.type = None diff --git a/messaging/sms/consts.py b/messaging/sms/consts.py new file mode 100644 index 0000000..caf7806 --- /dev/null +++ b/messaging/sms/consts.py @@ -0,0 +1,17 @@ +# see LICENSE +SEVENBIT_SIZE = 160 +EIGHTBIT_SIZE = 140 +UCS2_SIZE = 70 +SEVENBIT_MP_SIZE = SEVENBIT_SIZE - 7 +EIGHTBIT_MP_SIZE = EIGHTBIT_SIZE - 6 +UCS2_MP_SIZE = UCS2_SIZE - 3 + +# address type +UNKNOWN = 0 +INTERNATIONAL = 1 +NATIONAL = 2 +NETWORK_SPECIFIC = 3 +SUBSCRIBER = 4 +ALPHANUMERIC = 5 +ABBREVIATED = 6 +RESERVED = 7 diff --git a/messaging/sms/deliver.py b/messaging/sms/deliver.py new file mode 100644 index 0000000..37714e6 --- /dev/null +++ b/messaging/sms/deliver.py @@ -0,0 +1,264 @@ +# see LICENSE +"""Classes for processing received SMS""" + +from datetime import datetime, timedelta + +from messaging.utils import (swap, swap_number, encode_bytes, debug, + unpack_msg, unpack_msg2, to_array) +from messaging.sms import consts +from messaging.sms.base import SmsBase +from messaging.sms.udh import UserDataHeader + + +class SmsDeliver(SmsBase): + """I am a delivered SMS in your Inbox""" + + def __init__(self, pdu, strict=True): + super(SmsDeliver, self).__init__() + self._pdu = None + self._strict = strict + self.date = None + self.mtype = None + self.sr = None + + self.pdu = pdu + + @property + def data(self): + """ + Returns a dict populated with the SMS attributes + + It mimics the old API to ease the port to the new API + """ + ret = { + 'text': self.text, + 'pid': self.pid, + 'dcs': self.dcs, + 'csca': self.csca, + 'number': self.number, + 'type': self.type, + 'date': self.date, + 'fmt': self.fmt, + 'sr': self.sr, + } + + if self.udh is not None: + if self.udh.concat is not None: + ret.update({ + 'ref': self.udh.concat.ref, + 'cnt': self.udh.concat.cnt, + 'seq': self.udh.concat.seq, + }) + + return ret + + def _set_pdu(self, pdu): + if not self._strict and len(pdu) % 2: + # if not strict and PDU-length is odd, remove the last character + # and make it even. See the discussion of this bug at + # http://github.com/pmarti/python-messaging/issues#issue/7 + pdu = pdu[:-1] + + if len(pdu) % 2: + raise ValueError("Can not decode an odd-length pdu") + + # XXX: Should we keep the original PDU or the modified one? + self._pdu = pdu + + data = to_array(self._pdu) + + # Service centre address + smscl = data.pop(0) + if smscl > 0: + smscertype = data.pop(0) + smscl -= 1 + self.csca = swap_number(encode_bytes(data[:smscl])) + if (smscertype >> 4) & 0x07 == consts.INTERNATIONAL: + self.csca = '+%s' % self.csca + data = data[smscl:] + else: + self.csca = None + + # 1 byte(octet) == 2 char + # Message type TP-MTI bits 0,1 + # More messages to send/deliver bit 2 + # Status report request indicated bit 5 + # User Data Header Indicator bit 6 + # Reply path set bit 7 + try: + self.mtype = data.pop(0) + except TypeError: + raise ValueError("Decoding this type of SMS is not supported yet") + + mtype = self.mtype & 0x03 + + if mtype == 0x02: + return self._decode_status_report_pdu(data) + + if mtype == 0x01: + raise ValueError("Cannot decode a SmsSubmitReport message yet") + + sndlen = data.pop(0) + if sndlen % 2: + sndlen += 1 + sndlen = int(sndlen / 2.0) + + sndtype = (data.pop(0) >> 4) & 0x07 + if sndtype == consts.ALPHANUMERIC: + # coded according to 3GPP TS 23.038 [9] GSM 7-bit default alphabet + sender = unpack_msg2(data[:sndlen]).decode("gsm0338") + else: + # Extract phone number of sender + sender = swap_number(encode_bytes(data[:sndlen])) + if sndtype == consts.INTERNATIONAL: + sender = '+%s' % sender + + self.number = sender + data = data[sndlen:] + + # 1 byte TP-PID (Protocol IDentifier) + self.pid = data.pop(0) + # 1 byte TP-DCS (Data Coding Scheme) + self.dcs = data.pop(0) + if self.dcs & (0x04 | 0x08) == 0: + self.fmt = 0x00 + elif self.dcs & 0x04: + self.fmt = 0x04 + elif self.dcs & 0x08: + self.fmt = 0x08 + + datestr = '' + # Get date stamp (sender's local time) + date = list(encode_bytes(data[:6])) + for n in range(1, len(date), 2): + date[n - 1], date[n] = date[n], date[n - 1] + + data = data[6:] + + # Get sender's offset from GMT (TS 23.040 TP-SCTS) + tz = data.pop(0) + + offset = ((tz & 0x07) * 10 + ((tz & 0xf0) >> 4)) * 15 + if (tz & 0x08): + offset = offset * -1 + + # 02/08/26 19:37:41 + datestr = "%s%s/%s%s/%s%s %s%s:%s%s:%s%s" % tuple(date) + outputfmt = '%y/%m/%d %H:%M:%S' + + sndlocaltime = datetime.strptime(datestr, outputfmt) + sndoffset = timedelta(minutes=offset) + # date as UTC + self.date = sndlocaltime - sndoffset + + self._process_message(data) + + def _process_message(self, data): + # Now get message body + msgl = data.pop(0) + msg = encode_bytes(data[:msgl]) + # check for header + headlen = ud_len = 0 + + if self.mtype & 0x40: # UDHI present + ud_len = data.pop(0) + self.udh = UserDataHeader.from_bytes(data[:ud_len]) + headlen = (ud_len + 1) * 8 + if self.fmt == 0x00: + while headlen % 7: + headlen += 1 + headlen /= 7 + + headlen = int(headlen) + + if self.fmt == 0x00: + # XXX: Use unpack_msg2 + data = data[ud_len:].tolist() + #self.text = unpack_msg2(data).decode("gsm0338") + self.text = unpack_msg(msg)[headlen:msgl].decode("gsm0338") + + elif self.fmt == 0x04: + self.text = data[ud_len:].tostring() + + elif self.fmt == 0x08: + data = data[ud_len:].tolist() + _bytes = [int("%02X%02X" % (data[i], data[i + 1]), 16) + for i in range(0, len(data), 2)] + self.text = ''.join(list(map(chr, _bytes))) + + pdu = property(lambda self: self._pdu, _set_pdu) + + def _decode_status_report_pdu(self, data): + self.udh = UserDataHeader.from_status_report_ref(data.pop(0)) + + sndlen = data.pop(0) + if sndlen % 2: + sndlen += 1 + sndlen = int(sndlen / 2.0) + + sndtype = data.pop(0) + recipient = swap_number(encode_bytes(data[:sndlen])) + if (sndtype >> 4) & 0x07 == consts.INTERNATIONAL: + recipient = '+%s' % recipient + + data = data[sndlen:] + + date = swap(list(encode_bytes(data[:7]))) + try: + scts_str = "%s%s/%s%s/%s%s %s%s:%s%s:%s%s" % tuple(date[0:12]) + self.date = datetime.strptime(scts_str, "%y/%m/%d %H:%M:%S") + except (ValueError, TypeError): + scts_str = '' + debug('Could not decode scts: %s' % date) + + data = data[7:] + + date = swap(list(encode_bytes(data[:7]))) + try: + dt_str = "%s%s/%s%s/%s%s %s%s:%s%s:%s%s" % tuple(date[0:12]) + dt = datetime.strptime(dt_str, "%y/%m/%d %H:%M:%S") + except (ValueError, TypeError): + dt_str = '' + dt = None + debug('Could not decode date: %s' % date) + + data = data[7:] + + msg_l = [recipient, scts_str] + try: + status = data.pop(0) + except IndexError: + # Yes it is entirely possible that a status report comes + # with no status at all! I'm faking for now the values and + # set it to SR-UNKNOWN as that's all we can do + _status = None + status = 0x1 + sender = 'SR-UNKNOWN' + msg_l.append(dt_str) + else: + _status = status + if status == 0x00: + msg_l.append(dt_str) + else: + msg_l.append('') + if status == 0x00: + sender = "SR-OK" + elif status == 0x1: + sender = "SR-UNKNOWN" + elif status == 0x30: + sender = "SR-STORED" + else: + sender = "SR-UNKNOWN" + + self.number = sender + self.text = "|".join(msg_l) + self.fmt = 0x08 # UCS2 + self.type = 0x03 # status report + + self.sr = { + 'recipient': recipient, + 'scts': self.date, + 'dt': dt, + 'status': _status + } + diff --git a/messaging/sms/gsm0338.py b/messaging/sms/gsm0338.py new file mode 100644 index 0000000..10e4ae7 --- /dev/null +++ b/messaging/sms/gsm0338.py @@ -0,0 +1,292 @@ +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +import codecs +import sys +import traceback + +# data from +# http://snoops.roy202.org/testerman/browser/trunk/plugins/codecs/gsm0338.py + +# default GSM 03.38 -> unicode +def_regular_decode_dict = { + '\x00': u'\u0040', # COMMERCIAL AT + '\x01': u'\u00A3', # POUND SIGN + '\x02': u'\u0024', # DOLLAR SIGN + '\x03': u'\u00A5', # YEN SIGN + '\x04': u'\u00E8', # LATIN SMALL LETTER E WITH GRAVE + '\x05': u'\u00E9', # LATIN SMALL LETTER E WITH ACUTE + '\x06': u'\u00F9', # LATIN SMALL LETTER U WITH GRAVE + '\x07': u'\u00EC', # LATIN SMALL LETTER I WITH GRAVE + '\x08': u'\u00F2', # LATIN SMALL LETTER O WITH GRAVE + '\x09': u'\u00C7', # LATIN CAPITAL LETTER C WITH CEDILLA + # The Unicode page suggests this is a mistake: but + # it's still in the latest version of the spec and + # our implementation has to be exact. + + '\x0A': u'\u000A', # LINE FEED + '\x0B': u'\u00D8', # LATIN CAPITAL LETTER O WITH STROKE + '\x0C': u'\u00F8', # LATIN SMALL LETTER O WITH STROKE + '\x0D': u'\u000D', # CARRIAGE RETURN + '\x0E': u'\u00C5', # LATIN CAPITAL LETTER A WITH RING ABOVE + '\x0F': u'\u00E5', # LATIN SMALL LETTER A WITH RING ABOVE + '\x10': u'\u0394', # GREEK CAPITAL LETTER DELTA + '\x11': u'\u005F', # LOW LINE + '\x12': u'\u03A6', # GREEK CAPITAL LETTER PHI + '\x13': u'\u0393', # GREEK CAPITAL LETTER GAMMA + '\x14': u'\u039B', # GREEK CAPITAL LETTER LAMDA + '\x15': u'\u03A9', # GREEK CAPITAL LETTER OMEGA + '\x16': u'\u03A0', # GREEK CAPITAL LETTER PI + '\x17': u'\u03A8', # GREEK CAPITAL LETTER PSI + '\x18': u'\u03A3', # GREEK CAPITAL LETTER SIGMA + '\x19': u'\u0398', # GREEK CAPITAL LETTER THETA + '\x1A': u'\u039E', # GREEK CAPITAL LETTER XI + '\x1C': u'\u00C6', # LATIN CAPITAL LETTER AE + '\x1D': u'\u00E6', # LATIN SMALL LETTER AE + '\x1E': u'\u00DF', # LATIN SMALL LETTER SHARP S (German) + '\x1F': u'\u00C9', # LATIN CAPITAL LETTER E WITH ACUTE + '\x20': u'\u0020', # SPACE + '\x21': u'\u0021', # EXCLAMATION MARK + '\x22': u'\u0022', # QUOTATION MARK + '\x23': u'\u0023', # NUMBER SIGN + '\x24': u'\u00A4', # CURRENCY SIGN + '\x25': u'\u0025', # PERCENT SIGN + '\x26': u'\u0026', # AMPERSAND + '\x27': u'\u0027', # APOSTROPHE + '\x28': u'\u0028', # LEFT PARENTHESIS + '\x29': u'\u0029', # RIGHT PARENTHESIS + '\x2A': u'\u002A', # ASTERISK + '\x2B': u'\u002B', # PLUS SIGN + '\x2C': u'\u002C', # COMMA + '\x2D': u'\u002D', # HYPHEN-MINUS + '\x2E': u'\u002E', # FULL STOP + '\x2F': u'\u002F', # SOLIDUS + '\x30': u'\u0030', # DIGIT ZERO + '\x31': u'\u0031', # DIGIT ONE + '\x32': u'\u0032', # DIGIT TWO + '\x33': u'\u0033', # DIGIT THREE + '\x34': u'\u0034', # DIGIT FOUR + '\x35': u'\u0035', # DIGIT FIVE + '\x36': u'\u0036', # DIGIT SIX + '\x37': u'\u0037', # DIGIT SEVEN + '\x38': u'\u0038', # DIGIT EIGHT + '\x39': u'\u0039', # DIGIT NINE + '\x3A': u'\u003A', # COLON + '\x3B': u'\u003B', # SEMICOLON + '\x3C': u'\u003C', # LESS-THAN SIGN + '\x3D': u'\u003D', # EQUALS SIGN + '\x3E': u'\u003E', # GREATER-THAN SIGN + '\x3F': u'\u003F', # QUESTION MARK + '\x40': u'\u00A1', # INVERTED EXCLAMATION MARK + '\x41': u'\u0041', # LATIN CAPITAL LETTER A + '\x42': u'\u0042', # LATIN CAPITAL LETTER B + '\x43': u'\u0043', # LATIN CAPITAL LETTER C + '\x44': u'\u0044', # LATIN CAPITAL LETTER D + '\x45': u'\u0045', # LATIN CAPITAL LETTER E + '\x46': u'\u0046', # LATIN CAPITAL LETTER F + '\x47': u'\u0047', # LATIN CAPITAL LETTER G + '\x48': u'\u0048', # LATIN CAPITAL LETTER H + '\x49': u'\u0049', # LATIN CAPITAL LETTER I + '\x4A': u'\u004A', # LATIN CAPITAL LETTER J + '\x4B': u'\u004B', # LATIN CAPITAL LETTER K + '\x4C': u'\u004C', # LATIN CAPITAL LETTER L + '\x4D': u'\u004D', # LATIN CAPITAL LETTER M + '\x4E': u'\u004E', # LATIN CAPITAL LETTER N + '\x4F': u'\u004F', # LATIN CAPITAL LETTER O + '\x50': u'\u0050', # LATIN CAPITAL LETTER P + '\x51': u'\u0051', # LATIN CAPITAL LETTER Q + '\x52': u'\u0052', # LATIN CAPITAL LETTER R + '\x53': u'\u0053', # LATIN CAPITAL LETTER S + '\x54': u'\u0054', # LATIN CAPITAL LETTER T + '\x55': u'\u0055', # LATIN CAPITAL LETTER U + '\x56': u'\u0056', # LATIN CAPITAL LETTER V + '\x57': u'\u0057', # LATIN CAPITAL LETTER W + '\x58': u'\u0058', # LATIN CAPITAL LETTER X + '\x59': u'\u0059', # LATIN CAPITAL LETTER Y + '\x5A': u'\u005A', # LATIN CAPITAL LETTER Z + '\x5B': u'\u00C4', # LATIN CAPITAL LETTER A WITH DIAERESIS + '\x5C': u'\u00D6', # LATIN CAPITAL LETTER O WITH DIAERESIS + '\x5D': u'\u00D1', # LATIN CAPITAL LETTER N WITH TILDE + '\x5E': u'\u00DC', # LATIN CAPITAL LETTER U WITH DIAERESIS + '\x5F': u'\u00A7', # SECTION SIGN + '\x60': u'\u00BF', # INVERTED QUESTION MARK + '\x61': u'\u0061', # LATIN SMALL LETTER A + '\x62': u'\u0062', # LATIN SMALL LETTER B + '\x63': u'\u0063', # LATIN SMALL LETTER C + '\x64': u'\u0064', # LATIN SMALL LETTER D + '\x65': u'\u0065', # LATIN SMALL LETTER E + '\x66': u'\u0066', # LATIN SMALL LETTER F + '\x67': u'\u0067', # LATIN SMALL LETTER G + '\x68': u'\u0068', # LATIN SMALL LETTER H + '\x69': u'\u0069', # LATIN SMALL LETTER I + '\x6A': u'\u006A', # LATIN SMALL LETTER J + '\x6B': u'\u006B', # LATIN SMALL LETTER K + '\x6C': u'\u006C', # LATIN SMALL LETTER L + '\x6D': u'\u006D', # LATIN SMALL LETTER M + '\x6E': u'\u006E', # LATIN SMALL LETTER N + '\x6F': u'\u006F', # LATIN SMALL LETTER O + '\x70': u'\u0070', # LATIN SMALL LETTER P + '\x71': u'\u0071', # LATIN SMALL LETTER Q + '\x72': u'\u0072', # LATIN SMALL LETTER R + '\x73': u'\u0073', # LATIN SMALL LETTER S + '\x74': u'\u0074', # LATIN SMALL LETTER T + '\x75': u'\u0075', # LATIN SMALL LETTER U + '\x76': u'\u0076', # LATIN SMALL LETTER V + '\x77': u'\u0077', # LATIN SMALL LETTER W + '\x78': u'\u0078', # LATIN SMALL LETTER X + '\x79': u'\u0079', # LATIN SMALL LETTER Y + '\x7A': u'\u007A', # LATIN SMALL LETTER Z + '\x7B': u'\u00E4', # LATIN SMALL LETTER A WITH DIAERESIS + '\x7C': u'\u00F6', # LATIN SMALL LETTER O WITH DIAERESIS + '\x7D': u'\u00F1', # LATIN SMALL LETTER N WITH TILDE + '\x7E': u'\u00FC', # LATIN SMALL LETTER U WITH DIAERESIS + '\x7F': u'\u00E0', # LATIN SMALL LETTER A WITH GRAVE +} + +# default GSM 03.38 escaped characters -> unicode +def_escape_decode_dict = { + '\x0A': u'\u000C', # FORM FEED + '\x14': u'\u005E', # CIRCUMFLEX ACCENT + '\x28': u'\u007B', # LEFT CURLY BRACKET + '\x29': u'\u007D', # RIGHT CURLY BRACKET + '\x2F': u'\u005C', # REVERSE SOLIDUS + '\x3C': u'\u005B', # LEFT SQUARE BRACKET + '\x3D': u'\u007E', # TILDE + '\x3E': u'\u005D', # RIGHT SQUARE BRACKET + '\x40': u'\u007C', # VERTICAL LINE + '\x65': u'\u20AC', # EURO SIGN +} + +# Replacement characters, default is question mark. Used when it is not too +# important to ensure exact UTF-8 -> GSM -> UTF-8 equivilence, such as when +# humans read and write SMS. But for USSD and other M2M applications it's +# important to ensure the conversion is exact. +def_replace_encode_dict = { + u'\u00E7': '\x09', # LATIN SMALL LETTER C WITH CEDILLA + + u'\u0391': '\x41', # GREEK CAPITAL LETTER ALPHA + u'\u0392': '\x42', # GREEK CAPITAL LETTER BETA + u'\u0395': '\x45', # GREEK CAPITAL LETTER EPSILON + u'\u0397': '\x48', # GREEK CAPITAL LETTER ETA + u'\u0399': '\x49', # GREEK CAPITAL LETTER IOTA + u'\u039A': '\x4B', # GREEK CAPITAL LETTER KAPPA + u'\u039C': '\x4D', # GREEK CAPITAL LETTER MU + u'\u039D': '\x4E', # GREEK CAPITAL LETTER NU + u'\u039F': '\x4F', # GREEK CAPITAL LETTER OMICRON + u'\u03A1': '\x50', # GREEK CAPITAL LETTER RHO + u'\u03A4': '\x54', # GREEK CAPITAL LETTER TAU + u'\u03A7': '\x58', # GREEK CAPITAL LETTER CHI + u'\u03A5': '\x59', # GREEK CAPITAL LETTER UPSILON + u'\u0396': '\x5A', # GREEK CAPITAL LETTER ZETA +} + +QUESTION_MARK = chr(0x3f) + +# unicode -> default GSM 03.38 +def_regular_encode_dict = \ + dict((u, g) for g, u in iter(def_regular_decode_dict.items())) + +# unicode -> default escaped GSM 03.38 characters +def_escape_encode_dict = \ + dict((u, g) for g, u in iter(def_escape_decode_dict.items())) + + +def encode(input_, errors='strict'): + """ + :type input_: unicode + + :return: string + """ + result = [] + for c in input_: + try: + result.append(def_regular_encode_dict[c]) + except KeyError: + if c in def_escape_encode_dict: + # OK, let's encode it as an escaped characters + result.append('\x1b') + result.append(def_escape_encode_dict[c]) + else: + if errors == 'strict': + raise UnicodeError("Invalid GSM character") + elif errors == 'replace': + result.append( + def_replace_encode_dict.get(c, QUESTION_MARK)) + elif errors == 'ignore': + pass + else: + raise UnicodeError("Unknown error handling") + + ret = ''.join(result) + return ret, len(ret) + + +def decode(input_, errors='strict'): + """ + :type input_: str + + :return: unicode + """ + result = [] + index = 0 + while index < len(input_): + c = input_[index] + index += 1 + if c == '\x1b': + if index < len(input_): + c = input_[index] + index += 1 + result.append(def_escape_decode_dict.get(c, u'\xa0')) + else: + result.append(u'\xa0') + else: + try: + result.append(def_regular_decode_dict[c]) + except KeyError: + # error handling: unassigned byte, must be > 0x7f + if errors == 'strict': + raise UnicodeError("Unrecognized GSM character") + elif errors == 'replace': + result.append('?') + elif errors == 'ignore': + pass + else: + raise UnicodeError("Unknown error handling") + + ret = u''.join(result) + return ret, len(ret) + + +# encodings module API +def getregentry(encoding): + if encoding == 'gsm0338': + return codecs.CodecInfo(name='gsm0338', + encode=encode, + decode=decode) + +# Codec registration +codecs.register(getregentry) + + +def is_gsm_text(text): + """Returns True if ``text`` can be encoded as gsm text""" + try: + text.encode("gsm0338") + except UnicodeError: + return False + except: + traceback.print_exc(file=sys.stdout) + return False + + return True diff --git a/messaging/sms/pdu.py b/messaging/sms/pdu.py new file mode 100644 index 0000000..9d680d5 --- /dev/null +++ b/messaging/sms/pdu.py @@ -0,0 +1,10 @@ +# see LICENSE + + +class Pdu(object): + + def __init__(self, pdu, len_smsc, cnt=1, seq=1): + self.pdu = pdu.upper() + self.length = len(pdu) / 2 - len_smsc + self.cnt = cnt + self.seq = seq diff --git a/messaging/sms/submit.py b/messaging/sms/submit.py new file mode 100644 index 0000000..f0e9941 --- /dev/null +++ b/messaging/sms/submit.py @@ -0,0 +1,330 @@ +# See LICENSE +"""Classes for sending SMS""" + +from datetime import datetime, timedelta +import re + +from messaging.sms import consts +from messaging.utils import (debug, encode_str, clean_number, + pack_8bits_to_ucs2, pack_8bits_to_7bits, + pack_8bits_to_8bit, + timedelta_to_relative_validity, + datetime_to_absolute_validity) +from messaging.sms.base import SmsBase +from messaging.sms.gsm0338 import is_gsm_text +from messaging.sms.pdu import Pdu + +VALID_NUMBER = re.compile("^\+?\d{3,20}$") + + +class SmsSubmit(SmsBase): + """I am a SMS ready to be sent""" + + def __init__(self, number, text): + super(SmsSubmit, self).__init__() + self._number = None + self._csca = None + self._klass = None + self._validity = None + self.request_status = False + self.ref = None + self.rand_id = None + self.id_list = range(0, 255) + self.msgvp = 0xaa + self.pid = 0x00 + + self.number = number + self.text = text + self.text_gsm = None + + def _set_number(self, number): + if number and not VALID_NUMBER.match(number): + raise ValueError("Invalid number format: %s" % number) + + self._number = number + + number = property(lambda self: self._number, _set_number) + + def _set_csca(self, csca): + if csca and not VALID_NUMBER.match(csca): + raise ValueError("Invalid csca format: %s" % csca) + + self._csca = csca + + csca = property(lambda self: self._csca, _set_csca) + + def _set_validity(self, validity): + if validity is None or isinstance(validity, (timedelta, datetime)): + # valid values are None, timedelta and datetime + self._validity = validity + else: + raise TypeError("Don't know what to do with %s" % validity) + + validity = property(lambda self: self._validity, _set_validity) + + def _set_klass(self, klass): + if not isinstance(klass, int): + raise TypeError("_set_klass only accepts int objects") + + if klass not in [0, 1, 2, 3]: + raise ValueError("class must be between 0 and 3") + + self._klass = klass + + klass = property(lambda self: self._klass, _set_klass) + + def to_pdu(self): + """Returns a list of :class:`~messaging.pdu.Pdu` objects""" + smsc_pdu = self._get_smsc_pdu() + sms_submit_pdu = self._get_sms_submit_pdu() + tpmessref_pdu = self._get_tpmessref_pdu() + sms_phone_pdu = self._get_phone_pdu() + tppid_pdu = self._get_tppid_pdu() + sms_msg_pdu = self._get_msg_pdu() + + if len(sms_msg_pdu) == 1: + pdu = smsc_pdu + len_smsc = len(smsc_pdu) / 2 + pdu += sms_submit_pdu + pdu += tpmessref_pdu + pdu += sms_phone_pdu + pdu += tppid_pdu + pdu += sms_msg_pdu[0] + debug("smsc_pdu: %s" % smsc_pdu) + debug("sms_submit_pdu: %s" % sms_submit_pdu) + debug("tpmessref_pdu: %s" % tpmessref_pdu) + debug("sms_phone_pdu: %s" % sms_phone_pdu) + debug("tppid_pdu: %s" % tppid_pdu) + debug("sms_msg_pdu: %s" % sms_msg_pdu) + debug("-" * 20) + debug("full_pdu: %s" % pdu) + debug("full_text: %s" % self.text) + debug("-" * 20) + return [Pdu(pdu, len_smsc)] + + # multipart SMS + sms_submit_pdu = self._get_sms_submit_pdu(udh=True) + pdu_list = [] + cnt = len(sms_msg_pdu) + for i, sms_msg_pdu_item in enumerate(sms_msg_pdu): + pdu = smsc_pdu + len_smsc = len(smsc_pdu) / 2 + pdu += sms_submit_pdu + pdu += tpmessref_pdu + pdu += sms_phone_pdu + pdu += tppid_pdu + pdu += sms_msg_pdu_item + debug("smsc_pdu: %s" % smsc_pdu) + debug("sms_submit_pdu: %s" % sms_submit_pdu) + debug("tpmessref_pdu: %s" % tpmessref_pdu) + debug("sms_phone_pdu: %s" % sms_phone_pdu) + debug("tppid_pdu: %s" % tppid_pdu) + debug("sms_msg_pdu: %s" % sms_msg_pdu_item) + debug("-" * 20) + debug("full_pdu: %s" % pdu) + debug("full_text: %s" % self.text) + debug("-" * 20) + + pdu_list.append(Pdu(pdu, len_smsc, cnt=cnt, seq=i + 1)) + + return pdu_list + + def _get_smsc_pdu(self): + if not self.csca or not self.csca.strip(): + return "00" + + number = clean_number(self.csca) + ptype = 0x81 # set to unknown number by default + if number[0] == '+': + number = number[1:] + ptype = 0x91 + + if len(number) % 2: + number += 'F' + + ps = chr(ptype) + for n in range(0, len(number), 2): + num = number[n + 1] + number[n] + ps += chr(int(num, 16)) + + pl = len(ps) + ps = chr(pl) + ps + + return encode_str(ps) + + def _get_tpmessref_pdu(self): + if self.ref is None: + self.ref = self._get_rand_id() + + self.ref &= 0xFF + return encode_str(chr(self.ref)) + + def _get_phone_pdu(self): + number = clean_number(self.number) + ptype = 0x81 + if number[0] == '+': + number = number[1:] + ptype = 0x91 + + pl = len(number) + if len(number) % 2: + number += 'F' + + ps = chr(ptype) + for n in range(0, len(number), 2): + num = number[n + 1] + number[n] + ps += chr(int(num, 16)) + + ps = chr(pl) + ps + return encode_str(ps) + + def _get_tppid_pdu(self): + return encode_str(chr(self.pid)) + + def _get_sms_submit_pdu(self, udh=False): + sms_submit = 0x1 + if self.validity is None: + # handle no validity + pass + elif isinstance(self.validity, datetime): + # handle absolute validity + sms_submit |= 0x18 + elif isinstance(self.validity, timedelta): + # handle relative validity + sms_submit |= 0x10 + + if self.request_status: + sms_submit |= 0x20 + + if udh: + sms_submit |= 0x40 + + return encode_str(chr(sms_submit)) + + def _get_msg_pdu(self): + # Data coding scheme + if self.fmt is None: + if is_gsm_text(self.text): + self.fmt = 0x00 + else: + self.fmt = 0x08 + + self.dcs = self.fmt + + if self.klass is not None: + if self.klass == 0: + self.dcs |= 0x10 + elif self.klass == 1: + self.dcs |= 0x11 + elif self.klass == 2: + self.dcs |= 0x12 + elif self.klass == 3: + self.dcs |= 0x13 + + dcs_pdu = encode_str(chr(self.dcs)) + + # Validity period + msgvp_pdu = "" + if self.validity is None: + # handle no validity + pass + + elif isinstance(self.validity, timedelta): + # handle relative + msgvp = timedelta_to_relative_validity(self.validity) + msgvp_pdu = encode_str(chr(msgvp)) + + elif isinstance(self.validity, datetime): + # handle absolute + msgvp = datetime_to_absolute_validity(self.validity) + msgvp_pdu = ''.join(map(encode_str, map(chr, msgvp))) + + # UDL + UD + message_pdu = "" + + if self.fmt == 0x00: + self.text_gsm = self.text.encode("gsm0338") + if len(self.text_gsm) <= consts.SEVENBIT_SIZE: + message_pdu = [pack_8bits_to_7bits(self.text_gsm)] + else: + message_pdu = self._split_sms_message(self.text_gsm) + elif self.fmt == 0x04: + if len(self.text) <= consts.EIGHTBIT_SIZE: + message_pdu = [pack_8bits_to_8bit(self.text)] + else: + message_pdu = self._split_sms_message(self.text) + elif self.fmt == 0x08: + if len(self.text) <= consts.UCS2_SIZE: + message_pdu = [pack_8bits_to_ucs2(self.text)] + else: + message_pdu = self._split_sms_message(self.text) + else: + raise ValueError("Unknown data coding scheme: %d" % self.fmt) + + ret = [] + for msg in message_pdu: + ret.append(dcs_pdu + msgvp_pdu + msg) + + return ret + + def _split_sms_message(self, text): + if self.fmt == 0x00: + len_without_udh = consts.SEVENBIT_MP_SIZE + limit = consts.SEVENBIT_SIZE + packing_func = pack_8bits_to_7bits + total_len = len(self.text_gsm) + + elif self.fmt == 0x04: + len_without_udh = consts.EIGHTBIT_MP_SIZE + limit = consts.EIGHTBIT_SIZE + packing_func = pack_8bits_to_8bit + total_len = len(self.text) + + elif self.fmt == 0x08: + len_without_udh = consts.UCS2_MP_SIZE + limit = consts.UCS2_SIZE + packing_func = pack_8bits_to_ucs2 + total_len = len(self.text) + + msgs = [] + pi, pe = 0, len_without_udh + + while pi < total_len: + if text[pi:pe][-1] == '\x1b': + pe -= 1 + + msgs.append(text[pi:pe]) + pi = pe + pe += len_without_udh + + pdu_msgs = [] + + udh_len = 0x05 + mid = 0x00 + data_len = 0x03 + + sms_ref = self._get_rand_id() if self.rand_id is None else self.rand_id + sms_ref &= 0xFF + + for i, msg in enumerate(msgs): + i += 1 + total_parts = len(msgs) + if limit == consts.SEVENBIT_SIZE: + udh = (chr(udh_len) + chr(mid) + chr(data_len) + + chr(sms_ref) + chr(total_parts) + chr(i)) + padding = " " + else: + udh = (unichr(int("%04x" % ((udh_len << 8) | mid), 16)) + + unichr(int("%04x" % ((data_len << 8) | sms_ref), 16)) + + unichr(int("%04x" % ((total_parts << 8) | i), 16))) + padding = "" + + pdu_msgs.append(packing_func(padding + msg, udh)) + + return pdu_msgs + + def _get_rand_id(self): + if not self.id_list: + self.id_list = range(0, 255) + + return list(self.id_list).pop(0) diff --git a/messaging/sms/udh.py b/messaging/sms/udh.py new file mode 100644 index 0000000..eecfa23 --- /dev/null +++ b/messaging/sms/udh.py @@ -0,0 +1,79 @@ +# See LICENSE + + +class PortAddress(object): + + def __init__(self, dest_port, orig_port, eight_bits): + self.dest_port = dest_port + self.orig_port = orig_port + self.eight_bits = eight_bits + + def __repr__(self): + args = (self.dest_port, self.orig_port) + return "" % args + + +class ConcatReference(object): + + def __init__(self, ref, cnt, seq, eight_bits): + self.ref = ref + self.cnt = cnt + self.seq = seq + self.eight_bits = eight_bits + + def __repr__(self): + args = (self.ref, self.cnt, self.seq) + return "" % args + + +class UserDataHeader(object): + + def __init__(self): + self.concat = None + self.ports = None + self.headers = {} + + def __repr__(self): + args = (self.headers, self.concat, self.ports) + return "" % args + + @classmethod + def from_status_report_ref(cls, ref): + udh = cls() + udh.concat = ConcatReference(ref, 0, 0, True) + return udh + + @classmethod + def from_bytes(cls, data): + udh = cls() + while len(data): + iei = data.pop(0) + ie_len = data.pop(0) + ie_data = data[:ie_len] + data = data[ie_len:] + udh.headers[iei] = ie_data + + if iei == 0x00: + # process SM concatenation 8bit ref. + ref, cnt, seq = ie_data + udh.concat = ConcatReference(ref, cnt, seq, True) + + if iei == 0x08: + # process SM concatenation 16bit ref. + ref = ie_data[0] << 8 | ie_data[1] + cnt = ie_data[2] + seq = ie_data[3] + udh.concat = ConcatReference(ref, cnt, seq, False) + + elif iei == 0x04: + # process App port addressing 8bit + dest_port, orig_port = ie_data + udh.ports = PortAddress(dest_port, orig_port, False) + + elif iei == 0x05: + # process App port addressing 16bit + dest_port = ie_data[0] << 8 | ie_data[1] + orig_port = ie_data[2] << 8 | ie_data[3] + udh.ports = PortAddress(dest_port, orig_port, False) + + return udh diff --git a/messaging/sms/wap.py b/messaging/sms/wap.py new file mode 100644 index 0000000..46611ab --- /dev/null +++ b/messaging/sms/wap.py @@ -0,0 +1,38 @@ +# See LICENSE + +from array import array + +from messaging.mms.mms_pdu import MMSDecoder + + +def is_a_wap_push_notification(s): + if not isinstance(s, str): + raise TypeError("data must be an array.array serialised to string") + + data = array("B", s) + + try: + return data[1] == 0x06 + except IndexError: + return False + + +def extract_push_notification(s): + data = array("B", s) + + wap_push, offset = data[1:3] + assert wap_push == 0x06 + + offset += 3 + data = data[offset:] + + # XXX: Not all WAP pushes are MMS + return MMSDecoder().decode_data(data) + + +def is_mms_notification(push): + # XXX: Pretty poor, but until we decode generic WAP pushes + # it will have to suffice. Ideally we would read the + # content-type from the WAP push header and test + return (push.headers.get('From') is not None and + push.headers.get('Content-Location') is not None) diff --git a/messaging/test/__init__.py b/messaging/test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/messaging/test/mms-data/27d0a048cd79555de05283a22372b0eb.mms b/messaging/test/mms-data/27d0a048cd79555de05283a22372b0eb.mms new file mode 100644 index 0000000000000000000000000000000000000000..574825bf25c8a4414be7e85617452d4cc528b64b GIT binary patch literal 758 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Ν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%0DD-?9 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 literal 0 HcmV?d00001 diff --git a/messaging/test/mms-data/m.mms b/messaging/test/mms-data/m.mms new file mode 100644 index 0000000000000000000000000000000000000000..2b7fa273da6807070f8b8dcc9be48dbb54a1c1b7 GIT binary patch literal 27807 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 Z2m!MTk(Fhq`@cW<-&tBT|D84V{{Yn(A%_3} literal 0 HcmV?d00001 diff --git a/messaging/test/mms-data/openwave.mms b/messaging/test/mms-data/openwave.mms new file mode 100644 index 0000000000000000000000000000000000000000..d99d4b677c1dc2da36f94db8e7e9247b666e8f5b GIT binary patch literal 542 zcmah`%Sr<=6b&v!`UNgjLconul4+S*B{Mr0f=U5S3C8b*P<*DOV8@B1RXsNeYo@P5@0HSJC>4B$6OpFa`z3R->Xk z;kgmB zjb@}nPZ1)R7BJ0Yn#DAsXu@&=MKfR{nx|+1TtpLwV=0;k19Jk{U{D;-as+V#<`|$+ z9D`^9aXiEEnByUeAW8^D2quIfge8P0L?8kpEaEVbDZ)~aPFS}l!ESxRQ$%1113G}a z3lRpS7+?~C2b@rd#)xAvVW0{yDT1K`ieniFaSR3<3<7N-#34je;8Gk09Oeleie@1T zCdm^)AS??Z8UY6r1T=;)EZ7{vgo2_x!3>94f*67Tq-Y9qdBO`29aG z!Ao1~j$GR5^On}BsjqA<7(XNBc5A(>rC2;Ce*$he+O{Vsfm_6c31TRbMQi~{^ik@h+?pqz!PRw@SEiKyyBdo- z$E(Ms3|-RQ6(3nI8ST%@@Ad?jYI<8__jWHT*EMCB1H6WJd@^QJgx)VlcG_I&HSK_N zm0|nydbV_F!l=ZGg^y2Y_GK!rO)dy7i&ZV(TwSM$$)9tfIdEo~*fx^ND?$6?wfcLV zV>+TI7TCsBUR;sm?>l^~zE~HmC zTdU%ANju^L>ngp13by#>AKj~3-!j#)e4}-NRkJ5AM6X->$m4qaJ#X($&+s-$GZ(C_ zt#mwC7I1y_=Lv7qrtoh^iQ;#Ap6=2(_Dw2~jcDiCCtkPS%=KY$Q_7P@YiV)pnr}Vw zTF+=F6@48OGVyuQqrNp?>TSo*4tpG}_TO6*?p1%f^tSWwJpq3i(a^T_bJtnFnl;ka zBA++3^*s+_Q$IQK(XB-duEvzR=lidh`%M);IuqP{*k{d*bK8HGmpA8Hp5%t~tM*KZ z>o7QSI~BFJzQ3t>nmO;UC7=G(8dw$-u_B&XIk_*0EJP zX_2c0Qr1Ky__BXR!y4~G=| za5(&FZf9}NAzA3;oNmwUqN|C^{7n}`V=IREb=-@#&3Y)-P7sUe-X;DAk|Q_kT%xO4 z%d34ajGTQ!sF4`tgo5# zEK@r1gTt5aw?|$2sj+A5+QiF!yRxEpl&GV=x%pXccv55V#{Pnpqg>-#G?&B6`*&Gl zT>&>*FVAY~FU;8Gn($E5vdzN-y)$|1`)~f{mLIs-2k!fUn|<)gm%9O_++sGGl=4(# zc6z2=DYvDk+ougWVvE_DY_TgO;WBAPmPEY4YO-4tlIgSDUYK&UNNzJH!;6I2YEnpW znlafd5!=%<6cVXKoN8VTiD3MqF;hzYsvvbctF6GWSWPA~^BXmTIm`Z1Y#{Ofkqdj- z63jDfphqxPrJJ&q@(iO*Y|6AjV^XO!ZJk6Zw?jSgI$M%L^72(jA|C8bAsLv8QXb}} lxO=vyB@Z%Rd9V4EJ-7@&2b!B52DJu$2P(UPfkhuJ`X8JBS)%{| literal 0 HcmV?d00001 diff --git a/messaging/test/test_gsm_encoding.py b/messaging/test/test_gsm_encoding.py new file mode 100644 index 0000000..11c201c --- /dev/null +++ b/messaging/test/test_gsm_encoding.py @@ -0,0 +1,267 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2011 Sphere Systems Ltd +# Author: Andrew Bird +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +"""Unittests for the gsm encoding/decoding module""" + +import unittest +import messaging.sms.gsm0338 # imports GSM7 codec + +# Reversed from: ftp://ftp.unicode.org/Public/MAPPINGS/ETSI/GSM0338.TXT +MAP = { +# unichr(0x0000): (0x0000, 0x00), # Null + '@': (0x0040, 0x00), + '£': (0x00a3, 0x01), + '$': (0x0024, 0x02), + '¥': (0x00a5, 0x03), + 'è': (0x00e8, 0x04), + 'é': (0x00e9, 0x05), + 'ù': (0x00f9, 0x06), + 'ì': (0x00ec, 0x07), + 'ò': (0x00f2, 0x08), + 'Ç': (0x00c7, 0x09), # LATIN CAPITAL LETTER C WITH CEDILLA + chr(0x000a): (0x000a, 0x0a), # Linefeed + 'Ø': (0x00d8, 0x0b), + 'ø': (0x00f8, 0x0c), + chr(0x000d): (0x000d, 0x0d), # Carriage return + 'Å': (0x00c5, 0x0e), + 'å': (0x00e5, 0x0f), + 'Δ': (0x0394, 0x10), + '_': (0x005f, 0x11), + 'Φ': (0x03a6, 0x12), + 'Γ': (0x0393, 0x13), + 'Λ': (0x039b, 0x14), + 'Ω': (0x03a9, 0x15), + 'Π': (0x03a0, 0x16), + 'Ψ': (0x03a8, 0x17), + 'Σ': (0x03a3, 0x18), + 'Θ': (0x0398, 0x19), + 'Ξ': (0x039e, 0x1a), + chr(0x00a0): (0x00a0, 0x1b), # Escape to extension table (displayed + # as NBSP, on decode of invalid escape + # sequence) + 'Æ': (0x00c6, 0x1c), + 'æ': (0x00e6, 0x1d), + 'ß': (0x00df, 0x1e), + 'É': (0x00c9, 0x1f), + ' ': (0x0020, 0x20), + '!': (0x0021, 0x21), + '"': (0x0022, 0x22), + '#': (0x0023, 0x23), + '¤': (0x00a4, 0x24), + '%': (0x0025, 0x25), + '&': (0x0026, 0x26), + '\'': (0x0027, 0x27), + '{': (0x007b, 0x1b28), + '}': (0x007d, 0x1b29), + '*': (0x002a, 0x2a), + '+': (0x002b, 0x2b), + ',': (0x002c, 0x2c), + '-': (0x002d, 0x2d), + '.': (0x002e, 0x2e), + '\\': (0x005c, 0x1b2f), + '0': (0x0030, 0x30), + '1': (0x0031, 0x31), + '2': (0x0032, 0x32), + '3': (0x0033, 0x33), + '4': (0x0034, 0x34), + '5': (0x0035, 0x35), + '6': (0x0036, 0x36), + '7': (0x0037, 0x37), + '8': (0x0038, 0x38), + '9': (0x0039, 0x39), + ':': (0x003a, 0x3a), + ';': (0x003b, 0x3b), + '[': (0x005b, 0x1b3c), + chr(0x000c): (0x000c, 0x1b0a), # Formfeed + ']': (0x005d, 0x1b3e), + '?': (0x003f, 0x3f), + '|': (0x007c, 0x1b40), + 'A': (0x0041, 0x41), + 'B': (0x0042, 0x42), + 'C': (0x0043, 0x43), + 'D': (0x0044, 0x44), + 'E': (0x0045, 0x45), + 'F': (0x0046, 0x46), + 'G': (0x0047, 0x47), + 'H': (0x0048, 0x48), + 'I': (0x0049, 0x49), + 'J': (0x004a, 0x4a), + 'K': (0x004b, 0x4b), + 'L': (0x004c, 0x4c), + 'M': (0x004d, 0x4d), + 'N': (0x004e, 0x4e), + 'O': (0x004f, 0x4f), + 'P': (0x0050, 0x50), + 'Q': (0x0051, 0x51), + 'R': (0x0052, 0x52), + 'S': (0x0053, 0x53), + 'T': (0x0054, 0x54), + 'U': (0x0055, 0x55), + 'V': (0x0056, 0x56), + 'W': (0x0057, 0x57), + 'X': (0x0058, 0x58), + 'Y': (0x0059, 0x59), + 'Z': (0x005a, 0x5a), + 'Ä': (0x00c4, 0x5b), + 'Ö': (0x00d6, 0x5c), + 'Ñ': (0x00d1, 0x5d), + 'Ü': (0x00dc, 0x5e), + '§': (0x00a7, 0x5f), + '¿': (0x00bf, 0x60), + 'a': (0x0061, 0x61), + 'b': (0x0062, 0x62), + 'c': (0x0063, 0x63), + 'd': (0x0064, 0x64), + '€': (0x20ac, 0x1b65), + 'f': (0x0066, 0x66), + 'g': (0x0067, 0x67), + 'h': (0x0068, 0x68), + '<': (0x003c, 0x3c), + 'j': (0x006a, 0x6a), + 'k': (0x006b, 0x6b), + 'l': (0x006c, 0x6c), + 'm': (0x006d, 0x6d), + 'n': (0x006e, 0x6e), + '~': (0x007e, 0x1b3d), + 'p': (0x0070, 0x70), + 'q': (0x0071, 0x71), + 'r': (0x0072, 0x72), + 's': (0x0073, 0x73), + 't': (0x0074, 0x74), + '>': (0x003e, 0x3e), + 'v': (0x0076, 0x76), + 'i': (0x0069, 0x69), + 'x': (0x0078, 0x78), + '^': (0x005e, 0x1b14), + 'z': (0x007a, 0x7a), + 'ä': (0x00e4, 0x7b), + 'ö': (0x00f6, 0x7c), + 'ñ': (0x00f1, 0x7d), + 'ü': (0x00fc, 0x7e), + 'à': (0x00e0, 0x7f), + '¡': (0x00a1, 0x40), + '/': (0x002f, 0x2f), + 'o': (0x006f, 0x6f), + 'u': (0x0075, 0x75), + 'w': (0x0077, 0x77), + 'y': (0x0079, 0x79), + 'e': (0x0065, 0x65), + '=': (0x003d, 0x3d), + '(': (0x0028, 0x28), + ')': (0x0029, 0x29), +} + +GREEK_MAP = { # Note: these might look like Latin uppercase, but they aren't + 'Α': (0x0391, 0x41), + 'Β': (0x0392, 0x42), + 'Ε': (0x0395, 0x45), + 'Η': (0x0397, 0x48), + 'Ι': (0x0399, 0x49), + 'Κ': (0x039a, 0x4b), + 'Μ': (0x039c, 0x4d), + 'Ν': (0x039d, 0x4e), + 'Ο': (0x039f, 0x4f), + 'Ρ': (0x03a1, 0x50), + 'Τ': (0x03a4, 0x54), + 'Χ': (0x03a7, 0x58), + 'Υ': (0x03a5, 0x59), + 'Ζ': (0x0396, 0x5a), +} + +QUIRK_MAP = { + 'ç': (0x00e7, 0x09), +} + +BAD = -1 + + +class TestEncodingFunctions(unittest.TestCase): + + def test_encoding_supported_unicode_gsm(self): + + for key in list(MAP.keys()): + # Use 'ignore' so that we see the code tested, not an exception + s_gsm = key.encode('gsm0338', 'ignore') + + if len(s_gsm) == 1: + i_gsm = ord(s_gsm) + elif len(s_gsm) == 2: + i_gsm = (ord(s_gsm[0]) << 8) + ord(s_gsm[1]) + else: + i_gsm = BAD # so we see the comparison, not an exception + + # We shouldn't generate an invalid escape sequence + if key == chr(0x00a0): + self.assertEqual(BAD, i_gsm) + else: + self.assertEqual(MAP[key][1], i_gsm) + + def test_encoding_supported_greek_unicode_gsm(self): + # Note: Conversion is one way, hence no corresponding decode test + + for key in list(GREEK_MAP.keys()): + # Use 'replace' so that we trigger the mapping + s_gsm = key.encode('gsm0338', 'replace') + + if len(s_gsm) == 1: + i_gsm = ord(s_gsm) + else: + i_gsm = BAD # so we see the comparison, not an exception + + self.assertEqual(GREEK_MAP[key][1], i_gsm) + + def test_encoding_supported_quirk_unicode_gsm(self): + # Note: Conversion is one way, hence no corresponding decode test + + for key in list(QUIRK_MAP.keys()): + # Use 'replace' so that we trigger the mapping + s_gsm = key.encode('gsm0338', 'replace') + + if len(s_gsm) == 1: + i_gsm = ord(s_gsm) + else: + i_gsm = BAD # so we see the comparison, not an exception + + self.assertEqual(QUIRK_MAP[key][1], i_gsm) + + def test_decoding_supported_unicode_gsm(self): + for key in list(MAP.keys()): + i_gsm = MAP[key][1] + if i_gsm <= 0xff: + s_gsm = chr(i_gsm) + elif i_gsm <= 0xffff: + s_gsm = chr((i_gsm & 0xff00) >> 8) + s_gsm += chr(i_gsm & 0x00ff) + + s_unicode = s_gsm.decode('gsm0338', 'strict') + self.assertEqual(MAP[key][0], ord(s_unicode)) + + def test_is_gsm_text_true(self): + for key in list(MAP.keys()): + if key == chr(0x00a0): + continue + self.assertEqual(messaging.sms.gsm0338.is_gsm_text(key), True) + + def test_is_gsm_text_false(self): + self.assertEqual( + messaging.sms.gsm0338.is_gsm_text(chr(0x00a0)), False) + + for i in range(1, 0xffff + 1): + if chr(i) not in MAP: + # Note: it's a little odd, but on error we want to see values + if messaging.sms.gsm0338.is_gsm_text(chr(i)) is not False: + self.assertEqual(BAD, i) diff --git a/messaging/test/test_mms.py b/messaging/test/test_mms.py new file mode 100644 index 0000000..2cf6bf1 --- /dev/null +++ b/messaging/test/test_mms.py @@ -0,0 +1,378 @@ +# -*- coding: utf-8 -*- +from array import array +import datetime +import os +import unittest + +from messaging.mms.message import MMSMessage + +# test data extracted from heyman's +# http://github.com/heyman/mms-decoder +DATA_DIR = os.path.join(os.path.dirname(__file__), 'mms-data') + + +class TestMmsDecoding(unittest.TestCase): + + def test_decoding_from_data(self): + path = os.path.join(DATA_DIR, 'iPhone.mms') + data = array("B", open(path, 'rb').read()) + mms = MMSMessage.from_data(data) + headers = { + 'From': '', 'Transaction-Id': '1262957356-3', + 'MMS-Version': '1.2', 'To': '1337/TYPE=PLMN', + 'Message-Type': 'm-send-req', + 'Content-Type': ('application/vnd.wap.multipart.related', {'Start': '0.smil', 'Type': 'application/smil'}), + } + self.assertEqual(mms.headers, headers) + + def test_decoding_iPhone_mms(self): + path = os.path.join(DATA_DIR, 'iPhone.mms') + mms = MMSMessage.from_file(path) + self.assertTrue(isinstance(mms, MMSMessage)) + headers = { + 'From': '', 'Transaction-Id': '1262957356-3', + 'MMS-Version': '1.2', 'To': '1337/TYPE=PLMN', + 'Message-Type': 'm-send-req', + 'Content-Type': ('application/vnd.wap.multipart.related', {'Start': '0.smil', 'Type': 'application/smil'}), + } + smil_data = '\n\n\n \n\n\n\n\n\n\n\n\n\n\n' + self.assertEqual(mms.headers, headers) + self.assertEqual(mms.content_type, + 'application/vnd.wap.multipart.related') + self.assertEqual(len(mms.data_parts), 2) + self.assertEqual(mms.data_parts[0].content_type, 'application/smil') + self.assertEqual(mms.data_parts[0].data, smil_data) + self.assertEqual(mms.data_parts[1].content_type, 'image/jpeg') + self.assertEqual(mms.data_parts[1].content_type_parameters, + {'Name': 'IMG_6807.jpg'}) + + def test_decoding_SIMPLE_mms(self): + path = os.path.join(DATA_DIR, 'SIMPLE.MMS') + mms = MMSMessage.from_file(path) + self.assertTrue(isinstance(mms, MMSMessage)) + headers = { + 'Transaction-Id': '1234', 'MMS-Version': '1.0', + 'Message-Type': 'm-retrieve-conf', + 'Date': datetime.datetime(2002, 12, 20, 21, 26, 56), + 'Content-Type': ('application/vnd.wap.multipart.related', {}), + 'Subject': 'Simple message', + } + text_data = "This is a simple MMS message with a single text body part." + self.assertEqual(mms.headers, headers) + self.assertEqual(mms.content_type, + 'application/vnd.wap.multipart.related') + self.assertEqual(len(mms.data_parts), 1) + self.assertEqual(mms.data_parts[0].content_type, 'text/plain') + self.assertEqual(mms.data_parts[0].data, text_data) + + def test_decoding_BTMMS_mms(self): + path = os.path.join(DATA_DIR, 'BTMMS.MMS') + mms = MMSMessage.from_file(path) + self.assertTrue(isinstance(mms, MMSMessage)) + headers = { + 'Transaction-Id': '1234', 'MMS-Version': '1.0', + 'Message-Type': 'm-retrieve-conf', + 'Date': datetime.datetime(2003, 1, 21, 1, 57, 4), + 'Content-Type': ('application/vnd.wap.multipart.related', {'Start': '', 'Type': 'application/smil'}), + 'Subject': 'BT Ignite MMS', + } + smil_data = '\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n' + text_data = 'BT Ignite\r\n\r\nMMS Services' + self.assertEqual(mms.headers, headers) + self.assertEqual(mms.content_type, + 'application/vnd.wap.multipart.related') + self.assertEqual(len(mms.data_parts), 4) + self.assertEqual(mms.data_parts[0].content_type, 'application/smil') + self.assertEqual(mms.data_parts[0].data, smil_data) + self.assertEqual(mms.data_parts[1].content_type, 'image/gif') + self.assertEqual(mms.data_parts[2].content_type, 'audio/amr') + self.assertEqual(mms.data_parts[3].content_type, 'text/plain') + self.assertEqual(mms.data_parts[3].data, text_data) + + def test_decoding_TOMSLOT_mms(self): + path = os.path.join(DATA_DIR, 'TOMSLOT.MMS') + mms = MMSMessage.from_file(path) + self.assertTrue(isinstance(mms, MMSMessage)) + headers = { + 'From': '616c6c616e40746f6d736c6f742e636f6d'.decode('hex'), + 'Transaction-Id': '1234', + 'MMS-Version': '1.0', 'Message-Type': 'm-retrieve-conf', + 'Date': datetime.datetime(2003, 2, 16, 3, 48, 33), + 'Content-Type': ('application/vnd.wap.multipart.related', {'Start': '', 'Type': 'application/smil'}), + 'Subject': 'Tom Slot Band', + } + smil_data = '\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\r\n\r\n' + text_data = 'Presented by NowMMS\r\n' + self.assertEqual(mms.headers, headers) + self.assertEqual(mms.content_type, + 'application/vnd.wap.multipart.related') + self.assertEqual(len(mms.data_parts), 8) + self.assertEqual(mms.data_parts[0].content_type, 'application/smil') + self.assertEqual(mms.data_parts[0].data, smil_data) + self.assertEqual(mms.data_parts[1].content_type, 'image/jpeg') + self.assertEqual(mms.data_parts[2].content_type, 'image/jpeg') + self.assertEqual(mms.data_parts[3].content_type, 'image/jpeg') + self.assertEqual(mms.data_parts[4].content_type, 'image/jpeg') + self.assertEqual(mms.data_parts[5].content_type, 'image/jpeg') + self.assertEqual(mms.data_parts[6].content_type, 'text/plain') + self.assertEqual(mms.data_parts[6].data, text_data) + self.assertEqual(mms.data_parts[7].content_type, 'audio/amr') + + def test_decoding_images_are_cut_off_debug_mms(self): + path = os.path.join(DATA_DIR, 'images_are_cut_off_debug.mms') + mms = MMSMessage.from_file(path) + self.assertTrue(isinstance(mms, MMSMessage)) + headers = { + 'From': '', 'Read-Reply': False, + 'Transaction-Id': '2112410527', 'MMS-Version': '1.0', + 'To': '7464707440616a616a672e63646d'.decode('hex'), + 'Delivery-Report': False, + 'Message-Type': 'm-send-req', + 'Content-Type': ('application/vnd.wap.multipart.related', {'Start': '', 'Type': 'application/smil'}), + 'Subject': 'Picture3', + } + smil_data = '' + self.assertEqual(mms.headers, headers) + self.assertEqual(len(mms.data_parts), 2) + self.assertEqual(mms.content_type, + 'application/vnd.wap.multipart.related') + self.assertEqual(mms.data_parts[0].content_type, 'image/jpeg') + self.assertEqual(mms.data_parts[0].content_type_parameters, + {'Name': 'Picture3.jpg'}) + self.assertEqual(mms.data_parts[1].content_type, 'application/smil') + self.assertEqual(mms.data_parts[1].data, smil_data) + + def test_decoding_openwave_mms(self): + path = os.path.join(DATA_DIR, 'openwave.mms') + mms = MMSMessage.from_file(path) + self.assertTrue(isinstance(mms, MMSMessage)) + headers = { + 'From': '2b31363530353535303030302f545950453d504c4d4e'.decode('hex'), + 'Message-Class': 'Personal', + 'Transaction-Id': '1067263672', 'MMS-Version': '1.0', + 'Priority': 'Normal', 'To': '112/TYPE=PLMN', + 'Delivery-Report': False, 'Message-Type': 'm-send-req', + 'Content-Type': ('application/vnd.wap.multipart.related', {'Start': '', 'Type': 'application/smil'}), + 'Subject': 'rubrik', + } + smil_data = '\n \n \n \n \n \n \n \n \n \n \n \n \n\n' + text_data = 'rubrik' + self.assertEqual(mms.headers, headers) + self.assertEqual(len(mms.data_parts), 2) + self.assertEqual(mms.content_type, + 'application/vnd.wap.multipart.related') + self.assertEqual(mms.data_parts[0].content_type, 'application/smil') + self.assertEqual(mms.data_parts[0].data, smil_data) + self.assertEqual(mms.data_parts[1].data, text_data) + + def test_decoding_SonyEricssonT310_R201_mms(self): + path = os.path.join(DATA_DIR, 'SonyEricssonT310-R201.mms') + mms = MMSMessage.from_file(path) + self.assertTrue(isinstance(mms, MMSMessage)) + headers = { + 'Sender-Visibility': 'Show', 'From': '', + 'Read-Reply': False, 'Message-Class': 'Personal', + 'Transaction-Id': '1-8db', 'MMS-Version': '1.0', + 'Priority': 'Normal', 'To': '55225/TYPE=PLMN', + 'Delivery-Report': False, 'Message-Type': 'm-send-req', + 'Date': datetime.datetime(2004, 3, 18, 7, 30, 34), + 'Content-Type': ('application/vnd.wap.multipart.related', {'Start': '', 'Type': 'application/smil'}), + } + text_data = 'Hej hopp' + smil_data = '\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n' + self.assertEqual(mms.headers, headers) + self.assertEqual(len(mms.data_parts), 4) + self.assertEqual(mms.content_type, + 'application/vnd.wap.multipart.related') + self.assertEqual(mms.data_parts[0].content_type, 'image/gif') + self.assertEqual(mms.data_parts[0].content_type_parameters, + {'Name': 'Tony.gif'}) + self.assertEqual(mms.data_parts[1].content_type, 'text/plain') + self.assertEqual(mms.data_parts[1].data, text_data) + self.assertEqual(mms.data_parts[2].content_type, 'audio/midi') + self.assertEqual(mms.data_parts[2].content_type_parameters, + {'Name': 'OldhPhone.mid'}) + self.assertEqual(mms.data_parts[3].content_type, 'application/smil') + self.assertEqual(mms.data_parts[3].data, smil_data) + + def test_decoding_gallery2test_mms(self): + path = os.path.join(DATA_DIR, 'gallery2test.mms') + mms = MMSMessage.from_file(path) + self.assertTrue(isinstance(mms, MMSMessage)) + headers = { + 'From': '2b31363530353535303030302f545950453d504c4d4e'.decode('hex'), + 'Message-Class': 'Personal', + 'Transaction-Id': '1118775337', 'MMS-Version': '1.0', + 'Priority': 'Normal', 'To': 'Jg', 'Delivery-Report': False, + 'Message-Type': 'm-send-req', + 'Content-Type': ('application/vnd.wap.multipart.related', {'Start': '', 'Type': 'application/smil'}), + 'Subject': 'Jgj', + } + text_data = 'Jgj' + smil_data = '\n \n \n \n \n \n \n \n \n \n gnu-head\n \n \n \n\n' + self.assertEqual(mms.headers, headers) + self.assertEqual(len(mms.data_parts), 3) + self.assertEqual(mms.content_type, + 'application/vnd.wap.multipart.related') + self.assertEqual(mms.data_parts[0].content_type, 'application/smil') + self.assertEqual(mms.data_parts[0].data, smil_data) + self.assertEqual(mms.data_parts[1].content_type, 'text/plain') + self.assertEqual(mms.data_parts[1].data, text_data) + self.assertEqual(mms.data_parts[2].content_type, 'image/jpeg') + # XXX: Shouldn't it be 'Name' instead ? + self.assertEqual(mms.data_parts[2].content_type_parameters, + {'name': 'gnu-head.jpg'}) + + def test_decoding_projekt_exempel_mms(self): + path = os.path.join(DATA_DIR, 'projekt_exempel.mms') + mms = MMSMessage.from_file(path) + self.assertTrue(isinstance(mms, MMSMessage)) + headers = { + 'Sender-Visibility': 'Show', 'From': '', + 'Read-Reply': False, 'Message-Class': 'Personal', + 'Transaction-Id': '4-fc60', 'MMS-Version': '1.0', + 'Priority': 'Normal', 'To': '12345/TYPE=PLMN', + 'Delivery-Report': False, 'Message-Type': 'm-send-req', + 'Date': datetime.datetime(2004, 5, 23, 15, 13, 40), + 'Content-Type': ('application/vnd.wap.multipart.related', {'Start': '', 'Type': 'application/smil'}), + 'Subject': 'Hej', + } + smil_data = '\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n' + text_data = 'Jonatan \xc3\xa4r en GNU' + self.assertEqual(mms.headers, headers) + self.assertEqual(len(mms.data_parts), 3) + self.assertEqual(mms.content_type, + 'application/vnd.wap.multipart.related') + self.assertEqual(mms.data_parts[0].content_type, 'text/plain') + self.assertEqual(mms.data_parts[0].data, text_data) + self.assertEqual(mms.data_parts[1].content_type, 'image/gif') + self.assertEqual(mms.data_parts[2].content_type, 'application/smil') + self.assertEqual(mms.data_parts[2].data, smil_data) + self.assertEqual(mms.data_parts[2].content_type_parameters, + {'Charset': 'utf-8', 'Name': 'mms.smil'}) + + def test_decoding_m_mms(self): + path = os.path.join(DATA_DIR, 'm.mms') + mms = MMSMessage.from_file(path) + self.assertTrue(isinstance(mms, MMSMessage)) + headers = { + 'From': '676f6c64706f737440686f746d61696c2e636f6d'.decode('hex'), + 'Transaction-Id': '0000000001', + 'MMS-Version': '1.0', 'Message-Type': 'm-retrieve-conf', + 'Date': datetime.datetime(2002, 8, 9, 13, 8, 2), + 'Content-Type': ('application/vnd.wap.multipart.related', {'Start': '', 'Type': 'application/smil'}), + 'Subject': 'GOLD', + } + text_data1 = 'Audio' + text_data2 = 'Text +' + text_data3 = 'tagtag.com/gold\r\n' + text_data4 = 'globalisierunglobalisierunglobalisierunglobalisierunglobalisierunglobalisierunglobalisierungnureisilabolg' + text_data5 = 'KLONE\r\nKLONE\r\n' + text_data6 = 'pr\xe4sentiert..' + text_data7 = 'GOLD' + smil_data = '\r\n\r\n\r\n\r\n\r\n\r\n\r\n \r\n \r\n\r\n\r\n\r\n\r\n \r\n \r\n\r\n\r\n\r\n\r\n \r\n \r\n\r\n\r\n\r\n\r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n \r\n \r\n\r\n\r\n\r\n\r\n \r\n \r\n\r\n\r\n\r\n\r\n\r\n \r\n \r\n\r\n\r\n' + self.assertEqual(mms.headers, headers) + self.assertEqual(len(mms.data_parts), 9) + self.assertEqual(mms.content_type, 'application/vnd.wap.multipart.related') + self.assertEqual(mms.data_parts[0].content_type, 'text/plain') + self.assertEqual(mms.data_parts[0].data, text_data1) + self.assertEqual(mms.data_parts[0].content_type_parameters, + {'Charset': 'us-ascii'}) + self.assertEqual(mms.data_parts[1].content_type, 'application/smil') + self.assertEqual(mms.data_parts[1].data, smil_data) + self.assertEqual(mms.data_parts[1].content_type_parameters, + {'Charset': 'us-ascii'}) + self.assertEqual(mms.data_parts[2].content_type, 'text/plain') + self.assertEqual(mms.data_parts[2].data, text_data2) + self.assertEqual(mms.data_parts[2].content_type_parameters, + {'Charset': 'us-ascii'}) + self.assertEqual(mms.data_parts[3].content_type, 'text/plain') + self.assertEqual(mms.data_parts[3].data, text_data3) + self.assertEqual(mms.data_parts[3].content_type_parameters, + {'Charset': 'us-ascii'}) + self.assertEqual(mms.data_parts[4].content_type, 'audio/amr') + self.assertEqual(mms.data_parts[5].content_type, 'text/plain') + self.assertEqual(mms.data_parts[5].data, text_data4) + self.assertEqual(mms.data_parts[5].content_type_parameters, + {'Charset': 'us-ascii'}) + self.assertEqual(mms.data_parts[6].content_type, 'text/plain') + self.assertEqual(mms.data_parts[6].data, text_data5) + self.assertEqual(mms.data_parts[6].content_type_parameters, + {'Charset': 'us-ascii'}) + self.assertEqual(mms.data_parts[7].content_type, 'text/plain') + self.assertEqual(mms.data_parts[7].data, text_data6) + self.assertEqual(mms.data_parts[7].content_type_parameters, + {'Charset': 'us-ascii'}) + self.assertEqual(mms.data_parts[8].content_type, 'text/plain') + self.assertEqual(mms.data_parts[8].data, text_data7) + self.assertEqual(mms.data_parts[8].content_type_parameters, + {'Charset': 'us-ascii'}) + + def test_decoding_27d0a048cd79555de05283a22372b0eb_mms(self): + path = os.path.join(DATA_DIR, '27d0a048cd79555de05283a22372b0eb.mms') + mms = MMSMessage.from_file(path) + self.assertTrue(isinstance(mms, MMSMessage)) + headers = { + 'Sender-Visibility': 'Show', 'From': '', + 'Read-Reply': False, 'Message-Class': 'Personal', + 'Transaction-Id': '3-31cb', 'MMS-Version': '1.0', + 'Priority': 'Normal', 'To': '123/TYPE=PLMN', + 'Delivery-Report': False, 'Message-Type': 'm-send-req', + 'Date': datetime.datetime(2004, 5, 23, 14, 14, 58), + 'Content-Type': ('application/vnd.wap.multipart.related', {'Start': '', 'Type': 'application/smil'}), + 'Subject': 'Angående art-tillhörighet', + #'Subject': 'Ang\xc3\xa5ende art-tillh\xc3\xb6righet', + } + smil_data = '\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n' + text_data = 'Jonatan \xc3\xa4r en gnu.' + self.assertEqual(mms.headers, headers) + self.assertEqual(len(mms.data_parts), 3) + self.assertEqual(mms.content_type, + 'application/vnd.wap.multipart.related') + self.assertEqual(mms.data_parts[0].content_type, 'image/vnd.wap.wbmp') + self.assertEqual(mms.data_parts[0].content_type_parameters, + {'Name': 'Rain.wbmp'}) + self.assertEqual(mms.data_parts[1].content_type, 'text/plain') + self.assertEqual(mms.data_parts[1].data, text_data) + self.assertEqual(mms.data_parts[1].content_type_parameters, + {'Charset': 'utf-8', 'Name': 'mms.txt'}) + self.assertEqual(mms.data_parts[2].content_type, 'application/smil') + self.assertEqual(mms.data_parts[2].data, smil_data) + self.assertEqual(mms.data_parts[2].content_type_parameters, + {'Charset': 'utf-8', 'Name': 'mms.smil'}) + + def test_decoding_SEC_SGHS300M(self): + path = os.path.join(DATA_DIR, 'SEC-SGHS300M.mms') + mms = MMSMessage.from_file(path) + self.assertTrue(isinstance(mms, MMSMessage)) + headers = { + 'Sender-Visibility': 'Show', 'From': '', + 'Read-Reply': False, 'Message-Class': 'Personal', + 'Transaction-Id': '31887', 'MMS-Version': '1.0', + 'To': '303733383334353636342f545950453d504c4d4e'.decode('hex'), + 'Delivery-Report': False, + 'Message-Type': 'm-send-req', 'Subject': 'IL', + 'Content-Type': ('application/vnd.wap.multipart.mixed', {}), + } + text_data = 'HV' + self.assertEqual(mms.headers, headers) + self.assertEqual(len(mms.data_parts), 1) + self.assertEqual(mms.content_type, + 'application/vnd.wap.multipart.mixed') + self.assertEqual(mms.data_parts[0].content_type, 'text/plain') + self.assertEqual(mms.data_parts[0].data, text_data) + self.assertEqual(mms.data_parts[0].content_type_parameters, + {'Charset': 'utf-8'}) + + def test_encoding_m_sendnotifyresp_ind(self): + message = MMSMessage() + message.headers['Transaction-Id'] = 'NOK5AIdhfTMYSG4JeIgAAsHtp72AGAAAAAAAA' + message.headers['Message-Type'] = 'm-notifyresp-ind' + message.headers['Status'] = 'Retrieved' + data = [ + 140, 131, 152, 78, 79, 75, 53, 65, 73, 100, 104, 102, 84, 77, + 89, 83, 71, 52, 74, 101, 73, 103, 65, 65, 115, 72, 116, 112, + 55, 50, 65, 71, 65, 65, 65, 65, 65, 65, 65, 65, 0, 141, 144, + 149, 129, 132, 163, 1, 35, 129] + + self.assertEqual(list(message.encode()[:50]), data) diff --git a/messaging/test/test_sms.py b/messaging/test/test_sms.py new file mode 100644 index 0000000..c3ff7b5 --- /dev/null +++ b/messaging/test/test_sms.py @@ -0,0 +1,481 @@ +# -*- coding: utf-8 -*- +from datetime import datetime, timedelta + +try: + import unittest2 as unittest +except ImportError: + import unittest + +from messaging.sms import SmsSubmit, SmsDeliver +from messaging.utils import (timedelta_to_relative_validity as to_relative, + datetime_to_absolute_validity as to_absolute, + FixedOffset) + + +class TestEncodingFunctions(unittest.TestCase): + + def test_converting_timedelta_to_validity(self): + self.assertRaises(ValueError, to_relative, timedelta(minutes=4)) + self.assertRaises(ValueError, to_relative, timedelta(weeks=64)) + + self.assertTrue(isinstance(to_relative(timedelta(hours=6)), int)) + self.assertTrue(isinstance(to_relative(timedelta(hours=18)), int)) + self.assertTrue(isinstance(to_relative(timedelta(days=15)), int)) + self.assertTrue(isinstance(to_relative(timedelta(weeks=31)), int)) + + self.assertEqual(to_relative(timedelta(minutes=5)), 0) + self.assertEqual(to_relative(timedelta(minutes=6)), 0) + self.assertEqual(to_relative(timedelta(minutes=10)), 1) + + self.assertEqual(to_relative(timedelta(hours=12)), 143) + self.assertEqual(to_relative(timedelta(hours=13)), 145) + self.assertEqual(to_relative(timedelta(hours=24)), 167) + + self.assertEqual(to_relative(timedelta(days=2)), 168) + self.assertEqual(to_relative(timedelta(days=30)), 196) + + def test_converting_datetime_to_validity(self): + # http://www.dreamfabric.com/sms/scts.html + # 12. Feb 1999 05:57:30 GMT+3 + when = datetime(1999, 2, 12, 5, 57, 30, 0, + FixedOffset(3 * 60, "GMT+3")) + expected = [0x99, 0x20, 0x21, 0x50, 0x75, 0x03, 0x21] + self.assertEqual(to_absolute(when, "GMT+3"), expected) + + when = datetime(1999, 2, 12, 5, 57, 30, 0) + expected = [0x99, 0x20, 0x21, 0x50, 0x75, 0x03, 0x0] + self.assertEqual(to_absolute(when, "UTC"), expected) + + when = datetime(1999, 2, 12, 5, 57, 30, 0, + FixedOffset(-3 * 60, "GMT-3")) + expected = [0x99, 0x20, 0x21, 0x50, 0x75, 0x03, 0x29] + self.assertEqual(to_absolute(when, "GMT-3"), expected) + + +class TestSmsSubmit(unittest.TestCase): + + def test_encoding_validity(self): + # no validity + number = '2b3334363136353835313139'.decode('hex') + text = "hola" + expected = "0001000B914316565811F9000004E8373B0C" + + sms = SmsSubmit(number, text) + sms.ref = 0x0 + + pdu = sms.to_pdu()[0] + self.assertEqual(pdu.pdu, expected) + + # absolute validity + number = '2b3334363136353835313139'.decode('hex') + text = "hola" + expected = "0019000B914316565811F900000170520251930004E8373B0C" + + sms = SmsSubmit(number, text) + sms.ref = 0x0 + sms.validity = datetime(2010, 7, 25, 20, 15, 39) + + pdu = sms.to_pdu()[0] + self.assertEqual(pdu.pdu, expected) + + # relative validity + number = '2b3334363136353835313139'.decode('hex') + text = "hola" + expected = "0011000B914316565811F90000AA04E8373B0C" + expected_len = 18 + + sms = SmsSubmit(number, text) + sms.ref = 0x0 + sms.validity = timedelta(days=4) + + pdu = sms.to_pdu()[0] + self.assertEqual(pdu.pdu, expected) + self.assertEqual(pdu.length, expected_len) + + def test_encoding_csca(self): + number = '2b3334363136353835313139'.decode('hex') + text = "hola" + csca = "+34646456456" + expected = "07914346466554F601000B914316565811F9000004E8373B0C" + expected_len = 17 + + sms = SmsSubmit(number, text) + sms.csca = csca + sms.ref = 0x0 + + pdu = sms.to_pdu()[0] + self.assertEqual(pdu.pdu, expected) + self.assertEqual(pdu.length, expected_len) + self.assertEqual(pdu.cnt, 1) + self.assertEqual(pdu.seq, 1) + + def test_encoding_class(self): + number = '2b3334363534313233343536'.decode('hex') + text = "hey yo" + expected_0 = "0001000B914356143254F6001006E8721E947F03" + expected_1 = "0001000B914356143254F6001106E8721E947F03" + expected_2 = "0001000B914356143254F6001206E8721E947F03" + expected_3 = "0001000B914356143254F6001306E8721E947F03" + + sms = SmsSubmit(number, text) + sms.ref = 0x0 + sms.klass = 0 + + pdu = sms.to_pdu()[0] + self.assertEqual(pdu.pdu, expected_0) + + sms.klass = 1 + pdu = sms.to_pdu()[0] + self.assertEqual(pdu.pdu, expected_1) + + sms.klass = 2 + pdu = sms.to_pdu()[0] + self.assertEqual(pdu.pdu, expected_2) + + sms.klass = 3 + pdu = sms.to_pdu()[0] + self.assertEqual(pdu.pdu, expected_3) + + def test_encoding_request_status(self): + # tested with pduspy.exe and http://www.rednaxela.net/pdu.php + number = '2b3334363534313233343536'.decode('hex') + text = "hey yo" + expected = "0021000B914356143254F6000006E8721E947F03" + + sms = SmsSubmit(number, text) + sms.ref = 0x0 + sms.request_status = True + + pdu = sms.to_pdu()[0] + self.assertEqual(pdu.pdu, expected) + + def test_encoding_message_with_latin1_chars(self): + # tested with pduspy.exe + number = '2b3334363534313233343536'.decode('hex') + text = u"Hölä" + expected = "0011000B914356143254F60000AA04483E7B0F" + + sms = SmsSubmit(number, text) + sms.ref = 0x0 + sms.validity = timedelta(days=4) + + pdu = sms.to_pdu()[0] + self.assertEqual(pdu.pdu, expected) + + # tested with pduspy.exe + number = '2b3334363534313233343536'.decode('hex') + text = u"BÄRÇA äñ@" + expected = "0001000B914356143254F6000009C2AD341104EDFB00" + + sms = SmsSubmit(number, text) + sms.ref = 0x0 + + pdu = sms.to_pdu()[0] + self.assertEqual(pdu.pdu, expected) + + def test_encoding_8bit_message(self): + number = "01000000000" + csca = "+44000000000" + text = "Hi there..." + expected = "07914400000000F001000B811000000000F000040B48692074686572652E2E2E" + + sms = SmsSubmit(number, text) + sms.ref = 0x0 + sms.csca = csca + sms.fmt = 0x04 # 8 bits + + pdu = sms.to_pdu()[0] + self.assertEqual(pdu.pdu, expected) + + def test_encoding_ucs2_message(self): + number = '2b3334363136353835313139'.decode('hex') + text = u'あ叶葉' + csca = '+34646456456' + expected = "07914346466554F601000B914316565811F9000806304253F68449" + + sms = SmsSubmit(number, text) + sms.ref = 0x0 + sms.csca = csca + + pdu = sms.to_pdu()[0] + self.assertEqual(pdu.pdu, expected) + + text = u"Русский" + number = '363535333435363738'.decode('hex') + expected = "001100098156355476F80008AA0E0420044304410441043A04380439" + + sms = SmsSubmit(number, text) + sms.ref = 0x0 + sms.validity = timedelta(days=4) + + pdu = sms.to_pdu()[0] + self.assertEqual(pdu.pdu, expected) + + def test_encoding_multipart_7bit(self): + # text encoded with umts-tools + text = "Or walk with Kings - nor lose the common touch, if neither foes nor loving friends can hurt you, If all men count with you, but none too much; If you can fill the unforgiving minute With sixty seconds' worth of distance run, Yours is the Earth and everything thats in it, And - which is more - you will be a Man, my son" + number = '363535333435363738'.decode('hex') + expected = [ + "005100098156355476F80000AAA00500038803019E72D03DCC5E83EE693A1AB44CBBCF73500BE47ECB41ECF7BC0CA2A3CBA0F1BBDD7EBB41F4777D8C6681D26690BB9CA6A3CB7290F95D9E83DC6F3988FDB6A7DD6790599E2EBBC973D038EC06A1EB723A28FFAEB340493328CC6683DA653768FCAEBBE9A07B9A8E06E5DF7516485CA783DC6F7719447FBF41EDFA18BD0325CDA0FCBB0E1A87DD", + "005100098156355476F80000AAA005000388030240E6349B0DA2A3CBA0BADBFC969FD3F6B4FB0C6AA7DD757A19744DD3D1A0791A4FCF83E6E5F1DB4D9E9F40F7B79C8E06BDCD20727A4E0FBBC76590BCEE6681B2EFBA7C0E4ACF41747419540CCBE96850D84D0695ED65799E8E4EBBCF203A3A4C9F83D26E509ACE0205DD64500B7447A7C768507A0E6ABFE565500B947FD741F7349B0D129741", + "005100098156355476F80000AA14050003880303C2A066D8CD02B5F3A0F9DB0D", + ] + + sms = SmsSubmit(number, text) + sms.ref = 0x0 + sms.rand_id = 136 + sms.validity = timedelta(days=4) + + ret = sms.to_pdu() + cnt = len(ret) + for i, pdu in enumerate(ret): + self.assertEqual(pdu.pdu, expected[i]) + self.assertEqual(pdu.seq, i + 1) + self.assertEqual(pdu.cnt, cnt) + + def test_encoding_bad_number_raises_error(self): + self.assertRaises(ValueError, SmsSubmit, "032BADNUMBER", "text") + + def test_encoding_bad_csca_raises_error(self): + sms = SmsSubmit("54342342", "text") + self.assertRaises(ValueError, setattr, sms, 'csca', "1badcsca") + + +class TestSubmitPduCounts(unittest.TestCase): + + DEST = "+3530000000" + GSM_CHAR = "x" + EGSM_CHAR = u"€" + UNICODE_CHAR = u"ő" + + def test_gsm_1(self): + sms = SmsSubmit(self.DEST, self.GSM_CHAR * 160) + self.assertEqual(len(sms.to_pdu()), 1) + + def test_gsm_2(self): + sms = SmsSubmit(self.DEST, self.GSM_CHAR * 161) + self.assertEqual(len(sms.to_pdu()), 2) + + def test_gsm_3(self): + sms = SmsSubmit(self.DEST, self.GSM_CHAR * 153 * 2) + self.assertEqual(len(sms.to_pdu()), 2) + + def test_gsm_4(self): + sms = SmsSubmit(self.DEST, + self.GSM_CHAR * 153 * 2 + self.GSM_CHAR) + self.assertEqual(len(sms.to_pdu()), 3) + + def test_gsm_5(self): + sms = SmsSubmit(self.DEST, self.GSM_CHAR * 153 * 3) + self.assertEqual(len(sms.to_pdu()), 3) + + def test_gsm_6(self): + sms = SmsSubmit(self.DEST, + self.GSM_CHAR * 153 * 3 + self.GSM_CHAR) + self.assertEqual(len(sms.to_pdu()), 4) + + def test_egsm_1(self): + sms = SmsSubmit(self.DEST, self.EGSM_CHAR * 80) + self.assertEqual(len(sms.to_pdu()), 1) + + def test_egsm_2(self): + sms = SmsSubmit(self.DEST, + self.EGSM_CHAR * 79 + self.GSM_CHAR) + self.assertEqual(len(sms.to_pdu()), 1) + + def test_egsm_3(self): + sms = SmsSubmit(self.DEST, self.EGSM_CHAR * 153) # 306 septets + self.assertEqual(len(sms.to_pdu()), 3) + + def test_egsm_4(self): + sms = SmsSubmit(self.DEST, + self.EGSM_CHAR * 229 + self.GSM_CHAR) # 459 septets + self.assertEqual(len(sms.to_pdu()), 4) + + def test_unicode_1(self): + sms = SmsSubmit(self.DEST, self.UNICODE_CHAR * 70) + self.assertEqual(len(sms.to_pdu()), 1) + + def test_unicode_2(self): + sms = SmsSubmit(self.DEST, self.UNICODE_CHAR * 70 + self.GSM_CHAR) + self.assertEqual(len(sms.to_pdu()), 2) + + def test_unicode_3(self): + sms = SmsSubmit(self.DEST, self.UNICODE_CHAR * 67 * 2) + self.assertEqual(len(sms.to_pdu()), 2) + + def test_unicode_4(self): + sms = SmsSubmit(self.DEST, self.UNICODE_CHAR * 67 * 2 + self.GSM_CHAR) + self.assertEqual(len(sms.to_pdu()), 3) + + def test_unicode_5(self): + sms = SmsSubmit(self.DEST, self.UNICODE_CHAR * 67 * 3) + self.assertEqual(len(sms.to_pdu()), 3) + + def test_unicode_6(self): + sms = SmsSubmit(self.DEST, self.UNICODE_CHAR * 67 * 3 + self.GSM_CHAR) + self.assertEqual(len(sms.to_pdu()), 4) + + +class TestSmsDeliver(unittest.TestCase): + + def test_decoding_7bit_pdu(self): + pdu = "07911326040000F0040B911346610089F60000208062917314080CC8F71D14969741F977FD07" + text = "How are you?" + csca = "+31624000000" + number = '2b3331363431363030393836'.decode('hex') + + sms = SmsDeliver(pdu) + self.assertEqual(sms.text, text) + self.assertEqual(sms.csca, csca) + self.assertEqual(sms.number, number) + + def test_decoding_ucs2_pdu(self): + pdu = "07914306073011F0040B914316709807F2000880604290224080084E2D5174901A8BAF" + text = u"中兴通讯" + csca = "+34607003110" + number = '2b3334363130373839373032'.decode('hex') + + sms = SmsDeliver(pdu) + self.assertEqual(sms.text, text) + self.assertEqual(sms.csca, csca) + self.assertEqual(sms.number, number) + + def test_decoding_7bit_pdu_data(self): + pdu = "07911326040000F0040B911346610089F60000208062917314080CC8F71D14969741F977FD07" + text = "How are you?" + csca = "+31624000000" + number = '2b3331363431363030393836'.decode('hex') + + data = SmsDeliver(pdu).data + self.assertEqual(data['text'], text) + self.assertEqual(data['csca'], csca) + self.assertEqual(data['number'], number) + self.assertEqual(data['pid'], 0) + self.assertEqual(data['fmt'], 0) + self.assertEqual(data['date'], datetime(2002, 8, 26, 19, 37, 41)) + + def test_decoding_datetime_gmtplusone(self): + pdu = "0791447758100650040C914497716247010000909010711423400A2050EC468B81C4733A" + text = " 1741 bst" + number = '2b343437393137323637343130'.decode('hex') + date = datetime(2009, 9, 1, 16, 41, 32) + + sms = SmsDeliver(pdu) + self.assertEqual(sms.text, text) + self.assertEqual(sms.number, number) + self.assertEqual(sms.date, date) + + def test_decoding_datetime_gmtminusthree(self): + pdu = "0791553001000001040491578800000190115101112979CF340B342F9FEBE536E83D0791C3E4F71C440E83E6F53068FE66A7C7697A781C7EBB4050F99BFE1EBFD96F1D48068BC16030182E66ABD560B41988FC06D1D3F03768FA66A7C7697A781C7E83CCEF34282C2ECBE96F50B90D8AC55EB0DC4B068BC140B1994E16D3D1622E" + date = datetime(2010, 9, 11, 18, 10, 11) # 11/09/10 15:10 GMT-3.00 + + sms = SmsDeliver(pdu) + self.assertEqual(sms.date, date) + + def test_decoding_number_alphanumeric(self): + # Odd length test + pdu = "07919471060040340409D0C6A733390400009060920173018093CC74595C96838C4F6772085AD6DDE4320B444E9741D4B03C6D7EC3E9E9B71B9474D3CB727799DEA286CFE5B9991DA6CBC3F432E85E9793CBA0F09A9EB6A7CB72BA0B9474D3CB727799DE72D6E9FABAFB0CBAA7E56490BA4CD7D34170F91BE4ACD3F575F7794E0F9F4161F1B92C2F8FD1EE32DD054AA2E520E3D3991C82A8E5701B" + number = "FONIC" + text = "Lieber FONIC Kunde, die Tarifoption Internet-Tagesflatrate wurde aktiviert. Internet-Nutzung wird jetzt pro Nutzungstag abgerechnet. Ihr FONIC Team" + csca = "+491760000443" + + sms = SmsDeliver(pdu) + self.assertEqual(sms.text, text) + self.assertEqual(sms.csca, csca) + self.assertEqual(sms.number, number) + + # Even length test + pdu = "07919333852804000412D0F7FBDD454FB75D693A0000903002801153402BCD301E9F0605D9E971191483C140412A35690D52832063D2F9040599A058EE05A3BD6430580E" + number = "www.tim.it" + text = 'Maxxi Alice 100 ATTIVATA FINO AL 19/04/2009' + csca = '+393358824000' + + sms = SmsDeliver(pdu) + self.assertEqual(sms.text, text) + self.assertEqual(sms.csca, csca) + self.assertEqual(sms.number, number) + + def test_decode_sms_confirmation(self): + pdu = "07914306073011F006270B913426565711F7012081111345400120811174054043" + csca = "+34607003110" + date = datetime(2010, 2, 18, 11, 31, 54) + number = "SR-UNKNOWN" + # XXX: the number should be +344626575117, is the prefix flipped ? + text = "+43626575117|10/02/18 11:31:54|" + + sms = SmsDeliver(pdu) + self.assertEqual(sms.text, text) + self.assertEqual(sms.csca, csca) + self.assertEqual(sms.number, number) + self.assertEqual(sms.date, date) + + def test_decode_weird_multipart_german_pdu(self): + pdus = [ + "07919471227210244405852122F039F101506271217180A005000319020198E9B2B82C0759DFE4B0F9ED2EB7967537B9CC02B5D37450122D2FCB41EE303DFD7687D96537881A96A7CD6F383DFD7683F46134BBEC064DD36550DA0D22A7CBF3721BE42CD3F5A0198B56036DCA20B8FC0D6A0A4170767D0EAAE540433A082E7F83A6E5F93CFD76BB40D7B2DB0D9AA6CB2072BA3C2F83926EF31BE44E8FD17450BB8C9683CA", + "07919471227210244405852122F039F1015062712181804F050003190202E4E8309B5E7683DAFC319A5E76B340F73D9A5D7683A6E93268FD9ED3CB6EF67B0E5AD172B19B2C2693C9602E90355D6683A6F0B007946E8382F5393BEC26BB00", + ] + texts = [ + u"Lieber Vodafone-Kunde, mit Ihrer nationalen Tarifoption zahlen Sie in diesem Netz 3,45 € pro MB plus 59 Ct pro Session. Wenn Sie diese Info nicht mehr e", + u"rhalten möchten, wählen Sie kostenlos +4917212220. Viel Spaß im Ausland.", + ] + + for i, sms in enumerate(map(SmsDeliver, pdus)): + self.assertEqual(sms.text, texts[i]) + self.assertEqual(sms.udh.concat.cnt, len(pdus)) + self.assertEqual(sms.udh.concat.seq, i + 1) + self.assertEqual(sms.udh.concat.ref, 25) + + def test_decoding_odd_length_pdu_strict_raises_valueerror(self): + # same pdu as in test_decoding_number_alpha1 minus last char + pdu = "07919471060040340409D0C6A733390400009060920173018093CC74595C96838C4F6772085AD6DDE4320B444E9741D4B03C6D7EC3E9E9B71B9474D3CB727799DEA286CFE5B9991DA6CBC3F432E85E9793CBA0F09A9EB6A7CB72BA0B9474D3CB727799DE72D6E9FABAFB0CBAA7E56490BA4CD7D34170F91BE4ACD3F575F7794E0F9F4161F1B92C2F8FD1EE32DD054AA2E520E3D3991C82A8E5701" + self.assertRaises(ValueError, SmsDeliver, pdu) + + def test_decoding_odd_length_pdu_no_strict(self): + # same pdu as in test_decoding_number_alpha1 minus last char + pdu = "07919471060040340409D0C6A733390400009060920173018093CC74595C96838C4F6772085AD6DDE4320B444E9741D4B03C6D7EC3E9E9B71B9474D3CB727799DEA286CFE5B9991DA6CBC3F432E85E9793CBA0F09A9EB6A7CB72BA0B9474D3CB727799DE72D6E9FABAFB0CBAA7E56490BA4CD7D34170F91BE4ACD3F575F7794E0F9F4161F1B92C2F8FD1EE32DD054AA2E520E3D3991C82A8E5701" + text = "Lieber FONIC Kunde, die Tarifoption Internet-Tagesflatrate wurde aktiviert. Internet-Nutzung wird jetzt pro Nutzungstag abgerechnet. Ihr FONIC Tea" + + sms = SmsDeliver(pdu, strict=False) + self.assertEqual(sms.text, text) + + def test_decoding_delivery_status_report(self): + pdu = "0791538375000075061805810531F1019082416500400190824165004000" + sr = { + 'status': 0, + 'scts': datetime(2010, 9, 28, 14, 56), + 'dt': datetime(2010, 9, 28, 14, 56), + 'recipient': '50131' + } + + sms = SmsDeliver(pdu) + self.assertEqual(sms.csca, "+353857000057") + data = sms.data + self.assertEqual(data['ref'], 24) + self.assertEqual(sms.sr, sr) + + def test_decoding_delivery_status_report_without_smsc_address(self): + pdu = "00060505810531F1010150610000400101506100004000" + sr = { + 'status': 0, + 'scts': datetime(2010, 10, 5, 16, 0), + 'dt': datetime(2010, 10, 5, 16, 0), + 'recipient': '50131' + } + + sms = SmsDeliver(pdu) + self.assertEqual(sms.csca, None) + data = sms.data + self.assertEqual(data['ref'], 5) + self.assertEqual(sms.sr, sr) + +# XXX: renable when support added +# def test_decoding_submit_status_report(self): +# # sent from SMSC to indicate submission failed or additional info +# pdu = "07914306073011F001000B914306565711F9000007F0B2FC0DCABF01" +# csca = "+34607003110" +# number = "SR-UNKNOWN" +# +# sms = SmsDeliver(pdu) +# self.assertEqual(sms.csca, csca) +# self.assertEqual(sms.number, number) diff --git a/messaging/test/test_udh.py b/messaging/test/test_udh.py new file mode 100644 index 0000000..9496ff6 --- /dev/null +++ b/messaging/test/test_udh.py @@ -0,0 +1,24 @@ +import unittest + +from messaging.sms.udh import UserDataHeader +from messaging.utils import to_array + + +class TestUserDataHeader(unittest.TestCase): + + def test_user_data_header(self): + data = to_array("08049f8e020105040b8423f0") + udh = UserDataHeader.from_bytes(data) + + self.assertEqual(udh.concat.seq, 1) + self.assertEqual(udh.concat.cnt, 2) + self.assertEqual(udh.concat.ref, 40846) + self.assertEqual(udh.ports.dest_port, 2948) + self.assertEqual(udh.ports.orig_port, 9200) + + data = to_array("0003190201") + udh = UserDataHeader.from_bytes(data) + + self.assertEqual(udh.concat.seq, 1) + self.assertEqual(udh.concat.cnt, 2) + self.assertEqual(udh.concat.ref, 25) diff --git a/messaging/test/test_wap.py b/messaging/test/test_wap.py new file mode 100644 index 0000000..84224a1 --- /dev/null +++ b/messaging/test/test_wap.py @@ -0,0 +1,140 @@ +# -*- coding: utf-8 -*- +from array import array +import unittest + +from messaging.sms import SmsDeliver +from messaging.sms.wap import (is_a_wap_push_notification as is_push, + is_mms_notification, + extract_push_notification) + + +def list_to_str(l): + a = array("B", l) + return a.tostring() + + +class TestSmsWapPush(unittest.TestCase): + + data = [1, 6, 34, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, + 110, 47, 118, 110, 100, 46, 119, 97, 112, 46, 109, 109, 115, 45, + 109, 101, 115, 115, 97, 103, 101, 0, 175, 132, 140, 130, 152, 78, + 79, 75, 53, 67, 105, 75, 99, 111, 84, 77, 89, 83, 71, 52, 77, 66, + 83, 119, 65, 65, 115, 75, 118, 49, 52, 70, 85, 72, 65, 65, 65, 65, + 65, 65, 65, 65, 0, 141, 144, 137, 25, 128, 43, 52, 52, 55, 55, 56, + 53, 51, 52, 50, 55, 52, 57, 47, 84, 89, 80, 69, 61, 80, 76, 77, 78, + 0, 138, 128, 142, 2, 116, 0, 136, 5, 129, 3, 1, 25, 64, 131, 104, + 116, 116, 112, 58, 47, 47, 112, 114, 111, 109, 109, 115, 47, 115, + 101, 114, 118, 108, 101, 116, 115, 47, 78, 79, 75, 53, 67, 105, 75, + 99, 111, 84, 77, 89, 83, 71, 52, 77, 66, 83, 119, 65, 65, 115, 75, + 118, 49, 52, 70, 85, 72, 65, 65, 65, 65, 65, 65, 65, 65, 0] + + def test_is_a_wap_push_notification(self): + self.assertTrue(is_push(list_to_str(self.data))) + self.assertTrue(is_push(list_to_str([1, 6, 57, 92, 45]))) + self.assertFalse(is_push(list_to_str([4, 5, 57, 92, 45]))) + self.assertRaises(TypeError, is_push, 1) + + def test_decoding_m_notification_ind(self): + pdus = [ + "0791447758100650400E80885810000000810004016082415464408C0C08049F8E020105040B8423F00106226170706C69636174696F6E2F766E642E7761702E6D6D732D6D65737361676500AF848C82984E4F4B3543694B636F544D595347344D4253774141734B7631344655484141414141414141008D908919802B3434373738353334323734392F545950453D504C4D4E008A808E0274008805810301194083687474703A2F", + "0791447758100650440E8088581000000081000401608241547440440C08049F8E020205040B8423F02F70726F6D6D732F736572766C6574732F4E4F4B3543694B636F544D595347344D4253774141734B763134465548414141414141414100", + ] + number = '3838383530313030303030303138'.decode('hex') + csca = "+447785016005" + data = "" + + sms = SmsDeliver(pdus[0]) + self.assertEqual(sms.udh.concat.ref, 40846) + self.assertEqual(sms.udh.concat.cnt, 2) + self.assertEqual(sms.udh.concat.seq, 1) + self.assertEqual(sms.number, number) + self.assertEqual(sms.csca, csca) + data += sms.text + + sms = SmsDeliver(pdus[1]) + self.assertEqual(sms.udh.concat.ref, 40846) + self.assertEqual(sms.udh.concat.cnt, 2) + self.assertEqual(sms.udh.concat.seq, 2) + self.assertEqual(sms.number, number) + data += sms.text + + mms = extract_push_notification(data) + self.assertEqual(is_mms_notification(mms), True) + + self.assertEqual(mms.headers['Message-Type'], 'm-notification-ind') + self.assertEqual(mms.headers['Transaction-Id'], + 'NOK5CiKcoTMYSG4MBSwAAsKv14FUHAAAAAAAA') + self.assertEqual(mms.headers['MMS-Version'], '1.0') + self.assertEqual(mms.headers['From'], + '2b3434373738353334323734392f545950453d504c4d4e'.decode('hex')) + self.assertEqual(mms.headers['Message-Class'], 'Personal') + self.assertEqual(mms.headers['Message-Size'], 29696) + self.assertEqual(mms.headers['Expiry'], 72000) + self.assertEqual(mms.headers['Content-Location'], + 'http://promms/servlets/NOK5CiKcoTMYSG4MBSwAAsKv14FUHAAAAAAAA') + + pdus = [ + "0791447758100650400E80885810000000800004017002314303408C0C0804DFD3020105040B8423F00106226170706C69636174696F6E2F766E642E7761702E6D6D732D6D65737361676500AF848C82984E4F4B3541315A6446544D595347344F3356514141734A763934476F4E4141414141414141008D908919802B3434373731373237353034392F545950453D504C4D4E008A808E0274008805810303F47F83687474703A2F", + "0791447758100650440E8088581000000080000401700231431340440C0804DFD3020205040B8423F02F70726F6D6D732F736572766C6574732F4E4F4B3541315A6446544D595347344F3356514141734A763934476F4E414141414141414100", + ] + + number = "88850100000008" + data = "" + + sms = SmsDeliver(pdus[0]) + self.assertEqual(sms.udh.concat.ref, 57299) + self.assertEqual(sms.udh.concat.cnt, 2) + self.assertEqual(sms.udh.concat.seq, 1) + self.assertEqual(sms.number, number) + data += sms.text + + sms = SmsDeliver(pdus[1]) + self.assertEqual(sms.udh.concat.ref, 57299) + self.assertEqual(sms.udh.concat.cnt, 2) + self.assertEqual(sms.udh.concat.seq, 2) + self.assertEqual(sms.number, number) + data += sms.text + + mms = extract_push_notification(data) + self.assertEqual(is_mms_notification(mms), True) + + self.assertEqual(mms.headers['Message-Type'], 'm-notification-ind') + self.assertEqual(mms.headers['Transaction-Id'], + 'NOK5A1ZdFTMYSG4O3VQAAsJv94GoNAAAAAAAA') + self.assertEqual(mms.headers['MMS-Version'], '1.0') + self.assertEqual(mms.headers['From'], + '2b3434373731373237353034392f545950453d504c4d4e'.decode('hex')) + self.assertEqual(mms.headers['Message-Class'], 'Personal') + self.assertEqual(mms.headers['Message-Size'], 29696) + self.assertEqual(mms.headers['Expiry'], 259199) + self.assertEqual(mms.headers['Content-Location'], + 'http://promms/servlets/NOK5A1ZdFTMYSG4O3VQAAsJv94GoNAAAAAAAA') + + def test_decoding_generic_wap_push(self): + pdus = [ + "0791947122725014440C8500947122921105F5112042519582408C0B05040B8423F0000396020101060B03AE81EAC3958D01A2B48403056A0A20566F6461666F6E650045C60C037761702E6D65696E63616C6C79612E64652F000801035A756D206B6F7374656E6C6F73656E20506F7274616C20224D65696E0083000322202D2065696E66616368206175662064656E20666F6C67656E64656E204C696E6B206B6C69636B656E", + "0791947122725014440C8500947122921105F5112042519592403C0B05040B8423F00003960202206F6465722064696520536569746520646972656B7420617566727566656E2E2049687200830003205465616D000101", + ] + number = '303034393137323232393131'.decode('hex') + csca = "+491722270541" + data = "" + + sms = SmsDeliver(pdus[0]) + self.assertEqual(sms.udh.concat.ref, 150) + self.assertEqual(sms.udh.concat.cnt, 2) + self.assertEqual(sms.udh.concat.seq, 1) + self.assertEqual(sms.number, number) + self.assertEqual(sms.csca, csca) + data += sms.text + + sms = SmsDeliver(pdus[1]) + self.assertEqual(sms.udh.concat.ref, 150) + self.assertEqual(sms.udh.concat.cnt, 2) + self.assertEqual(sms.udh.concat.seq, 2) + self.assertEqual(sms.number, number) + data += sms.text + + self.assertEqual(data, '\x01\x06\x0b\x03\xae\x81\xea\xc3\x95\x8d\x01\xa2\xb4\x84\x03\x05j\n Vodafone\x00E\xc6\x0c\x03wap.meincallya.de/\x00\x08\x01\x03Zum kostenlosen Portal "Mein\x00\x83\x00\x03" - einfach auf den folgenden Link klicken oder die Seite direkt aufrufen. Ihr\x00\x83\x00\x03 Team\x00\x01\x01') + + push = extract_push_notification(data) + self.assertEqual(is_mms_notification(push), False) diff --git a/messaging/utils.py b/messaging/utils.py new file mode 100644 index 0000000..9544a4d --- /dev/null +++ b/messaging/utils.py @@ -0,0 +1,267 @@ +from array import array +from datetime import timedelta, tzinfo +from math import floor +import sys + + +class FixedOffset(tzinfo): + """Fixed offset in minutes east from UTC.""" + + def __init__(self, offset, name): + if isinstance(offset, timedelta): + self.offset = offset + else: + self.offset = timedelta(minutes=offset) + + self.__name = name + + @classmethod + def from_timezone(cls, tz_str, name): + # no timezone, GMT+3, GMT-3 + # '', '+0330', '-0300' + if not tz_str: + return cls(timedelta(0), name) + + sign = 1 if '+' in tz_str else -1 + offset = tz_str.replace('+', '').replace('-', '') + hours, minutes = int(offset[:2]), int(offset[2:]) + minutes += hours * 60 + + if sign == 1: + td = timedelta(minutes=minutes) + elif sign == -1: + td = timedelta(days=-1, minutes=minutes) + + return cls(td, name) + + def utcoffset(self, dt): + return self.offset + + def tzname(self, dt): + return self.__name + + def dst(self, dt): + return timedelta(0) + + +def bytes_to_str(b): + if sys.version_info >= (3,): + return b.decode('latin1') + + return b + + +def to_array(pdu): + return array('B', [int(pdu[i:i + 2], 16) for i in range(0, len(pdu), 2)]) + + +def to_bytes(s): + if sys.version_info >= (3,): + return bytes(s) + + return ''.join(map(chr, s)) + + +def debug(s): + # set this to True if you want to poke at PDU encoding/decoding + if False: + print(s) + + +def swap(s): + """Swaps ``s`` according to GSM 23.040""" + what = s[:] + for n in range(1, len(what), 2): + what[n - 1], what[n] = what[n], what[n - 1] + + return what + + +def swap_number(n): + data = swap(list(n.replace('f', ''))) + return ''.join(data) + + +def clean_number(n): + return n.strip().replace(' ', '') + + +def encode_str(s): + """Returns the hexadecimal representation of ``s``""" + return ''.join(["%02x" % ord(n) for n in s]) + + +def encode_bytes(b): + return ''.join(["%02x" % n for n in b]) + + +def pack_8bits_to_7bits(message, udh=None): + pdu = "" + txt = bytes_to_str(message) + + if udh is None: + tl = len(txt) + txt += '\x00' + msgl = int(len(txt) * 7 / 8) + op = [-1] * msgl + c = shift = 0 + + for n in range(msgl): + if shift == 6: + c += 1 + + shift = n % 7 + lb = ord(txt[c]) >> shift + hb = (ord(txt[c + 1]) << (7 - shift) & 255) + op[n] = lb + hb + c += 1 + + pdu = chr(tl) + ''.join(map(chr, op)) + else: + txt = "\x00\x00\x00\x00\x00\x00" + txt + tl = len(txt) + + txt += '\x00' + msgl = int(len(txt) * 7 / 8) + op = [-1] * msgl + c = shift = 0 + + for n in range(msgl): + if shift == 6: + c += 1 + + shift = n % 7 + lb = ord(txt[c]) >> shift + hb = (ord(txt[c + 1]) << (7 - shift) & 255) + op[n] = lb + hb + c += 1 + + for i, char in enumerate(udh): + op[i] = ord(char) + + pdu = chr(tl) + ''.join(map(chr, op)) + + return encode_str(pdu) + + +def pack_8bits_to_8bit(message, udh=None): + text = message + if udh is not None: + text = udh + text + + mlen = len(text) + message = chr(mlen) + message + return encode_str(message) + + +def pack_8bits_to_ucs2(message, udh=None): + # XXX: This does not control the size respect to UDH + text = message + nmesg = '' + + if udh is not None: + text = udh + text + + for n in text: + nmesg += chr(ord(n) >> 8) + chr(ord(n) & 0xFF) + + mlen = len(text) * 2 + message = chr(mlen) + nmesg + return encode_str(message) + + +def unpack_msg(pdu): + """Unpacks ``pdu`` into septets and returns the decoded string""" + # Taken/modified from Dave Berkeley's pysms package + count = last = 0 + result = [] + + for i in range(0, len(pdu), 2): + byte = int(pdu[i:i + 2], 16) + mask = 0x7F >> count + out = ((byte & mask) << count) + last + last = byte >> (7 - count) + result.append(out) + + if len(result) >= 0xa0: + break + + if count == 6: + result.append(last) + last = 0 + + count = (count + 1) % 7 + + return to_bytes(result) + + +def unpack_msg2(pdu): + """Unpacks ``pdu`` into septets and returns the decoded string""" + # Taken/modified from Dave Berkeley's pysms package + count = last = 0 + result = [] + + for byte in pdu: + mask = 0x7F >> count + out = ((byte & mask) << count) + last + last = byte >> (7 - count) + result.append(out) + + if len(result) >= 0xa0: + break + + if count == 6: + result.append(last) + last = 0 + + count = (count + 1) % 7 + + return to_bytes(result) + + +def timedelta_to_relative_validity(t): + """ + Convert ``t`` to its relative validity period + + In case the resolution of ``t`` is too small for a time unit, + it will be floor-rounded to the previous sane value + + :type t: datetime.timedelta + + :return int + """ + if t < timedelta(minutes=5): + raise ValueError("Min resolution is five minutes") + + if t > timedelta(weeks=63): + raise ValueError("Max validity is 63 weeks") + + if t <= timedelta(hours=12): + return int(floor(t.seconds / (60 * 5))) - 1 + + if t <= timedelta(hours=24): + t -= timedelta(hours=12) + return int(floor(t.seconds / (60 * 30))) + 143 + + if t <= timedelta(days=30): + return t.days + 166 + + if t <= timedelta(weeks=63): + return int(floor(t.days / 7)) + 192 + + +def datetime_to_absolute_validity(d, tzname='Unknown'): + """Convert ``d`` to its integer representation""" + n = d.strftime("%y %m %d %H %M %S %z").split(" ") + # compute offset + offset = FixedOffset.from_timezone(n[-1], tzname).offset + # one unit is 15 minutes + s = "%02d" % int(floor(offset.seconds / (60 * 15))) + + if offset.days < 0: + # set MSB to 1 + s = "%02x" % ((int(s[0]) << 4) | int(s[1]) | 0x80) + + n[-1] = s + + return [int(c[::-1], 16) for c in n] diff --git a/requirements.txt b/requirements.txt index 8eb8388..0969dc0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -18,3 +18,4 @@ pinax-theme-bootstrap django-bootstrap3 requests webdavclient +pyst2 diff --git a/systemd_units/djing_dial.service b/systemd_units/djing_dial.service new file mode 100644 index 0000000..a3adbf6 --- /dev/null +++ b/systemd_units/djing_dial.service @@ -0,0 +1,12 @@ +[Unit] +Description=Dialing inbox sms unit + +[Service] +Type=simple +ExecStart=/usr/bin/python3 dialing.py +WorkingDirectory=/srv/http/djing +User=http +Group=http + +[Install] +WantedBy=multi-user.target