diff options
-rw-r--r-- | slack/slack_api.py | 4 | ||||
-rw-r--r-- | slack/slack_workspace.py | 4 | ||||
-rw-r--r-- | slack/util.py | 17 | ||||
-rw-r--r-- | tests/test_get_cookies.py | 11 |
4 files changed, 32 insertions, 4 deletions
diff --git a/slack/slack_api.py b/slack/slack_api.py index 0f315a8..76d97cb 100644 --- a/slack/slack_api.py +++ b/slack/slack_api.py @@ -10,7 +10,7 @@ from slack.http import http_request from slack.shared import shared from slack.slack_message import SlackTs from slack.task import gather -from slack.util import chunked +from slack.util import chunked, get_cookies if TYPE_CHECKING: from slack_api.slack_bots_info import SlackBotInfoResponse, SlackBotsInfoResponse @@ -48,7 +48,7 @@ class SlackApiCommon: return { "useragent": f"wee_slack {shared.SCRIPT_VERSION}", "httpheader": f"Authorization: Bearer {self.workspace.config.api_token.value}", - "cookie": self.workspace.config.api_cookies.value, # TODO: url_encode_if_not_encoded + "cookie": get_cookies(self.workspace.config.api_cookies.value), } diff --git a/slack/slack_workspace.py b/slack/slack_workspace.py index 9348e1a..c0652fb 100644 --- a/slack/slack_workspace.py +++ b/slack/slack_workspace.py @@ -42,7 +42,7 @@ from slack.slack_message import SlackMessage, SlackTs from slack.slack_thread import SlackThread from slack.slack_user import SlackBot, SlackUser, SlackUsergroup from slack.task import Future, Task, create_task, gather, run_async -from slack.util import get_callback_name +from slack.util import get_callback_name, get_cookies if TYPE_CHECKING: from slack_api.slack_bots_info import SlackBotInfo @@ -382,7 +382,7 @@ class SlackWorkspace: self._ws = create_connection( url, self.config.network_timeout.value, - cookie=self.config.api_cookies.value, + cookie=get_cookies(self.config.api_cookies.value), proxy_type=proxy.type, http_proxy_host=proxy.address, http_proxy_port=proxy.port, diff --git a/slack/util.py b/slack/util.py index c988f1f..14d18dc 100644 --- a/slack/util.py +++ b/slack/util.py @@ -12,6 +12,7 @@ from typing import ( TypeVar, Union, ) +from urllib.parse import quote, unquote import weechat @@ -45,6 +46,22 @@ def unhtmlescape(text: str) -> str: return text.replace("<", "<").replace(">", ">").replace("&", "&") +def url_encode_if_not_encoded(value: str) -> str: + is_encoded = value != unquote(value) + if is_encoded: + return value + else: + return quote(value) + + +def get_cookies(cookie_config: str) -> str: + cookie_pairs = [cookie.split("=", 1) for cookie in cookie_config.split(";")] + for cookie_pair in cookie_pairs: + cookie_pair[0] = cookie_pair[0].strip() + cookie_pair[1] = url_encode_if_not_encoded(cookie_pair[1].strip()) + return "; ".join("=".join(cookie_pair) for cookie_pair in cookie_pairs) + + # From https://github.com/more-itertools/more-itertools/blob/v10.1.0/more_itertools/recipes.py#L93-L106 def take(n: int, iterable: Iterable[T]) -> List[T]: """Return first *n* items of the iterable as a list. diff --git a/tests/test_get_cookies.py b/tests/test_get_cookies.py new file mode 100644 index 0000000..1e68f58 --- /dev/null +++ b/tests/test_get_cookies.py @@ -0,0 +1,11 @@ +from slack.util import get_cookies + + +def test_get_cookies_multiple_keys_value_encoded(): + cookie = get_cookies("d=a%2Bb ; d-s=1") + assert cookie == "d=a%2Bb; d-s=1" + + +def test_get_cookies_multiple_keys_value_not_encoded(): + cookie = get_cookies("d=a+b ; d-s=1") + assert cookie == "d=a%2Bb; d-s=1" |