2022-08-04 03:08:54 +02:00
|
|
|
from marshmallow import fields
|
|
|
|
from marshmallow.schema import Schema
|
|
|
|
|
|
|
|
from platypush.schemas import DateTime
|
|
|
|
|
|
|
|
|
2022-08-28 12:26:27 +02:00
|
|
|
class MillisecondsTimestamp(DateTime):
|
|
|
|
def _get_attr(self, *args, **kwargs):
|
|
|
|
value = super()._get_attr(*args, **kwargs)
|
|
|
|
if isinstance(value, int):
|
|
|
|
value = float(value / 1000)
|
|
|
|
return value
|
|
|
|
|
|
|
|
|
2022-08-15 02:10:26 +02:00
|
|
|
class MatrixEventIdSchema(Schema):
|
|
|
|
event_id = fields.String(
|
|
|
|
required=True,
|
|
|
|
metadata={
|
|
|
|
'description': 'Event ID',
|
|
|
|
'example': '$24KT_aQz6sSKaZH8oTCibRTl62qywDgQXMpz5epXsW5',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2022-08-27 23:26:42 +02:00
|
|
|
class MatrixRoomIdSchema(Schema):
|
|
|
|
room_id = fields.String(
|
|
|
|
required=True,
|
|
|
|
metadata={
|
|
|
|
'description': 'Room ID',
|
|
|
|
'example': '!aBcDeFgHiJkMnO:matrix.example.org',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2022-08-04 03:08:54 +02:00
|
|
|
class MatrixProfileSchema(Schema):
|
|
|
|
user_id = fields.String(
|
|
|
|
required=True,
|
|
|
|
metadata={
|
|
|
|
'description': 'User ID',
|
|
|
|
'example': '@myuser:matrix.example.org',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
display_name = fields.String(
|
|
|
|
attribute='displayname',
|
|
|
|
metadata={
|
|
|
|
'description': 'User display name',
|
|
|
|
'example': 'Foo Bar',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
avatar_url = fields.URL(
|
|
|
|
metadata={
|
|
|
|
'description': 'User avatar URL',
|
2022-08-26 23:48:29 +02:00
|
|
|
'example': 'mxc://matrix.example.org/AbCdEfG0123456789',
|
2022-08-04 03:08:54 +02:00
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2022-08-28 12:26:27 +02:00
|
|
|
class MatrixMemberSchema(MatrixProfileSchema):
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
super().__init__(*args, **kwargs)
|
|
|
|
self.fields['display_name'].attribute = 'display_name'
|
|
|
|
|
|
|
|
|
2022-08-04 03:08:54 +02:00
|
|
|
class MatrixRoomSchema(Schema):
|
|
|
|
room_id = fields.String(
|
|
|
|
required=True,
|
|
|
|
metadata={
|
|
|
|
'description': 'Room ID',
|
|
|
|
'example': '!aBcDeFgHiJkMnO:matrix.example.org',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
name = fields.String(
|
|
|
|
metadata={
|
|
|
|
'description': 'Room name',
|
|
|
|
'example': 'My Room',
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
display_name = fields.String(
|
|
|
|
metadata={
|
|
|
|
'description': 'Room display name',
|
|
|
|
'example': 'My Room',
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
topic = fields.String(
|
|
|
|
metadata={
|
|
|
|
'description': 'Room topic',
|
|
|
|
'example': 'My Room Topic',
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
avatar_url = fields.URL(
|
|
|
|
attribute='room_avatar_url',
|
|
|
|
metadata={
|
|
|
|
'description': 'Room avatar URL',
|
2022-08-26 23:48:29 +02:00
|
|
|
'example': 'mxc://matrix.example.org/AbCdEfG0123456789',
|
2022-08-04 03:08:54 +02:00
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
owner_id = fields.String(
|
|
|
|
attribute='own_user_id',
|
|
|
|
metadata={
|
|
|
|
'description': 'Owner user ID',
|
|
|
|
'example': '@myuser:matrix.example.org',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
encrypted = fields.Bool()
|
|
|
|
|
|
|
|
|
|
|
|
class MatrixDeviceSchema(Schema):
|
|
|
|
device_id = fields.String(
|
|
|
|
required=True,
|
|
|
|
attribute='id',
|
|
|
|
metadata={
|
|
|
|
'description': 'ABCDEFG',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
2022-08-25 00:34:01 +02:00
|
|
|
user_id = fields.String(
|
|
|
|
required=True,
|
|
|
|
metadata={
|
|
|
|
'description': 'User ID associated to the device',
|
|
|
|
'example': '@myuser:matrix.example.org',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
display_name = fields.String(
|
|
|
|
metadata={
|
|
|
|
'description': 'Display name of the device',
|
|
|
|
'example': 'Element Android',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
blacklisted = fields.Boolean()
|
|
|
|
deleted = fields.Boolean(default=False)
|
|
|
|
ignored = fields.Boolean()
|
|
|
|
verified = fields.Boolean()
|
|
|
|
|
|
|
|
keys = fields.Dict(
|
|
|
|
metadata={
|
|
|
|
'description': 'Encryption keys supported by the device',
|
|
|
|
'example': {
|
|
|
|
'curve25519': 'BtlB0vaQmtYFsvOYkmxyzw9qP5yGjuAyRh4gXh3q',
|
|
|
|
'ed25519': 'atohIK2FeVlYoY8xxpZ1bhDbveD+HA2DswNFqUxP',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
class MatrixMyDeviceSchema(Schema):
|
|
|
|
device_id = fields.String(
|
|
|
|
required=True,
|
|
|
|
attribute='id',
|
|
|
|
metadata={
|
|
|
|
'description': 'ABCDEFG',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
2022-08-04 03:08:54 +02:00
|
|
|
display_name = fields.String(
|
|
|
|
metadata={
|
|
|
|
'description': 'Device display name',
|
|
|
|
'example': 'My Device',
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
last_seen_ip = fields.String(
|
|
|
|
metadata={
|
|
|
|
'description': 'Last IP associated to this device',
|
|
|
|
'example': '1.2.3.4',
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
last_seen_date = DateTime(
|
|
|
|
metadata={
|
|
|
|
'description': 'The last time that the device was reported online',
|
|
|
|
'example': '2022-07-23T17:20:01.254223',
|
|
|
|
}
|
|
|
|
)
|
2022-08-26 23:48:29 +02:00
|
|
|
|
|
|
|
|
|
|
|
class MatrixDownloadedFileSchema(Schema):
|
|
|
|
url = fields.String(
|
|
|
|
metadata={
|
|
|
|
'description': 'Matrix URL of the original resource',
|
|
|
|
'example': 'mxc://matrix.example.org/YhQycHvFOvtiDDbEeWWtEhXx',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
path = fields.String(
|
|
|
|
metadata={
|
|
|
|
'description': 'Local path where the file has been saved',
|
|
|
|
'example': '/home/user/Downloads/image.png',
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
content_type = fields.String(
|
|
|
|
metadata={
|
|
|
|
'description': 'Content type of the downloaded file',
|
|
|
|
'example': 'image/png',
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
size = fields.Int(
|
|
|
|
metadata={
|
|
|
|
'description': 'Length in bytes of the output file',
|
|
|
|
'example': 1024,
|
|
|
|
}
|
|
|
|
)
|
2022-08-28 12:26:27 +02:00
|
|
|
|
|
|
|
|
|
|
|
class MatrixMessageSchema(Schema):
|
|
|
|
event_id = fields.String(
|
|
|
|
required=True,
|
|
|
|
metadata={
|
|
|
|
'description': 'Event ID associated to this message',
|
|
|
|
'example': '$2eOQ5ueafANj91GnPCRkRUOOjM7dI5kFDOlfMNCD2ly',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
room_id = fields.String(
|
|
|
|
required=True,
|
|
|
|
metadata={
|
|
|
|
'description': 'The ID of the room containing the message',
|
|
|
|
'example': '!aBcDeFgHiJkMnO:matrix.example.org',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
user_id = fields.String(
|
|
|
|
required=True,
|
|
|
|
attribute='sender',
|
|
|
|
metadata={
|
|
|
|
'description': 'ID of the user who sent the message',
|
|
|
|
'example': '@myuser:matrix.example.org',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
body = fields.String(
|
|
|
|
required=True,
|
|
|
|
metadata={
|
|
|
|
'description': 'Message body',
|
|
|
|
'example': 'Hello world!',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
format = fields.String(
|
|
|
|
metadata={
|
|
|
|
'description': 'Message format',
|
|
|
|
'example': 'markdown',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
formatted_body = fields.String(
|
|
|
|
metadata={
|
|
|
|
'description': 'Formatted body',
|
|
|
|
'example': '**Hello world!**',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
url = fields.String(
|
|
|
|
metadata={
|
|
|
|
'description': 'mxc:// URL if this message contains an attachment',
|
|
|
|
'example': 'mxc://matrix.example.org/oarGdlpvcwppARPjzNlmlXkD',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
content_type = fields.String(
|
|
|
|
attribute='mimetype',
|
|
|
|
metadata={
|
|
|
|
'description': 'If the message contains an attachment, this field '
|
|
|
|
'will contain its MIME type',
|
|
|
|
'example': 'image/jpeg',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
transaction_id = fields.String(
|
|
|
|
metadata={
|
|
|
|
'description': 'Set if this message a unique transaction_id associated',
|
|
|
|
'example': 'mQ8hZR6Dx8I8YDMwONYmBkf7lTgJSMV/ZPqosDNM',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
decrypted = fields.Bool(
|
|
|
|
metadata={
|
|
|
|
'description': 'True if the message was encrypted and has been '
|
|
|
|
'successfully decrypted',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
verified = fields.Bool(
|
|
|
|
metadata={
|
|
|
|
'description': 'True if this is an encrypted message coming from a '
|
|
|
|
'verified source'
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
hashes = fields.Dict(
|
|
|
|
metadata={
|
|
|
|
'description': 'If the message has been decrypted, this field '
|
|
|
|
'contains a mapping of its hashes',
|
|
|
|
'example': {'sha256': 'yoQLQwcURq6/bJp1xQ/uhn9Z2xeA27KhMhPd/mfT8tR'},
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
iv = fields.String(
|
|
|
|
metadata={
|
|
|
|
'description': 'If the message has been decrypted, this field '
|
|
|
|
'contains the encryption initial value',
|
|
|
|
'example': 'NqJMMdijlLvAAAAAAAAAAA',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
key = fields.Dict(
|
|
|
|
metadata={
|
|
|
|
'description': 'If the message has been decrypted, this field '
|
|
|
|
'contains the encryption/decryption key',
|
|
|
|
'example': {
|
|
|
|
'alg': 'A256CTR',
|
|
|
|
'ext': True,
|
|
|
|
'k': 'u6jjAyNvJoBHE55P5ZfvX49m3oSt9s_L4PSQdprRSJI',
|
|
|
|
'key_ops': ['encrypt', 'decrypt'],
|
|
|
|
'kty': 'oct',
|
|
|
|
},
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
timestamp = MillisecondsTimestamp(
|
|
|
|
required=True,
|
|
|
|
attribute='server_timestamp',
|
|
|
|
metadata={
|
|
|
|
'description': 'When the event was registered on the server',
|
|
|
|
'example': '2022-07-23T17:20:01.254223',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
class MatrixMessagesResponseSchema(Schema):
|
|
|
|
messages = fields.Nested(
|
2022-08-29 00:55:46 +02:00
|
|
|
MatrixMessageSchema,
|
2022-08-28 12:26:27 +02:00
|
|
|
many=True,
|
|
|
|
required=True,
|
|
|
|
attribute='chunk',
|
|
|
|
)
|
|
|
|
|
|
|
|
start = fields.String(
|
|
|
|
required=True,
|
|
|
|
nullable=True,
|
|
|
|
metadata={
|
|
|
|
'description': 'Pointer to the first message. It can be used as a '
|
|
|
|
'``start``/``end`` for another ``get_messages`` query.',
|
|
|
|
'example': 's10226_143893_619_3648_5951_5_555_7501_0',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
end = fields.String(
|
|
|
|
required=True,
|
|
|
|
nullable=True,
|
|
|
|
metadata={
|
|
|
|
'description': 'Pointer to the last message. It can be used as a '
|
|
|
|
'``start``/``end`` for another ``get_messages`` query.',
|
|
|
|
'example': 't2-10202_143892_626_3663_5949_6_558_7501_0',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
start_time = MillisecondsTimestamp(
|
|
|
|
required=True,
|
|
|
|
nullable=True,
|
|
|
|
metadata={
|
|
|
|
'description': 'The oldest timestamp of the returned messages',
|
|
|
|
'example': '2022-07-23T16:20:01.254223',
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
end_time = MillisecondsTimestamp(
|
|
|
|
required=True,
|
|
|
|
nullable=True,
|
|
|
|
metadata={
|
|
|
|
'description': 'The newest timestamp of the returned messages',
|
|
|
|
'example': '2022-07-23T18:20:01.254223',
|
|
|
|
},
|
|
|
|
)
|