summaryrefslogtreecommitdiff
path: root/src/ui/documentwidget.c
diff options
context:
space:
mode:
authorJaakko Keränen <jaakko.keranen@iki.fi>2021-05-12 13:39:52 +0300
committerJaakko Keränen <jaakko.keranen@iki.fi>2021-05-12 13:39:52 +0300
commit9a51c0d0a17b9270542fef133040a02868bbaea9 (patch)
treefdbc5a60b171d2618e3bb9391a568f3fa80fce0e /src/ui/documentwidget.c
parent8e2126cae79e8182562d1796b61fefc8ba74f4b8 (diff)
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.
Diffstat (limited to 'src/ui/documentwidget.c')
-rw-r--r--src/ui/documentwidget.c57
1 files changed, 46 insertions, 11 deletions
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) {
1549 refresh_Widget(as_Widget(d)); 1549 refresh_Widget(as_Widget(d));
1550} 1550}
1551 1551
1552static iString *makeQueryUrl_DocumentWidget_(const iDocumentWidget *d,
1553 const iString *userEnteredText) {
1554 iString *url = copy_String(d->mod.url);
1555 /* Remove the existing query string. */
1556 const size_t qPos = indexOfCStr_String(url, "?");
1557 if (qPos != iInvalidPos) {
1558 remove_Block(&url->chars, qPos, iInvalidSize);
1559 }
1560 appendCStr_String(url, "?");
1561 append_String(url, collect_String(urlEncode_String(userEnteredText)));
1562 return url;
1563}
1564
1565static void inputQueryValidator_(iInputWidget *input, void *context) {
1566 iDocumentWidget *d = context;
1567 iString *url = makeQueryUrl_DocumentWidget_(d, text_InputWidget(input));
1568 iWidget *dlg = parent_Widget(input);
1569 iLabelWidget *counter = findChild_Widget(dlg, "valueinput.counter");
1570 iAssert(counter);
1571 int avail = 1024 - (int) size_String(url);
1572 setFlags_Widget(findChild_Widget(dlg, "default"), disabled_WidgetFlag, avail < 0);
1573 setEnterKeyEnabled_InputWidget(input, avail >= 0);
1574 int len = length_String(text_InputWidget(input));
1575 if (len > 1024) {
1576 iString *trunc = copy_String(text_InputWidget(input));
1577 truncate_String(trunc, 1024);
1578 setText_InputWidget(input, trunc);
1579 delete_String(trunc);
1580 }
1581 setTextCStr_LabelWidget(counter, format_CStr("%d", avail)); /* Gemini URL maxlen */
1582 setTextColor_LabelWidget(counter,
1583 avail < 0 ? uiTextCaution_ColorId :
1584 avail < 128 ? uiTextStrong_ColorId
1585 : uiTextDim_ColorId);
1586 delete_String(url);
1587}
1588
1552static void checkResponse_DocumentWidget_(iDocumentWidget *d) { 1589static void checkResponse_DocumentWidget_(iDocumentWidget *d) {
1553 if (!d->request) { 1590 if (!d->request) {
1554 return; 1591 return;
@@ -1578,6 +1615,11 @@ static void checkResponse_DocumentWidget_(iDocumentWidget *d) {
1578 : cstr_String(&resp->meta), 1615 : cstr_String(&resp->meta),
1579 uiTextCaution_ColorEscape "${dlg.input.send}", 1616 uiTextCaution_ColorEscape "${dlg.input.send}",
1580 format_CStr("!document.input.submit doc:%p", d)); 1617 format_CStr("!document.input.submit doc:%p", d));
1618 setId_Widget(addChildPosFlags_Widget(findChild_Widget(dlg, "dialogbuttons"),
1619 iClob(new_LabelWidget("", NULL)),
1620 front_WidgetAddPos, frameless_WidgetFlag),
1621 "valueinput.counter");
1622 setValidator_InputWidget(findChild_Widget(dlg, "input"), inputQueryValidator_, d);
1581 setSensitiveContent_InputWidget(findChild_Widget(dlg, "input"), 1623 setSensitiveContent_InputWidget(findChild_Widget(dlg, "input"),
1582 statusCode == sensitiveInput_GmStatusCode); 1624 statusCode == sensitiveInput_GmStatusCode);
1583 if (document_App() != d) { 1625 if (document_App() != d) {
@@ -2209,17 +2251,10 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd)
2209 return iTrue; 2251 return iTrue;
2210 } 2252 }
2211 else if (equal_Command(cmd, "document.input.submit") && document_Command(cmd) == d) { 2253 else if (equal_Command(cmd, "document.input.submit") && document_Command(cmd) == d) {
2212 iString *value = suffix_Command(cmd, "value"); 2254 postCommandf_Root(w->root,
2213 set_String(value, collect_String(urlEncode_String(value))); 2255 "open url:%s",
2214 iString *url = collect_String(copy_String(d->mod.url)); 2256 cstrCollect_String(makeQueryUrl_DocumentWidget_
2215 const size_t qPos = indexOfCStr_String(url, "?"); 2257 (d, collect_String(suffix_Command(cmd, "value")))));
2216 if (qPos != iInvalidPos) {
2217 remove_Block(&url->chars, qPos, iInvalidSize);
2218 }
2219 appendCStr_String(url, "?");
2220 append_String(url, value);
2221 postCommandf_Root(w->root, "open url:%s", cstr_String(url));
2222 delete_String(value);
2223 return iTrue; 2258 return iTrue;
2224 } 2259 }
2225 else if (equal_Command(cmd, "valueinput.cancelled") && 2260 else if (equal_Command(cmd, "valueinput.cancelled") &&