From 9a51c0d0a17b9270542fef133040a02868bbaea9 Mon Sep 17 00:00:00 2001 From: Jaakko Keränen Date: Wed, 12 May 2021 13:39:52 +0300 Subject: DocumentWidget: Input query length validation Enforce the maximum length of 1024 bytes for Gemini URLs. The input query prompt shows how many bytes are remaining. --- src/ui/documentwidget.c | 57 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 11 deletions(-) (limited to 'src/ui/documentwidget.c') diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c index 4706033a..e138af6f 100644 --- a/src/ui/documentwidget.c +++ b/src/ui/documentwidget.c @@ -1549,6 +1549,43 @@ static void togglePreFold_DocumentWidget_(iDocumentWidget *d, uint16_t preId) { refresh_Widget(as_Widget(d)); } +static iString *makeQueryUrl_DocumentWidget_(const iDocumentWidget *d, + const iString *userEnteredText) { + iString *url = copy_String(d->mod.url); + /* Remove the existing query string. */ + const size_t qPos = indexOfCStr_String(url, "?"); + if (qPos != iInvalidPos) { + remove_Block(&url->chars, qPos, iInvalidSize); + } + appendCStr_String(url, "?"); + append_String(url, collect_String(urlEncode_String(userEnteredText))); + return url; +} + +static void inputQueryValidator_(iInputWidget *input, void *context) { + iDocumentWidget *d = context; + iString *url = makeQueryUrl_DocumentWidget_(d, text_InputWidget(input)); + iWidget *dlg = parent_Widget(input); + iLabelWidget *counter = findChild_Widget(dlg, "valueinput.counter"); + iAssert(counter); + int avail = 1024 - (int) size_String(url); + setFlags_Widget(findChild_Widget(dlg, "default"), disabled_WidgetFlag, avail < 0); + setEnterKeyEnabled_InputWidget(input, avail >= 0); + int len = length_String(text_InputWidget(input)); + if (len > 1024) { + iString *trunc = copy_String(text_InputWidget(input)); + truncate_String(trunc, 1024); + setText_InputWidget(input, trunc); + delete_String(trunc); + } + setTextCStr_LabelWidget(counter, format_CStr("%d", avail)); /* Gemini URL maxlen */ + setTextColor_LabelWidget(counter, + avail < 0 ? uiTextCaution_ColorId : + avail < 128 ? uiTextStrong_ColorId + : uiTextDim_ColorId); + delete_String(url); +} + static void checkResponse_DocumentWidget_(iDocumentWidget *d) { if (!d->request) { return; @@ -1578,6 +1615,11 @@ static void checkResponse_DocumentWidget_(iDocumentWidget *d) { : cstr_String(&resp->meta), uiTextCaution_ColorEscape "${dlg.input.send}", format_CStr("!document.input.submit doc:%p", d)); + setId_Widget(addChildPosFlags_Widget(findChild_Widget(dlg, "dialogbuttons"), + iClob(new_LabelWidget("", NULL)), + front_WidgetAddPos, frameless_WidgetFlag), + "valueinput.counter"); + setValidator_InputWidget(findChild_Widget(dlg, "input"), inputQueryValidator_, d); setSensitiveContent_InputWidget(findChild_Widget(dlg, "input"), statusCode == sensitiveInput_GmStatusCode); if (document_App() != d) { @@ -2209,17 +2251,10 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) return iTrue; } else if (equal_Command(cmd, "document.input.submit") && document_Command(cmd) == d) { - iString *value = suffix_Command(cmd, "value"); - set_String(value, collect_String(urlEncode_String(value))); - iString *url = collect_String(copy_String(d->mod.url)); - const size_t qPos = indexOfCStr_String(url, "?"); - if (qPos != iInvalidPos) { - remove_Block(&url->chars, qPos, iInvalidSize); - } - appendCStr_String(url, "?"); - append_String(url, value); - postCommandf_Root(w->root, "open url:%s", cstr_String(url)); - delete_String(value); + postCommandf_Root(w->root, + "open url:%s", + cstrCollect_String(makeQueryUrl_DocumentWidget_ + (d, collect_String(suffix_Command(cmd, "value"))))); return iTrue; } else if (equal_Command(cmd, "valueinput.cancelled") && -- cgit v1.2.3