mirror of
https://github.com/weechat/weechat.git
synced 2026-07-03 00:03:12 +02:00
relay/remote: check that remote API is exactly the same version as local one upon connection
This commit is contained in:
@@ -33,6 +33,7 @@
|
||||
#include "../../../weechat-plugin.h"
|
||||
#include "../../relay.h"
|
||||
#include "../../relay-auth.h"
|
||||
#include "../../relay-config.h"
|
||||
#include "../../relay-http.h"
|
||||
#include "../../relay-raw.h"
|
||||
#include "../../relay-remote.h"
|
||||
@@ -804,6 +805,7 @@ RELAY_REMOTE_EVENT_CALLBACK(version)
|
||||
{
|
||||
cJSON *json_obj;
|
||||
const char *weechat_version, *weechat_version_git, *relay_api_version;
|
||||
char *weechat_version_local, request[1024];
|
||||
|
||||
if (!event->json)
|
||||
return WEECHAT_RC_OK;
|
||||
@@ -819,6 +821,40 @@ RELAY_REMOTE_EVENT_CALLBACK(version)
|
||||
weechat_version_git,
|
||||
relay_api_version);
|
||||
|
||||
if (!event->remote->version_ok)
|
||||
{
|
||||
/* check version: the remote API must be exactly the same as local API */
|
||||
if (strcmp (relay_api_version, RELAY_API_VERSION_STR) != 0)
|
||||
{
|
||||
weechat_version_local = weechat_info_get ("version", NULL);
|
||||
weechat_printf (
|
||||
NULL,
|
||||
_("%sremote[%s]: API version mismatch: "
|
||||
"remote API is %s (WeeChat %s), "
|
||||
"local API %s (WeeChat %s)"),
|
||||
weechat_prefix ("error"),
|
||||
event->remote->name,
|
||||
relay_api_version,
|
||||
weechat_version,
|
||||
RELAY_API_VERSION_STR,
|
||||
weechat_version_local);
|
||||
free (weechat_version_local);
|
||||
relay_remote_network_disconnect (event->remote);
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
event->remote->version_ok = 1;
|
||||
snprintf (request, sizeof (request),
|
||||
"{\"request\": \"GET /api/buffers?"
|
||||
"lines=-%d"
|
||||
"&nicks=true"
|
||||
"&colors=weechat"
|
||||
"\"}",
|
||||
weechat_config_integer (relay_config_api_remote_get_lines));
|
||||
relay_remote_network_send (event->remote, RELAY_MSG_STANDARD,
|
||||
request, strlen (request));
|
||||
}
|
||||
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -34,7 +34,6 @@
|
||||
#include "../../../weechat-plugin.h"
|
||||
#include "../../relay.h"
|
||||
#include "../../relay-auth.h"
|
||||
#include "../../relay-config.h"
|
||||
#include "../../relay-http.h"
|
||||
#include "../../relay-raw.h"
|
||||
#include "../../relay-remote.h"
|
||||
@@ -105,6 +104,7 @@ relay_remote_network_close_connection (struct t_relay_remote *remote)
|
||||
remote->sock = -1;
|
||||
}
|
||||
relay_websocket_deflate_reinit (remote->ws_deflate);
|
||||
remote->version_ok = 0;
|
||||
remote->synced = 0;
|
||||
if (remote->partial_ws_frame)
|
||||
{
|
||||
@@ -383,12 +383,6 @@ relay_remote_network_recv_text (struct t_relay_remote *remote,
|
||||
"{\"request\": \"GET /api/version\"}");
|
||||
relay_remote_network_send (remote, RELAY_MSG_STANDARD,
|
||||
request, strlen (request));
|
||||
snprintf (request, sizeof (request),
|
||||
"{\"request\": \"GET /api/buffers?"
|
||||
"lines=-%d&nicks=true&colors=weechat\"}",
|
||||
weechat_config_integer (relay_config_api_remote_get_lines));
|
||||
relay_remote_network_send (remote, RELAY_MSG_STANDARD,
|
||||
request, strlen (request));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -340,6 +340,7 @@ relay_remote_alloc (const char *name)
|
||||
new_remote->hook_fd = NULL;
|
||||
new_remote->gnutls_sess = NULL;
|
||||
new_remote->ws_deflate = relay_websocket_deflate_alloc ();
|
||||
new_remote->version_ok = 0;
|
||||
new_remote->synced = 0;
|
||||
new_remote->partial_ws_frame = NULL;
|
||||
new_remote->partial_ws_frame_size = 0;
|
||||
@@ -577,6 +578,7 @@ relay_remote_new_with_infolist (struct t_infolist *infolist)
|
||||
}
|
||||
}
|
||||
}
|
||||
new_remote->version_ok = weechat_infolist_integer (infolist, "version_ok");
|
||||
new_remote->synced = weechat_infolist_integer (infolist, "synced");
|
||||
ptr_ws_frame = weechat_infolist_buffer (infolist, "partial_ws_frame", &ws_frame_size);
|
||||
if (ptr_ws_frame && (ws_frame_size > 0))
|
||||
@@ -941,6 +943,8 @@ relay_remote_add_to_infolist (struct t_infolist *infolist,
|
||||
free (dict);
|
||||
}
|
||||
}
|
||||
if (!weechat_infolist_new_var_integer (ptr_item, "version_ok", remote->version_ok))
|
||||
return 0;
|
||||
if (!weechat_infolist_new_var_integer (ptr_item, "synced", remote->synced))
|
||||
return 0;
|
||||
|
||||
@@ -992,6 +996,7 @@ relay_remote_print_log ()
|
||||
weechat_log_printf (" hook_fd . . . . . . . . : 0x%lx", ptr_remote->hook_fd);
|
||||
weechat_log_printf (" gnutls_sess . . . . . . : 0x%lx", ptr_remote->gnutls_sess);
|
||||
relay_websocket_deflate_print_log (ptr_remote->ws_deflate, "");
|
||||
weechat_log_printf (" version_ok. . . . . . . : %d", ptr_remote->version_ok);
|
||||
weechat_log_printf (" synced. . . . . . . . . : %d", ptr_remote->synced);
|
||||
weechat_log_printf (" partial_ws_frame. . . . : %p (%d bytes)",
|
||||
ptr_remote->partial_ws_frame,
|
||||
|
||||
@@ -57,6 +57,7 @@ struct t_relay_remote
|
||||
struct t_hook *hook_fd; /* hook for socket */
|
||||
gnutls_session_t gnutls_sess; /* gnutls session (only if TLS used) */
|
||||
struct t_relay_websocket_deflate *ws_deflate; /* websocket deflate data */
|
||||
int version_ok; /* remote API version is OK? */
|
||||
int synced; /* 1 if synced with remote */
|
||||
char *partial_ws_frame; /* part. binary websocket frame recv */
|
||||
int partial_ws_frame_size; /* size of partial websocket frame */
|
||||
|
||||
Reference in New Issue
Block a user