163 lines
8.2 KiB
Python
163 lines
8.2 KiB
Python
# matrix-appservice-kakaotalk - A Matrix-KakaoTalk puppeting bridge.
|
|
# Copyright (C) 2022 Tulir Asokan, Andrew Ferrazzutti
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU Affero General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU Affero General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Affero General Public License
|
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
"""Helper functions & types for status codes for the KakaoTalk API."""
|
|
from __future__ import annotations
|
|
|
|
from typing import Dict, Union
|
|
|
|
from ..types.api.auth_api_client import KnownAuthStatusCode
|
|
from ..types.request import KnownDataStatusCode, RootCommandResult
|
|
|
|
|
|
class CommandException(Exception):
|
|
def __init__(self, result: RootCommandResult):
|
|
"""
|
|
Base type for errors raised from KakaoTalk. Subclasses identify different kinds of errors.
|
|
Which subclass to use should be based on the status code of the "result" object.
|
|
In the case that different status codes map to the same error subclass, the status code
|
|
can be retrieved from the "status" property.
|
|
"""
|
|
# TODO Handle result object
|
|
# TODO Print _unrecognized?
|
|
self.status = result.status
|
|
self.message = _status_code_message_map.get(self.status, self._default_message)
|
|
|
|
@property
|
|
def _default_message(self):
|
|
return "Unknown error"
|
|
|
|
def __str__(self):
|
|
return f"{self.message} ({self.status})"
|
|
|
|
|
|
class OAuthException(CommandException):
|
|
pass
|
|
|
|
class DeviceVerificationRequired(OAuthException):
|
|
pass
|
|
|
|
class AnotherLogonDetected(OAuthException):
|
|
pass
|
|
|
|
class IncorrectPassword(OAuthException):
|
|
pass
|
|
|
|
class IncorrectPasscode(OAuthException):
|
|
pass
|
|
|
|
class InvalidAccessToken(OAuthException):
|
|
"""Thrown when the session token is invalid and must be refreshed"""
|
|
@property
|
|
def _default_message(self):
|
|
return "Invalid access token"
|
|
|
|
class AuthenticationRequired(OAuthException):
|
|
"""Thrown when both the session token and refresh token are invalid"""
|
|
pass
|
|
|
|
|
|
class ResponseError(Exception):
|
|
"""TODO Use for network failures to the KakaoTalk API"""
|
|
pass
|
|
|
|
|
|
_status_code_message_map: Dict[Union[KnownAuthStatusCode, KnownDataStatusCode, int], str] = {
|
|
KnownAuthStatusCode.INVALID_PHONE_NUMBER: "Invalid phone number",
|
|
KnownAuthStatusCode.SUCCESS_WITH_ACCOUNT: "Success",
|
|
KnownAuthStatusCode.SUCCESS_WITH_DEVICE_CHANGED: "Success (device changed)",
|
|
KnownAuthStatusCode.MISMATCH_PASSWORD: "Password mismatch",
|
|
KnownAuthStatusCode.EXCEED_LOGIN_LIMIT: "Login limit exceeded",
|
|
KnownAuthStatusCode.MISMATCH_PHONE_NUMBER: "Phone number mismatch",
|
|
KnownAuthStatusCode.EXCEED_PHONE_NUMBER_CHECK_LIMIT: "Phone number limit exceeded",
|
|
KnownAuthStatusCode.NOT_EXIST_ACCOUNT: "Account does not exist",
|
|
KnownAuthStatusCode.NEED_CHECK_PHONE_NUMBER: "Must check phone number",
|
|
KnownAuthStatusCode.NEED_CHECK_QUIZ: "Must check quiz",
|
|
KnownAuthStatusCode.DORMANT_ACCOUNT: "Dormant account",
|
|
KnownAuthStatusCode.RESTRICTED_ACCOUNT: "Restricted account",
|
|
KnownAuthStatusCode.LOGIN_FAILED: "Login failed",
|
|
KnownAuthStatusCode.NOT_VERIFIED_EMAIL: "Unverified email address",
|
|
KnownAuthStatusCode.MOBILE_UNREGISTERED: "Mobile device not registered",
|
|
KnownAuthStatusCode.UNKNOWN_PHONE_NUMBER: "Unknown phone number",
|
|
KnownAuthStatusCode.SUCCESS_SAME_USER: "Success (same user)",
|
|
KnownAuthStatusCode.SUCCESS_SAME_USER_BY_MIGRATION: "Success (same user by migration)",
|
|
KnownAuthStatusCode.TOO_MANY_REQUEST_A_DAY: "Too many requests a day",
|
|
KnownAuthStatusCode.TOO_MANY_REQUEST_AT_A_TIME: " Too many requests at a time",
|
|
KnownAuthStatusCode.MISMATCH_PASSCODE: "Passcode mismatch",
|
|
KnownAuthStatusCode.EXCEED_DAILY_REQUEST_LIMIT: "Daily request limit exceeded",
|
|
KnownAuthStatusCode.EXCEED_DAILY_REQUEST_LIMIT_VOICECALL: "Daily voicecall limit exceeded",
|
|
KnownAuthStatusCode.EXCEED_DAILY_REQUEST_LIMIT_WITHOUT_TOKEN: "Daily tokenless request limit exceeded",
|
|
KnownAuthStatusCode.DEVICE_NOT_REGISTERED: "Device not registered",
|
|
KnownAuthStatusCode.ANOTHER_LOGON: "Another logon detected",
|
|
KnownAuthStatusCode.DEVICE_REGISTER_FAILED: "Device registration failed",
|
|
KnownAuthStatusCode.INVALID_DEVICE_REGISTER: "Invalid device",
|
|
KnownAuthStatusCode.INVALID_PASSCODE: "Invalid passcode",
|
|
KnownAuthStatusCode.PASSCODE_REQUEST_FAILED: "Passcode request failed",
|
|
KnownAuthStatusCode.NEED_TERMS_AGREE: "Must agree to terms",
|
|
KnownAuthStatusCode.DENIED_DEVICE_MODEL: "Denied device model",
|
|
KnownAuthStatusCode.RESET_STEP: "Reset step",
|
|
KnownAuthStatusCode.NEED_PROTECTOR_AGREE: "Must agree to protector terms",
|
|
KnownAuthStatusCode.ACCOUNT_RESTRICTED: "Account restricted",
|
|
#KnownAuthStatusCode.INVALID_STAGE_ERROR: "Same as KnownAuthStatusCode.AUTH_REQUIRED",
|
|
KnownAuthStatusCode.UPGRADE_REQUIRED: "Upgrade required",
|
|
KnownAuthStatusCode.VOICE_CALL_ONLY: "Voice call only",
|
|
KnownAuthStatusCode.ACCESSIBILITY_ARS_ONLY: "Accessibility only",
|
|
KnownAuthStatusCode.MIGRATION_FAILURE: "Migration failure",
|
|
KnownAuthStatusCode.INVAILD_TOKEN: "Invalid token",
|
|
KnownAuthStatusCode.UNDEFINED: "Undefined error",
|
|
|
|
KnownDataStatusCode.SUCCESS: "Success",
|
|
KnownDataStatusCode.INVALID_USER: "Invalid user",
|
|
KnownDataStatusCode.CLIENT_ERROR: "Client error",
|
|
KnownDataStatusCode.NOT_LOGON: "Not logged in",
|
|
KnownDataStatusCode.INVALID_METHOD: "Invalid method",
|
|
KnownDataStatusCode.INVALID_PARAMETER: "Invalid parameter",
|
|
KnownDataStatusCode.INVALID_BODY: "Invalid body",
|
|
KnownDataStatusCode.INVALID_HEADER: "Invalid header",
|
|
KnownDataStatusCode.UNAUTHORIZED_CHAT_DELETE: "Unauthorized chat deletion",
|
|
KnownDataStatusCode.MEDIA_SERVER_ERROR: "Media server error",
|
|
KnownDataStatusCode.CHAT_SPAM_LIMIT: "Chat spam limit exceeded",
|
|
KnownDataStatusCode.RESTRICTED_APP: "Restricted app",
|
|
KnownDataStatusCode.LOGINLIST_CHATLIST_FAILED: "Login chat list failed",
|
|
KnownDataStatusCode.MEDIA_NOT_FOUND: "Media not found",
|
|
KnownDataStatusCode.MEDIA_THUMB_GEN_FAILED: "Could not generate media thumbnail",
|
|
KnownDataStatusCode.UNSUPPORTED: "Unsupported",
|
|
KnownDataStatusCode.PARTIAL: "Parial",
|
|
KnownDataStatusCode.LINK_JOIN_TPS_EXCEEDED: "Link join TPS exceeded",
|
|
KnownDataStatusCode.CHAT_SEND_RESTRICTED: "Chat send restricted",
|
|
KnownDataStatusCode.CHANNEL_CREATE_TEMP_RESTRICTED: "Channel creation temporarily restricted",
|
|
KnownDataStatusCode.CHANNEL_CREATE_RESTRICTED: "Channel creation restricted",
|
|
KnownDataStatusCode.OPENLINK_UNAVAILABLE: "Openlink unavailable",
|
|
KnownDataStatusCode.INVITE_COUNT_LIMITED: "Invite count limited",
|
|
KnownDataStatusCode.OPENLINK_CREATE_RESTRICTED: "Openlink creation restricted",
|
|
KnownDataStatusCode.INVALID_CHANNEL: "Invalid channel",
|
|
KnownDataStatusCode.CHAT_BLOCKED_BY_FRIEND: "Blocked by friend",
|
|
KnownDataStatusCode.NOT_CHATABLE_USER: "Non-chattable user",
|
|
KnownDataStatusCode.GAME_MESSAGE_BLOCKED: "Game message blocked",
|
|
KnownDataStatusCode.BLOCKED_IP: "Blocked IP",
|
|
KnownDataStatusCode.BACKGROUND_LOGIN_BLOCKED: "Background login blocked",
|
|
KnownDataStatusCode.OPERATION_DENIED: "Operation denied",
|
|
KnownDataStatusCode.CHANNEL_USER_LIMITED: "Channel user limited",
|
|
KnownDataStatusCode.TEMP_RESTRICTED: "Temporarily restricted",
|
|
KnownDataStatusCode.WRITE_WHILE_BLOCKED: "Write while blocked",
|
|
KnownDataStatusCode.OPENCHAT_REJOIN_REQUIRED: "Openchat rejoin required",
|
|
KnownDataStatusCode.OPENCHAT_TIME_RESTRICTED: "Openchat time restricted",
|
|
KnownDataStatusCode.INVALID_ACCESS_TOKEN: "Invalid access token",
|
|
#KnownDataStatusCode.BLOCKED_ACCOUNT: "Same as KnownAuthStatusCode.ACCOUNT_RESTRICTED"
|
|
KnownDataStatusCode.AUTH_REQUIRED: "Authentication required",
|
|
#KnownDataStatusCode.UPDATE_REQUIRED = "Same as KnownAuthStatusCode.UPGRADE_REQUIRED"
|
|
KnownDataStatusCode.SERVER_UNDER_MAINTENANCE: "Server under maintenance",
|
|
}
|