function search()

in webui/js/ponymail.js [4182:4288]


function search(query, date) {
    let list = G_current_list;
    let global = false;
    let domain = G_current_domain;
    if (G_ponymail_search_list == 'global') {
        list = '*';
        domain = '*';
        global = true;
    }
    if (G_ponymail_search_list == 'domain') {
        list = '*';
        global = true;
    }

    let listid = '%s@%s'.format(list, domain);
    G_current_list = list;
    G_current_domain = domain;

    let header_from = document.getElementById('header_from');
    let header_subject = document.getElementById('header_subject');
    let header_to = document.getElementById('header_to');
    let header_body = document.getElementById('header_body');
    let header_messageid = document.getElementById('header_messageid');
    /*
     * See https://github.com/apache/incubator-ponymail-foal/issues/266
     *
     * The newhref URL parameter values should have been encoded.
     * However changing this now might invalidate existing URLs.
     * A work-round is to avoid splitting on '&' alone.
     * We know what parameter names to expect, so can look for them.
     * Also, the split() function discards excess parts, so use indexOf instead.
     */
    let qparts = query.split('&header_'); // look for additional query options (all start with header_)
    if (qparts.length > 0) { // i.e. query + header bits
        query = qparts.shift(); // Keep only the query
        // store the values to be picked up below
        for (let part of qparts) {
            let sep = part.indexOf('='); // find separator
            let key = part.substring(0, sep);
            let value = part.substring(sep+1)
            if (key == 'from') {
                header_from.value = value;
            }
            if (key == 'subject') {
                header_subject.value = value;
            }
            if (key == 'to') {
                header_to.value = value;
            }
            if (key == 'body') {
                header_body.value = value;
            }
            if (key == 'messageid') {
                header_messageid.value = value;
            }
            // N.B. other options are currently ignored
        }
    }
    let newhref = "list?%s:%s:%s".format(listid, date, query);
    let sURL = '%sapi/stats.lua?d=%s&list=%s&domain=%s&q=%s'.format(
        G_apiURL, encodeURIComponent(date), encodeURIComponent(list), encodeURIComponent(domain), encodeURIComponent(query)
        );
    // See above: newhref values should have been encoded, but doing so now might invalidate existing URLs
    if (header_from.value.length > 0) {
        sURL += "&header_from=%s".format(encodeURIComponent(header_from.value));
        newhref += "&header_from=%s".format(header_from.value);
        header_from.value = "";
    }
    if (header_subject.value.length > 0) {
        sURL += "&header_subject=%s".format(encodeURIComponent(header_subject.value));
        newhref += "&header_subject=%s".format(header_subject.value);
        header_subject.value = "";
    }
    if (header_to.value.length > 0) {
        sURL += "&header_to=%s".format(encodeURIComponent(header_to.value));
        newhref += "&header_to=%s".format(header_to.value);
        header_to.value = "";
    }
    if (header_body.value.length > 0) {
        sURL += "&header_body=%s".format(encodeURIComponent(header_body.value));
        newhref += "&header_body=%s".format(header_body.value);
        header_body.value = "";
    }
    if (header_messageid.value.length > 0) {
        sURL += "&header_messageid=%s".format(encodeURIComponent(header_messageid.value));
        newhref += "&header_messageid=%s".format(header_messageid.value);
        header_messageid.value = "";
    }
    GET(sURL, renderListView, {
        search: true,
        global: global
    });
    if (location.href !== newhref) {
        window.history.pushState({}, null, newhref);
    }

    listview_list_lists({
        url: sURL,
        search: true,
        query: query,
        list: list,
        domain: domain
    });
    hideWindows(true);
    document.getElementById('q').value = query;
    return false;
}