├── .gitignore ├── LICENSE ├── README.md ├── manage.py ├── notes.txt ├── requirements.txt ├── run.sh └── service ├── __init__.py ├── quickstart ├── __init__.py ├── admin.py ├── apps.py ├── config.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_auto_20170704_0922.py │ ├── 0003_auto_20170704_0923.py │ ├── 0004_account_label.py │ ├── 0005_auto_20170705_1208.py │ ├── 0006_auto_20170705_1217.py │ ├── 0007_auto_20170705_1316.py │ └── __init__.py ├── models.py ├── serializers.py ├── tests.py ├── views.py ├── whatsapp.py ├── whatsapp_layer.py └── whatsapp_stack.py ├── settings.py ├── urls.py ├── whatsapp.example.conf ├── wsgi.py └── yowsup ├── LICENSE ├── MANIFEST.in ├── README.md ├── setup.py ├── tox.ini ├── yowsup-cli └── yowsup ├── __init__.py ├── common ├── __init__.py ├── constants.py ├── http │ ├── __init__.py │ ├── httpproxy.py │ ├── test_warequest.py │ ├── warequest.py │ └── waresponseparser.py ├── mime.types ├── optionalmodules.py └── tools.py ├── demos ├── __init__.py ├── cli │ ├── __init__.py │ ├── cli.py │ ├── layer.py │ └── stack.py ├── contacts │ ├── __init__.py │ ├── layer.py │ └── stack.py ├── echoclient │ ├── __init__.py │ ├── layer.py │ └── stack.py └── sendclient │ ├── __init__.py │ ├── layer.py │ └── stack.py ├── env ├── __init__.py ├── env.py ├── env_android.py ├── env_s40.py └── test_env_s40.py ├── layers ├── __init__.py ├── auth │ ├── __init__.py │ ├── autherror.py │ ├── keystream.py │ ├── layer_authentication.py │ ├── layer_crypt.py │ ├── layer_interface_authentication.py │ ├── protocolentities │ │ ├── __init__.py │ │ ├── auth.py │ │ ├── challenge.py │ │ ├── failure.py │ │ ├── response.py │ │ ├── stream_error.py │ │ ├── stream_features.py │ │ ├── success.py │ │ ├── test_auth.py │ │ ├── test_challenge.py │ │ ├── test_failure.py │ │ ├── test_response.py │ │ ├── test_stream_features.py │ │ └── test_success.py │ ├── test_authenticator.py │ ├── test_crypt.py │ └── test_keystream.py ├── axolotl │ ├── __init__.py │ ├── layer_base.py │ ├── layer_control.py │ ├── layer_receive.py │ ├── layer_send.py │ ├── props.py │ ├── protocolentities │ │ ├── __init__.py │ │ ├── enc.py │ │ ├── iq_key_get.py │ │ ├── iq_keys_get_result.py │ │ ├── iq_keys_set.py │ │ ├── message_encrypted.py │ │ ├── notification_encrypt.py │ │ ├── receipt_incoming_retry.py │ │ ├── receipt_outgoing_retry.py │ │ ├── test_iq_keys_get_result.py │ │ ├── test_iq_keys_set.py │ │ └── test_notification_encrypt.py │ └── store │ │ ├── __init__.py │ │ └── sqlite │ │ ├── __init__.py │ │ ├── liteaxolotlstore.py │ │ ├── liteidentitykeystore.py │ │ ├── liteprekeystore.py │ │ ├── litesenderkeystore.py │ │ ├── litesessionstore.py │ │ └── litesignedprekeystore.py ├── coder │ ├── __init__.py │ ├── decoder.py │ ├── encoder.py │ ├── layer.py │ ├── test_decoder.py │ ├── test_encoder.py │ ├── test_tokendictionary.py │ └── tokendictionary.py ├── interface │ ├── __init__.py │ └── interface.py ├── logger │ ├── __init__.py │ └── layer.py ├── network │ ├── __init__.py │ ├── layer.py │ └── layer_interface.py ├── protocol_acks │ ├── __init__.py │ ├── layer.py │ ├── protocolentities │ │ ├── __init__.py │ │ ├── ack.py │ │ ├── ack_incoming.py │ │ ├── ack_outgoing.py │ │ ├── test_ack_incoming.py │ │ └── test_ack_outgoing.py │ └── test_layer.py ├── protocol_calls │ ├── __init__.py │ ├── layer.py │ └── protocolentities │ │ ├── __init__.py │ │ ├── call.py │ │ └── test_call.py ├── protocol_chatstate │ ├── __init__.py │ ├── layer.py │ ├── protocolentities │ │ ├── __init__.py │ │ ├── chatstate.py │ │ ├── chatstate_incoming.py │ │ ├── chatstate_outgoing.py │ │ ├── test_chatstate_incoming.py │ │ └── test_chatstate_outgoing.py │ └── test_layer.py ├── protocol_contacts │ ├── __init__.py │ ├── layer.py │ ├── protocolentities │ │ ├── __init__.py │ │ ├── iq_statuses_get.py │ │ ├── iq_statuses_result.py │ │ ├── iq_sync.py │ │ ├── iq_sync_get.py │ │ ├── iq_sync_result.py │ │ ├── notification_contact.py │ │ ├── notification_contact_add.py │ │ ├── notification_contact_remove.py │ │ ├── notification_contact_update.py │ │ ├── notificiation_contacts_sync.py │ │ ├── test_iq_sync_get.py │ │ ├── test_iq_sync_result.py │ │ ├── test_notification_contact_add.py │ │ ├── test_notification_contact_remove.py │ │ └── test_notification_contact_update.py │ └── test_layer.py ├── protocol_groups │ ├── __init__.py │ ├── layer.py │ ├── protocolentities │ │ ├── __init__.py │ │ ├── iq_groups.py │ │ ├── iq_groups_create.py │ │ ├── iq_groups_create_success.py │ │ ├── iq_groups_info.py │ │ ├── iq_groups_leave.py │ │ ├── iq_groups_leave_success.py │ │ ├── iq_groups_list.py │ │ ├── iq_groups_participants.py │ │ ├── iq_groups_participants_add.py │ │ ├── iq_groups_participants_add_failure.py │ │ ├── iq_groups_participants_add_success.py │ │ ├── iq_groups_participants_demote.py │ │ ├── iq_groups_participants_promote.py │ │ ├── iq_groups_participants_remove.py │ │ ├── iq_groups_participants_remove_success.py │ │ ├── iq_groups_subject.py │ │ ├── iq_result_groups_info.py │ │ ├── iq_result_groups_list.py │ │ ├── iq_result_participants_list.py │ │ ├── notification_groups.py │ │ ├── notification_groups_add.py │ │ ├── notification_groups_create.py │ │ ├── notification_groups_remove.py │ │ ├── notification_groups_subject.py │ │ ├── test_iq_groups.py │ │ ├── test_iq_groups_create.py │ │ ├── test_iq_groups_create_success.py │ │ ├── test_iq_groups_list.py │ │ ├── test_iq_result_groups.py │ │ └── test_iq_result_groups_list.py │ └── structs │ │ ├── __init__.py │ │ └── group.py ├── protocol_ib │ ├── __init__.py │ ├── layer.py │ └── protocolentities │ │ ├── __init__.py │ │ ├── account_ib.py │ │ ├── clean_iq.py │ │ ├── dirty_ib.py │ │ ├── ib.py │ │ ├── offline_ib.py │ │ ├── test_clean_iq.py │ │ ├── test_dirty_ib.py │ │ ├── test_ib.py │ │ └── test_offline_iq.py ├── protocol_iq │ ├── __init__.py │ ├── layer.py │ └── protocolentities │ │ ├── __init__.py │ │ ├── iq.py │ │ ├── iq_crypto.py │ │ ├── iq_error.py │ │ ├── iq_ping.py │ │ ├── iq_props.py │ │ ├── iq_push.py │ │ ├── iq_result.py │ │ ├── iq_result_pong.py │ │ ├── test_iq.py │ │ ├── test_iq_error.py │ │ └── test_iq_result.py ├── protocol_media │ ├── __init__.py │ ├── layer.py │ ├── mediadownloader.py │ ├── mediauploader.py │ ├── picture.py │ └── protocolentities │ │ ├── __init__.py │ │ ├── builder_message_media_downloadable.py │ │ ├── iq_requestupload.py │ │ ├── iq_requestupload_result.py │ │ ├── message_media.py │ │ ├── message_media_downloadable.py │ │ ├── message_media_downloadable_audio.py │ │ ├── message_media_downloadable_image.py │ │ ├── message_media_downloadable_video.py │ │ ├── message_media_location.py │ │ ├── message_media_vcard.py │ │ ├── test_iq_requestupload.py │ │ ├── test_iq_requestupload_result.py │ │ ├── test_message_media.py │ │ ├── test_message_media_downloadable.py │ │ ├── test_message_media_downloadable_audio.py │ │ ├── test_message_media_downloadable_image.py │ │ ├── test_message_media_downloadable_video.py │ │ ├── test_message_media_location.py │ │ └── test_message_media_vcard.py ├── protocol_messages │ ├── __init__.py │ ├── layer.py │ ├── proto │ │ ├── __init__.py │ │ ├── wa.proto │ │ └── wa_pb2.py │ └── protocolentities │ │ ├── __init__.py │ │ ├── message.py │ │ ├── message_text.py │ │ ├── message_text_broadcast.py │ │ ├── test_message.py │ │ ├── test_message_text.py │ │ └── test_message_text_broadcast.py ├── protocol_notifications │ ├── __init__.py │ ├── layer.py │ └── protocolentities │ │ ├── __init__.py │ │ ├── notification.py │ │ ├── notification_picture.py │ │ ├── notification_picture_delete.py │ │ ├── notification_picture_set.py │ │ ├── notification_status.py │ │ ├── test_notification.py │ │ ├── test_notification_picture.py │ │ ├── test_notification_picture_delete.py │ │ ├── test_notification_picture_set.py │ │ └── test_notification_status.py ├── protocol_presence │ ├── __init__.py │ ├── layer.py │ └── protocolentities │ │ ├── __init__.py │ │ ├── iq_lastseen.py │ │ ├── iq_lastseen_result.py │ │ ├── presence.py │ │ ├── presence_available.py │ │ ├── presence_subscribe.py │ │ ├── presence_unavailable.py │ │ ├── presence_unsubscribe.py │ │ ├── test_presence.py │ │ ├── test_presence_available.py │ │ ├── test_presence_subscribe.py │ │ ├── test_presence_unavailable.py │ │ └── test_presence_unsubscribe.py ├── protocol_privacy │ ├── __init__.py │ ├── layer.py │ └── protocolentities │ │ ├── __init__.py │ │ └── privacylist_iq.py ├── protocol_profiles │ ├── __init__.py │ ├── layer.py │ └── protocolentities │ │ ├── __init__.py │ │ ├── iq_picture.py │ │ ├── iq_picture_get.py │ │ ├── iq_picture_get_result.py │ │ ├── iq_picture_set.py │ │ ├── iq_pictures_list.py │ │ ├── iq_privacy_get.py │ │ ├── iq_privacy_result.py │ │ ├── iq_privacy_set.py │ │ ├── iq_status_set.py │ │ ├── iq_unregister.py │ │ ├── test_iq_privacy_get.py │ │ ├── test_iq_privacy_result.py │ │ ├── test_iq_privacy_set.py │ │ ├── test_iq_status_set.py │ │ └── test_iq_unregister.py ├── protocol_receipts │ ├── __init__.py │ ├── layer.py │ └── protocolentities │ │ ├── __init__.py │ │ ├── receipt.py │ │ ├── receipt_incoming.py │ │ ├── receipt_outgoing.py │ │ ├── test_receipt_incoming.py │ │ └── test_receipt_outgoing.py └── stanzaregulator │ ├── __init__.py │ └── layer.py ├── registration ├── __init__.py ├── coderequest.py ├── existsrequest.py └── regrequest.py ├── stacks ├── __init__.py └── yowstack.py └── structs ├── __init__.py ├── protocolentity.py └── protocoltreenode.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Project specific stuff 2 | db.sqlite3 3 | whatsapp.conf 4 | 5 | # Byte-compiled / optimized / DLL files 6 | __pycache__/ 7 | *.py[cod] 8 | *$py.class 9 | 10 | # C extensions 11 | *.so 12 | 13 | # Distribution / packaging 14 | .Python 15 | /env/ 16 | build/ 17 | develop-eggs/ 18 | dist/ 19 | downloads/ 20 | eggs/ 21 | .eggs/ 22 | lib/ 23 | lib64/ 24 | parts/ 25 | sdist/ 26 | var/ 27 | wheels/ 28 | *.egg-info/ 29 | .installed.cfg 30 | *.egg 31 | 32 | # PyInstaller 33 | # Usually these files are written by a python script from a template 34 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 35 | *.manifest 36 | *.spec 37 | 38 | # Installer logs 39 | pip-log.txt 40 | pip-delete-this-directory.txt 41 | 42 | # Unit test / coverage reports 43 | htmlcov/ 44 | .tox/ 45 | .coverage 46 | .coverage.* 47 | .cache 48 | nosetests.xml 49 | coverage.xml 50 | *.cover 51 | .hypothesis/ 52 | 53 | # Translations 54 | *.mo 55 | *.pot 56 | 57 | # Django stuff: 58 | *.log 59 | local_settings.py 60 | 61 | # Flask stuff: 62 | instance/ 63 | .webassets-cache 64 | 65 | # Scrapy stuff: 66 | .scrapy 67 | 68 | # Sphinx documentation 69 | docs/_build/ 70 | 71 | # PyBuilder 72 | target/ 73 | 74 | # Jupyter Notebook 75 | .ipynb_checkpoints 76 | 77 | # pyenv 78 | .python-version 79 | 80 | # celery beat schedule file 81 | celerybeat-schedule 82 | 83 | # SageMath parsed files 84 | *.sage.py 85 | 86 | # dotenv 87 | .env 88 | 89 | # virtualenv 90 | .venv 91 | venv/ 92 | ENV/ 93 | 94 | # Spyder project settings 95 | .spyderproject 96 | .spyproject 97 | 98 | # Rope project settings 99 | .ropeproject 100 | 101 | # mkdocs documentation 102 | /site 103 | 104 | # mypy 105 | .mypy_cache/ 106 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 svub 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | if __name__ == "__main__": 6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "service.settings") 7 | try: 8 | from django.core.management import execute_from_command_line 9 | except ImportError: 10 | # The above import may fail for some other reason. Ensure that the 11 | # issue is really that Django is missing to avoid masking other 12 | # exceptions on Python 2. 13 | try: 14 | import django 15 | except ImportError: 16 | raise ImportError( 17 | "Couldn't import Django. Are you sure it's installed and " 18 | "available on your PYTHONPATH environment variable? Did you " 19 | "forget to activate a virtual environment?" 20 | ) 21 | raise 22 | execute_from_command_line(sys.argv) 23 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | certifi==2017.4.17 2 | chardet==3.0.4 3 | coreapi==2.3.1 4 | coreschema==0.0.4 5 | Django==1.11.3 6 | djangorestframework==3.6.3 7 | idna==2.5 8 | itypes==1.1.0 9 | Jinja2==2.9.6 10 | MarkupSafe==1.0 11 | pytz==2017.2 12 | requests==2.18.1 13 | uritemplate==3.0.0 14 | urllib3==1.21.1 15 | -------------------------------------------------------------------------------- /run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | source env/bin/activate 3 | python manage.py runserver 0.0.0.0:8000 4 | -------------------------------------------------------------------------------- /service/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/svub/whatsapp-rest-webservice/822dfc46b80e7a26eb553e5a10e723dda5a9f77d/service/__init__.py -------------------------------------------------------------------------------- /service/quickstart/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/svub/whatsapp-rest-webservice/822dfc46b80e7a26eb553e5a10e723dda5a9f77d/service/quickstart/__init__.py -------------------------------------------------------------------------------- /service/quickstart/admin.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.contrib import admin 5 | 6 | # Register your models here. 7 | -------------------------------------------------------------------------------- /service/quickstart/apps.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.apps import AppConfig 5 | 6 | 7 | class QuickstartConfig(AppConfig): 8 | name = 'quickstart' 9 | -------------------------------------------------------------------------------- /service/quickstart/config.py: -------------------------------------------------------------------------------- 1 | import ConfigParser 2 | import os 3 | 4 | 5 | class Config: 6 | defaults = {} 7 | # load example.conf for defaults and overwrite if a real config has been created. 8 | configfiles = ['whatsapp.example.conf', 'service/whatsapp.example.conf', 'whatsapp.conf', 'service/whatsapp.conf'] 9 | config=None 10 | 11 | @classmethod 12 | def get(self, section, value): 13 | if not self.config: 14 | # load configuration file once 15 | self.config = ConfigParser.RawConfigParser(self.defaults); 16 | self.config.read(self.configfiles) 17 | 18 | print('Loading WhatsApp configuration.') 19 | print('phone number='+self.config.get('credentials', 'phone')) 20 | print('password='+self.config.get('credentials', 'password')) 21 | 22 | return self.config.get(section, value) 23 | -------------------------------------------------------------------------------- /service/quickstart/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.3 on 2017-07-04 09:16 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | ] 14 | 15 | operations = [ 16 | migrations.CreateModel( 17 | name='Account', 18 | fields=[ 19 | ('cc', models.IntegerField(default=49, help_text='Country code without +')), 20 | ('phone', models.IntegerField(help_text='Full phone number with country code but without +', primary_key=True, serialize=False)), 21 | ('mcc', models.IntegerField(choices=[(26203, 'O2'), (26201, 'Telekom'), (26202, 'Vodafone')], help_text='The mobile phone provider you are using.')), 22 | ('created', models.DateTimeField(auto_now_add=True, help_text='Time when account was added.')), 23 | ], 24 | ), 25 | migrations.CreateModel( 26 | name='Message', 27 | fields=[ 28 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 29 | ('origin', models.IntegerField(help_text='Phone number of WhatsApp account owner')), 30 | ('target', models.IntegerField(help_text='Full phone number of recepiant with country code but without +')), 31 | ('body', models.CharField(help_text='Message text', max_length=500)), 32 | ('timestamp', models.DateTimeField(auto_now_add=True, help_text='Time when message has been sent.')), 33 | ('status', models.CharField(choices=[('U', 'Unsend'), ('S', 'Sent'), ('A', 'Acknowledged')], default='U', max_length=1)), 34 | ], 35 | ), 36 | ] 37 | -------------------------------------------------------------------------------- /service/quickstart/migrations/0002_auto_20170704_0922.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.3 on 2017-07-04 09:22 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('quickstart', '0001_initial'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='account', 17 | name='cc', 18 | field=models.BigIntegerField(default=49, help_text='Country code without +'), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /service/quickstart/migrations/0003_auto_20170704_0923.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.3 on 2017-07-04 09:23 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('quickstart', '0002_auto_20170704_0922'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='account', 17 | name='cc', 18 | field=models.IntegerField(default=49, help_text='Country code without +'), 19 | ), 20 | migrations.AlterField( 21 | model_name='account', 22 | name='phone', 23 | field=models.BigIntegerField(help_text='Full phone number with country code but without +', primary_key=True, serialize=False), 24 | ), 25 | migrations.AlterField( 26 | model_name='message', 27 | name='origin', 28 | field=models.BigIntegerField(help_text='Phone number of WhatsApp account owner'), 29 | ), 30 | migrations.AlterField( 31 | model_name='message', 32 | name='target', 33 | field=models.BigIntegerField(help_text='Full phone number of recepiant with country code but without +'), 34 | ), 35 | ] 36 | -------------------------------------------------------------------------------- /service/quickstart/migrations/0004_account_label.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.3 on 2017-07-04 09:29 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('quickstart', '0003_auto_20170704_0923'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='account', 17 | name='label', 18 | field=models.CharField(default='Sven Buschbeck', help_text='A name for this account to help identify the owner.', max_length=200), 19 | preserve_default=False, 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /service/quickstart/migrations/0005_auto_20170705_1208.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.3 on 2017-07-05 12:08 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('quickstart', '0004_account_label'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='account', 17 | name='api_password', 18 | field=models.CharField(default='NPpELYnv4y50CJDnhfKxcZZwb38=', help_text='The account password required to use the WhatsApp service. Automatically generated when creating and registering a new account.', max_length=50), 19 | preserve_default=False, 20 | ), 21 | migrations.AddField( 22 | model_name='account', 23 | name='sms_code', 24 | field=models.CharField(default='xxx-xxx', help_text='The code received via SMS during registration xxx-xxx.', max_length=7), 25 | preserve_default=False, 26 | ), 27 | ] 28 | -------------------------------------------------------------------------------- /service/quickstart/migrations/0006_auto_20170705_1217.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.3 on 2017-07-05 12:17 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('quickstart', '0005_auto_20170705_1208'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='account', 17 | name='cc', 18 | field=models.CharField(default=49, help_text='Country code without +', max_length=3), 19 | ), 20 | migrations.AlterField( 21 | model_name='account', 22 | name='phone', 23 | field=models.CharField(help_text='Full phone number with country code but without +', max_length=30, primary_key=True, serialize=False), 24 | ), 25 | migrations.AlterField( 26 | model_name='message', 27 | name='origin', 28 | field=models.CharField(help_text='Phone number of WhatsApp account owner', max_length=30), 29 | ), 30 | migrations.AlterField( 31 | model_name='message', 32 | name='target', 33 | field=models.CharField(help_text='Group ID or full phone number of recepient with country code but without +', max_length=50), 34 | ), 35 | ] 36 | -------------------------------------------------------------------------------- /service/quickstart/migrations/0007_auto_20170705_1316.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.3 on 2017-07-05 13:16 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('quickstart', '0006_auto_20170705_1217'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='message', 17 | name='origin', 18 | field=models.CharField(default='', help_text='Phone number of WhatsApp account owner - ignored for now.', max_length=30), 19 | ), 20 | migrations.AlterField( 21 | model_name='message', 22 | name='status', 23 | field=models.CharField(choices=[('U', 'Unsend'), ('S', 'Sent'), ('A', 'Acknowledged'), ('E', 'Error occured trying to send message')], default='U', max_length=1), 24 | ), 25 | ] 26 | -------------------------------------------------------------------------------- /service/quickstart/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/svub/whatsapp-rest-webservice/822dfc46b80e7a26eb553e5a10e723dda5a9f77d/service/quickstart/migrations/__init__.py -------------------------------------------------------------------------------- /service/quickstart/serializers.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | from service.quickstart.models import Account, Message 3 | 4 | 5 | class AccountSerializer(serializers.HyperlinkedModelSerializer): 6 | class Meta: 7 | model = Account 8 | fields = ('label', 'cc', 'phone', 'sms_code', 'api_password', 'mcc') 9 | 10 | class MessageSerializer(serializers.HyperlinkedModelSerializer): 11 | class Meta: 12 | model = Message 13 | fields = ('origin', 'target', 'body', 'timestamp', 'status') 14 | 15 | -------------------------------------------------------------------------------- /service/quickstart/tests.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.test import TestCase 5 | 6 | # Create your tests here. 7 | -------------------------------------------------------------------------------- /service/quickstart/views.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.shortcuts import render 5 | 6 | from rest_framework import viewsets 7 | from service.quickstart.serializers import MessageSerializer, AccountSerializer 8 | from service.quickstart.models import Account, Message 9 | 10 | 11 | class MessageViewSet(viewsets.ModelViewSet): 12 | """ 13 | API endpoint for viewing and sending messages to WhatsApp. 14 | """ 15 | queryset = Message.objects.all().order_by('-timestamp') 16 | serializer_class = MessageSerializer 17 | 18 | class AccountViewSet(viewsets.ModelViewSet): 19 | """ 20 | API endpoint for adding new WhatsApp accounts to the service. 21 | """ 22 | queryset = Account.objects.all().order_by('-created') 23 | serializer_class = AccountSerializer 24 | -------------------------------------------------------------------------------- /service/quickstart/whatsapp.py: -------------------------------------------------------------------------------- 1 | from subprocess import Popen, PIPE 2 | from config import Config 3 | 4 | class WhatsApp: 5 | 6 | """ 7 | The WhatsApp AP Interface 8 | """ 9 | 10 | # for the time being, only one account can be actived and run at the same time 11 | # no need for loading account's data from the DB for now 12 | #origin = '4917667020717' 13 | #password = 'NPpELYnv4y50CJDnhfKxcZZwb38=' 14 | origin = Config.get('credentials', 'phone') 15 | password = Config.get('credentials', 'password') 16 | 17 | # send a message to WhatsApp via CLI 18 | # Example: yowsup-cli demos --login 4917667020717:NPpELYnv4y50CJDnhfKxcZZwb38= --env s40 --send 4917610407181 "Hello World d1" 19 | send_command = 'yowsup-cli demos --login {}:{} --env s40 --send {} "{}"' 20 | 21 | @classmethod 22 | def send(cls, target, body): 23 | rc, output = cls.run(cls.send_command, [cls.origin, cls.password, target, body]); 24 | return rc == 0 25 | 26 | @classmethod 27 | def run(cls, command, parameters): 28 | print('WhatsApp.run') 29 | print(command) 30 | print(parameters) 31 | formatted = command.format(*parameters) 32 | print('> run: ' + formatted) 33 | p = Popen(formatted, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) 34 | output, err = p.communicate() 35 | rc = p.returncode 36 | if rc > 0: 37 | print('Error occured running command '+formatted) 38 | print(rc) 39 | print(output) 40 | print(err) 41 | else: 42 | print('Successful executed command '+formatted) 43 | print(output) 44 | 45 | return [rc, output] 46 | 47 | -------------------------------------------------------------------------------- /service/quickstart/whatsapp_layer.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.interface import YowInterfaceLayer, ProtocolEntityCallback 2 | 3 | class SendLayer(YowInterfaceLayer): 4 | 5 | send(origin, target, body): 6 | outgoingMessageProtocolEntity = TextMessageProtocolEntity( body, target) 7 | self.toLower(outgoingMessageProtocolEntity) 8 | 9 | # receiving data 10 | @ProtocolEntityCallback("message") 11 | def onMessage(self, messageProtocolEntity): 12 | 13 | if messageProtocolEntity.getType() == 'text': 14 | self.onTextMessage(messageProtocolEntity) 15 | elif messageProtocolEntity.getType() == 'media': 16 | self.onMediaMessage(messageProtocolEntity) 17 | 18 | #self.toLower(messageProtocolEntity.forward(messageProtocolEntity.getFrom())) 19 | self.toLower(messageProtocolEntity.ack()) 20 | self.toLower(messageProtocolEntity.ack(True)) 21 | 22 | 23 | @ProtocolEntityCallback("receipt") 24 | def onReceipt(self, entity): 25 | self.toLower(entity.ack()) 26 | 27 | def onTextMessage(self,messageProtocolEntity): 28 | # just print info 29 | print("Received %s from %s" % (messageProtocolEntity.getBody(), messageProtocolEntity.getFrom(False))) 30 | 31 | def onMediaMessage(self, messageProtocolEntity): 32 | # just print info 33 | if messageProtocolEntity.getMediaType() == "image": 34 | print("Echoing image %s to %s" % (messageProtocolEntity.url, messageProtocolEntity.getFrom(False))) 35 | 36 | elif messageProtocolEntity.getMediaType() == "location": 37 | print("Echoing location (%s, %s) to %s" % (messageProtocolEntity.getLatitude(), messageProtocolEntity.getLongitude(), messageProtocolEntity.getFrom(False))) 38 | 39 | elif messageProtocolEntity.getMediaType() == "vcard": 40 | print("Echoing vcard (%s, %s) to %s" % (messageProtocolEntity.getName(), messageProtocolEntity.getCardData(), messageProtocolEntity.getFrom(False))) 41 | -------------------------------------------------------------------------------- /service/quickstart/whatsapp_stack.py: -------------------------------------------------------------------------------- 1 | from yowsup.stacks import YowStackBuilder 2 | from .layer import SendLayer 3 | from yowsup.layers.auth import AuthError 4 | from yowsup.layers import YowLayerEvent 5 | from yowsup.layers.network import YowNetworkLayer 6 | 7 | class YowsupSendStack(object): 8 | def __init__(self, credentials, encryptionEnabled = True): 9 | stackBuilder = YowStackBuilder() 10 | 11 | self.stack = stackBuilder\ 12 | .pushDefaultLayers(encryptionEnabled)\ 13 | .push(SendLayer)\ 14 | .build() 15 | 16 | self.stack.setCredentials(credentials) 17 | 18 | def start(self): 19 | self.stack.broadcastEvent(YowLayerEvent(YowNetworkLayer.EVENT_STATE_CONNECT)) 20 | try: 21 | self.stack.loop() 22 | except AuthError as e: 23 | print("Authentication Error: %s" % e.message) 24 | -------------------------------------------------------------------------------- /service/urls.py: -------------------------------------------------------------------------------- 1 | """service URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/1.11/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.conf.urls import url, include 14 | 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) 15 | """ 16 | from django.contrib import admin 17 | from django.conf.urls import url, include 18 | from rest_framework import routers 19 | from service.quickstart import views 20 | from rest_framework.schemas import get_schema_view 21 | 22 | 23 | router = routers.DefaultRouter() 24 | router.register(r'messages', views.MessageViewSet) 25 | router.register(r'accounts', views.AccountViewSet) 26 | 27 | schema_view = get_schema_view(title='WhatsApp API') 28 | 29 | urlpatterns = [ 30 | url(r'^', include(router.urls)), 31 | url(r'^admin/', admin.site.urls), 32 | url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), 33 | url(r'^schema/$', schema_view), 34 | ] 35 | -------------------------------------------------------------------------------- /service/whatsapp.example.conf: -------------------------------------------------------------------------------- 1 | [credentials] 2 | phone=4910717766702 3 | password=NP0CJDnhfKxcpELYnv4y5ZZwb38= 4 | -------------------------------------------------------------------------------- /service/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for service project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/1.11/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "service.settings") 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /service/yowsup/MANIFEST.in: -------------------------------------------------------------------------------- 1 | include yowsup/common/mime.types 2 | -------------------------------------------------------------------------------- /service/yowsup/setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | from __future__ import print_function 3 | from setuptools import setup, find_packages 4 | import yowsup 5 | import platform 6 | import sys 7 | 8 | deps = ['python-dateutil', 'argparse', 'python-axolotl>=0.1.39', 'six'] 9 | 10 | if sys.version_info < (2,7): 11 | deps += ['importlib'] 12 | 13 | if platform.system().lower() == "windows": 14 | deps.append('pyreadline') 15 | else: 16 | try: 17 | import readline 18 | except ImportError: 19 | deps.append('readline') 20 | 21 | setup( 22 | name='yowsup2', 23 | version=yowsup.__version__, 24 | url='http://github.com/tgalal/yowsup/', 25 | license='GPL-3+', 26 | author='Tarek Galal', 27 | tests_require=[], 28 | install_requires = deps, 29 | scripts = ['yowsup-cli'], 30 | #cmdclass={'test': PyTest}, 31 | author_email='tare2.galal@gmail.com', 32 | description='A WhatsApp python library', 33 | #long_description=long_description, 34 | packages= find_packages(), 35 | include_package_data=True, 36 | data_files = [('yowsup/common', ['yowsup/common/mime.types'])], 37 | platforms='any', 38 | #test_suite='', 39 | classifiers = [ 40 | 'Programming Language :: Python', 41 | 'Development Status :: 4 - Beta', 42 | 'Natural Language :: English', 43 | #'Environment :: Web Environment', 44 | 'Intended Audience :: Developers', 45 | 'License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)', 46 | 'Operating System :: OS Independent', 47 | 'Topic :: Software Development :: Libraries :: Python Modules' 48 | ], 49 | #extras_require={ 50 | # 'testing': ['pytest'], 51 | #} 52 | ) 53 | -------------------------------------------------------------------------------- /service/yowsup/tox.ini: -------------------------------------------------------------------------------- 1 | # Tox (http://tox.testrun.org/) is a tool for running tests 2 | # in multiple virtualenvs. This configuration file will run the 3 | # test suite on all supported python versions. To use it, "pip install tox" 4 | # and then run "tox" from this directory. 5 | 6 | [tox] 7 | skip_missing_interpreters = true 8 | envlist = py26, py27, py32, py33, py34, py35, py36 9 | 10 | [testenv] 11 | commands = nosetests yowsup 12 | deps = 13 | py26: importlib 14 | nose 15 | python-dateutil 16 | python-axolotl 17 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/__init__.py: -------------------------------------------------------------------------------- 1 | __version__ = "2.5.2" 2 | __author__ = "Tarek Galal" 3 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/common/__init__.py: -------------------------------------------------------------------------------- 1 | from .constants import YowConstants -------------------------------------------------------------------------------- /service/yowsup/yowsup/common/constants.py: -------------------------------------------------------------------------------- 1 | class YowConstants: 2 | DOMAIN = "s.whatsapp.net" 3 | ENDPOINTS = ( 4 | ("e1.whatsapp.net", 443), 5 | ("e2.whatsapp.net", 443), 6 | ("e3.whatsapp.net", 443), 7 | ("e4.whatsapp.net", 443), 8 | ("e5.whatsapp.net", 443), 9 | ("e6.whatsapp.net", 443), 10 | ("e7.whatsapp.net", 443), 11 | ("e8.whatsapp.net", 443), 12 | ("e9.whatsapp.net", 443), 13 | ("e10.whatsapp.net", 443), 14 | ("e11.whatsapp.net", 443), 15 | ("e12.whatsapp.net", 443), 16 | ("e13.whatsapp.net", 443), 17 | ("e14.whatsapp.net", 443), 18 | ("e15.whatsapp.net", 443), 19 | ("e16.whatsapp.net", 443), 20 | ) 21 | 22 | WHATSAPP_SERVER = "s.whatsapp.net" 23 | WHATSAPP_GROUP_SERVER = "g.us" 24 | 25 | PATH_STORAGE = "~/.yowsup" 26 | 27 | PREVIEW_WIDTH = 64 28 | PREVIEW_HEIGHT = 64 29 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/common/http/__init__.py: -------------------------------------------------------------------------------- 1 | from .httpproxy import HttpProxy 2 | from .warequest import WARequest 3 | from .waresponseparser import JSONResponseParser -------------------------------------------------------------------------------- /service/yowsup/yowsup/common/http/test_warequest.py: -------------------------------------------------------------------------------- 1 | from yowsup.common.http.warequest import WARequest -------------------------------------------------------------------------------- /service/yowsup/yowsup/common/mime.types: -------------------------------------------------------------------------------- 1 | audio/3gpp 3gpp 2 | audio/aac aac 3 | audio/aiff aif 4 | audio/amr amr 5 | audio/mp4 m4a 6 | audio/mpeg mp3 mp2 mpga mpega 7 | audio/ogg oga ogg opus spx 8 | audio/qcelp qcp 9 | audio/wav wav 10 | audio/webm webm 11 | audio/x-caf caf 12 | audio/x-ms-wma wma 13 | audio/ogg ogg 14 | image/gif gif 15 | image/jpeg jpe jpg jpeg 16 | image/png png 17 | video/3gpp 3gp 18 | video/avi avi 19 | video/mp4 mp4 20 | video/mpeg m1v mpeg mpa mpg mpe 21 | video/quicktime mov qt 22 | video/x-flv flv 23 | video/x-ms-asf asf asx 24 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/common/optionalmodules.py: -------------------------------------------------------------------------------- 1 | import importlib 2 | import logging 3 | logger = logging.getLogger(__name__) 4 | from contextlib import contextmanager 5 | 6 | class OptionalModule(object): 7 | def __init__(self, modulename, failMessage = None, require = False): 8 | self.modulename = modulename 9 | self.require = require 10 | self.failMessage = failMessage 11 | 12 | def __enter__(self): 13 | return self.importFn 14 | 15 | def importFn(self, what = None): 16 | imp = self.modulename if not what else ("%s.%s" % (self.modulename, what)) 17 | return importlib.import_module(imp) 18 | 19 | def __exit__(self, exc_type, exc_val, exc_tb): 20 | if isinstance(exc_val, ImportError): 21 | failMessage = self.failMessage if self.failMessage is not None else ("%s import failed" % self.modulename) 22 | if failMessage: 23 | logger.error(failMessage) 24 | if self.require: 25 | raise 26 | return True 27 | 28 | class PILOptionalModule(OptionalModule): 29 | def __init__(self, failMessage = None, require = False): 30 | super(PILOptionalModule, self).__init__("PIL", 31 | failMessage= failMessage, 32 | require = require) 33 | 34 | class FFVideoOptionalModule(OptionalModule): 35 | def __init__(self, failMessage = None, require = False): 36 | super(FFVideoOptionalModule, self).__init__("ffvideo", 37 | failMessage=failMessage, 38 | require=require) 39 | 40 | class AxolotlOptionalModule(OptionalModule): 41 | def __init__(self, failMessage = None, require = False): 42 | super(AxolotlOptionalModule, self).__init__("axolotl", 43 | failMessage=failMessage, 44 | require=require) 45 | 46 | if __name__ == "__main__": 47 | with PILOptionalModule() as imp: 48 | imp() 49 | print("OK") 50 | print("DONE") 51 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/demos/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/svub/whatsapp-rest-webservice/822dfc46b80e7a26eb553e5a10e723dda5a9f77d/service/yowsup/yowsup/demos/__init__.py -------------------------------------------------------------------------------- /service/yowsup/yowsup/demos/cli/__init__.py: -------------------------------------------------------------------------------- 1 | from .stack import YowsupCliStack 2 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/demos/cli/stack.py: -------------------------------------------------------------------------------- 1 | from yowsup.stacks import YowStackBuilder 2 | from .layer import YowsupCliLayer 3 | from yowsup.layers.auth import AuthError 4 | from yowsup.layers import YowLayerEvent 5 | from yowsup.layers.axolotl.props import PROP_IDENTITY_AUTOTRUST 6 | import sys 7 | 8 | class YowsupCliStack(object): 9 | def __init__(self, credentials, encryptionEnabled = True): 10 | stackBuilder = YowStackBuilder() 11 | 12 | self.stack = stackBuilder\ 13 | .pushDefaultLayers(encryptionEnabled)\ 14 | .push(YowsupCliLayer)\ 15 | .build() 16 | 17 | # self.stack.setCredentials(credentials) 18 | self.stack.setCredentials(credentials) 19 | self.stack.setProp(PROP_IDENTITY_AUTOTRUST, True) 20 | 21 | def start(self): 22 | print("Yowsup Cli client\n==================\nType /help for available commands\n") 23 | self.stack.broadcastEvent(YowLayerEvent(YowsupCliLayer.EVENT_START)) 24 | 25 | try: 26 | self.stack.loop(timeout = 0.5, discrete = 0.5) 27 | except AuthError as e: 28 | print("Auth Error, reason %s" % e) 29 | except KeyboardInterrupt: 30 | print("\nYowsdown") 31 | sys.exit(0) 32 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/demos/contacts/__init__.py: -------------------------------------------------------------------------------- 1 | from .stack import YowsupSyncStack 2 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/demos/contacts/layer.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.interface import YowInterfaceLayer, ProtocolEntityCallback 2 | from yowsup.layers.protocol_contacts.protocolentities import GetSyncIqProtocolEntity, ResultSyncIqProtocolEntity 3 | from yowsup.layers.protocol_iq.protocolentities import ErrorIqProtocolEntity 4 | import threading 5 | import logging 6 | logger = logging.getLogger(__name__) 7 | 8 | class SyncLayer(YowInterfaceLayer): 9 | 10 | PROP_CONTACTS = "org.openwhatsapp.yowsup.prop.syncdemo.contacts" 11 | 12 | def __init__(self): 13 | super(SyncLayer, self).__init__() 14 | 15 | #call back function when there is a successful connection to whatsapp server 16 | @ProtocolEntityCallback("success") 17 | def onSuccess(self, successProtocolEntity): 18 | contacts= self.getProp(self.__class__.PROP_CONTACTS, []) 19 | contactEntity = GetSyncIqProtocolEntity(contacts) 20 | self._sendIq(contactEntity, self.onGetSyncResult, self.onGetSyncError) 21 | 22 | def onGetSyncResult(self, resultSyncIqProtocolEntity, originalIqProtocolEntity): 23 | print(resultSyncIqProtocolEntity) 24 | raise KeyboardInterrupt() 25 | 26 | def onGetSyncError(self, errorSyncIqProtocolEntity, originalIqProtocolEntity): 27 | print(errorSyncIqProtocolEntity) 28 | raise KeyboardInterrupt() 29 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/demos/contacts/stack.py: -------------------------------------------------------------------------------- 1 | from .layer import SyncLayer 2 | 3 | from yowsup.stacks import YowStackBuilder 4 | from yowsup.layers.auth import AuthError 5 | from yowsup.layers import YowLayerEvent 6 | from yowsup.layers.auth import YowAuthenticationProtocolLayer 7 | from yowsup.layers.network import YowNetworkLayer 8 | 9 | class YowsupSyncStack(object): 10 | def __init__(self, credentials, contacts, encryptionEnabled = False): 11 | """ 12 | :param credentials: 13 | :param contacts: list of [jid ] 14 | :param encryptionEnabled: 15 | :return: 16 | """ 17 | stackBuilder = YowStackBuilder() 18 | 19 | self.stack = stackBuilder \ 20 | .pushDefaultLayers(encryptionEnabled) \ 21 | .push(SyncLayer) \ 22 | .build() 23 | 24 | self.stack.setProp(SyncLayer.PROP_CONTACTS, contacts) 25 | self.stack.setProp(YowAuthenticationProtocolLayer.PROP_PASSIVE, True) 26 | self.stack.setCredentials(credentials) 27 | 28 | def start(self): 29 | self.stack.broadcastEvent(YowLayerEvent(YowNetworkLayer.EVENT_STATE_CONNECT)) 30 | try: 31 | self.stack.loop() 32 | except AuthError as e: 33 | print("Authentication Error: %s" % e.message) 34 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/demos/echoclient/__init__.py: -------------------------------------------------------------------------------- 1 | from .stack import YowsupEchoStack -------------------------------------------------------------------------------- /service/yowsup/yowsup/demos/echoclient/layer.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.interface import YowInterfaceLayer, ProtocolEntityCallback 2 | 3 | class EchoLayer(YowInterfaceLayer): 4 | 5 | @ProtocolEntityCallback("message") 6 | def onMessage(self, messageProtocolEntity): 7 | 8 | if messageProtocolEntity.getType() == 'text': 9 | self.onTextMessage(messageProtocolEntity) 10 | elif messageProtocolEntity.getType() == 'media': 11 | self.onMediaMessage(messageProtocolEntity) 12 | 13 | self.toLower(messageProtocolEntity.forward(messageProtocolEntity.getFrom())) 14 | self.toLower(messageProtocolEntity.ack()) 15 | self.toLower(messageProtocolEntity.ack(True)) 16 | 17 | 18 | @ProtocolEntityCallback("receipt") 19 | def onReceipt(self, entity): 20 | self.toLower(entity.ack()) 21 | 22 | def onTextMessage(self,messageProtocolEntity): 23 | # just print info 24 | print("Echoing %s to %s" % (messageProtocolEntity.getBody(), messageProtocolEntity.getFrom(False))) 25 | 26 | def onMediaMessage(self, messageProtocolEntity): 27 | # just print info 28 | if messageProtocolEntity.getMediaType() == "image": 29 | print("Echoing image %s to %s" % (messageProtocolEntity.url, messageProtocolEntity.getFrom(False))) 30 | 31 | elif messageProtocolEntity.getMediaType() == "location": 32 | print("Echoing location (%s, %s) to %s" % (messageProtocolEntity.getLatitude(), messageProtocolEntity.getLongitude(), messageProtocolEntity.getFrom(False))) 33 | 34 | elif messageProtocolEntity.getMediaType() == "vcard": 35 | print("Echoing vcard (%s, %s) to %s" % (messageProtocolEntity.getName(), messageProtocolEntity.getCardData(), messageProtocolEntity.getFrom(False))) 36 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/demos/echoclient/stack.py: -------------------------------------------------------------------------------- 1 | from yowsup.stacks import YowStackBuilder 2 | from .layer import EchoLayer 3 | from yowsup.layers.auth import AuthError 4 | from yowsup.layers import YowLayerEvent 5 | from yowsup.layers.network import YowNetworkLayer 6 | 7 | class YowsupEchoStack(object): 8 | def __init__(self, credentials, encryptionEnabled = True): 9 | stackBuilder = YowStackBuilder() 10 | 11 | self.stack = stackBuilder\ 12 | .pushDefaultLayers(encryptionEnabled)\ 13 | .push(EchoLayer)\ 14 | .build() 15 | 16 | self.stack.setCredentials(credentials) 17 | 18 | def start(self): 19 | self.stack.broadcastEvent(YowLayerEvent(YowNetworkLayer.EVENT_STATE_CONNECT)) 20 | try: 21 | self.stack.loop() 22 | except AuthError as e: 23 | print("Authentication Error: %s" % e.message) 24 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/demos/sendclient/__init__.py: -------------------------------------------------------------------------------- 1 | from .stack import YowsupSendStack -------------------------------------------------------------------------------- /service/yowsup/yowsup/demos/sendclient/stack.py: -------------------------------------------------------------------------------- 1 | from yowsup.stacks import YowStackBuilder 2 | from .layer import SendLayer 3 | from yowsup.layers.auth import AuthError 4 | from yowsup.layers import YowLayerEvent 5 | from yowsup.layers.auth import YowAuthenticationProtocolLayer 6 | from yowsup.layers.network import YowNetworkLayer 7 | 8 | 9 | class YowsupSendStack(object): 10 | def __init__(self, credentials, messages, encryptionEnabled = True): 11 | """ 12 | :param credentials: 13 | :param messages: list of (jid, message) tuples 14 | :param encryptionEnabled: 15 | :return: 16 | """ 17 | stackBuilder = YowStackBuilder() 18 | 19 | self.stack = stackBuilder\ 20 | .pushDefaultLayers(encryptionEnabled)\ 21 | .push(SendLayer)\ 22 | .build() 23 | 24 | self.stack.setProp(SendLayer.PROP_MESSAGES, messages) 25 | self.stack.setProp(YowAuthenticationProtocolLayer.PROP_PASSIVE, True) 26 | self.stack.setCredentials(credentials) 27 | 28 | def start(self): 29 | self.stack.broadcastEvent(YowLayerEvent(YowNetworkLayer.EVENT_STATE_CONNECT)) 30 | try: 31 | self.stack.loop() 32 | except AuthError as e: 33 | print("Authentication Error: %s" % e.message) 34 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/env/__init__.py: -------------------------------------------------------------------------------- 1 | from .env import YowsupEnv 2 | from .env_android import AndroidYowsupEnv 3 | from .env_s40 import S40YowsupEnv 4 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/env/env_s40.py: -------------------------------------------------------------------------------- 1 | from .env import YowsupEnv 2 | import hashlib 3 | class S40YowsupEnv(YowsupEnv): 4 | _VERSION = "2.16.11" 5 | _OS_NAME= "S40" 6 | _OS_VERSION = "14.26" 7 | _DEVICE_NAME = "302" 8 | _MANUFACTURER = "Nokia" 9 | _TOKEN_STRING = "PdA2DJyKoUrwLw1Bg6EIhzh502dF9noR9uFCllGk1478194306452{phone}" 10 | _AXOLOTL = True 11 | 12 | def getVersion(self): 13 | return self.__class__._VERSION 14 | 15 | def getOSName(self): 16 | return self.__class__._OS_NAME 17 | 18 | def getOSVersion(self): 19 | return self.__class__._OS_VERSION 20 | 21 | def getDeviceName(self): 22 | return self.__class__._DEVICE_NAME 23 | 24 | def getManufacturer(self): 25 | return self.__class__._MANUFACTURER 26 | 27 | def isAxolotlEnabled(self): 28 | return self.__class__._AXOLOTL 29 | 30 | def getToken(self, phoneNumber): 31 | return hashlib.md5(self.__class__._TOKEN_STRING.format(phone = phoneNumber).encode()).hexdigest() 32 | 33 | def getUserAgent(self): 34 | return self.__class__._USERAGENT_STRING.format( 35 | WHATSAPP_VERSION = self.getVersion(), 36 | OS_NAME = self.getOSName() + "Version", 37 | OS_VERSION = self.getOSVersion(), 38 | DEVICE_NAME = self.getDeviceName(), 39 | MANUFACTURER = self.getManufacturer() 40 | ) 41 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/env/test_env_s40.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | from yowsup.env import S40YowsupEnv 3 | class S40YowsupEnvTest(unittest.TestCase): 4 | def test_tokengen(self): 5 | phone = "1234567" 6 | S40YowsupEnv._TOKEN_STRING = "PdA2DJyKoUrwLw1Bg6EIhzh502dF9noR9uFCllGk1425519315543{phone}" 7 | env = S40YowsupEnv() 8 | token = env.getToken(phone) 9 | self.assertEqual(token, 'e84e1f1477704159efd46f6f0781dbde') 10 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/auth/__init__.py: -------------------------------------------------------------------------------- 1 | from .layer_crypt import YowCryptLayer 2 | from .layer_authentication import YowAuthenticationProtocolLayer 3 | from .autherror import AuthError 4 | #import protocolentities 5 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/auth/autherror.py: -------------------------------------------------------------------------------- 1 | class AuthError(Exception): 2 | pass -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/auth/layer_interface_authentication.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers import YowLayerInterface 2 | 3 | class YowAuthenticationProtocolLayerInterface(YowLayerInterface): 4 | def setCredentials(self, phone, password): 5 | self._layer.setCredentials((phone, password)) 6 | 7 | def getUsername(self, full = False): 8 | return self._layer.getUsername(full) 9 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/auth/protocolentities/__init__.py: -------------------------------------------------------------------------------- 1 | from .auth import AuthProtocolEntity 2 | from .challenge import ChallengeProtocolEntity 3 | from .response import ResponseProtocolEntity 4 | from .stream_features import StreamFeaturesProtocolEntity 5 | from .success import SuccessProtocolEntity 6 | from .failure import FailureProtocolEntity 7 | from .stream_error import StreamErrorProtocolEntity 8 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/auth/protocolentities/auth.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | class AuthProtocolEntity(ProtocolEntity): 3 | def __init__(self, user, mechanism = "WAUTH-2", passive = False, nonce = None): 4 | super(AuthProtocolEntity, self).__init__("auth") 5 | self.user = user 6 | self.mechanism = mechanism 7 | self.passive = passive 8 | self.nonce = nonce 9 | 10 | def toProtocolTreeNode(self): 11 | attributes = { 12 | "user" : self.user, 13 | "mechanism" : self.mechanism, 14 | "passive" : "true" if self.passive else "false" 15 | } 16 | return self._createProtocolTreeNode(attributes, children = None, data = self.nonce) 17 | 18 | @staticmethod 19 | def fromProtocolTreeNode(node): 20 | return AuthProtocolEntity( 21 | node.getAttributeValue("user"), 22 | node.getAttributeValue("mechanism"), 23 | node.getAttributeValue("passive") != "false", 24 | node.getData() 25 | ) -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/auth/protocolentities/challenge.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | class ChallengeProtocolEntity(ProtocolEntity): 3 | def __init__(self, nonce): 4 | super(ChallengeProtocolEntity, self).__init__("challenge") 5 | self.nonce = nonce 6 | 7 | def getNonce(self): 8 | return self.nonce 9 | 10 | def toProtocolTreeNode(self): 11 | #return self._createProtocolTreeNode({}, children = None, data = self.nonce) 12 | return self._createProtocolTreeNode({}, children = [], data = "".join(map(chr, self.nonce))) 13 | 14 | def __str__(self): 15 | out = "Challenge\n" 16 | out += "Nonce: %s\n" % self.nonce 17 | return out 18 | 19 | @staticmethod 20 | def fromProtocolTreeNode(node): 21 | nonce = list(map(ord,node.getData())) 22 | entity = ChallengeProtocolEntity(bytearray(nonce)) 23 | return entity 24 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/auth/protocolentities/failure.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | class FailureProtocolEntity(ProtocolEntity): 3 | 4 | def __init__(self, reason): 5 | super(FailureProtocolEntity, self).__init__("failure") 6 | self.reason = reason 7 | 8 | def __str__(self): 9 | out = "Failure:\n" 10 | out += "Reason: %s\n" % self.reason 11 | return out 12 | 13 | def getReason(self): 14 | return self.reason 15 | 16 | def toProtocolTreeNode(self): 17 | reasonNode = ProtocolTreeNode(self.reason, {}) 18 | return self._createProtocolTreeNode({}, children = [reasonNode]) 19 | 20 | @staticmethod 21 | def fromProtocolTreeNode(node): 22 | return FailureProtocolEntity( node.getAllChildren()[0].tag ) -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/auth/protocolentities/response.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | class ResponseProtocolEntity(ProtocolEntity): 3 | def __init__(self, data, xmlns = "urn:ietf:params:xml:ns:xmpp-sasl"): 4 | super(ResponseProtocolEntity, self).__init__("response") 5 | self.xmlns = xmlns 6 | self.data = data 7 | 8 | def toProtocolTreeNode(self): 9 | return self._createProtocolTreeNode({"xmlns": self.xmlns}, children = None, data = self.data) 10 | 11 | @staticmethod 12 | def fromProtocolTreeNode(node): 13 | return ResponseProtocolEntity(node.getData(), node.getAttributeValue("xmlns")) -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/auth/protocolentities/stream_features.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | class StreamFeaturesProtocolEntity(ProtocolEntity): 3 | def __init__(self, features = None): 4 | super(StreamFeaturesProtocolEntity, self).__init__("stream:features") 5 | self.setFeatures(features) 6 | 7 | def setFeatures(self, features = None): 8 | self.features = features or [] 9 | 10 | def toProtocolTreeNode(self): 11 | featureNodes = [ProtocolTreeNode(feature) for feature in self.features] 12 | return self._createProtocolTreeNode({}, children = featureNodes, data = None) 13 | 14 | 15 | @staticmethod 16 | def fromProtocolTreeNode(node): 17 | return StreamFeaturesProtocolEntity([fnode.tag for fnode in node.getAllChildren()]) -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/auth/protocolentities/success.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | class SuccessProtocolEntity(ProtocolEntity): 3 | def __init__(self, status, kind, creation, expiration, props, t, nonce = None): 4 | super(SuccessProtocolEntity, self).__init__("success") 5 | self.status = status 6 | self.kind = kind 7 | self.creation = int(creation) 8 | self.expiration = int(expiration) 9 | self.props = props 10 | self.nonce = nonce 11 | self.t = int(t) ##whatever that is ! 12 | 13 | def __str__(self): 14 | out = "Account:\n" 15 | out += "Status: %s\n" % self.status 16 | out += "Kind: %s\n" % self.kind 17 | out += "Creation: %s\n" % self.creation 18 | out += "Expiration: %s\n" % self.expiration 19 | out += "Props: %s\n" % self.props 20 | out += "t: %s\n" % self.t 21 | return out 22 | 23 | def toProtocolTreeNode(self): 24 | attributes = { 25 | "status" : self.status, 26 | "kind" : self.kind, 27 | "creation" : str(self.creation), 28 | "expiration" : str(self.expiration), 29 | "props" : self.props, 30 | "t" : str(self.t) 31 | } 32 | return self._createProtocolTreeNode(attributes, children = None, data = self.nonce) 33 | 34 | @staticmethod 35 | def fromProtocolTreeNode(node): 36 | return SuccessProtocolEntity( 37 | node.getAttributeValue("status"), 38 | node.getAttributeValue("kind"), 39 | node.getAttributeValue("creation"), 40 | node.getAttributeValue("expiration"), 41 | node.getAttributeValue("props"), 42 | node.getAttributeValue("t"), 43 | node.getData() 44 | ) -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/auth/protocolentities/test_auth.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.auth.protocolentities import AuthProtocolEntity 2 | from yowsup.structs import ProtocolTreeNode 3 | from yowsup.structs.protocolentity import ProtocolEntityTest 4 | import unittest 5 | 6 | class AuthProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 7 | def setUp(self): 8 | self.ProtocolEntity = AuthProtocolEntity 9 | self.node = ProtocolTreeNode("auth", {"user": "testuser", "mechanism": "WAUTH-2", "passive": "false"}) -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/auth/protocolentities/test_challenge.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.auth.protocolentities.challenge import ChallengeProtocolEntity 2 | from yowsup.structs import ProtocolTreeNode 3 | from yowsup.structs.protocolentity import ProtocolEntityTest 4 | import unittest 5 | 6 | class ChallengeProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 7 | def setUp(self): 8 | self.ProtocolEntity = ChallengeProtocolEntity 9 | attribs = {} 10 | childNodes = [] 11 | data = "dummydata" 12 | self.node = ProtocolTreeNode("challenge", attribs, [], data) -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/auth/protocolentities/test_failure.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.auth.protocolentities.failure import FailureProtocolEntity 2 | from yowsup.structs import ProtocolTreeNode 3 | from yowsup.structs.protocolentity import ProtocolEntityTest 4 | import unittest 5 | 6 | class FailureProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 7 | def setUp(self): 8 | self.ProtocolEntity = FailureProtocolEntity 9 | self.node = ProtocolTreeNode("failure", {}, [ProtocolTreeNode("not-authorized", {})]) -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/auth/protocolentities/test_response.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.auth.protocolentities.response import ResponseProtocolEntity 2 | from yowsup.structs import ProtocolTreeNode 3 | from yowsup.structs.protocolentity import ProtocolEntityTest 4 | import unittest 5 | 6 | class ResponseProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 7 | def setUp(self): 8 | self.ProtocolEntity = ResponseProtocolEntity 9 | attribs = { 10 | "xmlns": "urn:ietf:params:xml:ns:xmpp-sasl" 11 | } 12 | self.node = ProtocolTreeNode("response", attribs, None, "dummydata") -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/auth/protocolentities/test_stream_features.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.auth.protocolentities.stream_features import StreamFeaturesProtocolEntity 2 | from yowsup.structs import ProtocolTreeNode 3 | from yowsup.structs.protocolentity import ProtocolEntityTest 4 | import unittest 5 | 6 | class StreamFeaturesProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 7 | def setUp(self): 8 | self.ProtocolEntity = StreamFeaturesProtocolEntity 9 | attribs = { 10 | } 11 | childNode = ProtocolTreeNode("receipt_acks", {}, None, None) 12 | self.node = ProtocolTreeNode("stream:features", attribs, [childNode]) -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/auth/protocolentities/test_success.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.auth.protocolentities.success import SuccessProtocolEntity 2 | from yowsup.structs import ProtocolTreeNode 3 | from yowsup.structs.protocolentity import ProtocolEntityTest 4 | import unittest 5 | 6 | class SuccessProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 7 | def setUp(self): 8 | self.ProtocolEntity = SuccessProtocolEntity 9 | attribs = { 10 | "status": "active", 11 | "kind": "free", 12 | "creation": "1234", 13 | "expiration": "1446578937", 14 | "props": "2", 15 | "t": "1415470561" 16 | } 17 | self.node = ProtocolTreeNode("success", attribs, None, "dummydata") -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/auth/test_authenticator.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.auth import YowAuthenticationProtocolLayer 2 | from yowsup.layers import YowLayerEvent, YowLayerTest 3 | from yowsup.layers.auth.protocolentities import StreamFeaturesProtocolEntity,AuthProtocolEntity, ChallengeProtocolEntity 4 | from yowsup.structs import ProtocolTreeNode 5 | from yowsup.stacks import YowStack 6 | import base64 7 | # from unittest.mock import MagicMock 8 | 9 | 10 | class AuthenticationProtocolLayerTest(YowLayerTest, YowAuthenticationProtocolLayer): 11 | def setUp(self): 12 | #YowAuthenticatorLayer.__init__(self) 13 | super(YowAuthenticationProtocolLayer, self).__init__() 14 | dummyStack = YowStack() 15 | self.setStack(dummyStack) 16 | 17 | self.credentials = ("dummyusername", bytearray("password", "latin-1")) 18 | dummyStack.setProp(YowAuthenticationProtocolLayer.PROP_CREDENTIALS, self.credentials) 19 | #ticatorLayer.setProp("credentials", self.credentials) 20 | 21 | def test_streamfeatures(self): 22 | self._sendFeatures() 23 | self.assertEqual(self.lowerSink.pop(), StreamFeaturesProtocolEntity([]).toProtocolTreeNode()) 24 | 25 | def test_auth(self): 26 | self._sendAuth() 27 | self.assertEqual(self.lowerSink.pop(), AuthProtocolEntity(self.credentials[0]).toProtocolTreeNode()) 28 | 29 | def test_handle_challenge(self): 30 | node = ProtocolTreeNode("challenge", {}, None, "salt") 31 | self.handleChallenge(node) 32 | 33 | 34 | 35 | def test_login_onconnected(self): 36 | self.onEvent(YowLayerEvent("network.state.connected")) 37 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/auth/test_crypt.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers import YowLayerEvent, YowLayerTest 2 | from yowsup.structs import ProtocolTreeNode 3 | from yowsup.layers.auth import YowCryptLayer 4 | from yowsup.layers.auth.keystream import KeyStream 5 | 6 | class CryptLayerTest(YowLayerTest, YowCryptLayer): 7 | def setUp(self): 8 | YowCryptLayer.__init__(self) 9 | self.password = bytearray(list(map(ord,"password"))) 10 | self.salt = bytearray(list(map(ord,"salt"))) 11 | self.username = "username" 12 | self.inputMessage = bytearray([0,0,0,0, ord('t'), ord('a'), ord('r'), ord('e'), ord('k')]) 13 | self.inputMessageCrypted = bytearray(b'\x80\x00\r)\x99\xbe_\xee\x98\xecV<\x9d\x0c\xb7r') 14 | keys = [ 15 | bytearray(b'>\xd5\x8a\xecB\xdb\xc8\xd4}\x98\x9aBa\x89\x9fC\x08\xdcp\x8d'), 16 | bytearray(b'\xd3;\xda:\x8f\x94CX\xe4;\xbb\xcc"W\x83\xe0m\xba\xe0\xd1'), 17 | bytearray(b'\x92w{\xc2\x04~\x08;\x81w\xb7h3\xb8\xc4t\xbd\xed\xf7q'), 18 | bytearray(b'.\xc7\xe4\x15\x1a\xa0\xfd\x98\xc0\xea\xefs{\r7E\xa6\xec\xd5\xfb') 19 | ] 20 | inputKey = KeyStream(keys[2], keys[3]) 21 | outputKey = KeyStream(keys[0], keys[1]) 22 | 23 | self.onEvent(YowLayerEvent(YowCryptLayer.EVENT_KEYS_READY, keys = (inputKey, outputKey))) 24 | 25 | def test_00send(self): 26 | self.send(self.inputMessage) 27 | self.assertEqual(self.lowerSink.pop(), self.inputMessageCrypted) 28 | 29 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/axolotl/__init__.py: -------------------------------------------------------------------------------- 1 | from .layer_send import AxolotlSendLayer 2 | from .layer_control import AxolotlControlLayer 3 | from .layer_receive import AxolotlReceivelayer 4 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/axolotl/props.py: -------------------------------------------------------------------------------- 1 | PROP_IDENTITY_AUTOTRUST = "org.openwhatsapp.yowsup.prop.axolotl.INDENTITY_AUTOTRUST" -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/axolotl/protocolentities/__init__.py: -------------------------------------------------------------------------------- 1 | from .iq_key_get import GetKeysIqProtocolEntity 2 | from .iq_keys_set import SetKeysIqProtocolEntity 3 | from .iq_keys_get_result import ResultGetKeysIqProtocolEntity 4 | from .message_encrypted import EncryptedMessageProtocolEntity 5 | from .enc import EncProtocolEntity 6 | from .notification_encrypt import EncryptNotification 7 | from .receipt_outgoing_retry import RetryOutgoingReceiptProtocolEntity 8 | from .receipt_incoming_retry import RetryIncomingReceiptProtocolEntity 9 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/axolotl/protocolentities/enc.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | import sys 3 | class EncProtocolEntity(ProtocolEntity): 4 | TYPE_PKMSG = "pkmsg" 5 | TYPE_MSG = "msg" 6 | TYPE_SKMSG = "skmsg" 7 | TYPES = (TYPE_PKMSG, TYPE_MSG, TYPE_SKMSG) 8 | 9 | def __init__(self, type, version, data, mediaType = None, jid = None): 10 | assert type in self.__class__.TYPES, "Unknown message enc type %s" % type 11 | super(EncProtocolEntity, self).__init__("enc") 12 | self.type = type 13 | self.version = int(version) 14 | self.data = data 15 | self.mediaType = mediaType 16 | self.jid = jid 17 | 18 | def getType(self): 19 | return self.type 20 | 21 | def getVersion(self): 22 | return self.version 23 | 24 | def getData(self): 25 | return self.data 26 | 27 | def getMediaType(self): 28 | return self.mediaType 29 | 30 | def getJid(self): 31 | return self.jid 32 | 33 | def toProtocolTreeNode(self): 34 | attribs = {"type": self.type, "v": str(self.version)} 35 | if self.mediaType: 36 | attribs["mediatype"] = self.mediaType 37 | encNode = ProtocolTreeNode("enc", attribs, data = self.data) 38 | if self.jid: 39 | return ProtocolTreeNode("to", {"jid": self.jid}, [encNode]) 40 | return encNode 41 | 42 | @staticmethod 43 | def fromProtocolTreeNode(node): 44 | return EncProtocolEntity(node["type"], node["v"], node.data.encode('latin-1') if sys.version_info >= (3,0) else node.data, node["mediatype"]) 45 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/axolotl/protocolentities/iq_key_get.py: -------------------------------------------------------------------------------- 1 | from yowsup.common import YowConstants 2 | from yowsup.layers.protocol_iq.protocolentities import IqProtocolEntity 3 | from yowsup.structs import ProtocolTreeNode 4 | class GetKeysIqProtocolEntity(IqProtocolEntity): 5 | def __init__(self, jids): 6 | super(GetKeysIqProtocolEntity, self).__init__("encrypt", _type = "get", to = YowConstants.WHATSAPP_SERVER) 7 | self.setJids(jids) 8 | 9 | def setJids(self, jids): 10 | assert type(jids) is list, "expected list of jids, got %s" % type(jids) 11 | self.jids = jids 12 | 13 | def getJids(self): 14 | return self.jids 15 | 16 | def toProtocolTreeNode(self): 17 | node = super(GetKeysIqProtocolEntity, self).toProtocolTreeNode() 18 | keyNode = ProtocolTreeNode("key") 19 | 20 | for jid in self.getJids(): 21 | userNode = ProtocolTreeNode("user", { "jid": jid }) 22 | keyNode.addChild(userNode) 23 | node.addChild(keyNode) 24 | return node 25 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/axolotl/protocolentities/notification_encrypt.py: -------------------------------------------------------------------------------- 1 | from yowsup.common import YowConstants 2 | from yowsup.layers.protocol_notifications.protocolentities import NotificationProtocolEntity 3 | from yowsup.structs import ProtocolTreeNode 4 | class EncryptNotification(NotificationProtocolEntity): 5 | """ 6 | 7 | 8 | 9 | 10 | """ 11 | def __init__(self, count, timestamp, _id = None, notify = None, offline = None): 12 | super(EncryptNotification, self).__init__("encrypt", _id, YowConstants.WHATSAPP_SERVER, timestamp, notify, offline) 13 | self.setProps(count) 14 | 15 | def setProps(self, count): 16 | self.count = int(count) 17 | 18 | def getCount(self): 19 | return self.count 20 | 21 | def toProtocolTreeNode(self): 22 | node = super(EncryptNotification, self).toProtocolTreeNode() 23 | countNode = ProtocolTreeNode("count", {"value": str(self.count)}) 24 | node.addChild(countNode) 25 | return node 26 | 27 | @staticmethod 28 | def fromProtocolTreeNode(node): 29 | entity = NotificationProtocolEntity.fromProtocolTreeNode(node) 30 | entity.__class__ = EncryptNotification 31 | entity.setProps(node.getChild("count")["value"]) 32 | return entity -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/axolotl/protocolentities/test_iq_keys_set.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_iq.protocolentities.test_iq import IqProtocolEntityTest 2 | from yowsup.layers.axolotl.protocolentities import SetKeysIqProtocolEntity 3 | from yowsup.structs import ProtocolTreeNode 4 | class SetKeysIqProtocolEntityTest(IqProtocolEntityTest): 5 | def setUp(self): 6 | super(SetKeysIqProtocolEntityTest, self).setUp() 7 | # self.ProtocolEntity = SetKeysIqProtocolEntity 8 | # 9 | # regNode = ProtocolTreeNode("registration", data = "abcd") 10 | # idNode = ProtocolTreeNode("identity", data = "efgh") 11 | # typeNode = ProtocolTreeNode("type", data = "ijkl") 12 | # listNode = ProtocolTreeNode("list") 13 | # for i in range(0, 2): 14 | # keyNode = ProtocolTreeNode("key", children=[ 15 | # ProtocolTreeNode("id", data = "id_%s" % i), 16 | # ProtocolTreeNode("value", data = "val_%s" % i) 17 | # ]) 18 | # listNode.addChild(keyNode) 19 | # 20 | # self.node.addChildren([regNode, idNode, typeNode, listNode]) 21 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/axolotl/protocolentities/test_notification_encrypt.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_notifications.protocolentities.test_notification import NotificationProtocolEntityTest 2 | from yowsup.layers.axolotl.protocolentities import EncryptNotification 3 | from yowsup.structs import ProtocolTreeNode 4 | class TestEncryptNotification(NotificationProtocolEntityTest): 5 | def setUp(self): 6 | super(TestEncryptNotification, self).setUp() 7 | self.ProtocolEntity = EncryptNotification 8 | self.node.addChild(ProtocolTreeNode("count", {"value": "9"})) -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/axolotl/store/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/svub/whatsapp-rest-webservice/822dfc46b80e7a26eb553e5a10e723dda5a9f77d/service/yowsup/yowsup/layers/axolotl/store/__init__.py -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/axolotl/store/sqlite/__init__.py: -------------------------------------------------------------------------------- 1 | __author__ = 'tarek' 2 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/coder/__init__.py: -------------------------------------------------------------------------------- 1 | from .layer import YowCoderLayer -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/coder/layer.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers import YowLayer, YowLayerEvent, EventCallback 2 | from yowsup.layers.network import YowNetworkLayer 3 | from .encoder import WriteEncoder 4 | from .decoder import ReadDecoder 5 | from .tokendictionary import TokenDictionary 6 | class YowCoderLayer(YowLayer): 7 | 8 | PROP_DOMAIN = "org.openwhatsapp.yowsup.prop.domain" 9 | PROP_RESOURCE = "org.openwhatsapp.yowsup.prop.resource" 10 | 11 | def __init__(self): 12 | YowLayer.__init__(self) 13 | tokenDictionary = TokenDictionary() 14 | self.writer = WriteEncoder(tokenDictionary) 15 | self.reader = ReadDecoder(tokenDictionary) 16 | 17 | @EventCallback(YowNetworkLayer.EVENT_STATE_CONNECTED) 18 | def onConnected(self, event): 19 | self.writer.reset() 20 | self.reader.reset() 21 | streamStartBytes = self.writer.getStreamStartBytes( 22 | self.getProp(self.__class__.PROP_DOMAIN), 23 | self.getProp(self.__class__.PROP_RESOURCE) 24 | ) 25 | for i in range(0, 4): 26 | self.write(streamStartBytes.pop(0)) 27 | self.write(streamStartBytes) 28 | 29 | def send(self, data): 30 | self.write(self.writer.protocolTreeNodeToBytes(data)) 31 | 32 | def receive(self, data): 33 | node = self.reader.getProtocolTreeNode(data) 34 | if node: 35 | self.toUpper(node) 36 | 37 | def write(self, i): 38 | if(type(i) in(list, tuple)): 39 | self.toLower(bytearray(i)) 40 | else: 41 | self.toLower(bytearray([i])) 42 | 43 | def __str__(self): 44 | return "Coder Layer" -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/coder/test_decoder.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | from yowsup.layers.coder.decoder import ReadDecoder 3 | from yowsup.layers.coder.tokendictionary import TokenDictionary 4 | from yowsup.structs import ProtocolTreeNode 5 | class DecoderTest(unittest.TestCase): 6 | def setUp(self): 7 | self.decoder = ReadDecoder(TokenDictionary()) 8 | self.decoder.streamStarted = True 9 | 10 | def test_decode(self): 11 | data = [248, 6, 95, 179, 252, 3, 120, 121, 122, 252, 4, 102, 111, 114, 109, 252, 3, 97, 98, 99, 248, 1, 248, 4, 93, 12 | 236, 104, 255, 130, 18, 63, 252, 6, 49, 50, 51, 52, 53, 54] 13 | node = self.decoder.getProtocolTreeNode(data) 14 | targetNode = ProtocolTreeNode("message", {"form": "abc", "to":"xyz"}, [ProtocolTreeNode("media", {"width" : "123"}, data="123456")]) 15 | self.assertEqual(node, targetNode) 16 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/coder/test_encoder.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | from yowsup.structs import ProtocolTreeNode 3 | from yowsup.layers.coder.encoder import WriteEncoder 4 | from yowsup.layers.coder.tokendictionary import TokenDictionary 5 | 6 | class EncoderTest(unittest.TestCase): 7 | def setUp(self): 8 | self.res = [] 9 | self.encoder = WriteEncoder(TokenDictionary()) 10 | 11 | def test_encode(self): 12 | node = ProtocolTreeNode("message", {"form": "abc", "to":"xyz"}, [ProtocolTreeNode("media", {"width" : "123"}, data="123456")]) 13 | result = self.encoder.protocolTreeNodeToBytes(node) 14 | 15 | self.assertTrue(result in ( 16 | [248, 6, 95, 179, 252, 3, 120, 121, 122, 252, 4, 102, 111, 114, 109, 252, 3, 97, 98, 99, 248, 1, 248, 4, 93, 17 | 236, 104, 255, 130, 18, 63, 252, 6, 49, 50, 51, 52, 53, 54], 18 | [248, 6, 95, 252, 4, 102, 111, 114, 109, 252, 3, 97, 98, 99, 179, 252, 3, 120, 121, 122, 248, 1, 248, 4, 93, 19 | 236, 104, 255, 130, 18, 63, 252, 6, 49, 50, 51, 52, 53, 54] 20 | ) 21 | ) 22 | 23 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/coder/test_tokendictionary.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.coder.tokendictionary import TokenDictionary 2 | import unittest 3 | class TokenDictionaryTest(unittest.TestCase): 4 | def setUp(self): 5 | self.tokenDictionary = TokenDictionary() 6 | 7 | def test_getToken(self): 8 | self.assertEqual(self.tokenDictionary.getToken(80), "iq") 9 | 10 | def test_getIndex(self): 11 | self.assertEqual(self.tokenDictionary.getIndex("iq"), (80, False)) 12 | 13 | def test_getSecondaryToken(self): 14 | self.assertEqual(self.tokenDictionary.getToken(238), "amrnb") 15 | 16 | def test_getSecondaryTokenExplicit(self): 17 | self.assertEqual(self.tokenDictionary.getToken(11, True), "wmv") 18 | 19 | def test_getSecondaryIndex(self): 20 | self.assertEqual(self.tokenDictionary.getIndex("wmv"), (11, True)) -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/interface/__init__.py: -------------------------------------------------------------------------------- 1 | from .interface import YowInterfaceLayer, ProtocolEntityCallback -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/logger/__init__.py: -------------------------------------------------------------------------------- 1 | from .layer import YowLoggerLayer 2 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/logger/layer.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers import YowLayer 2 | import logging 3 | logger = logging.getLogger(__name__) 4 | class YowLoggerLayer(YowLayer): 5 | 6 | def send(self, data): 7 | ldata = list(data) if type(data) is bytearray else data 8 | logger.debug("tx:\n%s" % ldata) 9 | self.toLower(data) 10 | 11 | def receive(self, data): 12 | ldata = list(data) if type(data) is bytearray else data 13 | logger.debug("rx:\n%s" % ldata) 14 | self.toUpper(data) 15 | 16 | def __str__(self): 17 | return "Logger Layer" -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/network/__init__.py: -------------------------------------------------------------------------------- 1 | from .layer import YowNetworkLayer 2 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/network/layer_interface.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers import YowLayerInterface 2 | class YowNetworkLayerInterface(YowLayerInterface): 3 | def connect(self): 4 | self._layer.createConnection() 5 | 6 | def disconnect(self): 7 | self._layer.destroyConnection() 8 | 9 | def getStatus(self): 10 | return self._layer.getStatus() -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_acks/__init__.py: -------------------------------------------------------------------------------- 1 | from .layer import YowAckProtocolLayer 2 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_acks/layer.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers import YowProtocolLayer 2 | from .protocolentities import * 3 | class YowAckProtocolLayer(YowProtocolLayer): 4 | def __init__(self): 5 | handleMap = { 6 | "ack": (self.recvAckNode, self.sendAckEntity) 7 | } 8 | super(YowAckProtocolLayer, self).__init__(handleMap) 9 | 10 | def __str__(self): 11 | return "Ack Layer" 12 | 13 | def sendAckEntity(self, entity): 14 | self.entityToLower(entity) 15 | 16 | def recvAckNode(self, node): 17 | self.toUpper(IncomingAckProtocolEntity.fromProtocolTreeNode(node)) 18 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_acks/protocolentities/__init__.py: -------------------------------------------------------------------------------- 1 | from .ack import AckProtocolEntity 2 | from .ack_incoming import IncomingAckProtocolEntity 3 | from .ack_outgoing import OutgoingAckProtocolEntity -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_acks/protocolentities/ack.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | class AckProtocolEntity(ProtocolEntity): 3 | 4 | ''' 5 | 6 | 7 | ''' 8 | 9 | def __init__(self, _id, _class): 10 | super(AckProtocolEntity, self).__init__("ack") 11 | self._id = _id 12 | self._class = _class 13 | 14 | def getId(self): 15 | return self._id 16 | 17 | def getClass(self): 18 | return self._class 19 | 20 | def toProtocolTreeNode(self): 21 | attribs = { 22 | "id" : self._id, 23 | "class" : self._class, 24 | } 25 | 26 | return self._createProtocolTreeNode(attribs, None, data = None) 27 | 28 | def __str__(self): 29 | out = "ACK:\n" 30 | out += "ID: %s\n" % self._id 31 | out += "Class: %s\n" % self._class 32 | return out 33 | 34 | @staticmethod 35 | def fromProtocolTreeNode(node): 36 | return AckProtocolEntity( 37 | node.getAttributeValue("id"), 38 | node.getAttributeValue("class") 39 | ) 40 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_acks/protocolentities/ack_incoming.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from .ack import AckProtocolEntity 3 | class IncomingAckProtocolEntity(AckProtocolEntity): 4 | 5 | ''' 6 | 7 | 8 | ''' 9 | 10 | def __init__(self, _id, _class, _from, timestamp): 11 | super(IncomingAckProtocolEntity, self).__init__(_id, _class) 12 | self.setIncomingData(_from, timestamp) 13 | 14 | def setIncomingData(self, _from, timestamp): 15 | self._from = _from 16 | self.timestamp = timestamp 17 | 18 | def toProtocolTreeNode(self): 19 | node = super(IncomingAckProtocolEntity, self).toProtocolTreeNode() 20 | node.setAttribute("from", self._from) 21 | node.setAttribute("t", self.timestamp) 22 | return node 23 | 24 | def __str__(self): 25 | out = super(IncomingAckProtocolEntity, self).__str__() 26 | out += "From: %s\n" % self._from 27 | out += "timestamp: %s\n" % self.timestamp 28 | return out 29 | 30 | @staticmethod 31 | def fromProtocolTreeNode(node): 32 | entity = AckProtocolEntity.fromProtocolTreeNode(node) 33 | entity.__class__ = IncomingAckProtocolEntity 34 | entity.setIncomingData( 35 | node.getAttributeValue("from"), 36 | node.getAttributeValue("t") 37 | ) 38 | return entity 39 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_acks/protocolentities/ack_outgoing.py: -------------------------------------------------------------------------------- 1 | from .ack import AckProtocolEntity 2 | class OutgoingAckProtocolEntity(AckProtocolEntity): 3 | 4 | ''' 5 | 6 | 7 | 8 | 9 | 10 | 11 | ''' 12 | 13 | def __init__(self, _id, _class, _type, to, participant = None): 14 | super(OutgoingAckProtocolEntity, self).__init__(_id, _class) 15 | self.setOutgoingData(_type, to, participant) 16 | 17 | def setOutgoingData(self, _type, _to, _participant): 18 | self._type = _type 19 | self._to = _to 20 | self._participant = _participant 21 | 22 | def toProtocolTreeNode(self): 23 | node = super(OutgoingAckProtocolEntity, self).toProtocolTreeNode() 24 | if self._type: 25 | node.setAttribute("type", self._type) 26 | node.setAttribute("to", self._to) 27 | if self._participant: 28 | node.setAttribute("participant", self._participant) 29 | return node 30 | 31 | def __str__(self): 32 | out = super(OutgoingAckProtocolEntity, self).__str__() 33 | out += "Type: %s\n" % self._type 34 | out += "To: %s\n" % self._to 35 | if self._participant: 36 | out += "Participant: %s\n" % self._participant 37 | return out 38 | 39 | @staticmethod 40 | def fromProtocolTreeNode(node): 41 | entity = AckProtocolEntity.fromProtocolTreeNode(node) 42 | entity.__class__ = OutgoingAckProtocolEntity 43 | entity.setOutgoingData( 44 | node.getAttributeValue("type"), 45 | node.getAttributeValue("to"), 46 | node.getAttributeValue("participant") 47 | ) 48 | return entity 49 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_acks/protocolentities/test_ack_incoming.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_acks.protocolentities.ack_incoming import IncomingAckProtocolEntity 2 | from yowsup.structs.protocolentity import ProtocolEntityTest 3 | import unittest 4 | import time 5 | 6 | entity = IncomingAckProtocolEntity("12345", "message", "sender@s.whatsapp.com", int(time.time())) 7 | 8 | class IncomingAckProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 9 | def setUp(self): 10 | self.ProtocolEntity = IncomingAckProtocolEntity 11 | self.node = entity.toProtocolTreeNode() 12 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_acks/protocolentities/test_ack_outgoing.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_acks.protocolentities.ack_outgoing import OutgoingAckProtocolEntity 2 | from yowsup.structs.protocolentity import ProtocolEntityTest 3 | import unittest 4 | 5 | entity = OutgoingAckProtocolEntity("12345", "receipt", "delivery", "to_jid") 6 | 7 | class OutgoingAckProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 8 | def setUp(self): 9 | self.ProtocolEntity = OutgoingAckProtocolEntity 10 | self.node = entity.toProtocolTreeNode() 11 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_acks/test_layer.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers import YowProtocolLayerTest 2 | from yowsup.layers.protocol_acks import YowAckProtocolLayer 3 | from yowsup.layers.protocol_acks.protocolentities.test_ack_incoming import entity as incomingAckEntity 4 | from yowsup.layers.protocol_acks.protocolentities.test_ack_outgoing import entity as outgoingAckEntity 5 | class YowAckProtocolLayerTest(YowProtocolLayerTest, YowAckProtocolLayer): 6 | def setUp(self): 7 | YowAckProtocolLayer.__init__(self) 8 | 9 | def test_receive(self): 10 | self.assertReceived(incomingAckEntity) 11 | 12 | def test_send(self): 13 | self.assertSent(outgoingAckEntity) 14 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_calls/__init__.py: -------------------------------------------------------------------------------- 1 | from .layer import YowCallsProtocolLayer 2 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_calls/layer.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers import YowProtocolLayer 2 | from .protocolentities import * 3 | from yowsup.layers.protocol_acks.protocolentities import OutgoingAckProtocolEntity 4 | from yowsup.layers.protocol_receipts.protocolentities import OutgoingReceiptProtocolEntity 5 | class YowCallsProtocolLayer(YowProtocolLayer): 6 | 7 | def __init__(self): 8 | handleMap = { 9 | "call": (self.recvCall, self.sendCall) 10 | } 11 | super(YowCallsProtocolLayer, self).__init__(handleMap) 12 | 13 | def __str__(self): 14 | return "call Layer" 15 | 16 | def sendCall(self, entity): 17 | if entity.getTag() == "call": 18 | self.toLower(entity.toProtocolTreeNode()) 19 | 20 | def recvCall(self, node): 21 | entity = CallProtocolEntity.fromProtocolTreeNode(node) 22 | if entity.getType() == "offer": 23 | receipt = OutgoingReceiptProtocolEntity(node["id"], node["from"], callId = entity.getCallId()) 24 | self.toLower(receipt.toProtocolTreeNode()) 25 | else: 26 | ack = OutgoingAckProtocolEntity(node["id"], "call", None, node["from"]) 27 | self.toLower(ack.toProtocolTreeNode()) 28 | self.toUpper(entity) 29 | 30 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_calls/protocolentities/__init__.py: -------------------------------------------------------------------------------- 1 | from .call import CallProtocolEntity 2 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_calls/protocolentities/test_call.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_calls.protocolentities.call import CallProtocolEntity 2 | from yowsup.structs import ProtocolTreeNode 3 | from yowsup.structs.protocolentity import ProtocolEntityTest 4 | import unittest 5 | 6 | class CallProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 7 | def setUp(self): 8 | self.ProtocolEntity = CallProtocolEntity 9 | children = [ProtocolTreeNode("offer", {"call-id": "call_id"})] 10 | attribs = { 11 | "t": "12345", 12 | "from": "from_jid", 13 | "offline": "0", 14 | "id": "message_id", 15 | "notify": "notify_name" 16 | } 17 | self.node = ProtocolTreeNode("call", attribs, children) 18 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_chatstate/__init__.py: -------------------------------------------------------------------------------- 1 | from .layer import YowChatstateProtocolLayer 2 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_chatstate/layer.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers import YowLayer, YowLayerEvent, YowProtocolLayer 2 | from .protocolentities import * 3 | class YowChatstateProtocolLayer(YowProtocolLayer): 4 | def __init__(self): 5 | handleMap = { 6 | "chatstate": (self.recvChatstateNode, self.sendChatstateEntity) 7 | } 8 | super(YowChatstateProtocolLayer, self).__init__(handleMap) 9 | 10 | def __str__(self): 11 | return "Chatstate Layer" 12 | 13 | def sendChatstateEntity(self, entity): 14 | self.entityToLower(entity) 15 | 16 | def recvChatstateNode(self, node): 17 | self.toUpper(IncomingChatstateProtocolEntity.fromProtocolTreeNode(node)) 18 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_chatstate/protocolentities/__init__.py: -------------------------------------------------------------------------------- 1 | from .chatstate import ChatstateProtocolEntity 2 | from .chatstate_incoming import IncomingChatstateProtocolEntity 3 | from .chatstate_outgoing import OutgoingChatstateProtocolEntity 4 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_chatstate/protocolentities/chatstate.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | class ChatstateProtocolEntity(ProtocolEntity): 3 | 4 | ''' 5 | INCOMING 6 | 7 | 8 | <{{composing|paused}}> 9 | 10 | 11 | OUTGOING 12 | 13 | 14 | <{{composing|paused}}> 15 | 16 | ''' 17 | 18 | STATE_TYPING = "composing" 19 | STATE_PAUSED = "paused" 20 | STATES = (STATE_TYPING, STATE_PAUSED) 21 | 22 | def __init__(self, _state): 23 | super(ChatstateProtocolEntity, self).__init__("chatstate") 24 | assert _state in self.__class__.STATES, "Expected chat state to be in %s, got %s" % (self.__class__.STATES, _state) 25 | self._state = _state 26 | 27 | def getState(self): 28 | return self._state 29 | 30 | def toProtocolTreeNode(self): 31 | node = self._createProtocolTreeNode({}, None, data = None) 32 | node.addChild(ProtocolTreeNode(self._state)) 33 | return node 34 | 35 | def __str__(self): 36 | out = "CHATSTATE:\n" 37 | out += "State: %s\n" % self._state 38 | return out 39 | 40 | @staticmethod 41 | def fromProtocolTreeNode(node): 42 | return ChatstateProtocolEntity( 43 | node.getAllChildren()[0].tag, 44 | ) 45 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_chatstate/protocolentities/chatstate_incoming.py: -------------------------------------------------------------------------------- 1 | from .chatstate import ChatstateProtocolEntity 2 | class IncomingChatstateProtocolEntity(ChatstateProtocolEntity): 3 | ''' 4 | INCOMING 5 | 6 | 7 | <{{composing|paused}}> 8 | 9 | 10 | OUTGOING 11 | 12 | 13 | <{{composing|paused}}> 14 | 15 | ''' 16 | 17 | def __init__(self, _state, _from): 18 | super(IncomingChatstateProtocolEntity, self).__init__(_state) 19 | self.setIncomingData(_from) 20 | 21 | def setIncomingData(self, _from): 22 | self._from = _from 23 | 24 | def toProtocolTreeNode(self): 25 | node = super(IncomingChatstateProtocolEntity, self).toProtocolTreeNode() 26 | node.setAttribute("from", self._from) 27 | return node 28 | 29 | def __str__(self): 30 | out = super(IncomingChatstateProtocolEntity, self).__str__() 31 | out += "From: %s\n" % self._from 32 | return out 33 | 34 | @staticmethod 35 | def fromProtocolTreeNode(node): 36 | entity = ChatstateProtocolEntity.fromProtocolTreeNode(node) 37 | entity.__class__ = IncomingChatstateProtocolEntity 38 | entity.setIncomingData( 39 | node.getAttributeValue("from"), 40 | ) 41 | return entity 42 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_chatstate/protocolentities/chatstate_outgoing.py: -------------------------------------------------------------------------------- 1 | from .chatstate import ChatstateProtocolEntity 2 | class OutgoingChatstateProtocolEntity(ChatstateProtocolEntity): 3 | ''' 4 | INCOMING 5 | 6 | 7 | <{{composing|paused}}> 8 | 9 | 10 | OUTGOING 11 | 12 | 13 | <{{composing|paused}}> 14 | 15 | ''' 16 | 17 | def __init__(self, _state, _to): 18 | super(OutgoingChatstateProtocolEntity, self).__init__(_state) 19 | self.setOutgoingData(_to) 20 | 21 | def setOutgoingData(self, _to): 22 | self._to = _to 23 | 24 | def toProtocolTreeNode(self): 25 | node = super(OutgoingChatstateProtocolEntity, self).toProtocolTreeNode() 26 | node.setAttribute("to", self._to) 27 | return node 28 | 29 | def __str__(self): 30 | out = super(OutgoingChatstateProtocolEntity, self).__str__() 31 | out += "To: %s\n" % self._to 32 | return out 33 | 34 | @staticmethod 35 | def fromProtocolTreeNode(node): 36 | entity = ChatstateProtocolEntity.fromProtocolTreeNode(node) 37 | entity.__class__ = OutgoingChatstateProtocolEntity 38 | entity.setOutgoingData( 39 | node.getAttributeValue("to"), 40 | ) 41 | return entity 42 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_chatstate/protocolentities/test_chatstate_incoming.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_chatstate.protocolentities.chatstate_incoming import IncomingChatstateProtocolEntity 2 | from yowsup.structs.protocolentity import ProtocolEntityTest 3 | import unittest 4 | 5 | entity = IncomingChatstateProtocolEntity(IncomingChatstateProtocolEntity.STATE_TYPING, "jid@s.whatsapp.net") 6 | 7 | class IncomingChatstateProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 8 | def setUp(self): 9 | self.ProtocolEntity = IncomingChatstateProtocolEntity 10 | self.node = entity.toProtocolTreeNode() 11 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_chatstate/protocolentities/test_chatstate_outgoing.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_chatstate.protocolentities.chatstate_outgoing import OutgoingChatstateProtocolEntity 2 | from yowsup.structs.protocolentity import ProtocolEntityTest 3 | import unittest 4 | 5 | entity = OutgoingChatstateProtocolEntity(OutgoingChatstateProtocolEntity.STATE_PAUSED, "jid@s.whatsapp.net") 6 | 7 | class OutgoingChatstateProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 8 | def setUp(self): 9 | self.ProtocolEntity = OutgoingChatstateProtocolEntity 10 | self.node = entity.toProtocolTreeNode() 11 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_chatstate/test_layer.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers import YowProtocolLayerTest 2 | from yowsup.layers.protocol_chatstate import YowChatstateProtocolLayer 3 | from yowsup.layers.protocol_chatstate.protocolentities import IncomingChatstateProtocolEntity, OutgoingChatstateProtocolEntity 4 | 5 | class YowChatStateProtocolLayerTest(YowProtocolLayerTest, YowChatstateProtocolLayer): 6 | def setUp(self): 7 | YowChatstateProtocolLayer.__init__(self) 8 | 9 | def test_send(self): 10 | entity = OutgoingChatstateProtocolEntity(OutgoingChatstateProtocolEntity.STATE_PAUSED, "jid@s.whatsapp.net") 11 | self.assertSent(entity) 12 | 13 | def test_receive(self): 14 | entity = IncomingChatstateProtocolEntity(IncomingChatstateProtocolEntity.STATE_TYPING, "jid@s.whatsapp.net") 15 | self.assertReceived(entity) -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_contacts/__init__.py: -------------------------------------------------------------------------------- 1 | from .layer import YowContactsIqProtocolLayer -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_contacts/layer.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers import YowLayer, YowLayerEvent, YowProtocolLayer 2 | from yowsup.common import YowConstants 3 | from .protocolentities import * 4 | class YowContactsIqProtocolLayer(YowProtocolLayer): 5 | def __init__(self): 6 | handleMap = { 7 | "iq": (self.recvIq, self.sendIq), 8 | "notification": (self.recvNotification, None) 9 | } 10 | super(YowContactsIqProtocolLayer, self).__init__(handleMap) 11 | 12 | def __str__(self): 13 | return "Iq Layer" 14 | 15 | def recvNotification(self, node): 16 | if node["type"] == "contacts": 17 | if node.getChild("remove"): 18 | self.toUpper(RemoveContactNotificationProtocolEntity.fromProtocolTreeNode(node)) 19 | elif node.getChild("add"): 20 | self.toUpper(AddContactNotificationProtocolEntity.fromProtocolTreeNode(node)) 21 | elif node.getChild("update"): 22 | self.toUpper(UpdateContactNotificationProtocolEntity.fromProtocolTreeNode(node)) 23 | elif node.getChild("sync"): 24 | self.toUpper(ContactsSyncNotificationProtocolEntity.fromProtocolTreeNode(node)) 25 | else: 26 | self.raiseErrorForNode(node) 27 | 28 | def recvIq(self, node): 29 | if node["type"] == "result" and node.getChild("sync"): 30 | self.toUpper(ResultSyncIqProtocolEntity.fromProtocolTreeNode(node)) 31 | elif node["type"] == "result" and node.getChild("status"): 32 | self.toUpper(ResultStatusesIqProtocolEntity.fromProtocolTreeNode(node)) 33 | 34 | def sendIq(self, entity): 35 | if entity.getXmlns() == "urn:xmpp:whatsapp:sync": 36 | self.toLower(entity.toProtocolTreeNode()) 37 | elif entity.getXmlns() == GetStatusesIqProtocolEntity.XMLNS: 38 | self.toLower(entity.toProtocolTreeNode()) 39 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_contacts/protocolentities/__init__.py: -------------------------------------------------------------------------------- 1 | from .iq_sync import SyncIqProtocolEntity 2 | from .iq_sync_get import GetSyncIqProtocolEntity 3 | from .iq_sync_result import ResultSyncIqProtocolEntity 4 | from .notification_contact_add import AddContactNotificationProtocolEntity 5 | from .notification_contact_remove import RemoveContactNotificationProtocolEntity 6 | from .notification_contact_update import UpdateContactNotificationProtocolEntity 7 | from .notificiation_contacts_sync import ContactsSyncNotificationProtocolEntity 8 | from .iq_statuses_get import GetStatusesIqProtocolEntity 9 | from .iq_statuses_result import ResultStatusesIqProtocolEntity 10 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_contacts/protocolentities/iq_statuses_get.py: -------------------------------------------------------------------------------- 1 | from yowsup.common import YowConstants 2 | from yowsup.layers.protocol_iq.protocolentities import IqProtocolEntity 3 | from yowsup.structs import ProtocolTreeNode 4 | 5 | class GetStatusesIqProtocolEntity(IqProtocolEntity): 6 | XMLNS = "status" 7 | 8 | def __init__(self, jids, _id = None): 9 | """ 10 | Request the statuses of users. Should be sent once after login. 11 | 12 | Args: 13 | - jids: A list of jids representing the users whose statuses you are 14 | trying to get. 15 | """ 16 | super(GetStatusesIqProtocolEntity, self).__init__(self.__class__.XMLNS, _id, _type = "get", to = YowConstants.WHATSAPP_SERVER) 17 | self.setGetStatusesProps(jids) 18 | 19 | def setGetStatusesProps(self, jids): 20 | assert type(jids) is list, "jids must be a list of jids" 21 | self.jids = jids 22 | 23 | def __str__(self): 24 | out = super(GetStatusesIqProtocolEntity, self).__str__() 25 | out += "Numbers: %s\n" % (",".join(self.numbers)) 26 | return out 27 | 28 | def toProtocolTreeNode(self): 29 | users = [ProtocolTreeNode("user", {'jid': jid}) for jid in self.jids] 30 | 31 | node = super(GetStatusesIqProtocolEntity, self).toProtocolTreeNode() 32 | statusNode = ProtocolTreeNode("status", None, users) 33 | node.addChild(statusNode) 34 | 35 | return node 36 | 37 | @staticmethod 38 | def fromProtocolTreeNode(node): 39 | entity = IqProtocolEntity.fromProtocolTreeNode(node) 40 | entity.__class__ = GetStatusesIqProtocolEntity 41 | statusNode = node.getChild("status") 42 | userNodes = statusNode.getAllChildren() 43 | jids = [user['jid'] for user in userNodes] 44 | 45 | entity.setGetStatusesProps(jids) 46 | 47 | return entity 48 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_contacts/protocolentities/notification_contact.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from yowsup.layers.protocol_notifications.protocolentities import NotificationProtocolEntity 3 | class ContactNotificationProtocolEntity(NotificationProtocolEntity): 4 | ''' 5 | 7 | 8 | 9 | ''' 10 | 11 | def __init__(self, _id, _from, timestamp, notify, offline = False): 12 | super(ContactNotificationProtocolEntity, self).__init__("contacts", _id, _from, timestamp, notify, offline) 13 | 14 | 15 | @staticmethod 16 | def fromProtocolTreeNode(node): 17 | entity = NotificationProtocolEntity.fromProtocolTreeNode(node) 18 | entity.__class__ = ContactNotificationProtocolEntity 19 | return entity -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_contacts/protocolentities/notification_contact_add.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolTreeNode 2 | from .notification_contact import ContactNotificationProtocolEntity 3 | class AddContactNotificationProtocolEntity(ContactNotificationProtocolEntity): 4 | ''' 5 | 7 | 8 | 9 | ''' 10 | 11 | def __init__(self, _id, _from, timestamp, notify, offline, contactJid): 12 | super(AddContactNotificationProtocolEntity, self).__init__(_id, _from, timestamp, notify, offline) 13 | self.setData(contactJid) 14 | 15 | def setData(self, jid): 16 | self.contactJid = jid 17 | 18 | def toProtocolTreeNode(self): 19 | node = super(AddContactNotificationProtocolEntity, self).toProtocolTreeNode() 20 | removeNode = ProtocolTreeNode("add", {"jid": self.contactJid}, None, None) 21 | node.addChild(removeNode) 22 | return node 23 | 24 | @staticmethod 25 | def fromProtocolTreeNode(node): 26 | entity = ContactNotificationProtocolEntity.fromProtocolTreeNode(node) 27 | entity.__class__ = AddContactNotificationProtocolEntity 28 | removeNode = node.getChild("add") 29 | entity.setData(removeNode.getAttributeValue("jid")) 30 | return entity -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_contacts/protocolentities/notification_contact_remove.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolTreeNode 2 | from .notification_contact import ContactNotificationProtocolEntity 3 | class RemoveContactNotificationProtocolEntity(ContactNotificationProtocolEntity): 4 | ''' 5 | 7 | 8 | 9 | ''' 10 | 11 | def __init__(self, _id, _from, timestamp, notify, offline, contactJid): 12 | super(RemoveContactNotificationProtocolEntity, self).__init__(_id, _from, timestamp, notify, offline) 13 | self.setData(contactJid) 14 | 15 | def setData(self, jid): 16 | self.contactJid = jid 17 | 18 | def toProtocolTreeNode(self): 19 | node = super(RemoveContactNotificationProtocolEntity, self).toProtocolTreeNode() 20 | removeNode = ProtocolTreeNode("remove", {"jid": self.contactJid}, None, None) 21 | node.addChild(removeNode) 22 | return node 23 | 24 | @staticmethod 25 | def fromProtocolTreeNode(node): 26 | entity = ContactNotificationProtocolEntity.fromProtocolTreeNode(node) 27 | entity.__class__ = RemoveContactNotificationProtocolEntity 28 | removeNode = node.getChild("remove") 29 | entity.setData(removeNode.getAttributeValue("jid")) 30 | return entity -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_contacts/protocolentities/notification_contact_update.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolTreeNode 2 | from .notification_contact import ContactNotificationProtocolEntity 3 | class UpdateContactNotificationProtocolEntity(ContactNotificationProtocolEntity): 4 | ''' 5 | 7 | 8 | 9 | ''' 10 | 11 | def __init__(self, _id, _from, timestamp, notify, offline, contactJid): 12 | super(UpdateContactNotificationProtocolEntity, self).__init__(_id, _from, timestamp, notify, offline) 13 | self.setData(contactJid) 14 | 15 | def setData(self, jid): 16 | self.contactJid = jid 17 | 18 | def toProtocolTreeNode(self): 19 | node = super(UpdateContactNotificationProtocolEntity, self).toProtocolTreeNode() 20 | removeNode = ProtocolTreeNode("update", {"jid": self.contactJid}, None, None) 21 | node.addChild(removeNode) 22 | return node 23 | 24 | @staticmethod 25 | def fromProtocolTreeNode(node): 26 | entity = ContactNotificationProtocolEntity.fromProtocolTreeNode(node) 27 | entity.__class__ = UpdateContactNotificationProtocolEntity 28 | removeNode = node.getChild("update") 29 | entity.setData(removeNode.getAttributeValue("jid")) 30 | return entity -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_contacts/protocolentities/notificiation_contacts_sync.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolTreeNode 2 | from .notification_contact import ContactNotificationProtocolEntity 3 | class ContactsSyncNotificationProtocolEntity(ContactNotificationProtocolEntity): 4 | ''' 5 | 6 | 7 | 8 | ''' 9 | 10 | def __init__(self, _id, _from, timestamp, notify, offline, after): 11 | super(ContactsSyncNotificationProtocolEntity, self).__init__(_id, _from, timestamp, notify, offline) 12 | self.setData(after) 13 | 14 | def setData(self, after): 15 | self.after = int(after) 16 | 17 | def toProtocolTreeNode(self): 18 | node = super(ContactsSyncNotificationProtocolEntity, self).toProtocolTreeNode() 19 | syncNode = ProtocolTreeNode("sync", {"after": str(self.after)}, None, None) 20 | node.addChild(syncNode) 21 | return node 22 | 23 | @staticmethod 24 | def fromProtocolTreeNode(node): 25 | entity = ContactNotificationProtocolEntity.fromProtocolTreeNode(node) 26 | entity.__class__ = ContactsSyncNotificationProtocolEntity 27 | syncNode = node.getChild("sync") 28 | entity.setData(syncNode.getAttributeValue("after")) 29 | return entity -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_contacts/protocolentities/test_iq_sync_get.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_contacts.protocolentities.iq_sync_get import GetSyncIqProtocolEntity 2 | from yowsup.structs.protocolentity import ProtocolEntityTest 3 | import unittest 4 | 5 | entity = GetSyncIqProtocolEntity(["12345678", "8764543121"]) 6 | 7 | class GetSyncIqProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 8 | def setUp(self): 9 | self.ProtocolEntity = GetSyncIqProtocolEntity 10 | self.node = entity.toProtocolTreeNode() -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_contacts/protocolentities/test_iq_sync_result.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_contacts.protocolentities.iq_sync_result import ResultSyncIqProtocolEntity 2 | from yowsup.structs.protocolentity import ProtocolEntityTest 3 | import unittest 4 | 5 | entity = ResultSyncIqProtocolEntity("123", "1.30615237617e+17", 0, 6 | True, "123456", {"12345678": "12345678@s.whatsapp.net"}, 7 | {"12345678": "12345678@s.whatsapp.net"}, ["1234"]) 8 | 9 | class ResultSyncIqProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 10 | def setUp(self): 11 | self.ProtocolEntity = ResultSyncIqProtocolEntity 12 | self.node = entity.toProtocolTreeNode() 13 | 14 | def test_delta_result(self): 15 | del self.node.getChild("sync")["wait"] 16 | self.test_generation() 17 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_contacts/protocolentities/test_notification_contact_add.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_contacts.protocolentities import AddContactNotificationProtocolEntity 2 | from yowsup.structs.protocolentity import ProtocolEntityTest 3 | import time 4 | import unittest 5 | 6 | entity = AddContactNotificationProtocolEntity("1234", "jid@s.whatsapp.net", int(time.time()), "notify", False, 7 | "sender@s.whatsapp.net") 8 | 9 | class AddContactNotificationProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 10 | def setUp(self): 11 | super(AddContactNotificationProtocolEntityTest, self).setUp() 12 | self.ProtocolEntity = AddContactNotificationProtocolEntity 13 | self.node = entity.toProtocolTreeNode() 14 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_contacts/protocolentities/test_notification_contact_remove.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_contacts.protocolentities import RemoveContactNotificationProtocolEntity 2 | from yowsup.structs.protocolentity import ProtocolEntityTest 3 | import time 4 | import unittest 5 | 6 | entity = RemoveContactNotificationProtocolEntity("1234", "jid@s.whatsapp.net", 7 | int(time.time()), "notify", False, "contactjid@s.whatsapp.net") 8 | 9 | class RemoveContactNotificationProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 10 | def setUp(self): 11 | self.ProtocolEntity = RemoveContactNotificationProtocolEntity 12 | self.node = entity.toProtocolTreeNode() 13 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_contacts/protocolentities/test_notification_contact_update.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_contacts.protocolentities import UpdateContactNotificationProtocolEntity 2 | from yowsup.structs.protocolentity import ProtocolEntityTest 3 | import time 4 | import unittest 5 | 6 | entity = UpdateContactNotificationProtocolEntity("1234", "jid@s.whatsapp.net", 7 | int(time.time()), "notify", False,"contactjid@s.whatsapp.net") 8 | 9 | class UpdateContactNotificationProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 10 | def setUp(self): 11 | self.ProtocolEntity = UpdateContactNotificationProtocolEntity 12 | self.node = entity.toProtocolTreeNode() 13 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_contacts/test_layer.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers import YowProtocolLayerTest 2 | from yowsup.layers.protocol_contacts import YowContactsIqProtocolLayer 3 | from yowsup.layers.protocol_contacts.protocolentities.test_notification_contact_add import entity as addEntity 4 | from yowsup.layers.protocol_contacts.protocolentities.test_notification_contact_update import entity as updateEntity 5 | from yowsup.layers.protocol_contacts.protocolentities.test_notification_contact_remove import entity as removeEntity 6 | from yowsup.layers.protocol_contacts.protocolentities.test_iq_sync_result import entity as syncResultEntity 7 | from yowsup.layers.protocol_contacts.protocolentities.test_iq_sync_get import entity as syncGetEntity 8 | 9 | class YowContactsIqProtocolLayerTest(YowProtocolLayerTest, YowContactsIqProtocolLayer): 10 | def setUp(self): 11 | YowContactsIqProtocolLayer.__init__(self) 12 | 13 | def test_sync(self): 14 | self.assertSent(syncGetEntity) 15 | 16 | def test_syncResult(self): 17 | self.assertReceived(syncResultEntity) 18 | 19 | def test_notificationAdd(self): 20 | self.assertReceived(addEntity) 21 | 22 | def test_notificationUpdate(self): 23 | self.assertReceived(updateEntity) 24 | 25 | def test_notificationRemove(self): 26 | self.assertReceived(removeEntity) 27 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_groups/__init__.py: -------------------------------------------------------------------------------- 1 | from .layer import YowGroupsProtocolLayer 2 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_groups/protocolentities/__init__.py: -------------------------------------------------------------------------------- 1 | from .iq_groups_create import CreateGroupsIqProtocolEntity 2 | from .iq_groups_create_success import SuccessCreateGroupsIqProtocolEntity 3 | from .iq_groups_leave import LeaveGroupsIqProtocolEntity 4 | from .iq_groups_leave_success import SuccessLeaveGroupsIqProtocolEntity 5 | from .iq_groups_list import ListGroupsIqProtocolEntity 6 | from .iq_groups_info import InfoGroupsIqProtocolEntity 7 | from .iq_groups_subject import SubjectGroupsIqProtocolEntity 8 | from .iq_groups_participants import ParticipantsGroupsIqProtocolEntity 9 | from .iq_groups_participants_add import AddParticipantsIqProtocolEntity 10 | from .iq_groups_participants_promote import PromoteParticipantsIqProtocolEntity 11 | from .iq_groups_participants_demote import DemoteParticipantsIqProtocolEntity 12 | from .iq_groups_participants_add_success import SuccessAddParticipantsIqProtocolEntity 13 | from .iq_groups_participants_add_failure import FailureAddParticipantsIqProtocolEntity 14 | from .iq_groups_participants_remove import RemoveParticipantsIqProtocolEntity 15 | from .iq_groups_participants_remove_success import SuccessRemoveParticipantsIqProtocolEntity 16 | from .iq_result_groups_list import ListGroupsResultIqProtocolEntity 17 | from .iq_result_participants_list import ListParticipantsResultIqProtocolEntity 18 | from .iq_result_groups_info import InfoGroupsResultIqProtocolEntity 19 | from .notification_groups import GroupsNotificationProtocolEntity 20 | from .notification_groups_subject import SubjectGroupsNotificationProtocolEntity 21 | from .notification_groups_create import CreateGroupsNotificationProtocolEntity 22 | from .notification_groups_add import AddGroupsNotificationProtocolEntity 23 | from .notification_groups_remove import RemoveGroupsNotificationProtocolEntity 24 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_groups/protocolentities/iq_groups.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from yowsup.layers.protocol_iq.protocolentities import IqProtocolEntity 3 | class GroupsIqProtocolEntity(IqProtocolEntity): 4 | ''' 5 | 6 | 7 | ''' 8 | def __init__(self, to = None, _from = None, _id = None, _type = None): 9 | super(GroupsIqProtocolEntity, self).__init__("w:g2", _id, _type, to = to, _from = _from) 10 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_groups/protocolentities/iq_groups_create_success.py: -------------------------------------------------------------------------------- 1 | from yowsup.common import YowConstants 2 | from yowsup.structs import ProtocolTreeNode 3 | from yowsup.layers.protocol_iq.protocolentities import ResultIqProtocolEntity 4 | class SuccessCreateGroupsIqProtocolEntity(ResultIqProtocolEntity): 5 | ''' 6 | 7 | 8 | 9 | ''' 10 | 11 | def __init__(self, _id, groupId): 12 | super(SuccessCreateGroupsIqProtocolEntity, self).__init__(_from = YowConstants.WHATSAPP_GROUP_SERVER, _id = _id) 13 | self.setProps(groupId) 14 | 15 | def setProps(self, groupId): 16 | self.groupId = groupId 17 | 18 | def toProtocolTreeNode(self): 19 | node = super(SuccessCreateGroupsIqProtocolEntity, self).toProtocolTreeNode() 20 | node.addChild(ProtocolTreeNode("group",{"id": self.groupId})) 21 | return node 22 | 23 | @staticmethod 24 | def fromProtocolTreeNode(node): 25 | entity = super(SuccessCreateGroupsIqProtocolEntity, SuccessCreateGroupsIqProtocolEntity).fromProtocolTreeNode(node) 26 | entity.__class__ = SuccessCreateGroupsIqProtocolEntity 27 | entity.setProps(node.getChild("group").getAttributeValue("id")) 28 | return entity 29 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_groups/protocolentities/iq_groups_info.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from .iq_groups import GroupsIqProtocolEntity 3 | class InfoGroupsIqProtocolEntity(GroupsIqProtocolEntity): 4 | ''' 5 | 6 | 7 | 8 | 9 | 10 | ''' 11 | 12 | def __init__(self, group_jid, _id=None): 13 | super(InfoGroupsIqProtocolEntity, self).__init__(to = group_jid, _id = _id, _type = "get") 14 | self.setProps(group_jid) 15 | 16 | def setProps(self, group_jid): 17 | self.group_jid = group_jid 18 | 19 | def __str__(self): 20 | out = super(InfoGroupsIqProtocolEntity, self).__str__() 21 | out += "Group JID: %s\n" % self.group_jid 22 | return out 23 | 24 | def toProtocolTreeNode(self): 25 | node = super(InfoGroupsIqProtocolEntity, self).toProtocolTreeNode() 26 | node.addChild(ProtocolTreeNode("query", {"request": "interactive"})) 27 | return node 28 | 29 | @staticmethod 30 | def fromProtocolTreeNode(node): 31 | assert node.getChild("query") is not None, "Not a groups info iq node %s" % node 32 | entity = super(InfoGroupsIqProtocolEntity, InfoGroupsIqProtocolEntity).fromProtocolTreeNode(node) 33 | entity.__class__ = InfoGroupsIqProtocolEntity 34 | entity.setProps(node.getAttributeValue("to")) 35 | return entity 36 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_groups/protocolentities/iq_groups_leave.py: -------------------------------------------------------------------------------- 1 | from yowsup.common import YowConstants 2 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 3 | from .iq_groups import GroupsIqProtocolEntity 4 | class LeaveGroupsIqProtocolEntity(GroupsIqProtocolEntity): 5 | ''' 6 | 7 | 8 | 9 | 10 | 11 | 12 | ''' 13 | 14 | def __init__(self, groupList): 15 | super(LeaveGroupsIqProtocolEntity, self).__init__(to = YowConstants.WHATSAPP_GROUP_SERVER, _type = "set") 16 | self.setProps(groupList if type(groupList) is list else [groupList]) 17 | 18 | def setProps(self, groupList): 19 | assert type(groupList) is list and len(groupList), "Must specify a list of group jids to leave" 20 | self.groupList = groupList 21 | 22 | def toProtocolTreeNode(self): 23 | node = super(LeaveGroupsIqProtocolEntity, self).toProtocolTreeNode() 24 | groupNodes = [ 25 | ProtocolTreeNode("group", { 26 | "id": groupid 27 | }) 28 | for groupid in self.groupList 29 | ] 30 | node.addChild(ProtocolTreeNode("leave", {"action": "delete"}, groupNodes)) 31 | return node 32 | 33 | @staticmethod 34 | def fromProtocolTreeNode(node): 35 | assert node.getChild("leave") is not None, "Not a group leave iq node %s" % node 36 | assert node.getChild("leave").getAttributeValue("action") == "delete", "Not a group leave action %s" % node 37 | entity = super(LeaveGroupsIqProtocolEntity, LeaveGroupsIqProtocolEntity).fromProtocolTreeNode(node) 38 | entity.__class__ = LeaveGroupsIqProtocolEntity 39 | entity.setProps([group.getAttributeValue("id") for group in node.getChild("leave").getAllChildren()] ) 40 | return entity 41 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_groups/protocolentities/iq_groups_leave_success.py: -------------------------------------------------------------------------------- 1 | from yowsup.common import YowConstants 2 | from yowsup.structs import ProtocolTreeNode 3 | from yowsup.layers.protocol_iq.protocolentities import ResultIqProtocolEntity 4 | 5 | 6 | class SuccessLeaveGroupsIqProtocolEntity(ResultIqProtocolEntity): 7 | ''' 8 | 9 | 10 | 11 | 12 | 13 | ''' 14 | 15 | def __init__(self, _id, groupId): 16 | super(SuccessLeaveGroupsIqProtocolEntity, self).\ 17 | __init__(_from=YowConstants.WHATSAPP_GROUP_SERVER, _id=_id) 18 | self.setProps(groupId) 19 | 20 | def setProps(self, groupId): 21 | self.groupId = groupId 22 | 23 | def __str__(self): 24 | out = super(SuccessLeaveGroupsIqProtocolEntity, self).__str__() 25 | out += "Group Id: %s\n" % self.groupId 26 | return out 27 | 28 | def toProtocolTreeNode(self): 29 | node = super(SuccessLeaveGroupsIqProtocolEntity, self).\ 30 | toProtocolTreeNode() 31 | leaveNode = ProtocolTreeNode( 32 | "leave", {}, [ProtocolTreeNode("group", {"id": self.groupId})] 33 | ) 34 | node.addChild(leaveNode) 35 | return node 36 | 37 | @staticmethod 38 | def fromProtocolTreeNode(node): 39 | entity = super(SuccessLeaveGroupsIqProtocolEntity, SuccessLeaveGroupsIqProtocolEntity).fromProtocolTreeNode(node) 40 | entity.__class__ = SuccessLeaveGroupsIqProtocolEntity 41 | entity.setProps( 42 | node.getChild("leave").getChild("group").getAttributeValue("id") 43 | ) 44 | return entity 45 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_groups/protocolentities/iq_groups_participants.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from .iq_groups import GroupsIqProtocolEntity 3 | 4 | class ParticipantsGroupsIqProtocolEntity(GroupsIqProtocolEntity): 5 | ''' 6 | 7 | 8 | 9 | ''' 10 | 11 | modes=["add","promote","remove","demote"] 12 | def __init__(self, jid, participantList, _mode, _id = None): 13 | super(ParticipantsGroupsIqProtocolEntity, self).__init__(to = jid, _id = _id, _type = "set") 14 | self.setProps(group_jid = jid, participantList = participantList, mode = _mode) 15 | 16 | def setProps(self, group_jid, participantList, mode): 17 | assert type(participantList) is list, "Must be a list of jids, got %s instead." % type(participantList) 18 | assert mode in self.modes, "Mode should be in: '" + "', '".join(self.modes) + "' but is '" + mode + "'" 19 | self.group_jid = group_jid 20 | self.participantList = participantList 21 | self.mode = mode 22 | 23 | def toProtocolTreeNode(self): 24 | node = super(ParticipantsGroupsIqProtocolEntity, self).toProtocolTreeNode() 25 | participantNodes = [ 26 | ProtocolTreeNode("participant", { 27 | "jid": participant 28 | }) 29 | for participant in self.participantList 30 | ] 31 | node.addChild(ProtocolTreeNode(self.mode,{}, participantNodes)) 32 | return node 33 | 34 | @staticmethod 35 | def fromProtocolTreeNode(node): 36 | entity = super(ParticipantsGroupsIqProtocolEntity, ParticipantsGroupsIqProtocolEntity).fromProtocolTreeNode(node) 37 | entity.__class__ = ParticipantsGroupsIqProtocolEntity 38 | return entity 39 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_groups/protocolentities/iq_groups_participants_add.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from .iq_groups_participants import ParticipantsGroupsIqProtocolEntity 3 | 4 | class AddParticipantsIqProtocolEntity(ParticipantsGroupsIqProtocolEntity): 5 | ''' 6 | 7 | 8 | 9 | 10 | 11 | 12 | ''' 13 | 14 | def __init__(self, group_jid, participantList, _id = None): 15 | super(AddParticipantsIqProtocolEntity, self).__init__(group_jid, participantList, "add", _id = _id) 16 | 17 | @staticmethod 18 | def fromProtocolTreeNode(node): 19 | entity = super(AddParticipantsIqProtocolEntity, AddParticipantsIqProtocolEntity).fromProtocolTreeNode(node) 20 | entity.__class__ = AddParticipantsIqProtocolEntity 21 | participantList = [] 22 | for participantNode in node.getChild("add").getAllChildren(): 23 | participantList.append(participantNode["jid"]) 24 | entity.setProps(node.getAttributeValue("to"), participantList) 25 | return entity 26 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_groups/protocolentities/iq_groups_participants_add_failure.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_iq.protocolentities import ErrorIqProtocolEntity 2 | class FailureAddParticipantsIqProtocolEntity(ErrorIqProtocolEntity): 3 | ''' 4 | 5 | 6 | 7 | 8 | ''' 9 | 10 | def __init__(self, _id, _from, _code, _text, _backoff= 0 ): 11 | super(FailureAddParticipantsIqProtocolEntity, self).__init__(_from = _from, 12 | _id = _id, code = _code, 13 | text = _text, backoff = _backoff) 14 | @staticmethod 15 | def fromProtocolTreeNode(node): 16 | entity = ErrorIqProtocolEntity.fromProtocolTreeNode(node) 17 | entity.__class__ = FailureAddParticipantsIqProtocolEntity 18 | return entity -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_groups/protocolentities/iq_groups_participants_demote.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from .iq_groups_participants import ParticipantsGroupsIqProtocolEntity 3 | 4 | class DemoteParticipantsIqProtocolEntity(ParticipantsGroupsIqProtocolEntity): 5 | ''' 6 | 7 | 8 | 9 | 10 | 11 | 12 | ''' 13 | 14 | def __init__(self, group_jid, participantList, _id = None): 15 | super(DemoteParticipantsIqProtocolEntity, self).__init__(group_jid, participantList, "demote", _id = _id) 16 | 17 | @staticmethod 18 | def fromProtocolTreeNode(node): 19 | entity = super(DemoteParticipantsIqProtocolEntity, DemoteParticipantsIqProtocolEntity).fromProtocolTreeNode(node) 20 | entity.__class__ = DemoteParticipantsIqProtocolEntity 21 | participantList = [] 22 | for participantNode in node.getChild("demote").getAllChildren(): 23 | participantList.append(participantNode["jid"]) 24 | entity.setProps(node.getAttributeValue("to"), participantList) 25 | return entity 26 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_groups/protocolentities/iq_groups_participants_promote.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from .iq_groups_participants import ParticipantsGroupsIqProtocolEntity 3 | 4 | class PromoteParticipantsIqProtocolEntity(ParticipantsGroupsIqProtocolEntity): 5 | ''' 6 | 7 | 8 | 9 | 10 | 11 | 12 | ''' 13 | 14 | def __init__(self, group_jid, participantList, _id = None): 15 | super(PromoteParticipantsIqProtocolEntity, self).__init__(group_jid, participantList, "promote", _id = _id) 16 | 17 | @staticmethod 18 | def fromProtocolTreeNode(node): 19 | entity = super(PromoteParticipantsIqProtocolEntity, PromoteParticipantsIqProtocolEntity).fromProtocolTreeNode(node) 20 | entity.__class__ = PromoteParticipantsIqProtocolEntity 21 | participantList = [] 22 | for participantNode in node.getChild("promote").getAllChildren(): 23 | participantList.append(participantNode["jid"]) 24 | entity.setProps(node.getAttributeValue("to"), participantList) 25 | return entity 26 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_groups/protocolentities/iq_groups_participants_remove.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from .iq_groups_participants import ParticipantsGroupsIqProtocolEntity 3 | 4 | class RemoveParticipantsIqProtocolEntity(ParticipantsGroupsIqProtocolEntity): 5 | ''' 6 | 7 | 8 | 9 | 10 | 11 | 12 | ''' 13 | 14 | def __init__(self, group_jid, participantList, _id = None): 15 | super(RemoveParticipantsIqProtocolEntity, self).__init__(group_jid, participantList, "remove", _id = _id) 16 | 17 | @staticmethod 18 | def fromProtocolTreeNode(node): 19 | entity = super(RemoveParticipantsIqProtocolEntity, RemoveParticipantsIqProtocolEntity).fromProtocolTreeNode(node) 20 | entity.__class__ = RemoveParticipantsIqProtocolEntity 21 | participantList = [] 22 | for participantNode in node.getChild("remove").getAllChildren(): 23 | participantList.append(participantNode["jid"]) 24 | entity.setProps(node.getAttributeValue("to"), participantList) 25 | return entity 26 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_groups/protocolentities/iq_groups_subject.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from .iq_groups import GroupsIqProtocolEntity 3 | class SubjectGroupsIqProtocolEntity(GroupsIqProtocolEntity): 4 | ''' 5 | 6 | 7 | {{NEW_VAL}} 8 | 9 | 10 | ''' 11 | def __init__(self, jid, subject, _id = None): 12 | super(SubjectGroupsIqProtocolEntity, self).__init__(to = jid, _id = _id, _type = "set") 13 | self.setProps(subject) 14 | 15 | def setProps(self, subject): 16 | self.subject = subject 17 | 18 | def toProtocolTreeNode(self): 19 | node = super(SubjectGroupsIqProtocolEntity, self).toProtocolTreeNode() 20 | node.addChild(ProtocolTreeNode("subject",{}, None, self.subject)) 21 | return node 22 | 23 | @staticmethod 24 | def fromProtocolTreeNode(node): 25 | entity = super(SubjectGroupsIqProtocolEntity, SubjectGroupsIqProtocolEntity).fromProtocolTreeNode(node) 26 | entity.__class__ = SubjectGroupsIqProtocolEntity 27 | entity.setProps(node.getChild("subject").getData()) 28 | return entity 29 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_groups/protocolentities/iq_result_participants_list.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolTreeNode 2 | from yowsup.layers.protocol_iq.protocolentities import ResultIqProtocolEntity 3 | class ListParticipantsResultIqProtocolEntity(ResultIqProtocolEntity): 4 | ''' 5 | 6 | 7 | 8 | 9 | ''' 10 | 11 | def __init__(self, _from, participantList): 12 | super(ListParticipantsResultIqProtocolEntity, self).__init__(_from = _from) 13 | self.setParticipants(participantList) 14 | 15 | def __str__(self): 16 | out = super(ListParticipantsResultIqProtocolEntity, self).__str__() 17 | out += "Participants: %s\n" % " ".join(self.participantList) 18 | return out 19 | 20 | def getParticipants(self): 21 | return self.participantList 22 | 23 | def setParticipants(self, participants): 24 | self.participantList = participants 25 | 26 | def toProtocolTreeNode(self): 27 | node = super(ListParticipantsResultIqProtocolEntity, self).toProtocolTreeNode() 28 | 29 | participantNodes = [ 30 | ProtocolTreeNode("participant", { 31 | "jid": participant 32 | }) 33 | for participant in self.participantList 34 | ] 35 | 36 | node.addChildren(participantNodes) 37 | return node 38 | 39 | @staticmethod 40 | def fromProtocolTreeNode(node): 41 | entity = super(ListParticipantsResultIqProtocolEntity, ListParticipantsResultIqProtocolEntity).fromProtocolTreeNode(node) 42 | entity.__class__ = ListParticipantsResultIqProtocolEntity 43 | entity.setParticipants([ pNode.getAttributeValue("jid") for pNode in node.getAllChildren() ]) 44 | return entity 45 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_groups/protocolentities/test_iq_groups.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_iq.protocolentities.test_iq import IqProtocolEntityTest 2 | 3 | class GroupsIqProtocolEntityTest(IqProtocolEntityTest): 4 | pass 5 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_groups/protocolentities/test_iq_groups_create.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_groups.protocolentities.iq_groups_create import CreateGroupsIqProtocolEntity 2 | from yowsup.structs.protocolentity import ProtocolEntityTest 3 | import unittest 4 | 5 | entity = CreateGroupsIqProtocolEntity("group subject") 6 | 7 | class CreateGroupsIqProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 8 | def setUp(self): 9 | self.ProtocolEntity = CreateGroupsIqProtocolEntity 10 | self.node = entity.toProtocolTreeNode() 11 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_groups/protocolentities/test_iq_groups_create_success.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs.protocolentity import ProtocolEntityTest 2 | from yowsup.layers.protocol_groups.protocolentities import SuccessCreateGroupsIqProtocolEntity 3 | import unittest 4 | 5 | entity = SuccessCreateGroupsIqProtocolEntity("123-456", "431-123") 6 | 7 | class SuccessCreateGroupsIqProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 8 | def setUp(self): 9 | self.ProtocolEntity = SuccessCreateGroupsIqProtocolEntity 10 | self.node = entity.toProtocolTreeNode() 11 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_groups/protocolentities/test_iq_groups_list.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_groups.protocolentities.iq_groups_list import ListGroupsIqProtocolEntity 2 | from yowsup.structs.protocolentity import ProtocolEntityTest 3 | import unittest 4 | 5 | entity = ListGroupsIqProtocolEntity() 6 | 7 | class ListGroupsIqProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 8 | def setUp(self): 9 | self.ProtocolEntity = ListGroupsIqProtocolEntity 10 | self.node = entity.toProtocolTreeNode() 11 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_groups/protocolentities/test_iq_result_groups.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_iq.protocolentities.test_iq_result import ResultIqProtocolEntityTest 2 | 3 | class GroupsResultIqProtocolEntityTest(ResultIqProtocolEntityTest): 4 | pass -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_groups/protocolentities/test_iq_result_groups_list.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_groups.protocolentities.iq_result_groups_list import ListGroupsResultIqProtocolEntity 2 | from yowsup.structs.protocolentity import ProtocolEntityTest 3 | from yowsup.layers.protocol_groups.structs import Group 4 | import unittest 5 | import time 6 | 7 | entity = ListGroupsResultIqProtocolEntity( 8 | [ 9 | Group("1234-456", "owner@s.whatsapp.net", "subject", "sOwnerJid@s.whatsapp.net", int(time.time()), int(time.time())), 10 | Group("4321-456", "owner@s.whatsapp.net", "subject", "sOwnerJid@s.whatsapp.net", int(time.time()), int(time.time())) 11 | ] 12 | ) 13 | 14 | class ListGroupsResultIqProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 15 | def setUp(self): 16 | self.ProtocolEntity = ListGroupsResultIqProtocolEntity 17 | self.node = entity.toProtocolTreeNode() 18 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_groups/structs/__init__.py: -------------------------------------------------------------------------------- 1 | from .group import Group -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_groups/structs/group.py: -------------------------------------------------------------------------------- 1 | class Group(object): 2 | def __init__(self, groupId, creatorJid, subject, subjectOwnerJid, subjectTime, creationTime, participants=None): 3 | self._groupId = groupId 4 | self._creatorJid = creatorJid 5 | self._subject = subject 6 | self._subjectOwnerJid = subjectOwnerJid 7 | self._subjectTime = int(subjectTime) 8 | self._creationTime = int(creationTime) 9 | self._participants = participants or {} 10 | 11 | def getId(self): 12 | return self._groupId 13 | 14 | def getCreator(self): 15 | return self._creatorJid 16 | 17 | def getOwner(self): 18 | return self.getCreator() 19 | 20 | def getSubject(self): 21 | return self._subject 22 | 23 | def getSubjectOwner(self): 24 | return self._subjectOwnerJid 25 | 26 | def getSubjectTime(self): 27 | return self._subjectTime 28 | 29 | def getCreationTime(self): 30 | return self._creationTime 31 | 32 | def __str__(self): 33 | return "ID: %s, Subject: %s, Creation: %s, Creator: %s, Subject Owner: %s, Subject Time: %s\nParticipants: %s" %\ 34 | (self.getId(), self.getSubject(), self.getCreationTime(), self.getCreator(), self.getSubjectOwner(), self.getSubjectTime(), ", ".join(self._participants.keys())) 35 | 36 | def getParticipants(self): 37 | return self._participants 38 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_ib/__init__.py: -------------------------------------------------------------------------------- 1 | from .layer import YowIbProtocolLayer 2 | 3 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_ib/layer.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers import YowLayer, YowLayerEvent, YowProtocolLayer 2 | from .protocolentities import * 3 | class YowIbProtocolLayer(YowProtocolLayer): 4 | 5 | def __init__(self): 6 | handleMap = { 7 | "ib": (self.recvIb, self.sendIb), 8 | "iq": (None, self.sendIb) 9 | } 10 | super(YowIbProtocolLayer, self).__init__(handleMap) 11 | 12 | def __str__(self): 13 | return "Ib Layer" 14 | 15 | def sendIb(self, entity): 16 | if entity.__class__ == CleanIqProtocolEntity: 17 | self.toLower(entity.toProtocolTreeNode()) 18 | 19 | def recvIb(self, node): 20 | if node.getChild("dirty"): 21 | self.toUpper(DirtyIbProtocolEntity.fromProtocolTreeNode(node)) 22 | elif node.getChild("offline"): 23 | self.toUpper(OfflineIbProtocolEntity.fromProtocolTreeNode(node)) 24 | elif node.getChild("account"): 25 | self.toUpper(AccountIbProtocolEntity.fromProtocolTreeNode(node)) 26 | else: 27 | raise ValueError("Unkown ib node %s" % node) 28 | 29 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_ib/protocolentities/__init__.py: -------------------------------------------------------------------------------- 1 | from .clean_iq import CleanIqProtocolEntity 2 | from .dirty_ib import DirtyIbProtocolEntity 3 | from .offline_ib import OfflineIbProtocolEntity 4 | from .account_ib import AccountIbProtocolEntity -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_ib/protocolentities/clean_iq.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from yowsup.layers.protocol_iq.protocolentities import IqProtocolEntity 3 | class CleanIqProtocolEntity(IqProtocolEntity): 4 | ''' 5 | 6 | 7 | 8 | ''' 9 | def __init__(self, cleanType, to, _id = None): 10 | super(CleanIqProtocolEntity, self).__init__( 11 | "urn:xmpp:whatsapp:dirty", 12 | _id = _id, 13 | _type = "set", 14 | to = to 15 | ) 16 | self.setProps(cleanType) 17 | 18 | def setProps(self, cleanType): 19 | self.cleanType = cleanType 20 | 21 | def __str__(self): 22 | out = super(CleanIqProtocolEntity, self).__str__() 23 | out += "Clean Type: %s\n" % self.cleanType 24 | return out 25 | 26 | def toProtocolTreeNode(self): 27 | node = super(CleanIqProtocolEntity, self).toProtocolTreeNode() 28 | cleanNode = ProtocolTreeNode("clean", {"type": self.cleanType}) 29 | node.addChild(cleanNode) 30 | return node 31 | 32 | @staticmethod 33 | def fromProtocolTreeNode(node): 34 | entity = IqProtocolEntity.fromProtocolTreeNode(node) 35 | entity.__class__ = CleanIqProtocolEntity 36 | entity.setProps(node.getChild("clean").getAttributeValue("type")) 37 | return entity -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_ib/protocolentities/dirty_ib.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from .ib import IbProtocolEntity 3 | class DirtyIbProtocolEntity(IbProtocolEntity): 4 | ''' 5 | 6 | 7 | 8 | ''' 9 | def __init__(self, timestamp, _type): 10 | super(DirtyIbProtocolEntity, self).__init__() 11 | self.setProps(timestamp, _type) 12 | 13 | 14 | def setProps(self, timestamp, _type): 15 | self.timestamp = int(timestamp) 16 | self._type = _type 17 | 18 | def toProtocolTreeNode(self): 19 | node = super(DirtyIbProtocolEntity, self).toProtocolTreeNode() 20 | dirtyNode = ProtocolTreeNode("dirty") 21 | dirtyNode["timestamp"] = str(self.timestamp) 22 | dirtyNode["type"] = self._type 23 | node.addChild(dirtyNode) 24 | return node 25 | 26 | def __str__(self): 27 | out = super(DirtyIbProtocolEntity, self).__str__() 28 | out += "Type: %s\n" % self._type 29 | out += "Timestamp: %s\n" % self.timestamp 30 | return out 31 | 32 | @staticmethod 33 | def fromProtocolTreeNode(node): 34 | entity = IbProtocolEntity.fromProtocolTreeNode(node) 35 | entity.__class__ = DirtyIbProtocolEntity 36 | dirtyChild = node.getChild("dirty") 37 | entity.setProps(dirtyChild["timestamp"], dirtyChild["type"]) 38 | return entity 39 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_ib/protocolentities/ib.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | class IbProtocolEntity(ProtocolEntity): 3 | ''' 4 | 5 | ''' 6 | def __init__(self): 7 | super(IbProtocolEntity, self).__init__("ib") 8 | 9 | def toProtocolTreeNode(self): 10 | return self._createProtocolTreeNode({}, None, None) 11 | 12 | def __str__(self): 13 | out = "Ib:\n" 14 | return out 15 | 16 | @staticmethod 17 | def fromProtocolTreeNode(node): 18 | return IbProtocolEntity() 19 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_ib/protocolentities/offline_ib.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from .ib import IbProtocolEntity 3 | class OfflineIbProtocolEntity(IbProtocolEntity): 4 | ''' 5 | 6 | 7 | 8 | ''' 9 | def __init__(self, count): 10 | super(IbProtocolEntity, self).__init__() 11 | self.setProps(count) 12 | 13 | 14 | def setProps(self, count): 15 | self.count = int(count) 16 | 17 | def toProtocolTreeNode(self): 18 | node = super(OfflineIbProtocolEntity, self).toProtocolTreeNode() 19 | offlineChild = ProtocolTreeNode("offline", {"count": str(self.count)}) 20 | node.addChild(offlineChild) 21 | return node 22 | 23 | def __str__(self): 24 | out = super(OfflineIbProtocolEntity, self).__str__() 25 | out += "Offline count: %s\n" % self.count 26 | return out 27 | 28 | @staticmethod 29 | def fromProtocolTreeNode(node): 30 | entity = IbProtocolEntity.fromProtocolTreeNode(node) 31 | entity.__class__ = OfflineIbProtocolEntity 32 | entity.setProps(node.getChild("offline")["count"]) 33 | return entity 34 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_ib/protocolentities/test_clean_iq.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolTreeNode 2 | from yowsup.layers.protocol_ib.protocolentities.clean_iq import CleanIqProtocolEntity 3 | from yowsup.layers.protocol_iq.protocolentities.test_iq import IqProtocolEntityTest 4 | 5 | class CleanIqProtocolEntityTest(IqProtocolEntityTest): 6 | def setUp(self): 7 | super(CleanIqProtocolEntityTest, self).setUp() 8 | self.ProtocolEntity = CleanIqProtocolEntity 9 | cleanNode = ProtocolTreeNode("clean", {"type": "groups"}) 10 | self.node.addChild(cleanNode) -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_ib/protocolentities/test_dirty_ib.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_ib.protocolentities.test_ib import IbProtocolEntityTest 2 | from yowsup.layers.protocol_ib.protocolentities.dirty_ib import DirtyIbProtocolEntity 3 | from yowsup.structs import ProtocolTreeNode 4 | class DirtyIbProtocolEntityTest(IbProtocolEntityTest): 5 | def setUp(self): 6 | super(DirtyIbProtocolEntityTest, self).setUp() 7 | self.ProtocolEntity = DirtyIbProtocolEntity 8 | dirtyNode = ProtocolTreeNode("dirty") 9 | dirtyNode["timestamp"] = "123456" 10 | dirtyNode["type"] = "groups" 11 | self.node.addChild(dirtyNode) -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_ib/protocolentities/test_ib.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_ib.protocolentities.ib import IbProtocolEntity 2 | from yowsup.structs import ProtocolTreeNode 3 | from yowsup.structs.protocolentity import ProtocolEntityTest 4 | import unittest 5 | 6 | class IbProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 7 | def setUp(self): 8 | self.ProtocolEntity = IbProtocolEntity 9 | self.node = ProtocolTreeNode("ib") 10 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_ib/protocolentities/test_offline_iq.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_ib.protocolentities.test_ib import IbProtocolEntityTest 2 | from yowsup.layers.protocol_ib.protocolentities.offline_ib import OfflineIbProtocolEntity 3 | from yowsup.structs import ProtocolTreeNode 4 | class OfflineIbProtocolEntityTest(IbProtocolEntityTest): 5 | def setUp(self): 6 | super(OfflineIbProtocolEntityTest, self).setUp() 7 | self.ProtocolEntity = OfflineIbProtocolEntity 8 | self.node.addChild(ProtocolTreeNode("offline", {"count": "5"})) -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_iq/__init__.py: -------------------------------------------------------------------------------- 1 | from .layer import YowIqProtocolLayer -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_iq/protocolentities/__init__.py: -------------------------------------------------------------------------------- 1 | from .iq import IqProtocolEntity 2 | from .iq_result import ResultIqProtocolEntity 3 | from .iq_ping import PingIqProtocolEntity 4 | from .iq_result_pong import PongResultIqProtocolEntity 5 | from .iq_error import ErrorIqProtocolEntity 6 | from .iq_push import PushIqProtocolEntity 7 | from .iq_props import PropsIqProtocolEntity 8 | from .iq_crypto import CryptoIqProtocolEntity 9 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_iq/protocolentities/iq_crypto.py: -------------------------------------------------------------------------------- 1 | from .iq import IqProtocolEntity 2 | from yowsup.structs import ProtocolTreeNode 3 | class CryptoIqProtocolEntity(IqProtocolEntity): 4 | def __init__(self): 5 | super(CryptoIqProtocolEntity, self).__init__("urn:xmpp:whatsapp:account", _type="get") 6 | 7 | def toProtocolTreeNode(self): 8 | node = super(CryptoIqProtocolEntity, self).toProtocolTreeNode() 9 | cryptoNode = ProtocolTreeNode("crypto", {"action": "create"}) 10 | googleNode = ProtocolTreeNode("google", data = "fe5cf90c511fb899781bbed754577098e460d048312c8b36c11c91ca4b49ca34".decode('hex')) 11 | cryptoNode.addChild(googleNode) 12 | node.addChild(cryptoNode) 13 | return node -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_iq/protocolentities/iq_error.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolTreeNode 2 | from .iq import IqProtocolEntity 3 | class ErrorIqProtocolEntity(IqProtocolEntity): 4 | 5 | ''' 6 | 7 | 8 | 9 | ''' 10 | 11 | def __init__(self, _id, _from, code, text, backoff= 0 ): 12 | super(ErrorIqProtocolEntity, self).__init__(xmlns = None, _id = _id, _type = "error", _from = _from) 13 | self.setErrorProps(code, text, backoff) 14 | 15 | def setErrorProps(self, code, text, backoff): 16 | self.code = code 17 | self.text = text 18 | self.backoff = int(backoff) if backoff else 0 19 | 20 | def toProtocolTreeNode(self): 21 | node = super(ErrorIqProtocolEntity, self).toProtocolTreeNode() 22 | errorNode = ProtocolTreeNode("error", {"text": self.text, "code": self.code}) 23 | if self.backoff: 24 | errorNode.setAttribute("backoff", str(self.backoff)) 25 | node.addChild(errorNode) 26 | return node 27 | 28 | def __str__(self): 29 | out = super(ErrorIqProtocolEntity, self).__str__() 30 | out += "Code: %s\n" % self.code 31 | out += "Text: %s\n" % self.text 32 | out += "Backoff: %s\n" % self.backoff 33 | return out 34 | 35 | @staticmethod 36 | def fromProtocolTreeNode(node): 37 | entity = IqProtocolEntity.fromProtocolTreeNode(node) 38 | entity.__class__ = ErrorIqProtocolEntity 39 | errorNode = node.getChild("error") 40 | entity.setErrorProps(errorNode.getAttributeValue("code"), 41 | errorNode.getAttributeValue("text"), 42 | errorNode.getAttributeValue("backoff")) 43 | return entity 44 | 45 | 46 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_iq/protocolentities/iq_ping.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from .iq import IqProtocolEntity 3 | class PingIqProtocolEntity(IqProtocolEntity): 4 | 5 | ''' 6 | Receive 7 | 8 | 9 | Send 10 | 11 | 12 | ''' 13 | 14 | def __init__(self, _from = None, to = None, _id = None): 15 | super(PingIqProtocolEntity, self).__init__("urn:xmpp:ping" if _from else "w:p", _id = _id, _type = "get", _from = _from, to = to) 16 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_iq/protocolentities/iq_props.py: -------------------------------------------------------------------------------- 1 | from .iq import IqProtocolEntity 2 | from yowsup.structs import ProtocolTreeNode 3 | class PropsIqProtocolEntity(IqProtocolEntity): 4 | def __init__(self): 5 | super(PropsIqProtocolEntity, self).__init__("w", _type="get") 6 | 7 | def toProtocolTreeNode(self): 8 | node = super(PropsIqProtocolEntity, self).toProtocolTreeNode() 9 | node.addChild(ProtocolTreeNode("props")) 10 | return node -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_iq/protocolentities/iq_push.py: -------------------------------------------------------------------------------- 1 | from .iq import IqProtocolEntity 2 | from yowsup.structs import ProtocolTreeNode 3 | class PushIqProtocolEntity(IqProtocolEntity): 4 | def __init__(self): 5 | super(PushIqProtocolEntity, self).__init__("urn:xmpp:whatsapp:push", _type="get") 6 | 7 | def toProtocolTreeNode(self): 8 | node = super(PushIqProtocolEntity, self).toProtocolTreeNode() 9 | node.addChild(ProtocolTreeNode("config")) 10 | return node -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_iq/protocolentities/iq_result.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from .iq import IqProtocolEntity 3 | class ResultIqProtocolEntity(IqProtocolEntity): 4 | 5 | ''' 6 | 7 | 8 | ''' 9 | 10 | def __init__(self, xmlns = None, _id = None, to = None, _from = None): 11 | super(ResultIqProtocolEntity, self).__init__(xmlns = xmlns, _id = _id, _type = "result", to = to, _from = _from) 12 | 13 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_iq/protocolentities/iq_result_pong.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from .iq_result import ResultIqProtocolEntity 3 | class PongResultIqProtocolEntity(ResultIqProtocolEntity): 4 | 5 | ''' 6 | 7 | 8 | ''' 9 | def __init__(self, to, _id = None): 10 | super(PongResultIqProtocolEntity, self).__init__("w:p", _id = _id, to = to) 11 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_iq/protocolentities/test_iq.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_iq.protocolentities.iq import IqProtocolEntity 2 | from yowsup.structs import ProtocolTreeNode 3 | from yowsup.structs.protocolentity import ProtocolEntityTest 4 | import unittest 5 | 6 | class IqProtocolEntityTest(unittest.TestCase, ProtocolEntityTest): 7 | def setUp(self): 8 | self.ProtocolEntity = IqProtocolEntity 9 | self.node = ProtocolTreeNode("iq", {"id": "test_id", "type": "get", "xmlns": "iq_xmlns"}, None, None) -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_iq/protocolentities/test_iq_error.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_iq.protocolentities.test_iq import IqProtocolEntityTest 2 | from yowsup.layers.protocol_iq.protocolentities import ErrorIqProtocolEntity 3 | from yowsup.structs import ProtocolTreeNode 4 | 5 | class ErrorIqProtocolEntityTest(IqProtocolEntityTest): 6 | def setUp(self): 7 | super(ErrorIqProtocolEntityTest, self).setUp() 8 | self.ProtocolEntity = ErrorIqProtocolEntity 9 | errorNode = ProtocolTreeNode("error", {"code": "123", "text": "abc"}) 10 | self.node.addChild(errorNode) 11 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_iq/protocolentities/test_iq_result.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_iq.protocolentities.test_iq import IqProtocolEntityTest 2 | class ResultIqProtocolEntityTest(IqProtocolEntityTest): 3 | def setUp(self): 4 | super(ResultIqProtocolEntityTest, self).setUp() 5 | self.node.setAttribute("type", "result") -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_media/__init__.py: -------------------------------------------------------------------------------- 1 | from .layer import YowMediaProtocolLayer 2 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_media/picture.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers import YowLayer 2 | from yowsup import ProtocolTreeNode 3 | from .mediadownloader import MediaDownloader 4 | import shutil, os, logging 5 | logger = logging.getLogger(__name__) 6 | 7 | class YowMediaPictureLayer(YowLayer): 8 | def send(self, data): 9 | self.toLower(data) 10 | 11 | def receive(self, node): 12 | if ProtocolTreeNode.tagEquals(node, "message") and node.getAttributeValue("type") == "media": 13 | self.downloadMedia(node.getChild("media").getAttributeValue("url")) 14 | else: 15 | self.toUpper(node) 16 | 17 | def downloadMedia(self, url): 18 | logger.debug("Downloading %s" % url) 19 | downloader = MediaDownloader(self.onSuccess, self.onError, self.onProgress) 20 | downloader.download(url) 21 | 22 | def onError(self): 23 | logger.error("Error download file") 24 | 25 | def onSuccess(self, path): 26 | outPath = "/tmp/yowfiles/%s.jpg" % os.path.basename(path) 27 | shutil.copyfile(path, outPath) 28 | logger.debug("Picture downloaded to %s" % outPath) 29 | 30 | def onProgress(self, progress): 31 | logger.debug("Download progress %s" % progress) 32 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_media/protocolentities/__init__.py: -------------------------------------------------------------------------------- 1 | from .message_media import MediaMessageProtocolEntity 2 | from .message_media_downloadable import DownloadableMediaMessageProtocolEntity 3 | from .message_media_downloadable_image import ImageDownloadableMediaMessageProtocolEntity 4 | from .message_media_downloadable_audio import AudioDownloadableMediaMessageProtocolEntity 5 | from .message_media_downloadable_video import VideoDownloadableMediaMessageProtocolEntity 6 | from .message_media_location import LocationMediaMessageProtocolEntity 7 | from .message_media_vcard import VCardMediaMessageProtocolEntity 8 | from .iq_requestupload import RequestUploadIqProtocolEntity 9 | from .iq_requestupload_result import ResultRequestUploadIqProtocolEntity 10 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_media/protocolentities/test_iq_requestupload.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_iq.protocolentities.test_iq import IqProtocolEntityTest 2 | from yowsup.layers.protocol_media.protocolentities import RequestUploadIqProtocolEntity 3 | from yowsup.structs import ProtocolTreeNode 4 | class RequestUploadIqProtocolEntityTest(IqProtocolEntityTest): 5 | def setUp(self): 6 | super(RequestUploadIqProtocolEntityTest, self).setUp() 7 | mediaNode = ProtocolTreeNode("media", {"hash": "hash", "size": "1234", "orighash": "orighash", "type": "image"}) 8 | self.ProtocolEntity = RequestUploadIqProtocolEntity 9 | self.node.setAttribute("type", "set") 10 | self.node.addChild(mediaNode) -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_media/protocolentities/test_iq_requestupload_result.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_iq.protocolentities.test_iq_result import ResultIqProtocolEntityTest 2 | from yowsup.layers.protocol_media.protocolentities import ResultRequestUploadIqProtocolEntity 3 | from yowsup.structs import ProtocolTreeNode 4 | class ResultRequestUploadIqProtocolEntityTest(ResultIqProtocolEntityTest): 5 | def setUp(self): 6 | super(ResultRequestUploadIqProtocolEntityTest, self).setUp() 7 | mediaNode = ProtocolTreeNode("media", {"url": "url", "ip": "1.2.3.4"}) 8 | self.ProtocolEntity = ResultRequestUploadIqProtocolEntity 9 | self.node.addChild(mediaNode) -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_media/protocolentities/test_message_media.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_media.protocolentities.message_media import MediaMessageProtocolEntity 2 | from yowsup.layers.protocol_messages.protocolentities.test_message import MessageProtocolEntityTest 3 | from yowsup.structs import ProtocolTreeNode 4 | 5 | class MediaMessageProtocolEntityTest(MessageProtocolEntityTest): 6 | def setUp(self): 7 | super(MediaMessageProtocolEntityTest, self).setUp() 8 | self.ProtocolEntity = MediaMessageProtocolEntity 9 | mediaNode = ProtocolTreeNode("media", {"type":"MEDIA_TYPE"}, None, None) 10 | self.node.addChild(mediaNode) 11 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_media/protocolentities/test_message_media_downloadable.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_media.protocolentities.message_media_downloadable import DownloadableMediaMessageProtocolEntity 2 | from yowsup.layers.protocol_media.protocolentities.test_message_media import MediaMessageProtocolEntityTest 3 | 4 | class DownloadableMediaMessageProtocolEntityTest(MediaMessageProtocolEntityTest): 5 | def setUp(self): 6 | super(DownloadableMediaMessageProtocolEntityTest, self).setUp() 7 | self.ProtocolEntity = DownloadableMediaMessageProtocolEntity 8 | mediaNode = self.node.getChild("media") 9 | mediaNode.setAttribute("mimetype", "MIMETYPE") 10 | mediaNode.setAttribute("filehash", "FILEHASH") 11 | mediaNode.setAttribute("url", "URL") 12 | mediaNode.setAttribute("ip", "IP") 13 | mediaNode.setAttribute("size", "123") 14 | mediaNode.setAttribute("file", "FILE") 15 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_media/protocolentities/test_message_media_downloadable_audio.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_media.protocolentities.message_media_downloadable_audio import AudioDownloadableMediaMessageProtocolEntity 2 | from yowsup.layers.protocol_media.protocolentities.test_message_media_downloadable import DownloadableMediaMessageProtocolEntityTest 3 | 4 | class AudioDownloadableMediaMessageProtocolEntityTest(DownloadableMediaMessageProtocolEntityTest): 5 | def setUp(self): 6 | super(AudioDownloadableMediaMessageProtocolEntityTest, self).setUp() 7 | self.ProtocolEntity = AudioDownloadableMediaMessageProtocolEntity 8 | mediaNode = self.node.getChild("media") 9 | mediaNode.setAttribute("abitrate", "31") 10 | mediaNode.setAttribute("acodec", "aac") 11 | mediaNode.setAttribute("asampfreq", "22050") 12 | mediaNode.setAttribute("duration", "3") 13 | mediaNode.setAttribute("encoding", "raw") 14 | mediaNode.setAttribute("origin", "live") 15 | mediaNode.setAttribute("seconds", "3") 16 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_media/protocolentities/test_message_media_downloadable_image.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_media.protocolentities.message_media_downloadable_image import ImageDownloadableMediaMessageProtocolEntity 2 | from yowsup.layers.protocol_media.protocolentities.test_message_media_downloadable import DownloadableMediaMessageProtocolEntityTest 3 | 4 | class ImageDownloadableMediaMessageProtocolEntityTest(DownloadableMediaMessageProtocolEntityTest): 5 | def setUp(self): 6 | super(ImageDownloadableMediaMessageProtocolEntityTest, self).setUp() 7 | self.ProtocolEntity = ImageDownloadableMediaMessageProtocolEntity 8 | mediaNode = self.node.getChild("media") 9 | mediaNode.setAttribute("encoding", "ENCODING") 10 | mediaNode.setAttribute("width", "1024") 11 | mediaNode.setAttribute("height", "768") 12 | mediaNode.setAttribute("caption", "caption") 13 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_media/protocolentities/test_message_media_downloadable_video.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_media.protocolentities.message_media_downloadable_video import VideoDownloadableMediaMessageProtocolEntity 2 | from yowsup.layers.protocol_media.protocolentities.test_message_media_downloadable import DownloadableMediaMessageProtocolEntityTest 3 | 4 | class VideoDownloadableMediaMessageProtocolEntityTest(DownloadableMediaMessageProtocolEntityTest): 5 | def setUp(self): 6 | super(VideoDownloadableMediaMessageProtocolEntityTest, self).setUp() 7 | self.ProtocolEntity = VideoDownloadableMediaMessageProtocolEntity 8 | mediaNode = self.node.getChild("media") 9 | mediaNode.setAttribute("abitrate", "165") 10 | mediaNode.setAttribute("acodec", "aac") 11 | mediaNode.setAttribute("asampfmt", "flt") 12 | mediaNode.setAttribute("asampfreq", "48000") 13 | mediaNode.setAttribute("duration", "61") 14 | mediaNode.setAttribute("encoding", "raw") 15 | mediaNode.setAttribute("fps", "24") 16 | mediaNode.setAttribute("height", "452") 17 | mediaNode.setAttribute("seconds", "61") 18 | mediaNode.setAttribute("vbitrate", "1862") 19 | mediaNode.setAttribute("vcodec", "h264") 20 | mediaNode.setAttribute("width", "800") 21 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_media/protocolentities/test_message_media_location.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_media.protocolentities.test_message_media import MediaMessageProtocolEntityTest 2 | from yowsup.layers.protocol_media.protocolentities import LocationMediaMessageProtocolEntity 3 | from yowsup.structs import ProtocolTreeNode 4 | class LocationMediaMessageProtocolEntityTest(MediaMessageProtocolEntityTest): 5 | def setUp(self): 6 | super(LocationMediaMessageProtocolEntityTest, self).setUp() 7 | self.ProtocolEntity = LocationMediaMessageProtocolEntity 8 | mediaNode = self.node.getChild("media") 9 | mediaNode["type"] = "location" 10 | mediaNode["latitude"] = "52.52393" 11 | mediaNode["longitude"] = "13.41747" 12 | mediaNode["encoding"] = "raw" 13 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_media/protocolentities/test_message_media_vcard.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_media.protocolentities.test_message_media import MediaMessageProtocolEntityTest 2 | from yowsup.layers.protocol_media.protocolentities import VCardMediaMessageProtocolEntity 3 | from yowsup.structs import ProtocolTreeNode 4 | class VCardMediaMessageProtocolEntityTest(MediaMessageProtocolEntityTest): 5 | def setUp(self): 6 | super(VCardMediaMessageProtocolEntityTest, self).setUp() 7 | self.ProtocolEntity = VCardMediaMessageProtocolEntity 8 | vcardNode = ProtocolTreeNode("vcard", {"name":"abc"}, None, "VCARD_DATA") 9 | mediaNode = self.node.getChild("media") 10 | mediaNode["type"] = "vcard" 11 | mediaNode.addChild(vcardNode) 12 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_messages/__init__.py: -------------------------------------------------------------------------------- 1 | from .layer import YowMessagesProtocolLayer 2 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_messages/layer.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers import YowLayer, YowLayerEvent, YowProtocolLayer 2 | from .protocolentities import TextMessageProtocolEntity 3 | class YowMessagesProtocolLayer(YowProtocolLayer): 4 | def __init__(self): 5 | handleMap = { 6 | "message": (self.recvMessageStanza, self.sendMessageEntity) 7 | } 8 | super(YowMessagesProtocolLayer, self).__init__(handleMap) 9 | 10 | def __str__(self): 11 | return "Messages Layer" 12 | 13 | def sendMessageEntity(self, entity): 14 | if entity.getType() == "text": 15 | self.entityToLower(entity) 16 | 17 | ###recieved node handlers handlers 18 | def recvMessageStanza(self, node): 19 | if node.getAttributeValue("type") == "text": 20 | entity = TextMessageProtocolEntity.fromProtocolTreeNode(node) 21 | self.toUpper(entity) 22 | 23 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_messages/proto/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/svub/whatsapp-rest-webservice/822dfc46b80e7a26eb553e5a10e723dda5a9f77d/service/yowsup/yowsup/layers/protocol_messages/proto/__init__.py -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_messages/protocolentities/__init__.py: -------------------------------------------------------------------------------- 1 | from .message_text import TextMessageProtocolEntity 2 | from .message import MessageProtocolEntity 3 | from .message_text_broadcast import BroadcastTextMessage 4 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_messages/protocolentities/message_text.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from .message import MessageProtocolEntity 3 | class TextMessageProtocolEntity(MessageProtocolEntity): 4 | ''' 5 | 7 | 8 | {{MESSAGE_DATA}} 9 | 10 | 11 | ''' 12 | def __init__(self, body, _id = None, _from = None, to = None, notify = None, 13 | timestamp = None, participant = None, offline = None, retry = None): 14 | super(TextMessageProtocolEntity, self).__init__("text",_id, _from, to, notify, timestamp, participant, offline, retry) 15 | self.setBody(body) 16 | 17 | def __str__(self): 18 | out = super(TextMessageProtocolEntity, self).__str__() 19 | out += "Body: %s\n" % self.body 20 | return out 21 | 22 | def setBody(self, body): 23 | self.body = body 24 | 25 | def getBody(self): 26 | return self.body 27 | 28 | def toProtocolTreeNode(self): 29 | node = super(TextMessageProtocolEntity, self).toProtocolTreeNode() 30 | bodyNode = ProtocolTreeNode("body", {}, None, self.body) 31 | node.addChild(bodyNode) 32 | return node 33 | 34 | @staticmethod 35 | def fromProtocolTreeNode(node): 36 | entity = MessageProtocolEntity.fromProtocolTreeNode(node) 37 | entity.__class__ = TextMessageProtocolEntity 38 | entity.setBody(node.getChild("body").getData()) 39 | return entity 40 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_messages/protocolentities/message_text_broadcast.py: -------------------------------------------------------------------------------- 1 | from .message_text import TextMessageProtocolEntity 2 | from yowsup.structs import ProtocolTreeNode 3 | import time 4 | class BroadcastTextMessage(TextMessageProtocolEntity): 5 | def __init__(self, jids, body): 6 | broadcastTime = int(time.time() * 1000) 7 | super(BroadcastTextMessage, self).__init__(body, to = "%s@broadcast" % broadcastTime) 8 | self.setBroadcastProps(jids) 9 | 10 | def setBroadcastProps(self, jids): 11 | assert type(jids) is list, "jids must be a list, got %s instead." % type(jids) 12 | self.jids = jids 13 | 14 | def toProtocolTreeNode(self): 15 | node = super(BroadcastTextMessage, self).toProtocolTreeNode() 16 | toNodes = [ProtocolTreeNode("to", {"jid": jid}) for jid in self.jids] 17 | broadcastNode = ProtocolTreeNode("broadcast", children = toNodes) 18 | node.addChild(broadcastNode) 19 | return node 20 | 21 | @staticmethod 22 | def fromProtocolTreeNode(node): 23 | entity = TextMessageProtocolEntity.fromProtocolTreeNode(node) 24 | entity.__class__ = BroadcastTextMessage 25 | jids = [toNode.getAttributeValue("jid") for toNode in node.getChild("broadcast").getAllChildren()] 26 | entity.setBroadcastProps(jids) 27 | return entity 28 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_messages/protocolentities/test_message.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_messages.protocolentities.message import MessageProtocolEntity 2 | from yowsup.structs import ProtocolTreeNode 3 | from yowsup.structs.protocolentity import ProtocolEntityTest 4 | import unittest 5 | 6 | class MessageProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 7 | def setUp(self): 8 | self.ProtocolEntity = MessageProtocolEntity 9 | # ORDER_MATTERS for node.toString() to output return attribs in same order 10 | attribs = { 11 | "type": "message_type", 12 | "id": "message-id", 13 | "t": "12345", 14 | "offline": "0", 15 | "from": "from_jid", 16 | "notify": "notify_name" 17 | } 18 | self.node = ProtocolTreeNode("message", attribs) 19 | 20 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_messages/protocolentities/test_message_text.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_messages.protocolentities.message_text import TextMessageProtocolEntity 2 | from yowsup.structs import ProtocolTreeNode 3 | from yowsup.layers.protocol_messages.protocolentities.test_message import MessageProtocolEntityTest 4 | 5 | class TextMessageProtocolEntityTest(MessageProtocolEntityTest): 6 | def setUp(self): 7 | super(TextMessageProtocolEntityTest, self).setUp() 8 | self.ProtocolEntity = TextMessageProtocolEntity 9 | bodyNode = ProtocolTreeNode("body", {}, None, "body_data") 10 | self.node.addChild(bodyNode) 11 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_messages/protocolentities/test_message_text_broadcast.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_messages.protocolentities.test_message_text import TextMessageProtocolEntityTest 2 | from yowsup.layers.protocol_messages.protocolentities.message_text_broadcast import BroadcastTextMessage 3 | from yowsup.structs import ProtocolTreeNode 4 | class BroadcastTextMessageTest(TextMessageProtocolEntityTest): 5 | def setUp(self): 6 | super(BroadcastTextMessageTest, self).setUp() 7 | self.ProtocolEntity = BroadcastTextMessage 8 | broadcastNode = ProtocolTreeNode("broadcast") 9 | jids = ["jid1", "jid2"] 10 | toNodes = [ProtocolTreeNode("to", {"jid" : jid}) for jid in jids] 11 | broadcastNode.addChildren(toNodes) 12 | self.node.addChild(broadcastNode) 13 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_notifications/__init__.py: -------------------------------------------------------------------------------- 1 | from .layer import YowNotificationsProtocolLayer -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_notifications/protocolentities/__init__.py: -------------------------------------------------------------------------------- 1 | from .notification import NotificationProtocolEntity 2 | from .notification_picture import PictureNotificationProtocolEntity 3 | from .notification_picture_set import SetPictureNotificationProtocolEntity 4 | from .notification_picture_delete import DeletePictureNotificationProtocolEntity 5 | from .notification_status import StatusNotificationProtocolEntity 6 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_notifications/protocolentities/notification_picture.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from .notification import NotificationProtocolEntity 3 | class PictureNotificationProtocolEntity(NotificationProtocolEntity): 4 | ''' 5 | 7 | 8 | ''' 9 | 10 | def __init__(self, _id, _from, status, timestamp, notify, offline, setJid, setId): 11 | super(PictureNotificationProtocolEntity, self).__init__("picture", _id, _from, timestamp, notify, offline) 12 | self.setData(setJid, setId) 13 | 14 | @staticmethod 15 | def fromProtocolTreeNode(node): 16 | entity = NotificationProtocolEntity.fromProtocolTreeNode(node) 17 | entity.__class__ = PictureNotificationProtocolEntity 18 | return entity -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_notifications/protocolentities/notification_picture_delete.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from .notification_picture import PictureNotificationProtocolEntity 3 | class DeletePictureNotificationProtocolEntity(PictureNotificationProtocolEntity): 4 | ''' 5 | 7 | 8 | 9 | 10 | ''' 11 | 12 | def __init__(self, _id, _from, status, timestamp, notify, offline, deleteJid): 13 | super(DeletePictureNotificationProtocolEntity, self).__init__(_id, _from, timestamp, notify, offline) 14 | self.setData(deleteJid) 15 | 16 | def setData(self, deleteJid): 17 | self.deleteJid = deleteJid 18 | 19 | def __str__(self): 20 | out = super(DeletePictureNotificationProtocolEntity, self).__str__() 21 | out += "Type: Delete" 22 | return out 23 | 24 | def toProtocolTreeNode(self): 25 | node = super(DeletePictureNotificationProtocolEntity, self).toProtocolTreeNode() 26 | deleteNode = ProtocolTreeNode("delete", {"jid": self.deleteJid}, None, None) 27 | node.addChild(deleteNode) 28 | return node 29 | 30 | @staticmethod 31 | def fromProtocolTreeNode(node): 32 | entity = PictureNotificationProtocolEntity.fromProtocolTreeNode(node) 33 | entity.__class__ = DeletePictureNotificationProtocolEntity 34 | deleteNode = node.getChild("delete") 35 | entity.setData(deleteNode.getAttributeValue("jid")) 36 | return entity 37 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_notifications/protocolentities/notification_picture_set.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from .notification_picture import PictureNotificationProtocolEntity 3 | class SetPictureNotificationProtocolEntity(PictureNotificationProtocolEntity): 4 | ''' 5 | 7 | 8 | 9 | 10 | ''' 11 | 12 | def __init__(self, _id, _from, status, timestamp, notify, offline, setJid, setId): 13 | super(SetPictureNotificationProtocolEntity, self).__init__(_id, _from, timestamp, notify, offline) 14 | self.setData(setJid, setId) 15 | 16 | def setData(self, setJid, setId): 17 | self.setId = setId 18 | self.setJid = setJid 19 | 20 | def toProtocolTreeNode(self): 21 | node = super(SetPictureNotificationProtocolEntity, self).toProtocolTreeNode() 22 | setNode = ProtocolTreeNode("set", {"jid": self.setJid, "id": self.setId}, None, None) 23 | node.addChild(setNode) 24 | return node 25 | 26 | @staticmethod 27 | def fromProtocolTreeNode(node): 28 | entity = PictureNotificationProtocolEntity.fromProtocolTreeNode(node) 29 | entity.__class__ = SetPictureNotificationProtocolEntity 30 | setNode = node.getChild("set") 31 | entity.setData(setNode.getAttributeValue("jid"), setNode.getAttributeValue("id")) 32 | return entity -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_notifications/protocolentities/notification_status.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from .notification import NotificationProtocolEntity 3 | class StatusNotificationProtocolEntity(NotificationProtocolEntity): 4 | ''' 5 | 7 | 8 | {{STATUS}} 9 | 10 | 11 | 12 | ''' 13 | 14 | def __init__(self, _type, _id, _from, status, timestamp, notify, offline = False): 15 | super(StatusNotificationProtocolEntity, self).__init__("status", _id, _from, timestamp, notify, offline) 16 | self.setStatus(status) 17 | 18 | def setStatus(self, status): 19 | self.status = status 20 | 21 | def toProtocolTreeNode(self): 22 | node = super(StatusNotificationProtocolEntity, self).toProtocolTreeNode() 23 | setNode = ProtocolTreeNode("set", {}, None, self.status) 24 | node.addChild(setNode) 25 | return node 26 | 27 | @staticmethod 28 | def fromProtocolTreeNode(node): 29 | entity = NotificationProtocolEntity.fromProtocolTreeNode(node) 30 | entity.__class__ = StatusNotificationProtocolEntity 31 | entity.setStatus(node.getChild("set").getData()) 32 | return entity -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_notifications/protocolentities/test_notification.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_notifications.protocolentities.notification import NotificationProtocolEntity 2 | from yowsup.structs import ProtocolTreeNode 3 | from yowsup.structs.protocolentity import ProtocolEntityTest 4 | import unittest 5 | 6 | class NotificationProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 7 | def setUp(self): 8 | self.ProtocolEntity = NotificationProtocolEntity 9 | attribs = { 10 | "t": "12345", 11 | "from": "from_jid", 12 | "offline": "0", 13 | "type": "notif_type", 14 | "id": "message-id", 15 | "notify": "notify_name" 16 | } 17 | self.node = ProtocolTreeNode("notification", attribs) -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_notifications/protocolentities/test_notification_picture.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_notifications.protocolentities.notification_picture import PictureNotificationProtocolEntity 2 | from yowsup.layers.protocol_notifications.protocolentities.test_notification import NotificationProtocolEntityTest 3 | 4 | class PictureNotificationProtocolEntityTest(NotificationProtocolEntityTest): 5 | def setUp(self): 6 | super(PictureNotificationProtocolEntityTest, self).setUp() 7 | self.ProtocolEntity = PictureNotificationProtocolEntity 8 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_notifications/protocolentities/test_notification_picture_delete.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_notifications.protocolentities.notification_picture_delete import DeletePictureNotificationProtocolEntity 2 | from yowsup.structs import ProtocolTreeNode 3 | from yowsup.layers.protocol_notifications.protocolentities.test_notification_picture import PictureNotificationProtocolEntityTest 4 | 5 | class DeletePictureNotificationProtocolEntityTest(PictureNotificationProtocolEntityTest): 6 | def setUp(self): 7 | super(DeletePictureNotificationProtocolEntityTest, self).setUp() 8 | self.ProtocolEntity = DeletePictureNotificationProtocolEntity 9 | deleteNode = ProtocolTreeNode("delete", {"jid": "DELETE_JID"}, None, None) 10 | self.node.addChild(deleteNode) 11 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_notifications/protocolentities/test_notification_picture_set.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_notifications.protocolentities.notification_picture_set import SetPictureNotificationProtocolEntity 2 | from yowsup.structs import ProtocolTreeNode 3 | from yowsup.layers.protocol_notifications.protocolentities.test_notification_picture import PictureNotificationProtocolEntityTest 4 | 5 | class SetPictureNotificationProtocolEntityTest(PictureNotificationProtocolEntityTest): 6 | def setUp(self): 7 | super(SetPictureNotificationProtocolEntityTest, self).setUp() 8 | self.ProtocolEntity = SetPictureNotificationProtocolEntity 9 | setNode = ProtocolTreeNode("set", {"jid": "SET_JID", "id": "123"}, None, None) 10 | self.node.addChild(setNode) 11 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_notifications/protocolentities/test_notification_status.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_notifications.protocolentities.notification_status import StatusNotificationProtocolEntity 2 | from yowsup.structs import ProtocolTreeNode 3 | from yowsup.layers.protocol_notifications.protocolentities.test_notification import NotificationProtocolEntityTest 4 | 5 | class StatusNotificationProtocolEntityTest(NotificationProtocolEntityTest): 6 | def setUp(self): 7 | super(StatusNotificationProtocolEntityTest, self).setUp() 8 | self.ProtocolEntity = StatusNotificationProtocolEntity 9 | setNode = ProtocolTreeNode("set", {}, [], "status_data") 10 | self.node.addChild(setNode) 11 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_presence/__init__.py: -------------------------------------------------------------------------------- 1 | from .layer import YowPresenceProtocolLayer 2 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_presence/layer.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers import YowLayer, YowLayerEvent, YowProtocolLayer 2 | from .protocolentities import * 3 | from yowsup.layers.protocol_iq.protocolentities import ErrorIqProtocolEntity 4 | class YowPresenceProtocolLayer(YowProtocolLayer): 5 | def __init__(self): 6 | handleMap = { 7 | "presence": (self.recvPresence, self.sendPresence), 8 | "iq": (None, self.sendIq) 9 | } 10 | super(YowPresenceProtocolLayer, self).__init__(handleMap) 11 | 12 | def __str__(self): 13 | return "Presence Layer" 14 | 15 | def sendPresence(self, entity): 16 | self.entityToLower(entity) 17 | 18 | def recvPresence(self, node): 19 | self.toUpper(PresenceProtocolEntity.fromProtocolTreeNode(node)) 20 | 21 | def sendIq(self, entity): 22 | if entity.getXmlns() == LastseenIqProtocolEntity.XMLNS: 23 | self._sendIq(entity, self.onLastSeenSuccess, self.onLastSeenError) 24 | 25 | def onLastSeenSuccess(self, protocolTreeNode, lastSeenEntity): 26 | self.toUpper(ResultLastseenIqProtocolEntity.fromProtocolTreeNode(protocolTreeNode)) 27 | 28 | def onLastSeenError(self, protocolTreeNode, lastSeenEntity): 29 | self.toUpper(ErrorIqProtocolEntity.fromProtocolTreeNode(protocolTreeNode)) 30 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_presence/protocolentities/__init__.py: -------------------------------------------------------------------------------- 1 | from .presence import PresenceProtocolEntity 2 | from .presence_available import AvailablePresenceProtocolEntity 3 | from .presence_unavailable import UnavailablePresenceProtocolEntity 4 | from .presence_subscribe import SubscribePresenceProtocolEntity 5 | from .presence_unsubscribe import UnsubscribePresenceProtocolEntity 6 | from .iq_lastseen import LastseenIqProtocolEntity 7 | from .iq_lastseen_result import ResultLastseenIqProtocolEntity 8 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_presence/protocolentities/iq_lastseen.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_iq.protocolentities.iq import IqProtocolEntity 2 | from yowsup.structs.protocoltreenode import ProtocolTreeNode 3 | class LastseenIqProtocolEntity(IqProtocolEntity): 4 | XMLNS = "jabber:iq:last" 5 | def __init__(self, jid, _id = None): 6 | super(LastseenIqProtocolEntity, self).__init__(self.__class__.XMLNS, _type = "get", to = jid, _id = _id) 7 | 8 | @staticmethod 9 | def fromProtocolTreeNode(node): 10 | return LastseenIqProtocolEntity(node["to"]) 11 | 12 | def toProtocolTreeNode(self): 13 | node = super(LastseenIqProtocolEntity, self).toProtocolTreeNode() 14 | node.setAttribute("xmlns", self.__class__.XMLNS) 15 | node.addChild(ProtocolTreeNode("query")) 16 | return node 17 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_presence/protocolentities/iq_lastseen_result.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_iq.protocolentities.iq_result import ResultIqProtocolEntity 2 | from yowsup.structs.protocoltreenode import ProtocolTreeNode 3 | class ResultLastseenIqProtocolEntity(ResultIqProtocolEntity): 4 | def __init__(self, jid, seconds, _id = None): 5 | super(ResultLastseenIqProtocolEntity, self).__init__(_from=jid, _id=_id) 6 | self.setSeconds(seconds) 7 | 8 | def setSeconds(self, seconds): 9 | self.seconds = int(seconds) 10 | 11 | def getSeconds(self): 12 | return self.seconds 13 | 14 | def __str__(self): 15 | out = super(ResultIqProtocolEntity, self).__str__() 16 | out += "Seconds: %s\n" % self.seconds 17 | return out 18 | 19 | def toProtocolTreeNode(self): 20 | node = super(ResultLastseenIqProtocolEntity, self).toProtocolTreeNode() 21 | node.addChild(ProtocolTreeNode("query", {"seconds": str(self.seconds)})) 22 | return node 23 | 24 | @staticmethod 25 | def fromProtocolTreeNode(node): 26 | return ResultLastseenIqProtocolEntity(node["from"], node.getChild("query")["seconds"], node["id"]) -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_presence/protocolentities/presence_available.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from .presence import PresenceProtocolEntity 3 | class AvailablePresenceProtocolEntity(PresenceProtocolEntity): 4 | ''' 5 | 6 | response: 7 | 8 | 9 | 10 | ''' 11 | def __init__(self): 12 | super(AvailablePresenceProtocolEntity, self).__init__("available") -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_presence/protocolentities/presence_subscribe.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from .presence import PresenceProtocolEntity 3 | class SubscribePresenceProtocolEntity(PresenceProtocolEntity): 4 | 5 | ''' 6 | 7 | ''' 8 | 9 | def __init__(self, jid): 10 | super(SubscribePresenceProtocolEntity, self).__init__("subscribe") 11 | self.setProps(jid) 12 | 13 | def setProps(self, jid): 14 | self.jid = jid 15 | 16 | def toProtocolTreeNode(self): 17 | node = super(SubscribePresenceProtocolEntity, self).toProtocolTreeNode() 18 | node.setAttribute("to", self.jid) 19 | return node 20 | 21 | def __str__(self): 22 | out = super(SubscribePresenceProtocolEntity, self).__str__() 23 | out += "To: %s\n" % self.jid 24 | return out 25 | 26 | @staticmethod 27 | def fromProtocolTreeNode(node): 28 | entity = PresenceProtocolEntity.fromProtocolTreeNode(node) 29 | entity.__class__ = SubscribePresenceProtocolEntity 30 | entity.setProps( 31 | node.getAttributeValue("to") 32 | ) 33 | return entity 34 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_presence/protocolentities/presence_unavailable.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from .presence import PresenceProtocolEntity 3 | class UnavailablePresenceProtocolEntity(PresenceProtocolEntity): 4 | ''' 5 | 6 | response: 7 | 8 | 9 | ''' 10 | def __init__(self): 11 | super(UnavailablePresenceProtocolEntity, self).__init__("unavailable") -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_presence/protocolentities/presence_unsubscribe.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from .presence import PresenceProtocolEntity 3 | class UnsubscribePresenceProtocolEntity(PresenceProtocolEntity): 4 | 5 | ''' 6 | 7 | ''' 8 | 9 | def __init__(self, jid): 10 | super(UnsubscribePresenceProtocolEntity, self).__init__("unsubscribe") 11 | self.setProps(jid) 12 | 13 | def setProps(self, jid): 14 | self.jid = jid 15 | 16 | def toProtocolTreeNode(self): 17 | node = super(UnsubscribePresenceProtocolEntity, self).toProtocolTreeNode() 18 | node.setAttribute("to", self.jid) 19 | return node 20 | 21 | def __str__(self): 22 | out = super(UnsubscribePresenceProtocolEntity, self).__str__() 23 | out += "To: %s\n" % self.jid 24 | return out 25 | 26 | @staticmethod 27 | def fromProtocolTreeNode(node): 28 | entity = PresenceProtocolEntity.fromProtocolTreeNode(node) 29 | entity.__class__ = UnsubscribePresenceProtocolEntity 30 | entity.setProps( 31 | node.getAttributeValue("to") 32 | ) 33 | return entity 34 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_presence/protocolentities/test_presence.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_presence.protocolentities.presence import PresenceProtocolEntity 2 | from yowsup.structs import ProtocolTreeNode 3 | from yowsup.structs.protocolentity import ProtocolEntityTest 4 | import unittest 5 | 6 | class PresenceProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 7 | def setUp(self): 8 | self.ProtocolEntity = PresenceProtocolEntity 9 | self.node = ProtocolTreeNode("presence", {"type": "presence_type", "name": "presence_name"}, None, None) 10 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_presence/protocolentities/test_presence_available.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_presence.protocolentities.presence_available import AvailablePresenceProtocolEntity 2 | from yowsup.layers.protocol_presence.protocolentities.test_presence import PresenceProtocolEntityTest 3 | 4 | class AvailablePresenceProtocolEntityTest(PresenceProtocolEntityTest): 5 | def setUp(self): 6 | super(AvailablePresenceProtocolEntityTest, self).setUp() 7 | self.ProtocolEntity = AvailablePresenceProtocolEntity 8 | self.node.setAttribute("type", "available") 9 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_presence/protocolentities/test_presence_subscribe.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_presence.protocolentities.presence_subscribe import SubscribePresenceProtocolEntity 2 | from yowsup.layers.protocol_presence.protocolentities.test_presence import PresenceProtocolEntityTest 3 | 4 | class SubscribePresenceProtocolEntityTest(PresenceProtocolEntityTest): 5 | def setUp(self): 6 | super(SubscribePresenceProtocolEntityTest, self).setUp() 7 | self.ProtocolEntity = SubscribePresenceProtocolEntity 8 | self.node.setAttribute("type", "subscribe") 9 | self.node.setAttribute("to", "subscribe_jid") -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_presence/protocolentities/test_presence_unavailable.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_presence.protocolentities.presence_unavailable import UnavailablePresenceProtocolEntity 2 | from yowsup.layers.protocol_presence.protocolentities.test_presence import PresenceProtocolEntityTest 3 | 4 | class UnavailablePresenceProtocolEntityTest(PresenceProtocolEntityTest): 5 | def setUp(self): 6 | super(UnavailablePresenceProtocolEntityTest, self).setUp() 7 | self.ProtocolEntity = UnavailablePresenceProtocolEntity 8 | self.node.setAttribute("type", "unavailable") 9 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_presence/protocolentities/test_presence_unsubscribe.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_presence.protocolentities.presence_unsubscribe import UnsubscribePresenceProtocolEntity 2 | from yowsup.layers.protocol_presence.protocolentities.test_presence import PresenceProtocolEntityTest 3 | 4 | class UnsubscribePresenceProtocolEntityTest(PresenceProtocolEntityTest): 5 | def setUp(self): 6 | super(UnsubscribePresenceProtocolEntityTest, self).setUp() 7 | self.ProtocolEntity = UnsubscribePresenceProtocolEntity 8 | self.node.setAttribute("type", "unsubscribe") 9 | self.node.setAttribute("to", "some_jid") -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_privacy/__init__.py: -------------------------------------------------------------------------------- 1 | from .layer import YowPrivacyProtocolLayer -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_privacy/layer.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers import YowLayer, YowLayerEvent, YowProtocolLayer 2 | from .protocolentities import * 3 | class YowPrivacyProtocolLayer(YowProtocolLayer): 4 | def __init__(self): 5 | handleMap = { 6 | "iq": (self.recvIq, self.sendIq) 7 | } 8 | super(YowPrivacyProtocolLayer, self).__init__(handleMap) 9 | 10 | def __str__(self): 11 | return "Privacy Layer" 12 | 13 | def sendIq(self, entity): 14 | if entity.getXmlns() == "jabber:iq:privacy": 15 | self.entityToLower(entity) 16 | 17 | def recvIq(self, node): 18 | pass 19 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_privacy/protocolentities/__init__.py: -------------------------------------------------------------------------------- 1 | from .privacylist_iq import PrivacyListIqProtocolEntity -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_privacy/protocolentities/privacylist_iq.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_iq.protocolentities import IqProtocolEntity 2 | from yowsup.structs import ProtocolTreeNode 3 | class PrivacyListIqProtocolEntity(IqProtocolEntity): 4 | def __init__(self, name = "default"): 5 | super(PrivacyListIqProtocolEntity, self).__init__("jabber:iq:privacy", _type="get") 6 | self.setListName(name) 7 | 8 | def setListName(self, name): 9 | self.listName = name 10 | 11 | def toProtocolTreeNode(self): 12 | node = super(PrivacyListIqProtocolEntity, self).toProtocolTreeNode() 13 | queryNode = ProtocolTreeNode("query") 14 | listNode = ProtocolTreeNode("list", {"name": self.listName}) 15 | queryNode.addChild(listNode) 16 | node.addChild(queryNode) 17 | return node 18 | 19 | @staticmethod 20 | def fromProtocolTreeNode(node): 21 | entity = IqProtocolEntity.fromProtocolTreeNode(node) 22 | entity.__class__ = PrivacyListIqProtocolEntity 23 | entity.setListName(node.getChild("query").getChild("list")["name"]) 24 | return entity 25 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_profiles/__init__.py: -------------------------------------------------------------------------------- 1 | from .layer import YowProfilesProtocolLayer -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_profiles/protocolentities/__init__.py: -------------------------------------------------------------------------------- 1 | from .iq_unregister import UnregisterIqProtocolEntity 2 | from .iq_status_set import SetStatusIqProtocolEntity 3 | from .iq_picture_get import GetPictureIqProtocolEntity 4 | from .iq_picture_get_result import ResultGetPictureIqProtocolEntity 5 | from .iq_pictures_list import ListPicturesIqProtocolEntity 6 | from .iq_picture_set import SetPictureIqProtocolEntity 7 | from .iq_privacy_set import SetPrivacyIqProtocolEntity 8 | from .iq_privacy_get import GetPrivacyIqProtocolEntity 9 | from .iq_privacy_result import ResultPrivacyIqProtocolEntity 10 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_profiles/protocolentities/iq_picture.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_iq.protocolentities import IqProtocolEntity 2 | class PictureIqProtocolEntity(IqProtocolEntity): 3 | ''' 4 | When receiving a profile picture: 5 | 6 | 7 | {{Binary bytes of the picture.}} 8 | 9 | 10 | ''' 11 | XMLNS = "w:profile:picture" 12 | 13 | def __init__(self, jid, _id = None, type = "get"): 14 | super(PictureIqProtocolEntity, self).__init__(self.__class__.XMLNS, _id = _id, _type=type, to = jid) -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_profiles/protocolentities/iq_picture_get.py: -------------------------------------------------------------------------------- 1 | from .iq_picture import PictureIqProtocolEntity 2 | from yowsup.structs import ProtocolTreeNode 3 | class GetPictureIqProtocolEntity(PictureIqProtocolEntity): 4 | ''' 5 | 6 | 7 | 8 | ''' 9 | def __init__(self, jid, preview = True, _id = None): 10 | super(GetPictureIqProtocolEntity, self).__init__(jid, _id, "get") 11 | self.setGetPictureProps(preview) 12 | 13 | def setGetPictureProps(self, preview = True): 14 | self.preview = preview 15 | 16 | def isPreview(self): 17 | return self.preview 18 | 19 | def toProtocolTreeNode(self): 20 | node = super(GetPictureIqProtocolEntity, self).toProtocolTreeNode() 21 | pictureNode = ProtocolTreeNode("picture", {"type": "preview" if self.isPreview() else "image" }) 22 | node.addChild(pictureNode) 23 | return node 24 | 25 | @staticmethod 26 | def fromProtocolTreeNode(node): 27 | entity = PictureIqProtocolEntity.fromProtocolTreeNode(node) 28 | entity.__class__ = GetPictureIqProtocolEntity 29 | entity.setGetPictureProps(node.getChild("picture").getAttributeValue("type")) 30 | return entity -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_profiles/protocolentities/iq_pictures_list.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | from .iq_picture import PictureIqProtocolEntity 3 | class ListPicturesIqProtocolEntity(PictureIqProtocolEntity): 4 | ''' 5 | 6 | 7 | 8 | 9 | 10 | 11 | ''' 12 | 13 | def __init__(self, selfJid, jids): 14 | super(ListPicturesIqProtocolEntity, self).__init__(jid = selfJid, type = "get") 15 | self.setProps(jids) 16 | 17 | def setProps(self, jids): 18 | assert type(jids) is list and len(jids), "Must specify a list of jids to get the pictures for" 19 | self.jids = jids 20 | 21 | def toProtocolTreeNode(self): 22 | node = super(ListPicturesIqProtocolEntity, self).toProtocolTreeNode() 23 | userNodes = [ProtocolTreeNode("user", {"jid": jid}) for jid in self.jids] 24 | listNode = ProtocolTreeNode("list", {}, userNodes) 25 | node.addChild(listNode) 26 | return node 27 | 28 | @staticmethod 29 | def fromProtocolTreeNode(node): 30 | entity = PictureIqProtocolEntity.fromProtocolTreeNode(node) 31 | entity.__class__ = ListPicturesIqProtocolEntity 32 | jids = [userNode.getAttributeValue("jid") for userNode in node.getChild("list").getAllChildren()] 33 | entity.setProps(jids) 34 | return entity -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_profiles/protocolentities/iq_privacy_get.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_iq.protocolentities import IqProtocolEntity 2 | from yowsup.structs import ProtocolTreeNode 3 | 4 | ''' 5 | 6 | 7 | 8 | 9 | ''' 10 | 11 | class GetPrivacyIqProtocolEntity(IqProtocolEntity): 12 | XMLNS = "privacy" 13 | def __init__(self): 14 | super(GetPrivacyIqProtocolEntity, self).__init__(self.__class__.XMLNS, _type="get") 15 | 16 | def toProtocolTreeNode(self): 17 | node = super(GetPrivacyIqProtocolEntity, self).toProtocolTreeNode() 18 | queryNode = ProtocolTreeNode(self.__class__.XMLNS) 19 | node.addChild(queryNode) 20 | return node 21 | 22 | @staticmethod 23 | def fromProtocolTreeNode(node): 24 | assert node.getChild(GetPrivacyIqProtocolEntity.XMLNS) is not None, "Not a get privacy iq node %s" % node 25 | entity = IqProtocolEntity.fromProtocolTreeNode(node) 26 | entity.__class__ = GetPrivacyIqProtocolEntity 27 | return entity 28 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_profiles/protocolentities/iq_status_set.py: -------------------------------------------------------------------------------- 1 | from yowsup.common import YowConstants 2 | from yowsup.layers.protocol_iq.protocolentities import IqProtocolEntity 3 | from yowsup.structs import ProtocolTreeNode 4 | 5 | class SetStatusIqProtocolEntity(IqProtocolEntity): 6 | ''' 7 | 8 | {{MSG}} 9 | 10 | ''' 11 | XMLNS = "status" 12 | def __init__(self, text = None, _id = None): 13 | super(SetStatusIqProtocolEntity, self).__init__(self.__class__.XMLNS, _id, _type = "set", to = YowConstants.WHATSAPP_SERVER) 14 | self.setData(text) 15 | 16 | def setData(self, text): 17 | self.text = text 18 | 19 | def toProtocolTreeNode(self): 20 | node = super(SetStatusIqProtocolEntity, self).toProtocolTreeNode() 21 | statusNode = ProtocolTreeNode("status", {}, [], self.text) 22 | node.addChild(statusNode) 23 | return node 24 | 25 | @staticmethod 26 | def fromProtocolTreeNode(node): 27 | entity = IqProtocolEntity.fromProtocolTreeNode(node) 28 | entity.__class__ = SetStatusIqProtocolEntity 29 | statusNode = node.getChild("status") 30 | entity.setData(statusNode.getData()) 31 | return entity 32 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_profiles/protocolentities/iq_unregister.py: -------------------------------------------------------------------------------- 1 | from yowsup.common import YowConstants 2 | from yowsup.layers.protocol_iq.protocolentities import IqProtocolEntity 3 | from yowsup.structs import ProtocolTreeNode 4 | 5 | class UnregisterIqProtocolEntity(IqProtocolEntity): 6 | 7 | XMLNS = "urn:xmpp:whatsapp:account" 8 | 9 | def __init__(self): 10 | super(UnregisterIqProtocolEntity, self).__init__(_type = "get", to = YowConstants.WHATSAPP_SERVER) 11 | 12 | def toProtocolTreeNode(self): 13 | node = super(UnregisterIqProtocolEntity, self).toProtocolTreeNode() 14 | rmNode = ProtocolTreeNode("remove", {"xmlns": self.__class__.XMLNS}) 15 | node.addChild(rmNode) 16 | return node 17 | 18 | @staticmethod 19 | def fromProtocolTreeNode(node): 20 | entity = IqProtocolEntity.fromProtocolTreeNode(node) 21 | entity.__class__ = UnregisterIqProtocolEntity 22 | removeNode = node.getChild("remove") 23 | assert removeNode["xmlns"] == UnregisterIqProtocolEntity.XMLNS, "Not an account delete xmlns, got %s" % removeNode["xmlns"] 24 | 25 | return entity -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_profiles/protocolentities/test_iq_privacy_get.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_iq.protocolentities.test_iq import IqProtocolEntityTest 2 | from yowsup.layers.protocol_profiles.protocolentities import GetPrivacyIqProtocolEntity 3 | from yowsup.structs import ProtocolTreeNode 4 | 5 | entity = GetPrivacyIqProtocolEntity() 6 | 7 | class GetPrivacyIqProtocolEntityTest(IqProtocolEntityTest): 8 | def setUp(self): 9 | super(GetPrivacyIqProtocolEntityTest, self).setUp() 10 | self.ProtocolEntity = GetPrivacyIqProtocolEntity 11 | self.node = entity.toProtocolTreeNode() 12 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_profiles/protocolentities/test_iq_privacy_result.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_iq.protocolentities.test_iq import IqProtocolEntityTest 2 | from yowsup.layers.protocol_profiles.protocolentities import ResultPrivacyIqProtocolEntity 3 | from yowsup.structs import ProtocolTreeNode 4 | 5 | entity = ResultPrivacyIqProtocolEntity({"profile":"all","last":"none","status":"contacts"}) 6 | 7 | class ResultPrivacyIqProtocolEntityTest(IqProtocolEntityTest): 8 | def setUp(self): 9 | super(ResultPrivacyIqProtocolEntityTest, self).setUp() 10 | self.ProtocolEntity = ResultPrivacyIqProtocolEntity 11 | self.node = entity.toProtocolTreeNode() 12 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_profiles/protocolentities/test_iq_privacy_set.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_iq.protocolentities.test_iq import IqProtocolEntityTest 2 | from yowsup.layers.protocol_profiles.protocolentities import SetPrivacyIqProtocolEntity 3 | from yowsup.structs import ProtocolTreeNode 4 | 5 | entity = SetPrivacyIqProtocolEntity("all", ["profile","last","status"]) 6 | 7 | class SetPrivacyIqProtocolEntityTest(IqProtocolEntityTest): 8 | def setUp(self): 9 | super(SetPrivacyIqProtocolEntityTest, self).setUp() 10 | self.ProtocolEntity = SetPrivacyIqProtocolEntity 11 | self.node = entity.toProtocolTreeNode() 12 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_profiles/protocolentities/test_iq_status_set.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_iq.protocolentities.test_iq import IqProtocolEntityTest 2 | from yowsup.layers.protocol_profiles.protocolentities import SetStatusIqProtocolEntity 3 | from yowsup.structs import ProtocolTreeNode 4 | 5 | class SetStatusIqProtocolEntityTest(IqProtocolEntityTest): 6 | def setUp(self): 7 | super(SetStatusIqProtocolEntityTest, self).setUp() 8 | self.ProtocolEntity = SetStatusIqProtocolEntity 9 | statusNode = ProtocolTreeNode("status", {}, [], "Hey there, I'm using WhatsApp") 10 | self.node.addChild(statusNode) 11 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_profiles/protocolentities/test_iq_unregister.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_iq.protocolentities.test_iq import IqProtocolEntityTest 2 | from yowsup.layers.protocol_profiles.protocolentities import UnregisterIqProtocolEntity 3 | from yowsup.structs import ProtocolTreeNode 4 | 5 | class UnregisterIqProtocolEntityTest(IqProtocolEntityTest): 6 | def setUp(self): 7 | super(UnregisterIqProtocolEntityTest, self).setUp() 8 | self.ProtocolEntity = UnregisterIqProtocolEntity 9 | self.node.addChild(ProtocolTreeNode("remove", {"xmlns": "urn:xmpp:whatsapp:account"})) -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_receipts/__init__.py: -------------------------------------------------------------------------------- 1 | from .layer import YowReceiptProtocolLayer 2 | 3 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_receipts/layer.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers import YowLayer, YowLayerEvent, YowProtocolLayer 2 | from .protocolentities import * 3 | class YowReceiptProtocolLayer(YowProtocolLayer): 4 | def __init__(self): 5 | handleMap = { 6 | "receipt": (self.recvReceiptNode, self.sendReceiptEntity) 7 | } 8 | super(YowReceiptProtocolLayer, self).__init__(handleMap) 9 | 10 | def __str__(self): 11 | return "Receipt Layer" 12 | 13 | def sendReceiptEntity(self, entity): 14 | self.entityToLower(entity) 15 | 16 | def recvReceiptNode(self, node): 17 | self.toUpper(IncomingReceiptProtocolEntity.fromProtocolTreeNode(node)) 18 | 19 | 20 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_receipts/protocolentities/__init__.py: -------------------------------------------------------------------------------- 1 | from .receipt import ReceiptProtocolEntity 2 | from .receipt_incoming import IncomingReceiptProtocolEntity 3 | from .receipt_outgoing import OutgoingReceiptProtocolEntity -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_receipts/protocolentities/receipt.py: -------------------------------------------------------------------------------- 1 | from yowsup.structs import ProtocolEntity, ProtocolTreeNode 2 | class ReceiptProtocolEntity(ProtocolEntity): 3 | 4 | ''' 5 | delivered: 6 | 7 | 8 | read 9 | 10 | 11 | INCOMING 12 | 13 | ''' 14 | 15 | def __init__(self, _id): 16 | super(ReceiptProtocolEntity, self).__init__("receipt") 17 | self._id = _id 18 | 19 | def getId(self): 20 | return self._id 21 | 22 | def toProtocolTreeNode(self): 23 | attribs = { 24 | "id" : self._id 25 | } 26 | return self._createProtocolTreeNode(attribs, None, data = None) 27 | 28 | 29 | def __str__(self): 30 | out = "Receipt:\n" 31 | out += "ID: %s\n" % self._id 32 | return out 33 | 34 | @staticmethod 35 | def fromProtocolTreeNode(node): 36 | return ReceiptProtocolEntity( 37 | node.getAttributeValue("id") 38 | ) 39 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_receipts/protocolentities/test_receipt_incoming.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_receipts.protocolentities import IncomingReceiptProtocolEntity 2 | from yowsup.structs.protocolentity import ProtocolEntityTest 3 | import unittest 4 | import time 5 | 6 | class IncomingReceiptProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 7 | def setUp(self): 8 | self.ProtocolEntity = IncomingReceiptProtocolEntity 9 | self.node = IncomingReceiptProtocolEntity("123", "sender", int(time.time())).toProtocolTreeNode() 10 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/protocol_receipts/protocolentities/test_receipt_outgoing.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers.protocol_receipts.protocolentities import OutgoingReceiptProtocolEntity 2 | from yowsup.structs.protocolentity import ProtocolEntityTest 3 | import unittest 4 | 5 | class OutgoingReceiptProtocolEntityTest(ProtocolEntityTest, unittest.TestCase): 6 | def setUp(self): 7 | self.ProtocolEntity = OutgoingReceiptProtocolEntity 8 | self.node = OutgoingReceiptProtocolEntity("123", "target", "read").toProtocolTreeNode() -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/stanzaregulator/__init__.py: -------------------------------------------------------------------------------- 1 | from .layer import YowStanzaRegulator -------------------------------------------------------------------------------- /service/yowsup/yowsup/layers/stanzaregulator/layer.py: -------------------------------------------------------------------------------- 1 | from yowsup.layers import YowLayer, YowLayerEvent, EventCallback 2 | from yowsup.layers.network import YowNetworkLayer 3 | class YowStanzaRegulator(YowLayer): 4 | ''' 5 | send: bytearray -> bytearray 6 | receive: bytearray -> bytearray 7 | ''' 8 | 9 | def __init__(self): 10 | super(YowStanzaRegulator, self).__init__() 11 | self.buf = bytearray() 12 | self.enabled = False 13 | 14 | @EventCallback(YowNetworkLayer.EVENT_STATE_CONNECTED) 15 | def onConnected(self, yowLayerEvent): 16 | self.enabled = True 17 | self.buf = bytearray() 18 | 19 | @EventCallback(YowNetworkLayer.EVENT_STATE_DISCONNECTED) 20 | def onDisconnected(self, yowLayerEvent): 21 | self.enabled = False 22 | 23 | def send(self, data): 24 | self.toLower(data) 25 | 26 | def receive(self, data): 27 | if self.enabled: 28 | self.buf.extend(data) 29 | self.processReceived() 30 | else: 31 | self.toLower(data) 32 | 33 | 34 | def processReceived(self): 35 | metaData = self.buf[:3] 36 | recvData = self.buf[3:] 37 | 38 | firstByte = metaData[0] 39 | stanzaFlag = (firstByte & 0xF0) >> 4 40 | stanzaSize = ((metaData[1] << 8) + metaData[2]) | ((firstByte & 0x0F) << 16) 41 | 42 | if len(recvData) < stanzaSize: 43 | #will in leave in buf till receive remaining data 44 | return 45 | 46 | oneMessageData = metaData + recvData[:stanzaSize] 47 | self.buf = self.buf[len(oneMessageData):] 48 | 49 | self.toUpper(oneMessageData) 50 | 51 | if len(self.buf) > 3: #min required if has processable data yet 52 | self.processReceived() 53 | 54 | def __str__(self): 55 | return "Stanza Regulator Layer" 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/registration/__init__.py: -------------------------------------------------------------------------------- 1 | from .coderequest import WACodeRequest 2 | from .existsrequest import WAExistsRequest 3 | from .regrequest import WARegRequest -------------------------------------------------------------------------------- /service/yowsup/yowsup/registration/existsrequest.py: -------------------------------------------------------------------------------- 1 | from yowsup.common.http.warequest import WARequest 2 | from yowsup.common.http.waresponseparser import JSONResponseParser 3 | from yowsup.env import YowsupEnv 4 | import os 5 | 6 | class WAExistsRequest(WARequest): 7 | 8 | def __init__(self,cc, p_in, idx): 9 | super(WAExistsRequest,self).__init__() 10 | 11 | self.addParam("cc", cc) 12 | self.addParam("in", p_in) 13 | self.addParam("id", idx) 14 | self.addParam("lg", "en") 15 | self.addParam("lc", "GB") 16 | self.addParam("token", YowsupEnv.getCurrent().getToken(p_in)) 17 | self.addParam("mistyped", '6') 18 | self.addParam('network_radio_type', '1') 19 | self.addParam('simnum', '1') 20 | self.addParam('s', '') 21 | self.addParam('copiedrc', '1') 22 | self.addParam('hasinrc', '1') 23 | self.addParam('rcmatch', '1') 24 | self.addParam('pid', os.getpid()) 25 | self.addParam('extexist', '1') 26 | self.addParam('extstate', '1') 27 | 28 | self.url = "v.whatsapp.net/v2/exist" 29 | 30 | self.pvars = ["status", "reason", "sms_length", "voice_length", "result","param", "pw", "login", "type", "expiration", "kind", 31 | "price", "cost", "currency", "price_expiration" 32 | ] 33 | 34 | self.setParser(JSONResponseParser()) 35 | 36 | def send(self, parser = None): 37 | res = super(WAExistsRequest, self).send(parser) 38 | return res 39 | -------------------------------------------------------------------------------- /service/yowsup/yowsup/structs/__init__.py: -------------------------------------------------------------------------------- 1 | from .protocolentity import ProtocolEntity 2 | from .protocoltreenode import ProtocolTreeNode -------------------------------------------------------------------------------- /service/yowsup/yowsup/structs/protocolentity.py: -------------------------------------------------------------------------------- 1 | from .protocoltreenode import ProtocolTreeNode 2 | import unittest, time 3 | class ProtocolEntity(object): 4 | __ID_GEN = 0 5 | 6 | def __init__(self, tag): 7 | self.tag = tag 8 | 9 | def getTag(self): 10 | return self.tag 11 | 12 | def isType(self, typ): 13 | return self.tag == typ 14 | 15 | def _createProtocolTreeNode(self, attributes, children = None, data = None): 16 | return ProtocolTreeNode(self.getTag(), attributes, children, data) 17 | 18 | 19 | def _getCurrentTimestamp(self): 20 | return int(time.time()) 21 | 22 | def _generateId(self, short = False): 23 | ProtocolEntity.__ID_GEN += 1 24 | return str(ProtocolEntity.__ID_GEN) if short else str(int(time.time())) + "-" + str(ProtocolEntity.__ID_GEN) 25 | 26 | 27 | def toProtocolTreeNode(self): 28 | pass 29 | 30 | @staticmethod 31 | def fromProtocolTreeNode(self, protocolTreeNode): 32 | pass 33 | 34 | 35 | class ProtocolEntityTest(object): 36 | def setUp(self): 37 | self.ProtocolEntity = None 38 | self.node = None 39 | 40 | # def assertEqual(self, entity, node): 41 | # raise AssertionError("Should never execute that") 42 | 43 | def test_generation(self): 44 | if self.ProtocolEntity is None: 45 | raise ValueError("Test case not setup!") 46 | entity = self.ProtocolEntity.fromProtocolTreeNode(self.node) 47 | try: 48 | self.assertEqual(entity.toProtocolTreeNode(), self.node) 49 | except: 50 | print(entity.toProtocolTreeNode()) 51 | print("\nNOTEQ\n") 52 | print(self.node) 53 | raise 54 | 55 | --------------------------------------------------------------------------------