1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-13 14:44:46 +02:00

Compare commits

..

2 Commits

Author SHA1 Message Date
Sébastien Helleu d67520a212 core: add option weechat.completion.partial_completion_auto_expand (closes #2253) 2025-06-30 09:35:53 +02:00
Sébastien Helleu b467f85f30 core: always enable partial completion for templates in option weechat.completion.partial_completion_templates (issue #2253)
Previous behavior was to reverse the partial completion, which was confusing
when option like weechat.completion.partial_completion_command_arg was enabled
as well.
2025-06-29 14:24:58 +02:00
45 changed files with 810 additions and 1074 deletions
+1 -3
View File
@@ -194,13 +194,11 @@ jobs:
weechat-headless \
--dir /tmp/weechat-test-api \
--run-command '/set relay.network.password "${{ env.RELAY_PASSWORD }}"' \
--run-command '/set relay.network.password_hash_iterations 100' \
--run-command '/set relay.network.max_clients 0' \
--run-command '/relay add api 9000' \
--daemon \
;
sleep 5
schemathesis run --url http://localhost:9000/api ./src/plugins/relay/api/weechat-relay-api.yaml
./tools/test_relay_api.sh http://localhost:9000
echo '*/quit' >/tmp/weechat-test-api/weechat_fifo_*
- name: Code coverage
+1 -18
View File
@@ -6,21 +6,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
# WeeChat ChangeLog
## Version 4.7.2 (2025-11-23)
### Fixed
- api: fix file descriptor leak in hook_url when a timeout occurs or if the hook is removed during the transfer ([#2284](https://github.com/weechat/weechat/issues/2284))
- irc: fix colors in messages 367 (ban mask), 728 (quiet mask) and MODE ([#2286](https://github.com/weechat/weechat/issues/2286))
- irc: fix reset of color when multiple modes are set with command `/mode`
## Version 4.7.1 (2025-08-16)
### Fixed
- relay/api: fix crash when an invalid HTTP request is received from a client
## Version 4.7.0 (2025-07-19)
## Version 4.7.0 (under dev)
### Changed
@@ -29,7 +15,6 @@ SPDX-License-Identifier: GPL-3.0-or-later
- core: write configuration files on disk only if there are changes ([#2250](https://github.com/weechat/weechat/issues/2250))
- core: always enable partial completion for templates in option weechat.completion.partial_completion_templates, add option weechat.completion.partial_completion_auto_expand to expand word on new completion ([#2253](https://github.com/weechat/weechat/issues/2253))
- core: add script name in output of `/debug hooks <plugin>`
- relay/api: return HTTP error 405 (Method Not Allowed) when the method received is not allowed
### Added
@@ -52,8 +37,6 @@ SPDX-License-Identifier: GPL-3.0-or-later
- core: fix memory leak in function util_parse_delay
- irc: display nick changes and quit messages when option irc.look.ignore_tag_messages is enabled ([#2241](https://github.com/weechat/weechat/issues/2241))
- perl: fix build when multiplicity is not available ([#2243](https://github.com/weechat/weechat/issues/2243))
- relay/api: reject any invalid or unknown password hash algorithm in handshake resource
- relay/api: process HTTP request received as soon as a NULL char is received
- relay/weechat: fix empty buffers in client when WeeChat is running on Solaris/illumos
- build: fix build on Solaris/illumos (issue #2251)
-10
View File
@@ -11064,16 +11064,6 @@ Arguments:
*** _headers_: HTTP headers in response
*** _output_: standard output (set only if _file_out_ was not set in options)
*** _error_: error message (set only in case of error)
*** _error_code_: error code (integer, set only in case of error):
**** `1`: invalid URL
**** `2`: transfer error (Curl error)
**** `3`: not enough memory
**** `4`: file error
**** `5`: transfer stopped (hook removed during the transfer)
**** `6`: transfer timeout
**** `100`: thread creation error
*** _error_code_pthread_: return code of function _pthread_create_
(integer, set only if _error_code_ is `100`)
** return value:
*** _WEECHAT_RC_OK_
*** _WEECHAT_RC_ERROR_
-10
View File
@@ -11270,16 +11270,6 @@ Paramètres :
*** _output_ : sortie standard (défini seulement si _file_out_ n'était pas défini
dans les options)
*** _error_ : message d'erreur (défini seulement en cas d'erreur)
*** _error_code_: code d'erreur (entier, défini seulement en cas d'erreur):
**** `1`: URL invalide
**** `2`: erreur de transfert (erreur Curl)
**** `3`: mémoire insuffisante
**** `4`: erreur de fichier
**** `5`: transfert stoppé (hook supprimé durant le transfert)
**** `6`: délai d'attente dépassé pour le transfert ("timeout")
**** `100`: erreur de création du thread
*** _error_code_pthread_: code retour de la fonction _pthread_create_
(entier, défini seulement si _error_code_ vaut `100`)
** valeur de retour :
*** _WEECHAT_RC_OK_
*** _WEECHAT_RC_ERROR_
-10
View File
@@ -11475,16 +11475,6 @@ Argomenti:
*** _headers_: HTTP headers in response
*** _output_: standard output (set only if _file_out_ was not set in options)
*** _error_: error message (set only in case of error)
*** _error_code_: error code (integer, set only in case of error):
**** `1`: invalid URL
**** `2`: transfer error (Curl error)
**** `3`: not enough memory
**** `4`: file error
**** `5`: transfer stopped (hook removed during the transfer)
**** `6`: transfer timeout
**** `100`: thread creation error
*** _error_code_pthread_: return code of function _pthread_create_
(integer, set only if _error_code_ is `100`)
** return value:
*** _WEECHAT_RC_OK_
*** _WEECHAT_RC_ERROR_
-10
View File
@@ -11209,16 +11209,6 @@ struct t_hook *weechat_hook_url (const char *url,
*** _headers_: HTTP headers in response
*** _output_: standard output (set only if _file_out_ was not set in options)
*** _error_: error message (set only in case of error)
*** _error_code_: error code (integer, set only in case of error):
**** `1`: invalid URL
**** `2`: transfer error (Curl error)
**** `3`: not enough memory
**** `4`: file error
**** `5`: transfer stopped (hook removed during the transfer)
**** `6`: transfer timeout
**** `100`: thread creation error
*** _error_code_pthread_: return code of function _pthread_create_
(integer, set only if _error_code_ is `100`)
** return value:
*** _WEECHAT_RC_OK_
*** _WEECHAT_RC_ERROR_
+58 -29
View File
@@ -91,23 +91,33 @@ qweechat::
|       typing/ | Typing додатак.
|       xfer/ | Xfer додатак (IRC DCC фајл/разговор).
| tests/ | Тестови.
|    fuzz/ | Fuzz тестирање.
| core/ | Fuzz тестирање функција језгра.
// TRANSLATION MISSING
|    fuzz/ | Fuzz testing.
// TRANSLATION MISSING
| core/ | Fuzz testing for core functions.
|    unit/ | Unit тестови.
|       core/ | Unit тестови за функције језгра.
|       hook/ | Unit тестову за функције куке.
// TRANSLATION MISSING
|       hook/ | Unit tests for hook functions.
|       gui/ | Unit тестови за функције интерфејса.
|       curses/ | Unit тестови за функције Curses интерфејса.
// TRANSLATION MISSING
|       curses/ | Unit tests for Curses interface functions.
|    scripts/ | Тестови за API скриптовања.
|       python/ | Python скрипте за генерисање и покретање тестова за API скриптовања.
|       plugins/ | Unit тестови за додатке.
|          alias/ | Unit тестови за alias додатак.
// TRANSLATION MISSING
|          alias/ | Unit tests for alias plugin.
|          irc/ | Unit тестови за IRC додатак.
|          logger/ | Unit тестови за logger додатак.
|          relay/ | Unit тестови за relay додатак.
|          trigger/ | Unit тестови за trigger додатак.
|          typing/ | Unit тестови за typing додатак.
|          xfer/ | Unit тестови за xfer додатак.
// TRANSLATION MISSING
|          logger/ | Unit tests for logger plugin.
// TRANSLATION MISSING
|          relay/ | Unit tests for relay plugin.
// TRANSLATION MISSING
|          trigger/ | Unit tests for trigger plugin.
// TRANSLATION MISSING
|          typing/ | Unit tests for typing plugin.
// TRANSLATION MISSING
|          xfer/ | Unit tests for xfer plugin.
| doc/ | Документација.
| po/ | Фајлови превода (gettext).
| debian/ | Debian паковање.
@@ -416,15 +426,24 @@ WeeChat „језгро” се налази у следећим директо
|===
| Путања/фајл | Опис
| tests/ | Корен тестова.
|    fuzz/ | Корен fuzz тестирања.
| ossfuzz.sh | Скрипта изградње за https://github.com/google/oss-fuzz[OSS-Fuzz ^↗^^].
|       core/ | Корен fuzz тестирања за језгро.
|       calc-fuzzer.c | Fuzz тестирање: калкулација израза.
|       crypto-fuzzer.c | Fuzz тестирање: криптографске функције.
|       secure-fuzzer.c | Fuzz тестирање: обезбеђени подаци.
|       string-fuzzer.c | Fuzz тестирање: стрингови.
|       utf8-fuzzer.c | Fuzz тестирање: UTF-8.
|       util-fuzzer.c | Fuzz тестирање: услужне функције.
// TRANSLATION MISSING
|    fuzz/ | Root of fuzz testing.
// TRANSLATION MISSING
| ossfuzz.sh | Build script for https://github.com/google/oss-fuzz[OSS-Fuzz ^↗^^].
// TRANSLATION MISSING
|       core/ | Root of fuzz testing for core.
// TRANSLATION MISSING
|       calc-fuzzer.c | Fuzz testing: калкулација израза.
// TRANSLATION MISSING
|       crypto-fuzzer.c | Fuzz testing: криптографске функције.
// TRANSLATION MISSING
|       secure-fuzzer.c | Fuzz testing: secured data.
// TRANSLATION MISSING
|       string-fuzzer.c | Fuzz testing: стрингови.
// TRANSLATION MISSING
|       utf8-fuzzer.c | Fuzz testing: UTF-8.
// TRANSLATION MISSING
|       util-fuzzer.c | Fuzz testing: utility functions.
|    unit/ | Корен unit тестова.
|    tests.cpp | Програм који се користи за извршавање свих тестова.
|    tests-record.cpp | Бележење и претрага у приказаним порукама.
@@ -471,10 +490,13 @@ WeeChat „језгро” се налази у следећим директо
|             test-hook-timer.cpp | Тестови: куке „timer”.
|             test-hook-url.cpp | Тестови: куке „url”.
|       gui/ | Корен unit тестова интерфејса.
|          test-gui-bar-item-custom.cpp | Тестови: функције ставки прилагођене траке.
|          test-gui-bar-item.cpp | Тестови: функције ставки траке.
// TRANSLATION MISSING
|          test-gui-bar-item-custom.cpp | Tests: custom bar item functions.
// TRANSLATION MISSING
|          test-gui-bar-item.cpp | Tests: bar item functions.
|          test-gui-bar-window.cpp | Тестови: функције прозора траке.
|          test-gui-bar.cpp | Тестови: функције траке.
// TRANSLATION MISSING
|          test-gui-bar.cpp | Tests: bar functions.
|          test-gui-buffer.cpp | Тестови: бафер функције.
|          test-gui-chat.cpp | Тестови: чет функције.
|          test-gui-color.cpp | Тестови: боје.
@@ -497,8 +519,10 @@ WeeChat „језгро” се налази у следећим директо
|       test-plugin-config.cpp | Тестови: функције конфигурације додатка.
|       test-plugin-api-info.cpp | Тестови: инфо функције API додатака.
|       test-plugins.cpp | Тестови: plugins.
|          alias/ | Корен unit тестова за alias додатак.
|             test-alias.cpp | Тестови: алијаси.
// TRANSLATION MISSING
|          alias/ | Root of unit tests for alias plugin.
// TRANSLATION MISSING
|             test-alias.cpp | Tests: aliases.
|          irc/ | Корен unit тестова IRC додатка.
|             test-irc-batch.cpp | Тестови: IRC пакетни догађаји.
|             test-irc-buffer.cpp | Тестови: IRC бафери.
@@ -532,9 +556,12 @@ WeeChat „језгро” се налази у следећим директо
|                test-relay-api.cpp | Тестови: Релеј „api” протокол: опште функције.
|                test-relay-api-msg.cpp | Тестови: Релеј „api” протокол: поруке.
|                test-relay-api-protocol.cpp | Тестови: Релеј „api” протокол: протокол.
|             remote/ | Тестови: Релеј „api” протокол: удаљене функције.
|             test-relay-remote-event.cpp | Тестови: Релеј „api” протокол: удаљени догађаји.
|             test-relay-remote-network.cpp | Тестови: Релеј „api” протокол: удаљена мрежа.
// TRANSLATION MISSING
|             remote/ | Tests: Relay "api" protocol: remote functions.
// TRANSLATION MISSING
|             test-relay-remote-event.cpp | Tests: Relay "api" protocol: remote events.
// TRANSLATION MISSING
|             test-relay-remote-network.cpp | Tests: Relay "api" protocol: remote network.
|             irc/ | Корен unit тестова за Релеј „irc” протокол.
|                test-relay-irc.cpp | Тестови: Релеј „irc” протокол.
|          trigger/ | Корен unit тестова за окидач додатак.
@@ -1235,11 +1262,13 @@ server->hook_timer_sasl = weechat_hook_timer (timeout * 1000,
| tests/fuzz
| tests/fuzz/*
| Fuzz тестирање
// TRANSLATION MISSING
| Fuzz testing
| tests/unit
| tests/unit/*
| Unit тестови
// TRANSLATION MISSING
| Unit tests
| doc
| doc/*
+11 -19
View File
@@ -4484,11 +4484,12 @@ if (weechat_file_compress ("/tmp/test.txt", "/tmp/test.txt.zst", "zstd", 50))
[NOTE]
Ова функција није доступна у API скриптовања.
// TRANSLATION MISSING
==== file_compare
_WeeChat ≥ 4.7.0._
Пореди садржаје два фајла.
Compare the content of two files.
Прототип:
@@ -4499,14 +4500,14 @@ int weechat_file_compare (const char *filename1, const char *filename2);
Аргументи:
* _filename1_: први фајл за поређење
* _filename2_: други фајл за поређење
* _filename1_: first file to compare
* _filename2_: second file to compare
Повратна вредност:
* 0: оба фајла имају исти садржај
* 1: садржај се разликује
* 2: грешка (фајл није пронађен или грешка при читању)
* 0: both files have same content
* 1: content is different
* 2: error (file not found or read error)
C пример:
@@ -4514,7 +4515,7 @@ C пример:
----
if (weechat_file_compare ("/tmp/test.txt", "/tmp/test2.txt") == 0)
{
/* исти садржај */
/* same content */
}
----
@@ -4679,8 +4680,9 @@ int weechat_util_strftimeval (char *string, int max, const char *format, struct
* _string_: бафер у који се смешта форматирани стринг
* _max_: величина стринга
* _format_: формат, исто као за _strftime_ функцију, са следећим додатним спецификаторима:
** `%@`: враћа датум изражен у Coordinated Universal Time (UTC) уместо као датум
релативан у односу на временску зону коју је задао корисник _(WeeChat ≥ 4.7.0)_
// TRANSLATION MISSING
** `%@`: return the date expressed in Coordinated Universal Time (UTC)
instead of date relative to the user's specified timezone _(WeeChat ≥ 4.7.0)_
** `%.N` где је `N` између 1 и 6: микросекунде допуњене нулама на N цифара
(на пример `%.3` за милисекунде)
** `%f`: алијас за `%.6`
@@ -10781,16 +10783,6 @@ struct t_hook *weechat_hook_url (const char *url,
*** _headers_: HTTP заглавља у одзиву
*** _output_: стандардни излаз (поставља се само ако у опцијама није постављено _file_out_)
*** _error_: порука о грешки (поставља се само у случају грешке)
*** _error_code_: error code (integer, set only in case of error):
**** `1`: invalid URL
**** `2`: transfer error (Curl error)
**** `3`: not enough memory
**** `4`: file error
**** `5`: transfer stopped (hook removed during the transfer)
**** `6`: transfer timeout
**** `100`: thread creation error
*** _error_code_pthread_: return code of function _pthread_create_
(integer, set only if _error_code_ is `100`)
** повратна вредност:
*** _WEECHAT_RC_OK_
*** _WEECHAT_RC_ERROR_
+4 -2
View File
@@ -1002,7 +1002,8 @@ WeeChat командна линија (на дну прозора) вам омо
kbd:[yyyyyy] | Текст у боји `xxxxxx` и позадина `yyyyyy` (RGB као хексадецимални број).
| kbd:[Ctrl+c], kbd:[i] | Текст у курзиву.
| kbd:[Ctrl+c], kbd:[o] | Искључивање боје и атрибута.
| kbd:[Ctrl+c], kbd:[s] | Прецртани текст (у ncurses интерфејсу се приказује као полусветао јер се не подржава прецртавање).
// TRANSLATION MISSING
| kbd:[Ctrl+c], kbd:[s] | Strikethrough text (displayed as half bright in ncurses interface because strikethrough is not supported).
| kbd:[Ctrl+c], kbd:[v] | Обрнути видео (боје текста и позадине се замењују једна са другом).
| kbd:[Ctrl+c], kbd:[_] | Подвучени текст.
|===
@@ -1548,7 +1549,8 @@ WeeChat нуди доста подразумеваних тастерских п
| kbd:[Ctrl+c], kbd:[d] | Уметање кода за обојени текст (RGB боја, као хексадецимални број). | `+/input insert \x04+`
| kbd:[Ctrl+c], kbd:[i] | Уметање кода за текст у курзиву. | `+/input insert \x1D+`
| kbd:[Ctrl+c], kbd:[o] | Уметање кода за ресет боје. | `+/input insert \x0F+`
| kbd:[Ctrl+c], kbd:[s] | Уметање кода за прецртани текст. | `+/input insert \x1E+`
// TRANSLATION MISSING
| kbd:[Ctrl+c], kbd:[s] | Insert code for strikethrough text. | `+/input insert \x1E+`
| kbd:[Ctrl+c], kbd:[v] | Уметање кода за обрнуту боју. | `+/input insert \x16+`
| kbd:[Ctrl+c], kbd:[_] | Уметање кода за подвучени текст. | `+/input insert \x1F+`
|===
+1 -5
View File
@@ -23,7 +23,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-08-16 19:26+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-05-04 09:24+0200\n"
"Last-Translator: Ondřej Súkup <mimi.vx@gmail.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@@ -14025,10 +14025,6 @@ msgstr ""
msgid "%s%s: failed to execute route \"%s %s\" for client %s%s%s"
msgstr "%s%s: selhalo parsování příkazu \"%s\" (prosím oznamte to vývojárům):"
#, fuzzy, c-format
msgid "%s%s: invalid data received from client %s%s%s"
msgstr "%s%s: TLS handshake selhal"
#, fuzzy, c-format
#| msgid "%s%s: unable to create socket"
msgid "%sremote[%s]: unable to send data, disconnecting"
+1 -6
View File
@@ -28,7 +28,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-08-16 19:26+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-05-05 09:24+0200\n"
"Last-Translator: Nils Görs <weechatter@arcor.de>\n"
"Language-Team: German <kde-i18n-de@kde.org>\n"
@@ -15419,11 +15419,6 @@ msgstr ""
msgid "%s%s: failed to execute route \"%s %s\" for client %s%s%s"
msgstr "%s%s: Route „%s %s“ für Client %s%s%s konnte nicht ausgeführt werden"
#, fuzzy, c-format
#| msgid "%s%s: invalid websocket handshake received for client %s%s%s"
msgid "%s%s: invalid data received from client %s%s%s"
msgstr "%s%s: ungültigen WebSocket Handshake für Client %s%s%s empfangen"
#, c-format
msgid "%sremote[%s]: unable to send data, disconnecting"
msgstr ""
+1 -5
View File
@@ -24,7 +24,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-08-16 19:26+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-05-04 09:25+0200\n"
"Last-Translator: Santiago Forero <santiago@forero.xyz>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@@ -14359,10 +14359,6 @@ msgstr ""
msgid "%s%s: failed to execute route \"%s %s\" for client %s%s%s"
msgstr "%s%s: falló la ejecución del comando \"%s\" por el cliente %s%s%s"
#, fuzzy, c-format
msgid "%s%s: invalid data received from client %s%s%s"
msgstr "%s%s: agotado el tiempo de espera del saludo TLS del cliente %s%s%s"
#, fuzzy, c-format
#| msgid "%s%s: unable to create socket"
msgid "%sremote[%s]: unable to send data, disconnecting"
+2 -6
View File
@@ -23,8 +23,8 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-08-16 19:26+0200\n"
"PO-Revision-Date: 2025-08-16 19:27+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-06-30 09:34+0200\n"
"Last-Translator: Sébastien Helleu <flashcode@flashtux.org>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
"Language: fr\n"
@@ -15116,10 +15116,6 @@ msgstr ""
msgid "%s%s: failed to execute route \"%s %s\" for client %s%s%s"
msgstr "%s%s : échec d'exécution de la route \"%s %s\" pour le client %s%s%s"
#, c-format
msgid "%s%s: invalid data received from client %s%s%s"
msgstr "%s%s : données invalides reçues du client %s%s%s"
#, c-format
msgid "%sremote[%s]: unable to send data, disconnecting"
msgstr "%sremote[%s] : impossible d'envoyer des données, déconnexion"
+1 -5
View File
@@ -22,7 +22,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-08-16 19:26+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-05-04 09:25+0200\n"
"Last-Translator: Andras Voroskoi <voroskoi@frugalware.org>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@@ -13424,10 +13424,6 @@ msgstr ""
msgid "%s%s: failed to execute route \"%s %s\" for client %s%s%s"
msgstr "Nem sikerült a(z) \"%s\" naplófájlt írni\n"
#, fuzzy, c-format
msgid "%s%s: invalid data received from client %s%s%s"
msgstr "%s gnutls kézfogás sikertelen\n"
#, fuzzy, c-format
msgid "%sremote[%s]: unable to send data, disconnecting"
msgstr "%s nem sikerült a szervert létrehozni\n"
+1 -5
View File
@@ -22,7 +22,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-08-16 19:26+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-05-04 09:25+0200\n"
"Last-Translator: Esteban I. Ruiz Moreno <exio4.com@gmail.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@@ -14361,10 +14361,6 @@ msgstr ""
msgid "%s%s: failed to execute route \"%s %s\" for client %s%s%s"
msgstr "%s%s: impossibile eseguire il comando \"%s\" per il client %s%s%s"
#, fuzzy, c-format
msgid "%s%s: invalid data received from client %s%s%s"
msgstr "%s%s: set di caratter invalido: \"%s\""
#, fuzzy, c-format
#| msgid "%s%s: unable to create socket"
msgid "%sremote[%s]: unable to send data, disconnecting"
+1 -7
View File
@@ -22,7 +22,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-08-16 19:26+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-05-04 09:25+0200\n"
"Last-Translator: AYANOKOUZI, Ryuunosuke <i38w7i3@yahoo.co.jp>\n"
"Language-Team: Japanese <https://github.com/l/weechat/tree/master/"
@@ -14849,12 +14849,6 @@ msgid "%s%s: failed to execute route \"%s %s\" for client %s%s%s"
msgstr ""
"%1$s%2$s: クライアント %4$s%5$s%6$s に対するコマンド \"%3$s\" の実行に失敗"
#, fuzzy, c-format
#| msgid "%s%s: invalid websocket handshake received for client %s%s%s"
msgid "%s%s: invalid data received from client %s%s%s"
msgstr ""
"%s%s: クライアント %s%s%s から受け取った不正なウェブソケットハンドシェイク"
#, fuzzy, c-format
#| msgid "%s%s: unable to create socket"
msgid "%sremote[%s]: unable to send data, disconnecting"
+1 -7
View File
@@ -24,7 +24,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-08-16 19:26+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-05-04 09:25+0200\n"
"Last-Translator: Krzysztof Korościk <soltys@soltys.info>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@@ -15045,12 +15045,6 @@ msgstr ""
msgid "%s%s: failed to execute route \"%s %s\" for client %s%s%s"
msgstr "%s%s: nie udało się wykonać trasy „%s %s” dla klienta %s%s%s"
#, fuzzy, c-format
#| msgid "%s%s: invalid websocket handshake received for client %s%s%s"
msgid "%s%s: invalid data received from client %s%s%s"
msgstr ""
"%s%s: otrzymano niepoprawny pakiet dla gniazda webowego od klienta %s%s%s"
#, fuzzy, c-format
#| msgid "%sremote[%s]: unable to create socket"
msgid "%sremote[%s]: unable to send data, disconnecting"
+1 -6
View File
@@ -22,7 +22,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-08-16 19:26+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-05-04 09:25+0200\n"
"Last-Translator: Vasco Almeida <vascomalmeida@sapo.pt>\n"
"Language-Team: Portuguese <>\n"
@@ -14734,11 +14734,6 @@ msgstr ""
msgid "%s%s: failed to execute route \"%s %s\" for client %s%s%s"
msgstr "%s%s: falha ao executar o comando \"%s\" do cliente %s%s%s"
#, fuzzy, c-format
#| msgid "%s%s: invalid websocket handshake received for client %s%s%s"
msgid "%s%s: invalid data received from client %s%s%s"
msgstr "%s%s: websocket handshake inválido recebido do cliente %s%s%s"
#, fuzzy, c-format
#| msgid "%s%s: unable to create socket"
msgid "%sremote[%s]: unable to send data, disconnecting"
+1 -5
View File
@@ -23,7 +23,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-08-16 19:26+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-05-04 09:25+0200\n"
"Last-Translator: Érico Nogueira <ericonr@disroot.org>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@@ -13857,10 +13857,6 @@ msgstr ""
msgid "%s%s: failed to execute route \"%s %s\" for client %s%s%s"
msgstr "%s%s: falha ao executar comando \"%s\" para cliente %d"
#, fuzzy, c-format
msgid "%s%s: invalid data received from client %s%s%s"
msgstr "%s%s: handshake TLS falhou"
#, fuzzy, c-format
msgid "%sremote[%s]: unable to send data, disconnecting"
msgstr "%s%s: não foi possível criar pipe"
+1 -5
View File
@@ -23,7 +23,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-08-16 19:26+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-05-04 09:25+0200\n"
"Last-Translator: Aleksey V Zapparov AKA ixti <ixti@member.fsf.org>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@@ -13476,10 +13476,6 @@ msgstr ""
msgid "%s%s: failed to execute route \"%s %s\" for client %s%s%s"
msgstr "Не могу записать лог-файл \"%s\"\n"
#, fuzzy, c-format
msgid "%s%s: invalid data received from client %s%s%s"
msgstr "%s инициализация gnutls не удалось\n"
#, fuzzy, c-format
msgid "%sremote[%s]: unable to send data, disconnecting"
msgstr "%s не могу создать сервер\n"
+4 -10
View File
@@ -22,8 +22,8 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-08-16 19:26+0200\n"
"PO-Revision-Date: 2025-07-09 15:48+0400\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2025-05-04 09:25+0200\n"
"Last-Translator: Ivan Pešić <ivan.pesic@gmail.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
"Language: sr\n"
@@ -5864,7 +5864,6 @@ msgstr "шаље упозорење (BEL) када се догоди делим
msgid ""
"automatically expand word after partial completion when completing again"
msgstr ""
"када се поново довршава, аутоматски развија реч након делимичног довршавања"
msgid ""
"partially complete command names (stop when many commands found begin with "
@@ -7440,10 +7439,10 @@ msgstr ""
"бафера"
msgid " - ${number_zero}: like ${number} but the number is zero-padded"
msgstr " - ${number_zero}: као ${number} али се број допуњава нулама"
msgstr ""
msgid " - ${number_zero2}: like ${number2} but the number is zero-padded"
msgstr " - ${number_zero2}: као ${number2} али се број допуњава нулама"
msgstr ""
msgid ""
" - ${number_displayed}: \"1\" if the number is displayed, otherwise \"0\""
@@ -14669,11 +14668,6 @@ msgstr ""
msgid "%s%s: failed to execute route \"%s %s\" for client %s%s%s"
msgstr "%s%s: није успело извршавање руте „%s %s” за клијента %s%s%s"
#, fuzzy, c-format
#| msgid "%s%s: invalid websocket handshake received for client %s%s%s"
msgid "%s%s: invalid data received from client %s%s%s"
msgstr "%s%s: примљено је неважеће вебсокет руковање од клијента %s%s%s"
#, c-format
msgid "%sremote[%s]: unable to send data, disconnecting"
msgstr "%sудаљени[%s]: није могао да пошаље податке, веза се прекида"
+269 -186
View File
File diff suppressed because it is too large Load Diff
+1 -5
View File
@@ -23,7 +23,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
"POT-Creation-Date: 2025-08-16 19:26+0200\n"
"POT-Creation-Date: 2025-06-30 09:32+0200\n"
"PO-Revision-Date: 2014-08-16 10:27+0200\n"
"Last-Translator: Sébastien Helleu <flashcode@flashtux.org>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@@ -12259,10 +12259,6 @@ msgstr ""
msgid "%s%s: failed to execute route \"%s %s\" for client %s%s%s"
msgstr ""
#, c-format
msgid "%s%s: invalid data received from client %s%s%s"
msgstr ""
#, c-format
msgid "%sremote[%s]: unable to send data, disconnecting"
msgstr ""
-12
View File
@@ -1,12 +0,0 @@
# SPDX-FileCopyrightText: 2025 Sébastien Helleu <flashcode@flashtux.org>
#
# SPDX-License-Identifier: GPL-3.0-or-later
continue-on-failure = true
[[operations]]
include-path-regex = "/sync/?.*"
enabled = false
[auth]
basic = { username = "plain", password = "${RELAY_PASSWORD}" }
+29 -123
View File
@@ -37,7 +37,6 @@
#include "core-infolist.h"
#include "core-proxy.h"
#include "core-string.h"
#include "core-util.h"
#include "../plugins/plugin.h"
@@ -654,9 +653,7 @@ struct t_url_option url_options[] =
URL_DEF_OPTION(SSLENGINE_DEFAULT, LONG, NULL),
URL_DEF_OPTION(CAPATH, STRING, NULL),
URL_DEF_OPTION(SSL_SESSIONID_CACHE, LONG, NULL),
#if LIBCURL_VERSION_NUM < 0x081100 /* < 8.17.0 */
URL_DEF_OPTION(KRBLEVEL, STRING, NULL),
#endif
URL_DEF_OPTION(KEYPASSWD, STRING, NULL),
URL_DEF_OPTION(ISSUERCERT, STRING, NULL),
URL_DEF_OPTION(CRLFILE, STRING, NULL),
@@ -1049,46 +1046,31 @@ weeurl_set_proxy (CURL *curl, struct t_proxy *proxy)
* output | stdout (set only if "file_out" was not set in options)
* error | error message (set only in case of error)
*
* If timeout is 0, the function blocks until the end of the transfer.
* If timeout (in milliseconds) is > 0, the function returns an error in the
* output hashtable if the timeout is reached while the transfer is still
* active.
*
* If stop_download is not NULL, it is checked regularly, and as soon as the
* pointed integer becomes different from 0 (set by the caller of this function),
* the download is immediately stopped with an error.
*
* Returns:
* 0: OK
* 1: invalid URL
* 2: error downloading URL
* 3: not enough memory
* 4: file error
* 5: transfer stopped by the caller
* 6: transfer timeout
*/
int
weeurl_download (const char *url, struct t_hashtable *options,
long timeout, struct t_hashtable *output,
int *stop_transfer)
struct t_hashtable *output)
{
CURL *curl;
CURLM *multi;
CURLMcode curl_mc;
struct t_url_file url_file[2];
char *url_file_option[2] = { "file_in", "file_out" };
char *url_file_mode[2] = { "rb", "wb" };
char url_error[4096], url_error_code[12];
char url_error[CURL_ERROR_SIZE + 1], url_error_code[12];
char **string_headers, **string_output;
char str_response_code[32];
CURLoption url_file_opt_func[2] = { CURLOPT_READFUNCTION, CURLOPT_WRITEFUNCTION };
CURLoption url_file_opt_data[2] = { CURLOPT_READDATA, CURLOPT_WRITEDATA };
void *url_file_opt_cb[2] = { &weeurl_read_stream, &weeurl_write_stream };
struct t_proxy *ptr_proxy;
int rc, i, output_to_file, still_running;
int rc, curl_rc, i, output_to_file;
long response_code;
struct timeval tv_now, tv_end;
rc = 0;
@@ -1187,120 +1169,44 @@ weeurl_download (const char *url, struct t_hashtable *options,
/* set error buffer */
curl_easy_setopt (curl, CURLOPT_ERRORBUFFER, url_error);
/* compute end time for transfer, according to the timeout */
if (timeout > 0)
/* perform action! */
curl_rc = curl_easy_perform (curl);
if (curl_rc == CURLE_OK)
{
gettimeofday (&tv_end, NULL);
util_timeval_add (&tv_end, ((long long)timeout) * 1000);
if (output)
{
curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &response_code);
snprintf (str_response_code, sizeof (str_response_code),
"%ld", response_code);
hashtable_set (output, "response_code", str_response_code);
}
}
else
{
tv_end.tv_sec = 0;
tv_end.tv_usec = 0;
}
/* start the transfer */
multi = curl_multi_init ();
curl_multi_add_handle (multi, curl);
while (1)
{
curl_mc = curl_multi_perform (multi, &still_running);
if ((curl_mc == CURLM_OK) && still_running)
curl_mc = curl_multi_poll (multi, NULL, 0, 5, NULL);
if (curl_mc != CURLM_OK)
if (output)
{
if (output)
snprintf (url_error_code, sizeof (url_error_code), "%d", curl_rc);
if (!url_error[0])
{
snprintf (url_error_code, sizeof (url_error_code), "%d", curl_mc);
if (!url_error[0])
{
snprintf (url_error, sizeof (url_error),
"%s", _("transfer error"));
}
}
else
{
/*
* URL transfer done in a forked process: display error on stderr,
* which will be sent to the hook_process callback
*/
fprintf (stderr,
_("curl error %d (%s) (URL: \"%s\")\n"),
curl_mc, url_error, url);
}
rc = 2;
break;
}
if (!still_running)
{
/* transfer OK */
if (output)
{
curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &response_code);
snprintf (str_response_code, sizeof (str_response_code),
"%ld", response_code);
hashtable_set (output, "response_code", str_response_code);
}
break;
}
if (stop_transfer && *stop_transfer)
{
/* transfer stopped by the caller */
if (output)
{
if (!url_error[0])
snprintf (url_error, sizeof (url_error), "transfer stopped");
}
else
{
/*
* URL transfer done in a forked process: display error on stderr,
* which will be sent to the hook_process callback
*/
fprintf (stderr,
_("transfer stopped (URL: \"%s\")\n"),
url);
}
rc = 5;
break;
}
if (tv_end.tv_sec > 0)
{
/* timeout reached? */
gettimeofday (&tv_now, NULL);
if (util_timeval_cmp (&tv_now, &tv_end) >= 0)
{
if (output)
{
if (!url_error[0])
{
snprintf (url_error, sizeof (url_error),
URL_ERROR_TIMEOUT " (%.3fs)",
((float)timeout) / 1000);
}
}
else
{
/*
* URL transfer done in a forked process: display error on stderr,
* which will be sent to the hook_process callback
*/
fprintf (stderr,
_("transfer timeout reached (%.3fs) (URL: \"%s\")\n"),
((float)timeout) / 1000, url);
}
rc = 6;
break;
snprintf (url_error, sizeof (url_error),
"%s", _("transfer error"));
}
}
else
{
/*
* URL transfer done in a forked process: display error on stderr,
* which will be sent to the hook_process callback
*/
fprintf (stderr,
_("curl error %d (%s) (URL: \"%s\")\n"),
curl_rc, url_error, url);
}
rc = 2;
}
/* cleanup */
curl_multi_remove_handle (multi, curl);
curl_easy_cleanup (curl);
curl_multi_cleanup (multi);
end:
for (i = 0; i < 2; i++)
+1 -4
View File
@@ -24,8 +24,6 @@
#include <stdio.h>
#define URL_ERROR_TIMEOUT "transfer timeout reached"
struct t_hashtable;
struct t_infolist;
@@ -63,8 +61,7 @@ extern char *url_type_string[];
extern struct t_url_option url_options[];
extern int weeurl_download (const char *url, struct t_hashtable *options,
long timeout, struct t_hashtable *output,
int *stop_transfer);
struct t_hashtable *output);
extern int weeurl_option_add_to_infolist (struct t_infolist *infolist,
struct t_url_option *option);
extern void weeurl_init (void);
+1 -3
View File
@@ -279,9 +279,7 @@ hook_process_child (struct t_hook *hook_process)
}
rc = weeurl_download (ptr_url,
HOOK_PROCESS(hook_process, options),
0, /* timeout */
NULL, /* output */
NULL); /* stop_download */
NULL); /* output */
}
else if (strncmp (HOOK_PROCESS(hook_process, command), "func:", 5) == 0)
{
+9 -34
View File
@@ -137,9 +137,7 @@ hook_url_transfer_thread (void *hook_pointer)
url_rc = weeurl_download (HOOK_URL(hook, url),
HOOK_URL(hook, options),
HOOK_URL(hook, timeout),
HOOK_URL(hook, output),
&(HOOK_URL(hook, stop_transfer)));
HOOK_URL(hook, output));
if (url_rc != 0)
{
@@ -161,7 +159,7 @@ hook_url_timer_cb (const void *pointer, void *data, int remaining_calls)
{
struct t_hook *hook;
const char *ptr_error;
char str_error[1024];
char str_error[1024], str_error_code[12];
/* make C compiler happy */
(void) data;
@@ -194,10 +192,11 @@ hook_url_timer_cb (const void *pointer, void *data, int remaining_calls)
if (!hashtable_has_key (HOOK_URL(hook, output), "error_code"))
{
snprintf (str_error, sizeof (str_error),
URL_ERROR_TIMEOUT " (%.3fs)",
"transfer timeout reached (%.3fs)",
((float)HOOK_URL(hook, timeout)) / 1000);
snprintf (str_error_code, sizeof (str_error_code), "6");
hashtable_set (HOOK_URL(hook, output), "error", str_error);
hashtable_set (HOOK_URL(hook, output), "error_code", "6");
hashtable_set (HOOK_URL(hook, output), "error_code", str_error_code);
}
hook_url_run_callback (hook);
if (weechat_debug_core >= 1)
@@ -225,7 +224,7 @@ hook_url_transfer (struct t_hook *hook)
{
int rc, timeout, max_calls;
long interval;
char str_error[1024], str_error_code_pthread[12];
char str_error[1024], str_error_code[12], str_error_code_pthread[12];
HOOK_URL(hook, thread_running) = 1;
@@ -236,10 +235,11 @@ hook_url_transfer (struct t_hook *hook)
{
snprintf (str_error, sizeof (str_error),
"error calling pthread_create (%d)", rc);
snprintf (str_error_code, sizeof (str_error_code), "5");
snprintf (str_error_code_pthread, sizeof (str_error_code_pthread),
"%d", rc);
hashtable_set (HOOK_URL(hook, output), "error", str_error);
hashtable_set (HOOK_URL(hook, output), "error_code", "100");
hashtable_set (HOOK_URL(hook, output), "error_code", str_error_code);
hashtable_set (HOOK_URL(hook, output), "error_code_pthread",
str_error_code_pthread);
hook_url_run_callback (hook);
@@ -265,7 +265,7 @@ hook_url_transfer (struct t_hook *hook)
{
if (timeout <= 100)
{
interval = timeout + 50;
interval = timeout;
max_calls = 1;
}
else
@@ -274,7 +274,6 @@ hook_url_transfer (struct t_hook *hook)
max_calls = timeout / 100;
if (timeout % 100 == 0)
max_calls++;
max_calls++;
}
}
HOOK_URL(hook, hook_timer) = hook_timer (hook->plugin,
@@ -324,7 +323,6 @@ hook_url (struct t_weechat_plugin *plugin,
new_hook_url->url = strdup (url);
new_hook_url->options = (options) ? hashtable_dup (options) : NULL;
new_hook_url->timeout = timeout;
new_hook_url->stop_transfer = 0;
new_hook_url->thread_id = 0;
new_hook_url->thread_created = 0;
new_hook_url->thread_running = 0;
@@ -368,26 +366,6 @@ hook_url_free_data (struct t_hook *hook)
if (!hook || !hook->hook_data)
return;
/* stop transfer if it's still active */
if (HOOK_URL(hook, thread_created) && HOOK_URL(hook, thread_running))
{
HOOK_URL(hook, stop_transfer) = 1;
usleep (10000);
if (!hashtable_has_key (HOOK_URL(hook, output), "error_code"))
{
hashtable_set (HOOK_URL(hook, output), "error", "transfer stopped");
hashtable_set (HOOK_URL(hook, output), "error_code", "5");
}
hook_url_run_callback (hook);
if (weechat_debug_core >= 1)
{
gui_chat_printf (
NULL,
_("End of URL transfer '%s', transfer stopped"),
HOOK_URL(hook, url));
}
}
if (HOOK_URL(hook, url))
{
free (HOOK_URL(hook, url));
@@ -443,8 +421,6 @@ hook_url_add_to_infolist (struct t_infolist_item *item,
return 0;
if (!infolist_new_var_integer (item, "timeout", (int)(HOOK_URL(hook, timeout))))
return 0;
if (!infolist_new_var_integer (item, "stop_transfer", HOOK_URL(hook, stop_transfer)))
return 0;
if (!infolist_new_var_integer (item, "thread_created", (int)(HOOK_URL(hook, thread_created))))
return 0;
if (!infolist_new_var_integer (item, "thread_running", (int)(HOOK_URL(hook, thread_running))))
@@ -475,7 +451,6 @@ hook_url_print_log (struct t_hook *hook)
hashtable_get_string (HOOK_URL(hook, options),
"keys_values"));
log_printf (" timeout . . . . . . . : %ld", HOOK_URL(hook, timeout));
log_printf (" stop_transfer . . . . : %d", HOOK_URL(hook, stop_transfer));
log_printf (" thread_created. . . . : %d", (int)HOOK_URL(hook, thread_created));
log_printf (" thread_running. . . . : %d", (int)HOOK_URL(hook, thread_running));
log_printf (" hook_timer. . . . . . : %p", HOOK_URL(hook, hook_timer));
-1
View File
@@ -41,7 +41,6 @@ struct t_hook_url
char *url; /* URL */
struct t_hashtable *options; /* URL options (see doc) */
long timeout; /* timeout (ms) (0 = no timeout) */
int stop_transfer; /* 1 is used to stop transfer now */
pthread_t thread_id; /* thread id */
int thread_created; /* thread created */
int thread_running; /* 1 if thread is running */
+22 -22
View File
@@ -1771,30 +1771,30 @@ gui_completion_print_log (void)
ptr_completion = ptr_completion->next_completion)
{
log_printf ("[completion (addr:%p)]", ptr_completion);
log_printf (" plugin. . . . . . . . . . . : %p", ptr_completion->plugin);
log_printf (" buffer. . . . . . . . . . . : %p ('%s')",
log_printf (" plugin. . . . . . . . . . : %p", ptr_completion->plugin);
log_printf (" buffer. . . . . . . . . . : %p ('%s')",
ptr_completion->buffer,
ptr_completion->buffer->full_name);
log_printf (" context . . . . . . . . . . : %d", ptr_completion->context);
log_printf (" case_sensitive. . . . . . . : %d", ptr_completion->case_sensitive);
log_printf (" base_command. . . . . . . . : '%s'", ptr_completion->base_command);
log_printf (" base_command_arg_index. . . : %d", ptr_completion->base_command_arg_index);
log_printf (" base_word . . . . . . . . . : '%s'", ptr_completion->base_word);
log_printf (" base_word_pos . . . . . . . : %d", ptr_completion->base_word_pos);
log_printf (" position. . . . . . . . . . : %d", ptr_completion->position);
log_printf (" args. . . . . . . . . . . . : '%s'", ptr_completion->args);
log_printf (" direction . . . . . . . . . : %d", ptr_completion->direction);
log_printf (" add_space . . . . . . . . . : %d", ptr_completion->add_space);
log_printf (" partial_completion. . . . . : %d", ptr_completion->partial_completion);
log_printf (" template_partial_completion : %d", ptr_completion->template_partial_completion);
log_printf (" list. . . . . . . . . . . . : %p", ptr_completion->list);
log_printf (" word_found. . . . . . . . . : '%s'", ptr_completion->word_found);
log_printf (" word_found_is_nick. . . . . : %d", ptr_completion->word_found_is_nick);
log_printf (" position_replace. . . . . . : %d", ptr_completion->position_replace);
log_printf (" diff_size . . . . . . . . . : %d", ptr_completion->diff_size);
log_printf (" diff_length . . . . . . . . : %d", ptr_completion->diff_length);
log_printf (" prev_completion . . . . . . : %p", ptr_completion->prev_completion);
log_printf (" next_completion . . . . . . : %p", ptr_completion->next_completion);
log_printf (" context . . . . . . . . . : %d", ptr_completion->context);
log_printf (" case_sensitive. . . . . . : %d", ptr_completion->case_sensitive);
log_printf (" base_command. . . . . . . : '%s'", ptr_completion->base_command);
log_printf (" base_command_arg_index. . : %d", ptr_completion->base_command_arg_index);
log_printf (" base_word . . . . . . . . : '%s'", ptr_completion->base_word);
log_printf (" base_word_pos . . . . . . : %d", ptr_completion->base_word_pos);
log_printf (" position. . . . . . . . . : %d", ptr_completion->position);
log_printf (" args. . . . . . . . . . . : '%s'", ptr_completion->args);
log_printf (" direction . . . . . . . . : %d", ptr_completion->direction);
log_printf (" add_space . . . . . . . . : %d", ptr_completion->add_space);
log_printf (" partial_completion. . . . : %d", ptr_completion->partial_completion);
log_printf (" template_partial_completion: %d", ptr_completion->template_partial_completion);
log_printf (" list. . . . . . . . . . . : %p", ptr_completion->list);
log_printf (" word_found. . . . . . . . : '%s'", ptr_completion->word_found);
log_printf (" word_found_is_nick. . . . : %d", ptr_completion->word_found_is_nick);
log_printf (" position_replace. . . . . : %d", ptr_completion->position_replace);
log_printf (" diff_size . . . . . . . . : %d", ptr_completion->diff_size);
log_printf (" diff_length . . . . . . . : %d", ptr_completion->diff_length);
log_printf (" prev_completion . . . . . : %p", ptr_completion->prev_completion);
log_printf (" next_completion . . . . . : %p", ptr_completion->next_completion);
if (ptr_completion->list && (ptr_completion->list->size > 0))
{
log_printf ("");
+19 -20
View File
@@ -28,7 +28,6 @@
#include "../weechat-plugin.h"
#include "irc.h"
#include "irc-color.h"
#include "irc-mode.h"
#include "irc-config.h"
#include "irc-server.h"
@@ -38,24 +37,18 @@
/*
* Gets mode arguments: skips colons before arguments and converts IRC color
* codes into WeeChat color codes, so that the result can be displayed in a
* buffer.
* Gets mode arguments: skip colons before arguments.
*/
char *
irc_mode_get_arguments_colors (const char *arguments)
irc_mode_get_arguments (const char *arguments)
{
char **argv, **new_arguments;
char **argv, **argv2, *new_arguments;
int argc, i;
if (!arguments || !arguments[0])
return strdup ("");
new_arguments = weechat_string_dyn_alloc (1024);
if (!new_arguments)
return NULL;
argv = weechat_string_split (arguments, " ", NULL,
WEECHAT_STRING_SPLIT_STRIP_LEFT
| WEECHAT_STRING_SPLIT_STRIP_RIGHT
@@ -64,20 +57,26 @@ irc_mode_get_arguments_colors (const char *arguments)
if (!argv)
return strdup ("");
for (i = 0; i < argc; i++)
argv2 = malloc (sizeof (*argv) * (argc + 1));
if (!argv2)
{
if ((*new_arguments)[0])
weechat_string_dyn_concat (new_arguments, " ", -1);
weechat_string_dyn_concat (
new_arguments,
(argv[i][0] == ':') ? IRC_COLOR_MSG(argv[i] + 1) : IRC_COLOR_MSG(argv[i]),
-1);
weechat_string_dyn_concat (new_arguments, IRC_COLOR_RESET, -1);
weechat_string_free_split (argv);
return strdup ("");;
}
weechat_string_free_split (argv);
for (i = 0; i < argc; i++)
{
argv2[i] = (argv[i][0] == ':') ? argv[i] + 1 : argv[i];
}
argv2[argc] = NULL;
return weechat_string_dyn_free (new_arguments, 0);
new_arguments = weechat_string_rebuild_split_string (
(const char **)argv2, " ", 0, -1);
weechat_string_free_split (argv);
free (argv2);
return new_arguments;
}
/*
+1 -1
View File
@@ -25,7 +25,7 @@
struct t_irc_server;
struct t_irc_channel;
extern char *irc_mode_get_arguments_colors (const char *arguments);
extern char *irc_mode_get_arguments (const char *arguments);
extern char irc_mode_get_chanmode_type (struct t_irc_server *server,
char chanmode);
extern int irc_mode_channel_set (struct t_irc_server *server,
+7 -7
View File
@@ -2178,7 +2178,7 @@ IRC_PROTOCOL_CALLBACK(mode)
}
ptr_nick = irc_nick_search (ctxt->server, ptr_channel, ctxt->nick);
ptr_buffer = (ptr_channel) ? ptr_channel->buffer : ctxt->server->buffer;
modes_args = irc_mode_get_arguments_colors (msg_modes_args);
modes_args = irc_mode_get_arguments (msg_modes_args);
weechat_printf_datetime_tags (
irc_msgbuffer_get_target_buffer (ctxt->server, NULL, ctxt->command, NULL,
ptr_buffer),
@@ -6811,7 +6811,7 @@ IRC_PROTOCOL_CALLBACK(367)
IRC_COLOR_CHAT_DELIMITERS,
str_number,
IRC_COLOR_CHAT_HOST,
IRC_COLOR_MSG(ctxt->params[2]), /* banmask */
ctxt->params[2], /* banmask */
IRC_COLOR_RESET,
(nick_address[0]) ? nick_address : "?",
weechat_util_get_time_string (&datetime));
@@ -6834,7 +6834,7 @@ IRC_PROTOCOL_CALLBACK(367)
IRC_COLOR_CHAT_DELIMITERS,
str_number,
IRC_COLOR_CHAT_HOST,
IRC_COLOR_MSG(ctxt->params[2]), /* banmask */
ctxt->params[2], /* banmask */
IRC_COLOR_RESET,
(nick_address[0]) ? nick_address : "?");
}
@@ -6857,7 +6857,7 @@ IRC_PROTOCOL_CALLBACK(367)
IRC_COLOR_CHAT_DELIMITERS,
str_number,
IRC_COLOR_CHAT_HOST,
IRC_COLOR_MSG(ctxt->params[2]), /* banmask */
ctxt->params[2], /* banmask */
IRC_COLOR_RESET);
}
@@ -7386,7 +7386,7 @@ IRC_PROTOCOL_CALLBACK(728)
IRC_COLOR_CHAT_DELIMITERS,
str_number,
IRC_COLOR_CHAT_HOST,
IRC_COLOR_MSG(ctxt->params[3]), /* quietmask */
ctxt->params[3], /* quietmask */
IRC_COLOR_RESET,
(nick_address[0]) ? nick_address : "?",
weechat_util_get_time_string (&datetime));
@@ -7409,7 +7409,7 @@ IRC_PROTOCOL_CALLBACK(728)
IRC_COLOR_CHAT_DELIMITERS,
str_number,
IRC_COLOR_CHAT_HOST,
IRC_COLOR_MSG(ctxt->params[3]), /* quietmask */
ctxt->params[3], /* quietmask */
IRC_COLOR_RESET,
(nick_address[0]) ? nick_address : "?");
}
@@ -7432,7 +7432,7 @@ IRC_PROTOCOL_CALLBACK(728)
IRC_COLOR_CHAT_DELIMITERS,
str_number,
IRC_COLOR_CHAT_HOST,
IRC_COLOR_MSG(ctxt->params[3]), /* quietmask */
ctxt->params[3], /* quietmask */
IRC_COLOR_RESET);
}
+63 -118
View File
@@ -374,7 +374,7 @@ RELAY_API_PROTOCOL_CALLBACK(options)
relay_api_msg_send_json (
client,
RELAY_HTTP_204_NO_CONTENT,
"Access-Control-Allow-Methods: " RELAY_API_ALLOWED_METHODS "\r\n"
"Access-Control-Allow-Methods: GET, POST, PUT, DELETE\r\n"
"Access-Control-Allow-Headers: origin, content-type, accept, authorization",
NULL, /* body_type */
NULL); /* json_body */
@@ -401,13 +401,9 @@ RELAY_API_PROTOCOL_CALLBACK(handshake)
json_body = cJSON_Parse (client->http_req->body);
if (json_body)
{
if (!cJSON_IsObject (json_body))
return RELAY_API_PROTOCOL_RC_BAD_REQUEST;
json_algos = cJSON_GetObjectItem (json_body, "password_hash_algo");
if (json_algos)
{
if (!cJSON_IsArray (json_algos))
goto invalid_hash_algo;
cJSON_ArrayForEach (json_algo, json_algos)
{
ptr_algo = (cJSON_IsString (json_algo)) ?
@@ -415,17 +411,7 @@ RELAY_API_PROTOCOL_CALLBACK(handshake)
if (ptr_algo)
{
index_hash_algo = relay_auth_password_hash_algo_search (ptr_algo);
if (index_hash_algo < 0)
{
relay_api_msg_send_error_json (
client,
RELAY_HTTP_400_BAD_REQUEST, NULL,
"Hash algorithm \"%s\" not found",
ptr_algo);
cJSON_Delete (json_body);
return RELAY_API_PROTOCOL_RC_OK;
}
if (index_hash_algo > hash_algo_found)
if ((index_hash_algo >= 0) && (index_hash_algo > hash_algo_found))
{
if (weechat_string_match_list (
relay_auth_password_hash_algo_name[index_hash_algo],
@@ -436,8 +422,6 @@ RELAY_API_PROTOCOL_CALLBACK(handshake)
}
}
}
else
goto invalid_hash_algo;
}
}
}
@@ -476,14 +460,6 @@ RELAY_API_PROTOCOL_CALLBACK(handshake)
cJSON_Delete (json_body);
return RELAY_API_PROTOCOL_RC_OK;
invalid_hash_algo:
relay_api_msg_send_error_json (
client,
RELAY_HTTP_400_BAD_REQUEST, NULL,
"Invalid hash algorithm");
cJSON_Delete (json_body);
return RELAY_API_PROTOCOL_RC_OK;
}
/*
@@ -736,55 +712,57 @@ RELAY_API_PROTOCOL_CALLBACK(input)
char str_delay[32];
json_body = cJSON_Parse (client->http_req->body);
if (!json_body || !cJSON_IsObject (json_body))
if (!json_body)
return RELAY_API_PROTOCOL_RC_BAD_REQUEST;
/* get buffer either by name or by id */
/* get buffer either by id or by name */
ptr_buffer = NULL;
json_buffer_name = cJSON_GetObjectItem (json_body, "buffer_name");
if (json_buffer_name)
json_buffer_id = cJSON_GetObjectItem (json_body, "buffer_id");
if (json_buffer_id)
{
if (cJSON_IsString (json_buffer_name))
if (cJSON_IsNumber (json_buffer_id))
{
ptr_buffer_name = cJSON_GetStringValue (json_buffer_name);
ptr_buffer = weechat_buffer_search ("==", ptr_buffer_name);
snprintf (str_id, sizeof (str_id),
"%lld", (long long)cJSON_GetNumberValue (json_buffer_id));
ptr_buffer = weechat_buffer_search ("==id", str_id);
if (!ptr_buffer)
{
relay_api_msg_send_error_json (
client,
RELAY_HTTP_400_BAD_REQUEST, NULL,
"Buffer \"%s\" not found",
ptr_buffer_name);
"Buffer \"%lld\" not found",
(long long)cJSON_GetNumberValue (json_buffer_id));
cJSON_Delete (json_body);
return RELAY_API_PROTOCOL_RC_OK;
}
}
}
if (!ptr_buffer)
else
{
json_buffer_id = cJSON_GetObjectItem (json_body, "buffer_id");
if (json_buffer_id)
json_buffer_name = cJSON_GetObjectItem (json_body, "buffer_name");
if (json_buffer_name)
{
if (cJSON_IsNumber (json_buffer_id))
if (cJSON_IsString (json_buffer_name))
{
snprintf (str_id, sizeof (str_id),
"%lld", (long long)cJSON_GetNumberValue (json_buffer_id));
ptr_buffer = weechat_buffer_search ("==id", str_id);
ptr_buffer_name = cJSON_GetStringValue (json_buffer_name);
ptr_buffer = weechat_buffer_search ("==", ptr_buffer_name);
if (!ptr_buffer)
{
relay_api_msg_send_error_json (
client,
RELAY_HTTP_400_BAD_REQUEST, NULL,
"Buffer \"%lld\" not found",
(long long)cJSON_GetNumberValue (json_buffer_id));
"Buffer \"%s\" not found",
ptr_buffer_name);
cJSON_Delete (json_body);
return RELAY_API_PROTOCOL_RC_OK;
}
}
}
else
{
ptr_buffer = weechat_buffer_search_main ();
}
}
if (!ptr_buffer)
ptr_buffer = weechat_buffer_search_main ();
if (!ptr_buffer)
{
cJSON_Delete (json_body);
@@ -863,55 +841,57 @@ RELAY_API_PROTOCOL_CALLBACK(completion)
struct t_gui_buffer *ptr_buffer;
json_body = cJSON_Parse (client->http_req->body);
if (!json_body || !cJSON_IsObject(json_body))
if (!json_body)
return RELAY_API_PROTOCOL_RC_BAD_REQUEST;
/* get buffer either by name or by id */
/* get buffer either by id or by name */
ptr_buffer = NULL;
json_buffer_name = cJSON_GetObjectItem (json_body, "buffer_name");
if (json_buffer_name)
json_buffer_id = cJSON_GetObjectItem (json_body, "buffer_id");
if (json_buffer_id)
{
if (cJSON_IsString (json_buffer_name))
if (cJSON_IsNumber (json_buffer_id))
{
ptr_buffer_name = cJSON_GetStringValue (json_buffer_name);
ptr_buffer = weechat_buffer_search ("==", ptr_buffer_name);
snprintf (str_id, sizeof(str_id),
"%lld", (long long)cJSON_GetNumberValue (json_buffer_id));
ptr_buffer = weechat_buffer_search ("==id", str_id);
if (!ptr_buffer)
{
relay_api_msg_send_error_json (
client,
RELAY_HTTP_400_BAD_REQUEST, NULL,
"Buffer \"%s\" not found",
ptr_buffer_name);
"Buffer \"%lld\" not found",
(long long)cJSON_GetNumberValue (json_buffer_id));
cJSON_Delete (json_body);
return RELAY_API_PROTOCOL_RC_OK;
}
}
}
if (!ptr_buffer)
else
{
json_buffer_id = cJSON_GetObjectItem (json_body, "buffer_id");
if (json_buffer_id)
json_buffer_name = cJSON_GetObjectItem (json_body, "buffer_name");
if (json_buffer_name)
{
if (cJSON_IsNumber (json_buffer_id))
if (cJSON_IsString (json_buffer_name))
{
snprintf (str_id, sizeof(str_id),
"%lld", (long long)cJSON_GetNumberValue (json_buffer_id));
ptr_buffer = weechat_buffer_search ("==id", str_id);
ptr_buffer_name = cJSON_GetStringValue (json_buffer_name);
ptr_buffer = weechat_buffer_search ("==", ptr_buffer_name);
if (!ptr_buffer)
{
relay_api_msg_send_error_json (
client,
RELAY_HTTP_400_BAD_REQUEST, NULL,
"Buffer \"%lld\" not found",
(long long)cJSON_GetNumberValue (json_buffer_id));
"Buffer \"%s\" not found",
ptr_buffer_name);
cJSON_Delete (json_body);
return RELAY_API_PROTOCOL_RC_OK;
}
}
}
else
{
ptr_buffer = weechat_buffer_search_main ();
}
}
if (!ptr_buffer)
ptr_buffer = weechat_buffer_search_main ();
if (!ptr_buffer)
{
cJSON_Delete (json_body);
@@ -1217,7 +1197,7 @@ relay_api_protocol_recv_json (struct t_relay_client *client, const char *json)
void
relay_api_protocol_recv_http (struct t_relay_client *client)
{
int i, num_args, match_method, match_resource;
int i, num_args;
char str_error[1024];
enum t_relay_api_protocol_rc return_code;
struct t_relay_api_protocol_cb protocol_cb[] = {
@@ -1258,22 +1238,18 @@ relay_api_protocol_recv_http (struct t_relay_client *client)
|| !client->http_req->path_items[1]
|| (strcmp (client->http_req->path_items[0], "api") != 0))
{
goto resource_not_found;
goto error_not_found;
}
num_args = client->http_req->num_path_items - 2;
for (i = 0; protocol_cb[i].resource; i++)
{
match_method = (strcmp (protocol_cb[i].method, client->http_req->method) == 0);
if (strcmp (protocol_cb[i].method, client->http_req->method) != 0)
continue;
match_resource = ((strcmp (protocol_cb[i].resource, "*") == 0)
|| (strcmp (protocol_cb[i].resource, client->http_req->path_items[1]) == 0));
if (!match_method && (strcmp (protocol_cb[i].resource, "*") != 0) && match_resource)
goto error_method_not_allowed;
if (!match_method || !match_resource)
if ((strcmp (protocol_cb[i].resource, "*") != 0)
&& (strcmp (protocol_cb[i].resource, client->http_req->path_items[1]) != 0))
continue;
if (protocol_cb[i].auth_required
@@ -1355,19 +1331,7 @@ relay_api_protocol_recv_http (struct t_relay_client *client)
}
}
resource_not_found:
if (!client->http_req->method
|| ((strcmp (client->http_req->method, "GET") != 0)
&& (strcmp (client->http_req->method, "POST") != 0)
&& (strcmp (client->http_req->method, "PUT") != 0)
&& (strcmp (client->http_req->method, "DELETE") != 0)))
{
goto error_method_not_allowed;
}
else
{
goto error_not_found;
}
goto error_not_found;
error_bad_request:
relay_api_msg_send_error_json (client, RELAY_HTTP_400_BAD_REQUEST,
@@ -1379,12 +1343,6 @@ error_not_found:
NULL, RELAY_HTTP_ERROR_NOT_FOUND);
goto error;
error_method_not_allowed:
relay_api_msg_send_error_json (client, RELAY_HTTP_405_METHOD_NOT_ALLOWED,
"Allow: " RELAY_API_ALLOWED_METHODS,
RELAY_HTTP_ERROR_METHOD_NOT_ALLOWED);
goto error;
error_memory:
relay_api_msg_send_error_json (client, RELAY_HTTP_503_SERVICE_UNAVAILABLE,
NULL, RELAY_HTTP_ERROR_OUT_OF_MEMORY);
@@ -1393,28 +1351,15 @@ error_memory:
error:
if (weechat_relay_plugin->debug >= 1)
{
if (client->http_req->method && client->http_req->path)
{
weechat_printf (NULL,
_("%s%s: failed to execute route \"%s %s\" "
"for client %s%s%s"),
weechat_prefix ("error"),
RELAY_PLUGIN_NAME,
client->http_req->method,
client->http_req->path,
RELAY_COLOR_CHAT_CLIENT,
client->desc,
RELAY_COLOR_CHAT);
}
else
{
weechat_printf (NULL,
_("%s%s: invalid data received from client %s%s%s"),
weechat_prefix ("error"),
RELAY_PLUGIN_NAME,
RELAY_COLOR_CHAT_CLIENT,
client->desc,
RELAY_COLOR_CHAT);
}
weechat_printf (NULL,
_("%s%s: failed to execute route \"%s %s\" "
"for client %s%s%s"),
weechat_prefix ("error"),
RELAY_PLUGIN_NAME,
client->http_req->method,
client->http_req->path,
RELAY_COLOR_CHAT_CLIENT,
client->desc,
RELAY_COLOR_CHAT);
}
}
@@ -22,8 +22,6 @@
#ifndef WEECHAT_PLUGIN_RELAY_API_PROTOCOL_H
#define WEECHAT_PLUGIN_RELAY_API_PROTOCOL_H
#define RELAY_API_ALLOWED_METHODS "GET, POST, PUT, DELETE"
#define RELAY_API_CB(__command) &relay_api_protocol_cb_##__command
#define RELAY_API_PROTOCOL_CALLBACK(__command) \
enum t_relay_api_protocol_rc \
+1 -1
View File
@@ -27,7 +27,7 @@ enum t_relay_status;
#define RELAY_API_VERSION_MAJOR 0
#define RELAY_API_VERSION_MINOR 4
#define RELAY_API_VERSION_PATCH 1
#define RELAY_API_VERSION_PATCH 0
#define RELAY_API_VERSION_NUMBER \
((RELAY_API_VERSION_MAJOR << 16) \
+ (RELAY_API_VERSION_MINOR << 8) \
+143 -138
View File
@@ -17,7 +17,7 @@ info:
license:
name: CC BY-NC-SA 4.0
url: https://creativecommons.org/licenses/by-nc-sa/4.0/
version: 0.4.1
version: 0.4.0
externalDocs:
url: https://weechat.org/doc/
@@ -50,29 +50,7 @@ paths:
This endpoint does not require authentication.
operationId: handshake
requestBody:
description: Handshake request
required: true
content:
application/json:
schema:
type: object
properties:
password_hash_algo:
type: array
items:
type: string
enum:
- plain
- sha256
- sha512
- pbkdf2+sha256
- pbkdf2+sha512
example:
- plain
- sha256
- sha512
- pbkdf2+sha256
- pbkdf2+sha512
$ref: '#/components/requestBodies/HandshakeBody'
responses:
'200':
description: Successful operation
@@ -80,12 +58,6 @@ paths:
application/json:
schema:
$ref: '#/components/schemas/Handshake'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'503':
description: Out of memory
content:
@@ -202,7 +174,7 @@ paths:
tags:
- buffers
description: |
Get a single buffer by full name, with optional lines and nicks.
Get buffer by full name, with optional lines and nicks.
operationId: getBufferByName
parameters:
- $ref: '#/components/parameters/totp'
@@ -520,31 +492,7 @@ paths:
parameters:
- $ref: '#/components/parameters/totp'
requestBody:
description: Buffer and command to execute
required: true
content:
application/json:
schema:
type: object
properties:
buffer_id:
type: integer
format: int64
description: Buffer identifier (≥ 0)
buffer_name:
type: string
description: >-
Buffer full name
example: 'core.weechat'
command:
type: string
description: text or command to send
example: '/print test'
required:
- command
example:
buffer_name: 'core.weechat'
command: '/print test'
$ref: '#/components/requestBodies/InputBody'
responses:
'204':
description: Successful operation
@@ -568,42 +516,11 @@ paths:
- completion
description: |
Complete user command or text.
operationId: completion
operationId: input
parameters:
- $ref: '#/components/parameters/totp'
requestBody:
description: Buffer and user text/command to complete
required: true
content:
application/json:
schema:
type: object
properties:
buffer_id:
type: integer
format: int64
description: Buffer identifier (≥ 0)
buffer_name:
type: string
description: >-
Buffer full name
example: 'core.weechat'
command:
type: string
description: user command or text to complete
example: '/hel'
position:
type: integer
format: int32
description: Position in data (≥ 0)
example: 4
required:
- command
- position
example:
buffer_name: 'core.weechat'
command: '/hel'
position: 4
$ref: '#/components/requestBodies/CompletionBody'
responses:
'200':
description: Successful operation
@@ -635,16 +552,7 @@ paths:
parameters:
- $ref: '#/components/parameters/totp'
requestBody:
description: Custom data that will be returned in the response
required: false
content:
application/json:
schema:
type: object
properties:
data:
type: string
example: '1714854355123456'
$ref: '#/components/requestBodies/PingBody'
responses:
'200':
description: Successful operation
@@ -681,37 +589,7 @@ paths:
parameters:
- $ref: '#/components/parameters/totp'
requestBody:
description: Synchronization parameters
required: false
content:
application/json:
schema:
type: object
properties:
sync:
type: boolean
description: Enable synchronization
example: true
nicks:
type: boolean
description: Receive nick updates in buffers
example: true
input:
type: boolean
description: Receive input changes in buffers (content and cursor position)
example: true
colors:
type: string
enum:
- ansi
- weechat
- strip
default: ansi
description: |
How to return strings with color codes:
* `ansi`: return ANSI color codes
* `weechat`: return WeeChat internal color codes
* `strip`: strip colors
$ref: '#/components/requestBodies/SyncBody'
responses:
'204':
description: Successful operation
@@ -754,7 +632,6 @@ components:
type: integer
format: int64
description: Buffer identifier
example: 1709932823238637
bufferName:
name: buffer_name
in: path
@@ -1023,7 +900,7 @@ components:
type: string
format: date-time
description: date and time of line
example: '2023-12-05T19:46:03.847625Z'
example: '"2023-12-05T19:46:03.847625Z'
date_printed:
type: string
format: date-time
@@ -1284,11 +1161,11 @@ components:
type: array
items:
type: string
example:
- 'query'
- 'quiet'
- 'quit'
- 'quote'
example:
- 'query'
- 'quiet'
- 'quit'
- 'quote'
required:
- context
- base_word
@@ -1300,10 +1177,138 @@ components:
properties:
data:
type: string
example: '1714854355123456'
example: 1714854355123456
required:
- data
requestBodies:
HandshakeBody:
description: Handshake request
required: false
content:
application/json:
schema:
type: object
properties:
password_hash_algo:
type: array
items:
type: string
enum:
- plain
- sha256
- sha512
- pbkdf2+sha256
- pbkdf2+sha512
example:
- plain
- sha256
- sha512
- pbkdf2+sha256
- pbkdf2+sha512
InputBody:
description: Buffer and command to execute
required: true
content:
application/json:
schema:
type: object
properties:
buffer_id:
type: integer
format: int64
description: Buffer identifier (≥ 0)
example: 1709932823238637
buffer_name:
type: string
description: >-
Buffer full name
example: 'irc.libera.#weechat'
command:
type: string
description: text or command to send
example: 'hello, world!'
required:
- command
example:
buffer_id: 1709932823238637
command: 'hello, world!'
CompletionBody:
description: Buffer and user text/command to complete
required: true
content:
application/json:
schema:
type: object
properties:
buffer_id:
type: integer
format: int64
description: Buffer identifier (≥ 0)
example: 1709932823238637
buffer_name:
type: string
description: >-
Buffer full name
example: 'irc.libera.#weechat'
command:
type: string
description: user command or text to complete
example: '/qu'
position:
type: integer
format: int32
description: Position in data (≥ 0)
example: 3
required:
- data
example:
buffer_id: 1709932823238637
command: '/qu'
PingBody:
description: Custom data that will be returned in the response
required: false
content:
application/json:
schema:
type: object
properties:
data:
type: string
example: 1714854355123456
SyncBody:
description: Synchronization parameters
required: false
content:
application/json:
schema:
type: object
properties:
sync:
type: boolean
description: Enable synchronization
example: true
nicks:
type: boolean
description: Receive nick updates in buffers
example: true
input:
type: boolean
description: Receive input changes in buffers (content and cursor position)
example: true
colors:
type: string
enum:
- ansi
- weechat
- strip
default: ansi
description: |
How to return strings with color codes:
* `ansi`: return ANSI color codes
* `weechat`: return WeeChat internal color codes
* `strip`: strip colors
securitySchemes:
password:
type: http
+3 -4
View File
@@ -504,8 +504,7 @@ relay_client_recv_text_buffer (struct t_relay_client *client,
if ((client->websocket == RELAY_CLIENT_WEBSOCKET_INITIALIZING)
|| (client->recv_data_type == RELAY_CLIENT_DATA_HTTP))
{
relay_http_recv (client, buffer + index, length_buffer - index);
break;
relay_http_recv (client, buffer + index);
}
else
{
@@ -583,7 +582,7 @@ relay_client_read_websocket_frames (struct t_relay_client *client,
if ((client->websocket == RELAY_CLIENT_WEBSOCKET_INITIALIZING)
|| (client->recv_data_type == RELAY_CLIENT_DATA_HTTP))
{
relay_http_recv (client, frames[i].payload, frames[i].payload_size);
relay_http_recv (client, frames[i].payload);
}
else if ((client->recv_data_type == RELAY_CLIENT_DATA_TEXT_LINE)
|| (client->recv_data_type == RELAY_CLIENT_DATA_TEXT_MULTILINE))
@@ -695,7 +694,7 @@ relay_client_recv_buffer (struct t_relay_client *client,
if ((client->websocket == RELAY_CLIENT_WEBSOCKET_INITIALIZING)
|| (client->recv_data_type == RELAY_CLIENT_DATA_HTTP))
{
relay_http_recv (client, buffer, buffer_size);
relay_http_recv (client, buffer);
}
else if ((client->recv_data_type == RELAY_CLIENT_DATA_TEXT_LINE)
|| (client->recv_data_type == RELAY_CLIENT_DATA_TEXT_MULTILINE))
+4 -9
View File
@@ -935,13 +935,11 @@ relay_http_process_request (struct t_relay_client *client)
*/
void
relay_http_recv (struct t_relay_client *client, const char *data, int size)
relay_http_recv (struct t_relay_client *client, const char *data)
{
char *new_partial, *pos, **null_char;
char *new_partial, *pos;
int length, ws_deflate_allowed;
null_char = memchr (data, 0, size);
if (client->partial_message)
{
new_partial = realloc (client->partial_message,
@@ -1005,11 +1003,8 @@ relay_http_recv (struct t_relay_client *client, const char *data, int size)
relay_http_add_to_body (client->http_req, &(client->partial_message));
}
/*
* process the request if it's ready to be processed (all parsed)
* or if we received a NULL char in the HTTP message (forbidden)
* */
if ((client->http_req->status == RELAY_HTTP_END) || null_char)
/* process the request if it's ready to be processed (all parsed) */
if (client->http_req->status == RELAY_HTTP_END)
{
relay_http_process_request (client);
relay_http_request_reinit (client->http_req);
+1 -4
View File
@@ -40,7 +40,6 @@ enum t_relay_client_http_status
#define RELAY_HTTP_401_UNAUTHORIZED 401, "Unauthorized"
#define RELAY_HTTP_403_FORBIDDEN 403, "Forbidden"
#define RELAY_HTTP_404_NOT_FOUND 404, "Not Found"
#define RELAY_HTTP_405_METHOD_NOT_ALLOWED 405, "Method Not Allowed"
#define RELAY_HTTP_500_INTERNAL_SERVER_ERROR 500, "Internal Server Error"
#define RELAY_HTTP_503_SERVICE_UNAVAILABLE 503, "Service Unavailable"
@@ -54,7 +53,6 @@ enum t_relay_client_http_status
#define RELAY_HTTP_ERROR_INVALID_ITERATIONS "Invalid number of iterations"
#define RELAY_HTTP_ERROR_BAD_REQUEST "Bad request"
#define RELAY_HTTP_ERROR_NOT_FOUND "Resource not found"
#define RELAY_HTTP_ERROR_METHOD_NOT_ALLOWED "Method Not Allowed"
#define RELAY_HTTP_ERROR_OUT_OF_MEMORY "Out of memory"
struct t_relay_http_request
@@ -100,8 +98,7 @@ extern long relay_http_get_param_long (struct t_relay_http_request *request,
extern int relay_http_parse_method_path (struct t_relay_http_request *request,
const char *method_path);
extern int relay_http_check_auth (struct t_relay_client *client);
extern void relay_http_recv (struct t_relay_client *client,
const char *data, int size);
extern void relay_http_recv (struct t_relay_client *client, const char *data);
extern int relay_http_send (struct t_relay_client *client,
int return_code, const char *message,
const char *headers,
+14 -86
View File
@@ -25,13 +25,11 @@
extern "C"
{
#include "src/gui/gui-color.h"
#include "src/plugins/irc/irc-color.h"
#include "src/plugins/irc/irc-mode.h"
}
#define WEE_CHECK_GET_ARGS(__result, __arguments) \
str = irc_mode_get_arguments_colors (__arguments); \
str = irc_mode_get_arguments (__arguments); \
STRCMP_EQUAL(__result, str); \
free (str);
@@ -46,93 +44,23 @@ TEST_GROUP(IrcMode)
TEST(IrcMode, GetArguments)
{
char *str, string[1024], expected[1024];
char *str;
/* invalid arguments */
WEE_CHECK_GET_ARGS("", NULL);
WEE_CHECK_GET_ARGS("", "");
WEE_CHECK_GET_ARGS("", " ");
WEE_CHECK_GET_ARGS("", irc_mode_get_arguments (NULL));
WEE_CHECK_GET_ARGS("", irc_mode_get_arguments (""));
WEE_CHECK_GET_ARGS("", irc_mode_get_arguments (" "));
/* simple arguments */
snprintf (string, sizeof (string), "abc%c02_blue", IRC_COLOR_COLOR_CHAR);
snprintf (expected, sizeof (expected),
"abc%s_blue%s",
gui_color_get_custom ("|blue"),
gui_color_get_custom ("reset"));
WEE_CHECK_GET_ARGS(expected, string);
snprintf (string, sizeof (string),
"abc%c02_blue def%c02_blue",
IRC_COLOR_COLOR_CHAR,
IRC_COLOR_COLOR_CHAR);
snprintf (expected, sizeof (expected),
"abc%s_blue%s def%s_blue%s",
gui_color_get_custom ("|blue"),
gui_color_get_custom ("reset"),
gui_color_get_custom ("|blue"),
gui_color_get_custom ("reset"));
WEE_CHECK_GET_ARGS(expected, string);
snprintf (string, sizeof (string),
"abc%c02_blue def%c02_blue ghi%c02_blue",
IRC_COLOR_COLOR_CHAR,
IRC_COLOR_COLOR_CHAR,
IRC_COLOR_COLOR_CHAR);
snprintf (expected, sizeof (expected),
"abc%s_blue%s def%s_blue%s ghi%s_blue%s",
gui_color_get_custom ("|blue"),
gui_color_get_custom ("reset"),
gui_color_get_custom ("|blue"),
gui_color_get_custom ("reset"),
gui_color_get_custom ("|blue"),
gui_color_get_custom ("reset"));
WEE_CHECK_GET_ARGS(expected, string);
WEE_CHECK_GET_ARGS("abc", irc_mode_get_arguments ("abc"));
WEE_CHECK_GET_ARGS("abc def", irc_mode_get_arguments ("abc def"));
WEE_CHECK_GET_ARGS("abc def ghi", irc_mode_get_arguments ("abc def ghi"));
/* some arguments starting with a colon */
snprintf (string, sizeof (string), ":abc%c02_blue", IRC_COLOR_COLOR_CHAR);
snprintf (expected, sizeof (expected),
"abc%s_blue%s",
gui_color_get_custom ("|blue"),
gui_color_get_custom ("reset"));
WEE_CHECK_GET_ARGS(expected, string);
snprintf (string, sizeof (string),
":abc%c02_blue def%c02_blue",
IRC_COLOR_COLOR_CHAR,
IRC_COLOR_COLOR_CHAR);
snprintf (expected, sizeof (expected),
"abc%s_blue%s def%s_blue%s",
gui_color_get_custom ("|blue"),
gui_color_get_custom ("reset"),
gui_color_get_custom ("|blue"),
gui_color_get_custom ("reset"));
WEE_CHECK_GET_ARGS(expected, string);
snprintf (string, sizeof (string),
"abc%c02_blue :def%c02_blue",
IRC_COLOR_COLOR_CHAR,
IRC_COLOR_COLOR_CHAR);
WEE_CHECK_GET_ARGS(expected, string);
snprintf (string, sizeof (string),
"abc%c02_blue :def%c02_blue ghi%c02_blue",
IRC_COLOR_COLOR_CHAR,
IRC_COLOR_COLOR_CHAR,
IRC_COLOR_COLOR_CHAR);
snprintf (expected, sizeof (expected),
"abc%s_blue%s def%s_blue%s ghi%s_blue%s",
gui_color_get_custom ("|blue"),
gui_color_get_custom ("reset"),
gui_color_get_custom ("|blue"),
gui_color_get_custom ("reset"),
gui_color_get_custom ("|blue"),
gui_color_get_custom ("reset"));
WEE_CHECK_GET_ARGS(expected, string);
snprintf (string, sizeof (string),
"abc%c02_blue :def%c02_blue :ghi%c02_blue",
IRC_COLOR_COLOR_CHAR,
IRC_COLOR_COLOR_CHAR,
IRC_COLOR_COLOR_CHAR);
WEE_CHECK_GET_ARGS(expected, string);
snprintf (string, sizeof (string),
":abc%c02_blue :def%c02_blue :ghi%c02_blue",
IRC_COLOR_COLOR_CHAR,
IRC_COLOR_COLOR_CHAR,
IRC_COLOR_COLOR_CHAR);
WEE_CHECK_GET_ARGS(expected, string);
WEE_CHECK_GET_ARGS("abc", irc_mode_get_arguments (":abc"));
WEE_CHECK_GET_ARGS("abc def", irc_mode_get_arguments (":abc def"));
WEE_CHECK_GET_ARGS("abc def", irc_mode_get_arguments ("abc :def"));
WEE_CHECK_GET_ARGS("abc def ghi", irc_mode_get_arguments ("abc :def ghi"));
WEE_CHECK_GET_ARGS("abc def ghi", irc_mode_get_arguments ("abc :def :ghi"));
WEE_CHECK_GET_ARGS("abc def ghi", irc_mode_get_arguments (":abc :def :ghi"));
}
+28 -47
View File
@@ -2316,22 +2316,6 @@ TEST(IrcProtocolWithServer, mode)
"irc_mode,nick_admin,host_user@host,log3");
STRCMP_EQUAL(NULL, ptr_channel->modes);
/* bans added on channel */
RECV(":admin!user@host MODE #test +bb "
"bob!user_\00304red@host_\00304red "
"carol!user_\00304red@host_\00304red");
CHECK_CHAN("--", "Mode #test [+bb bob!user_red@host_red "
"carol!user_red@host_red] by admin",
"irc_mode,nick_admin,host_user@host,log3");
/* bans removed from channel */
RECV(":admin!user@host MODE #test -bb "
"bob!user_\00304red@host_\00304red "
"carol!user_\00304red@host_\00304red");
CHECK_CHAN("--", "Mode #test [-bb bob!user_red@host_red "
"carol!user_red@host_red] by admin",
"irc_mode,nick_admin,host_user@host,log3");
/* nick mode '@' on channel #test */
RECV(":admin!user@host MODE #test +o alice ");
CHECK_CHAN("--", "Mode #test [+o alice] by admin",
@@ -5616,32 +5600,30 @@ TEST(IrcProtocolWithServer, 367)
RECV(":server 367 alice #test");
CHECK_ERROR_PARAMS("367", 2, 3);
RECV(":server 367 alice #test nick1!user1@host1_\00304red");
CHECK_CHAN("--", "[#test] [1] nick1!user1@host1_red banned",
RECV(":server 367 alice #test nick1!user1@host1");
CHECK_CHAN("--", "[#test] [1] nick1!user1@host1 banned",
"irc_367,irc_numeric,nick_server,log3");
RECV(":server 367 alice #test nick1!user1_\00304red@host1_\00304red "
"nick2!user2_\00304red@host2_\00304red ");
RECV(":server 367 alice #test nick1!user1@host1 nick2!user2@host2 ");
CHECK_CHAN("--",
"[#test] [2] nick1!user1_red@host1_red banned by nick2 (user2_red@host2_red)",
"[#test] [2] nick1!user1@host1 banned by nick2 (user2@host2)",
"irc_367,irc_numeric,nick_server,log3");
RECV(":server 367 alice #test nick1!user1_\00304red@host1_\00304red "
"nick2!user2_\00304red@host2_\00304red 1205585109 ");
RECV(":server 367 alice #test nick1!user1@host1 nick2!user2@host2 "
"1205585109 ");
CHECK_CHAN("--",
"[#test] [3] nick1!user1_red@host1_red banned "
"by nick2 (user2_red@host2_red) on Sat, 15 Mar 2008 12:45:09",
"[#test] [3] nick1!user1@host1 banned "
"by nick2 (user2@host2) on Sat, 15 Mar 2008 12:45:09",
"irc_367,irc_numeric,nick_server,log3");
/* channel not found */
RECV(":server 367 alice #xyz nick1!user1_\00304red@host1_\00304red");
CHECK_SRV("--", "[#xyz] nick1!user1_red@host1_red banned",
RECV(":server 367 alice #xyz nick1!user1@host1");
CHECK_SRV("--", "[#xyz] nick1!user1@host1 banned",
"irc_367,irc_numeric,nick_server,log3");
RECV(":server 367 alice #xyz nick1!user1_\00304red@host1_\00304red "
"nick2!user2_\00304red@host2_\00304red");
CHECK_SRV("--", "[#xyz] nick1!user1_red@host1_red banned by nick2 (user2_red@host2_red)",
RECV(":server 367 alice #xyz nick1!user1@host1 nick2!user2@host2");
CHECK_SRV("--", "[#xyz] nick1!user1@host1 banned by nick2 (user2@host2)",
"irc_367,irc_numeric,nick_server,log3");
RECV(":server 367 alice #xyz nick1!user1_\00304red@host1_\00304red "
"nick2!user2_\00304red@host2_\00304red 1205585109");
CHECK_SRV("--", "[#xyz] nick1!user1_red@host1_red banned by nick2 (user2_red@host2_red) "
RECV(":server 367 alice #xyz nick1!user1@host1 nick2!user2@host2 "
"1205585109");
CHECK_SRV("--", "[#xyz] nick1!user1@host1 banned by nick2 (user2@host2) "
"on Sat, 15 Mar 2008 12:45:09",
"irc_367,irc_numeric,nick_server,log3");
}
@@ -7226,30 +7208,29 @@ TEST(IrcProtocolWithServer, 728)
RECV(":server 728 alice #test q");
CHECK_ERROR_PARAMS("728", 3, 4);
RECV(":server 728 alice #test q nick1!user1_\00304red@host1_\00304red");
CHECK_CHAN("--", "[#test] nick1!user1_red@host1_red quieted",
RECV(":server 728 alice #test q nick1!user1@host1");
CHECK_CHAN("--", "[#test] nick1!user1@host1 quieted",
"irc_728,irc_numeric,nick_server,log3");
RECV(":server 728 alice #test q nick1!user1_\00304red@host1_\00304red "
"alice!user_\00304red@host_\00304red");
CHECK_CHAN("--", "[#test] nick1!user1_red@host1_red quieted by alice (user_red@host_red)",
RECV(":server 728 alice #test q nick1!user1@host1 alice!user@host");
CHECK_CHAN("--", "[#test] nick1!user1@host1 quieted by alice (user@host)",
"irc_728,irc_numeric,nick_server,log3");
RECV(":server 728 alice #test q nick1!user1_\00304red@host1_\00304red "
"alice!user_\00304red@host_\00304red 1351350090 ");
RECV(":server 728 alice #test q nick1!user1@host1 alice!user@host "
"1351350090 ");
CHECK_CHAN("--",
"[#test] nick1!user1_red@host1_red quieted by alice (user_red@host_red) "
"[#test] nick1!user1@host1 quieted by alice (user@host) "
"on Sat, 27 Oct 2012 15:01:30",
"irc_728,irc_numeric,nick_server,log3");
/* channel not found */
RECV(":server 728 alice #xyz q nick1!user1_\00304red@host1_\00304red");
CHECK_SRV("--", "[#xyz] nick1!user1_red@host1_red quieted",
RECV(":server 728 alice #xyz q nick1!user1@host1");
CHECK_SRV("--", "[#xyz] nick1!user1@host1 quieted",
"irc_728,irc_numeric,nick_server,log3");
RECV(":server 728 alice #xyz q nick1!user1_\00304red@host1_\00304red alice!user_\00304red@host_\00304red");
CHECK_SRV("--", "[#xyz] nick1!user1_red@host1_red quieted by alice (user_red@host_red)",
RECV(":server 728 alice #xyz q nick1!user1@host1 alice!user@host");
CHECK_SRV("--", "[#xyz] nick1!user1@host1 quieted by alice (user@host)",
"irc_728,irc_numeric,nick_server,log3");
RECV(":server 728 alice #xyz q nick1!user1_\00304red@host1_\00304red alice!user_\00304red@host_\00304red "
RECV(":server 728 alice #xyz q nick1!user1@host1 alice!user@host "
"1351350090 ");
CHECK_SRV("--", "[#xyz] nick1!user1_red@host1_red quieted by alice (user_red@host_red) "
CHECK_SRV("--", "[#xyz] nick1!user1@host1 quieted by alice (user@host) "
"on Sat, 27 Oct 2012 15:01:30",
"irc_728,irc_numeric,nick_server,log3");
}
@@ -321,23 +321,14 @@ TEST(RelayApiProtocolWithClient, CbHandshake)
/* unknown password hash algorithm */
test_client_recv_http ("POST /api/handshake", NULL,
"{\"password_hash_algo\": [\"invalid\"]}");
STRCMP_EQUAL("HTTP/1.1 400 Bad Request\r\n"
STRCMP_EQUAL("HTTP/1.1 200 OK\r\n"
"Access-Control-Allow-Origin: *\r\n"
"Content-Type: application/json; charset=utf-8\r\n"
"Content-Length: 48\r\n"
"Content-Length: 74\r\n"
"\r\n"
"{\"error\":\"Hash algorithm \\\"invalid\\\" not found\"}",
data_sent[0]);
/* invalid password hash algorithm */
test_client_recv_http ("POST /api/handshake", NULL,
"{\"password_hash_algo\": [{}]}");
STRCMP_EQUAL("HTTP/1.1 400 Bad Request\r\n"
"Access-Control-Allow-Origin: *\r\n"
"Content-Type: application/json; charset=utf-8\r\n"
"Content-Length: 34\r\n"
"\r\n"
"{\"error\":\"Invalid hash algorithm\"}",
"{\"password_hash_algo\":null,"
"\"password_hash_iterations\":100000,"
"\"totp\":false}",
data_sent[0]);
/* two supported hash algorithms */
@@ -973,7 +964,7 @@ TEST(RelayApiProtocolWithClient, RecvJson)
TEST(RelayApiProtocolWithClient, RecvHttp404)
{
/* resource not found: error 404 */
test_client_recv_http ("GET /", NULL, NULL);
test_client_recv_http ("GET / HTTP/1.1", NULL, NULL);
STRCMP_EQUAL("HTTP/1.1 404 Not Found\r\n"
"Access-Control-Allow-Origin: *\r\n"
"Content-Type: application/json; charset=utf-8\r\n"
@@ -983,7 +974,7 @@ TEST(RelayApiProtocolWithClient, RecvHttp404)
data_sent[0]);
/* resource not found: error 404 */
test_client_recv_http ("GET /unknown", NULL, NULL);
test_client_recv_http ("GET /unknown HTTP/1.1", NULL, NULL);
STRCMP_EQUAL("HTTP/1.1 404 Not Found\r\n"
"Access-Control-Allow-Origin: *\r\n"
"Content-Type: application/json; charset=utf-8\r\n"
@@ -993,7 +984,7 @@ TEST(RelayApiProtocolWithClient, RecvHttp404)
data_sent[0]);
/* resource not found: error 404 */
test_client_recv_http ("GET /unknown/abc", NULL, NULL);
test_client_recv_http ("GET /unknown/abc HTTP/1.1", NULL, NULL);
STRCMP_EQUAL("HTTP/1.1 404 Not Found\r\n"
"Access-Control-Allow-Origin: *\r\n"
"Content-Type: application/json; charset=utf-8\r\n"
@@ -1003,7 +994,7 @@ TEST(RelayApiProtocolWithClient, RecvHttp404)
data_sent[0]);
/* resource not found: error 404 */
test_client_recv_http ("GET /api", NULL, NULL);
test_client_recv_http ("GET /api HTTP/1.1", NULL, NULL);
STRCMP_EQUAL("HTTP/1.1 404 Not Found\r\n"
"Access-Control-Allow-Origin: *\r\n"
"Content-Type: application/json; charset=utf-8\r\n"
@@ -1013,7 +1004,7 @@ TEST(RelayApiProtocolWithClient, RecvHttp404)
data_sent[0]);
/* resource not found: error 404 */
test_client_recv_http ("GET /api/unknown", NULL, NULL);
test_client_recv_http ("GET /api/unknown HTTP/1.1", NULL, NULL);
STRCMP_EQUAL("HTTP/1.1 404 Not Found\r\n"
"Access-Control-Allow-Origin: *\r\n"
"Content-Type: application/json; charset=utf-8\r\n"
@@ -1031,7 +1022,7 @@ TEST(RelayApiProtocolWithClient, RecvHttp404)
TEST(RelayApiProtocolWithClient, RecvHttpMissingPassword)
{
/* unauthorized: missing password */
test_client_recv_http_raw ("GET /api/version\r\n"
test_client_recv_http_raw ("GET /api/version HTTP/1.1\r\n"
"\r\n");
STRCMP_EQUAL("HTTP/1.1 401 Unauthorized\r\n"
"Access-Control-Allow-Origin: *\r\n"
@@ -1050,7 +1041,7 @@ TEST(RelayApiProtocolWithClient, RecvHttpMissingPassword)
TEST(RelayApiProtocolWithClient, RecvHttpInvalidPassword)
{
/* unauthorized: invalid password: "plain:invalid" */
test_client_recv_http_raw ("GET /api/version\r\n"
test_client_recv_http_raw ("GET /api/version HTTP/1.1\r\n"
"Authorization: Basic cGxhaW46aW52YWxpZA==\r\n"
"\r\n");
STRCMP_EQUAL("HTTP/1.1 401 Unauthorized\r\n"
@@ -1061,44 +1052,3 @@ TEST(RelayApiProtocolWithClient, RecvHttpInvalidPassword)
"{\"error\":\"Invalid password\"}",
data_sent[0]);
}
/*
* Tests functions:
* relay_api_protocol_recv_http (method not allowed)
*/
TEST(RelayApiProtocolWithClient, RecvHttpMethodNotAllowed)
{
/* method not allowed (PATCH) with existing resource (/api/ping) */
test_client_recv_http ("PATCH /api/ping", NULL, "{\"data\": \"abcdef\"}");
STRCMP_EQUAL("HTTP/1.1 405 Method Not Allowed\r\n"
"Allow: GET, POST, PUT, DELETE\r\n"
"Access-Control-Allow-Origin: *\r\n"
"Content-Type: application/json; charset=utf-8\r\n"
"Content-Length: 30\r\n"
"\r\n"
"{\"error\":\"Method Not Allowed\"}",
data_sent[0]);
/* method not allowed (PATCH) with unknown resource (/api/unknown) */
test_client_recv_http ("PATCH /api/unknown", NULL, "{\"data\": \"abcdef\"}");
STRCMP_EQUAL("HTTP/1.1 405 Method Not Allowed\r\n"
"Allow: GET, POST, PUT, DELETE\r\n"
"Access-Control-Allow-Origin: *\r\n"
"Content-Type: application/json; charset=utf-8\r\n"
"Content-Length: 30\r\n"
"\r\n"
"{\"error\":\"Method Not Allowed\"}",
data_sent[0]);
/* method not allowed (PATCH) with unknown resource (/unknown) */
test_client_recv_http ("PATCH /unknown", NULL, "{\"data\": \"abcdef\"}");
STRCMP_EQUAL("HTTP/1.1 405 Method Not Allowed\r\n"
"Allow: GET, POST, PUT, DELETE\r\n"
"Access-Control-Allow-Origin: *\r\n"
"Content-Type: application/json; charset=utf-8\r\n"
"Content-Length: 30\r\n"
"\r\n"
"{\"error\":\"Method Not Allowed\"}",
data_sent[0]);
}
+89
View File
@@ -0,0 +1,89 @@
#!/bin/sh
#
# SPDX-FileCopyrightText: 2024-2025 Sébastien Helleu <flashcode@flashtux.org>
#
# SPDX-License-Identifier: GPL-3.0-or-later
#
# This file is part of WeeChat, the extensible chat client.
#
# WeeChat is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# WeeChat is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with WeeChat. If not, see <https://www.gnu.org/licenses/>.
#
#
# Test WeeChat relay HTTP REST API.
#
# Environment variables that can be used:
#
# RELAY_PASSWORD Password for WeeChat relay
#
set -o errexit
# default values for options from environment variables
default_relay_password="test"
usage ()
{
rc=$1
cat <<-EOF
Syntax: $0 url
url URL of the running WeeChat with relay api (without "/api")
Environment variables used:
RELAY_PASSWORD password for the relay (default: "${default_relay_password}")
Example:
RELAY_PASSWORD="test" $0 http://localhost:9000
EOF
exit "${rc}"
}
error_usage ()
{
echo >&2 "ERROR: $*"
usage 1
}
# ================================== START ==================================
# relay password
[ -z "${RELAY_PASSWORD}" ] && RELAY_PASSWORD="${default_relay_password}"
# check command line arguments
if [ $# -eq 0 ]; then
usage 0
fi
if [ $# -lt 1 ]; then
error_usage "missing arguments"
fi
# command line arguments
url="$1"
schemathesis run \
--checks all \
--show-trace \
--validate-schema=true \
--experimental=openapi-3.1 \
--base-url "${url}/api" \
--auth "plain:${RELAY_PASSWORD}" \
./src/plugins/relay/api/weechat-relay-api.yaml \
;
exit 0
+2 -2
View File
@@ -41,8 +41,8 @@
# devel-number the devel version as hex number ("0x04010000" for "4.1.0-dev")
#
weechat_stable="4.7.2"
weechat_devel="4.7.3-dev"
weechat_stable="4.6.3"
weechat_devel="4.7.0-dev"
stable_major=$(echo "${weechat_stable}" | cut -d"." -f1)
stable_minor=$(echo "${weechat_stable}" | cut -d"." -f2)