From 256c0ec77e27c0f7d333502eb2cbe82b1e4a1a91 Mon Sep 17 00:00:00 2001 From: Kristian Amlie Date: Tue, 19 Sep 2023 07:55:58 +0200 Subject: [PATCH] Start sending d-cookie in WebSocket requests. Started being required by Slack around 2023-09-19. Signed-off-by: Kristian Amlie --- purple-websocket.c | 5 +++-- purple-websocket.h | 2 +- slack-rtm.c | 9 ++++++++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/purple-websocket.c b/purple-websocket.c index 55eb371..07821c4 100644 --- a/purple-websocket.c +++ b/purple-websocket.c @@ -463,7 +463,7 @@ static void ws_connect_cb(gpointer data, gint source, const gchar *error_message } PurpleWebsocket *purple_websocket_connect(PurpleAccount *account, - const char *url, const char *protocol, + const char *url, const char *protocol, const char *cookies, PurpleWebsocketCallback callback, void *user_data) { gboolean ssl = FALSE; @@ -510,9 +510,10 @@ PurpleWebsocket *purple_websocket_connect(PurpleAccount *account, GET /%s HTTP/1.1\r\n\ Host: %s\r\n\ Connection: Upgrade\r\n\ +Cookie: %s\r\n\ Upgrade: websocket\r\n\ Sec-WebSocket-Key: %s\r\n\ -Sec-WebSocket-Version: 13\r\n", path, host, ws->key); +Sec-WebSocket-Version: 13\r\n", path, host, cookies, ws->key); if (protocol) g_string_append_printf(request, "Sec-WebSocket-Protocol: %s\r\n", protocol); g_string_append(request, "\r\n"); diff --git a/purple-websocket.h b/purple-websocket.h index 0416750..0f3eae0 100644 --- a/purple-websocket.h +++ b/purple-websocket.h @@ -17,7 +17,7 @@ typedef enum _PurpleWebsocketOp { typedef void (*PurpleWebsocketCallback)(PurpleWebsocket *ws, gpointer user_data, PurpleWebsocketOp op, const guchar *msg, size_t len); -PurpleWebsocket *purple_websocket_connect(PurpleAccount *account, const char *url, const char *protocol, PurpleWebsocketCallback callback, void *user_data); +PurpleWebsocket *purple_websocket_connect(PurpleAccount *account, const char *url, const char *protocol, const char *cookies, PurpleWebsocketCallback callback, void *user_data); void purple_websocket_send(PurpleWebsocket *ws, PurpleWebsocketOp op, const guchar *msg, size_t len); void purple_websocket_abort(PurpleWebsocket *ws); diff --git a/slack-rtm.c b/slack-rtm.c index d4ee8f2..f79b9e2 100644 --- a/slack-rtm.c +++ b/slack-rtm.c @@ -187,8 +187,15 @@ static gboolean rtm_connect_cb(SlackAccount *sa, gpointer data, json_value *json slack_blist_init(sa); slack_login_step(sa); + + size_t cookie_size = strlen("d=") + strlen(sa->d_cookie) + 1; + char *cookie = malloc(cookie_size); + snprintf(cookie, cookie_size, "d=%s", sa->d_cookie); + purple_debug_info("slack", "RTM URL: %s\n", url); - sa->rtm = purple_websocket_connect(sa->account, url, NULL, rtm_cb, sa); + sa->rtm = purple_websocket_connect(sa->account, url, NULL, cookie, rtm_cb, sa); + + free(cookie); sa->ping_timer = purple_timeout_add_seconds(60, ping_timer, sa); return FALSE;