python-trueconf-bot 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- python_trueconf_bot-1.0.0.dist-info/METADATA +115 -0
- python_trueconf_bot-1.0.0.dist-info/RECORD +120 -0
- python_trueconf_bot-1.0.0.dist-info/WHEEL +5 -0
- python_trueconf_bot-1.0.0.dist-info/licenses/LICENSE +32 -0
- python_trueconf_bot-1.0.0.dist-info/top_level.txt +1 -0
- trueconf/__init__.py +18 -0
- trueconf/_version.py +34 -0
- trueconf/client/__init__.py +0 -0
- trueconf/client/bot.py +1269 -0
- trueconf/client/context_controller.py +27 -0
- trueconf/client/session.py +60 -0
- trueconf/dispatcher/__init__.py +0 -0
- trueconf/dispatcher/dispatcher.py +56 -0
- trueconf/dispatcher/router.py +207 -0
- trueconf/enums/__init__.py +23 -0
- trueconf/enums/aouth_error.py +15 -0
- trueconf/enums/chat_participant_role.py +18 -0
- trueconf/enums/chat_type.py +17 -0
- trueconf/enums/envelope_author_type.py +13 -0
- trueconf/enums/file_ready_state.py +14 -0
- trueconf/enums/incoming_update_method.py +14 -0
- trueconf/enums/message_type.py +27 -0
- trueconf/enums/parse_mode.py +14 -0
- trueconf/enums/survey_type.py +6 -0
- trueconf/enums/update_type.py +14 -0
- trueconf/exceptions.py +17 -0
- trueconf/filters/__init__.py +11 -0
- trueconf/filters/base.py +8 -0
- trueconf/filters/command.py +32 -0
- trueconf/filters/instance_of.py +11 -0
- trueconf/filters/message.py +15 -0
- trueconf/filters/method.py +12 -0
- trueconf/loggers.py +4 -0
- trueconf/methods/__init__.py +59 -0
- trueconf/methods/add_participant_to_chat.py +22 -0
- trueconf/methods/auth.py +25 -0
- trueconf/methods/base.py +107 -0
- trueconf/methods/create_channel.py +20 -0
- trueconf/methods/create_group_chat.py +20 -0
- trueconf/methods/create_p2p_chat.py +20 -0
- trueconf/methods/edit_message.py +25 -0
- trueconf/methods/edit_survey.py +32 -0
- trueconf/methods/forward_message.py +22 -0
- trueconf/methods/get_chat_by_id.py +20 -0
- trueconf/methods/get_chat_history.py +24 -0
- trueconf/methods/get_chat_participants.py +24 -0
- trueconf/methods/get_chats.py +22 -0
- trueconf/methods/get_file_info.py +20 -0
- trueconf/methods/get_message_by_id.py +19 -0
- trueconf/methods/get_user_display_name.py +20 -0
- trueconf/methods/has_chat_participant.py +22 -0
- trueconf/methods/remove_chat.py +20 -0
- trueconf/methods/remove_message.py +23 -0
- trueconf/methods/remove_participant_from_chat.py +23 -0
- trueconf/methods/send_file.py +25 -0
- trueconf/methods/send_message.py +29 -0
- trueconf/methods/send_survey.py +40 -0
- trueconf/methods/subscribe_file_progress.py +21 -0
- trueconf/methods/unsubscribe_file_progress.py +21 -0
- trueconf/methods/upload_file.py +21 -0
- trueconf/py.typed +0 -0
- trueconf/types/__init__.py +25 -0
- trueconf/types/author_box.py +17 -0
- trueconf/types/chat_participant.py +11 -0
- trueconf/types/content/__init__.py +25 -0
- trueconf/types/content/attachment.py +14 -0
- trueconf/types/content/base.py +8 -0
- trueconf/types/content/chat_created.py +9 -0
- trueconf/types/content/document.py +71 -0
- trueconf/types/content/forward_message.py +21 -0
- trueconf/types/content/photo.py +70 -0
- trueconf/types/content/remove_participant.py +9 -0
- trueconf/types/content/sticker.py +70 -0
- trueconf/types/content/survey.py +19 -0
- trueconf/types/content/text.py +9 -0
- trueconf/types/content/video.py +71 -0
- trueconf/types/last_message.py +33 -0
- trueconf/types/message.py +411 -0
- trueconf/types/parser.py +90 -0
- trueconf/types/requests/__init__.py +21 -0
- trueconf/types/requests/added_chat_participant.py +40 -0
- trueconf/types/requests/created_channel.py +42 -0
- trueconf/types/requests/created_group_chat.py +42 -0
- trueconf/types/requests/created_personal_chat.py +42 -0
- trueconf/types/requests/edited_message.py +37 -0
- trueconf/types/requests/removed_chat.py +32 -0
- trueconf/types/requests/removed_chat_participant.py +39 -0
- trueconf/types/requests/removed_message.py +37 -0
- trueconf/types/requests/uploading_progress.py +34 -0
- trueconf/types/responses/__init__.py +57 -0
- trueconf/types/responses/add_chat_participant_response.py +8 -0
- trueconf/types/responses/api_error.py +38 -0
- trueconf/types/responses/auth_response_payload.py +9 -0
- trueconf/types/responses/create_channel_response.py +8 -0
- trueconf/types/responses/create_group_chat_response.py +8 -0
- trueconf/types/responses/create_p2p_chat_response.py +8 -0
- trueconf/types/responses/edit_message_response.py +9 -0
- trueconf/types/responses/edit_survey_response.py +9 -0
- trueconf/types/responses/forward_message_response.py +10 -0
- trueconf/types/responses/get_chat_by_id_response.py +13 -0
- trueconf/types/responses/get_chat_history_response.py +13 -0
- trueconf/types/responses/get_chat_participants_response.py +12 -0
- trueconf/types/responses/get_chats_response.py +12 -0
- trueconf/types/responses/get_file_info_response.py +24 -0
- trueconf/types/responses/get_message_by_id_response.py +26 -0
- trueconf/types/responses/get_user_display_name_response.py +8 -0
- trueconf/types/responses/has_chat_participant_response.py +8 -0
- trueconf/types/responses/remove_chat_participant_response.py +8 -0
- trueconf/types/responses/remove_chat_response.py +8 -0
- trueconf/types/responses/remove_message_response.py +8 -0
- trueconf/types/responses/send_file_response.py +10 -0
- trueconf/types/responses/send_message_response.py +10 -0
- trueconf/types/responses/send_survey_response.py +10 -0
- trueconf/types/responses/subscribe_file_progress_response.py +8 -0
- trueconf/types/responses/unsubscribe_file_progress_response.py +8 -0
- trueconf/types/responses/upload_file_response.py +8 -0
- trueconf/types/update.py +12 -0
- trueconf/utils/__init__.py +3 -0
- trueconf/utils/generate_secret_for_survey.py +10 -0
- trueconf/utils/token.py +78 -0
trueconf/utils/token.py
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import base64
|
|
2
|
+
import json
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
from functools import lru_cache
|
|
5
|
+
from typing import Optional
|
|
6
|
+
|
|
7
|
+
from httpx import AsyncClient, Client, HTTPStatusError
|
|
8
|
+
|
|
9
|
+
from ..exceptions import TokenValidationError, InvalidGrantError
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def get_auth_token(
|
|
13
|
+
server: str,
|
|
14
|
+
username: str,
|
|
15
|
+
password: str,
|
|
16
|
+
verify: bool,
|
|
17
|
+
*,
|
|
18
|
+
protocol: str = "https",
|
|
19
|
+
port: int = 443,
|
|
20
|
+
timeout: float = 5.0,
|
|
21
|
+
) -> Optional[str]:
|
|
22
|
+
url = f"{protocol}://{server}:{port}/bridge/api/client/v1/oauth/token"
|
|
23
|
+
params = {
|
|
24
|
+
"client_id": "chat_bot",
|
|
25
|
+
"grant_type": "password",
|
|
26
|
+
"username": username,
|
|
27
|
+
"password": password,
|
|
28
|
+
}
|
|
29
|
+
with Client(timeout=timeout, verify=verify) as client:
|
|
30
|
+
r = client.post(url, json=params)
|
|
31
|
+
|
|
32
|
+
try:
|
|
33
|
+
r.raise_for_status()
|
|
34
|
+
except HTTPStatusError as e:
|
|
35
|
+
if e.response.status_code == 401:
|
|
36
|
+
if r.json().get("error_description", False):
|
|
37
|
+
raise InvalidGrantError("Invalid username or password!") from e
|
|
38
|
+
else:
|
|
39
|
+
raise
|
|
40
|
+
|
|
41
|
+
return r.json().get("access_token", None)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@lru_cache()
|
|
45
|
+
def validate_token(token: str) -> bool:
|
|
46
|
+
"""
|
|
47
|
+
Validate TrueConf Chatbot Connector token
|
|
48
|
+
|
|
49
|
+
:param token:
|
|
50
|
+
:return:
|
|
51
|
+
"""
|
|
52
|
+
if not isinstance(token, str):
|
|
53
|
+
message = (
|
|
54
|
+
f"Token is invalid! It must be 'str' type instead of {type(token)} type."
|
|
55
|
+
)
|
|
56
|
+
raise TokenValidationError(message)
|
|
57
|
+
|
|
58
|
+
if any(x.isspace() for x in token):
|
|
59
|
+
message = "Token is invalid! It can't contains spaces."
|
|
60
|
+
raise TokenValidationError(message)
|
|
61
|
+
|
|
62
|
+
header_encoded, payload_encoded, signature = token.split(".")
|
|
63
|
+
|
|
64
|
+
if (not header_encoded) or (not payload_encoded):
|
|
65
|
+
message = f"Token is invalid! It can't contain any of the following characters: {token}"
|
|
66
|
+
raise TokenValidationError(message)
|
|
67
|
+
|
|
68
|
+
header_decoded = base64.urlsafe_b64decode(header_encoded + "==").decode("utf-8")
|
|
69
|
+
payload_decoded = base64.urlsafe_b64decode(payload_encoded + "==").decode("utf-8")
|
|
70
|
+
|
|
71
|
+
header = json.loads(header_decoded)
|
|
72
|
+
payload = json.loads(payload_decoded)
|
|
73
|
+
|
|
74
|
+
if int(datetime.now().timestamp()) > payload["exp"]:
|
|
75
|
+
message = f"Token is invalid!"
|
|
76
|
+
raise TokenValidationError(message)
|
|
77
|
+
|
|
78
|
+
return True
|