aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--slack/slack_api.py4
-rw-r--r--slack/slack_workspace.py4
-rw-r--r--slack/util.py17
-rw-r--r--tests/test_get_cookies.py11
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("&lt;", "<").replace("&gt;", ">").replace("&amp;", "&")
+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"