├── .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}}>{{composing|paused}}>
9 |
10 |
11 | OUTGOING
12 |
13 |
14 | <{{composing|paused}}>{{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}}>{{composing|paused}}>
8 |
9 |
10 | OUTGOING
11 |
12 |
13 | <{{composing|paused}}>{{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}}>{{composing|paused}}>
8 |
9 |
10 | OUTGOING
11 |
12 |
13 | <{{composing|paused}}>{{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 |
--------------------------------------------------------------------------------