diff --git a/overlays/purple-slack/browser-based-auth.patch b/overlays/purple-slack/browser-based-auth.patch index 3f032d7..6fb4f30 100644 --- a/overlays/purple-slack/browser-based-auth.patch +++ b/overlays/purple-slack/browser-based-auth.patch @@ -1,9 +1,10 @@ https://github.com/kacf/slack-libpurple/commit/8a09a6d94c1020aeb7aef1ab3b08a088e4fbfac0.patch -From 8a09a6d94c1020aeb7aef1ab3b08a088e4fbfac0 Mon Sep 17 00:00:00 2001 +From d276ba4a0854ea243cb995a6042acc1b936f7d45 Mon Sep 17 00:00:00 2001 From: Kristian Amlie Date: Wed, 20 Jul 2022 15:43:03 +0200 -Subject: [PATCH] Enable credentials using browser obtained token and cookie. +Subject: [PATCH 1/2] Enable credentials using browser obtained token and + cookie. The way it works is that you need two tokens from the browser. Currently, getting them is inconvenient, but let's start with the @@ -161,28 +162,28 @@ index 6463da0..6415a46 100644 void slack_api_disconnect(SlackAccount *sa); diff --git a/slack-auth.c b/slack-auth.c -index 5a41f76..d157ee5 100644 +index b1422ae..62ffcbb 100644 --- a/slack-auth.c +++ b/slack-auth.c -@@ -49,7 +49,7 @@ slack_auth_login_finduser_cb(SlackAccount *sa, gpointer user_data, json_value *j - - /* now do the actual login */ +@@ -37,7 +37,7 @@ slack_auth_login_signin_cb(SlackAccount *sa, gpointer user_data, json_value *jso + static void + slack_auth_login_user(SlackAccount *sa, const char *user_id) { slack_login_step(sa); - slack_api_get(sa, slack_auth_login_signin_cb, + slack_api_post(sa, slack_auth_login_signin_cb, NULL, "auth.signin", "user", user_id, "password", purple_account_get_password(sa->account), -@@ -75,7 +75,7 @@ slack_auth_login_findteam_cb(SlackAccount *sa, gpointer user_data, json_value *j - +@@ -81,7 +81,7 @@ slack_auth_login_findteam_cb(SlackAccount *sa, gpointer user_data, json_value *j /* now validate that the user exists and get their ID. */ slack_login_step(sa); -- slack_api_get(sa, slack_auth_login_finduser_cb, -+ slack_api_post(sa, slack_auth_login_finduser_cb, - NULL, "auth.findUser", - "email", sa->email, - "team", sa->team.id, -@@ -86,7 +86,7 @@ slack_auth_login_findteam_cb(SlackAccount *sa, gpointer user_data, json_value *j + if (strchr(sa->email, '@')) +- slack_api_get(sa, slack_auth_login_finduser_cb, ++ slack_api_post(sa, slack_auth_login_finduser_cb, + NULL, "auth.findUser", + "email", sa->email, + "team", sa->team.id, +@@ -94,7 +94,7 @@ slack_auth_login_findteam_cb(SlackAccount *sa, gpointer user_data, json_value *j void slack_auth_login(SlackAccount *sa) { /* validate the team and get it's ID */ @@ -192,10 +193,10 @@ index 5a41f76..d157ee5 100644 "domain", sa->host, NULL); diff --git a/slack-blist.c b/slack-blist.c -index be5c7ba..2756aef 100644 +index 5f7612d..b039a48 100644 --- a/slack-blist.c +++ b/slack-blist.c -@@ -140,7 +140,7 @@ struct roomlist_expand { +@@ -145,7 +145,7 @@ struct roomlist_expand { }; #define ROOMLIST_CALL(sa, expand, ARGS...) \ @@ -297,10 +298,10 @@ index 1a84e1f..d4ee8f2 100644 + slack_api_post(sa, rtm_connect_cb, NULL, "rtm.connect", "batch_presence_aware", "1", "presence_sub", "true", NULL); } diff --git a/slack-thread.c b/slack-thread.c -index 75e2b9d..bf5ae00 100644 +index ae86996..714781c 100644 --- a/slack-thread.c +++ b/slack-thread.c -@@ -225,7 +225,7 @@ static void slack_thread_lookup_ts(SlackAccount *sa, slack_thread_lookup_ts_cb * +@@ -251,7 +251,7 @@ static void slack_thread_lookup_ts(SlackAccount *sa, slack_thread_lookup_ts_cb * lookup->rest = g_strdup(rest); const char *id = slack_conversation_id(conv); @@ -350,7 +351,7 @@ index 88292b4..3b3d151 100644 static void avatar_load_next(SlackAccount *sa); diff --git a/slack.c b/slack.c -index 709baf6..5b8259a 100644 +index 5b61b39..0cbcd38 100644 --- a/slack.c +++ b/slack.c @@ -282,14 +282,35 @@ static void slack_login(PurpleAccount *account) { @@ -411,3 +412,75 @@ index 2f6454e..490722a 100644 short login_step; GQueue api_calls; /* SlackAPICall */ + +From 256c0ec77e27c0f7d333502eb2cbe82b1e4a1a91 Mon Sep 17 00:00:00 2001 +From: Kristian Amlie +Date: Tue, 19 Sep 2023 07:55:58 +0200 +Subject: [PATCH 2/2] 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,13 @@ static gboolean rtm_connect_cb(SlackAccount *sa, gpointer data, json_value *json + slack_blist_init(sa); + + slack_login_step(sa); ++ ++ gchar *cookie = g_strdup_printf("d=%s", sa->d_cookie ? 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; diff --git a/overlays/purple-slack/default.nix b/overlays/purple-slack/default.nix index 3ddf52e..630da4b 100644 --- a/overlays/purple-slack/default.nix +++ b/overlays/purple-slack/default.nix @@ -1,12 +1,12 @@ self: super: { purple-slack = super.purple-slack.overrideAttrs(old: { - version = "2023-01-19"; + version = "2023-05-15"; src = super.fetchFromGitHub { owner = "dylex"; repo = "slack-libpurple"; - rev = "6778b7c7ae28d9b62339262245c8ca7d11fb5a16"; - sha256 = "sha256-smv2/bHLD5OJyUZhvgzqqzYO6NVWAY6d0dLamiXIEm4="; + rev = "1cfcf6694c0813d9362d31291e48b54fea1318b2"; + sha256 = "ri6qFgWMVGQUse0A+q3VjvixoUC0zqCSMNw+vEIfgxI="; }; # Further ideas to add: