/* * Copyright 2020 Vincent Sanders * * This file is part of NetSurf. * * NetSurf 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; version 2 of the License. * * NetSurf 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 this program. If not, see . */ /** * \file * content generator for the about scheme query privacy page */ #include #include #include #include #include #include #include "utils/errors.h" #include "utils/log.h" #include "utils/messages.h" #include "content/fetch.h" #include "private.h" #include "query_auth.h" /** * generate the description of the login query */ static nserror get_authentication_description(struct nsurl *url, const char *realm, const char *username, const char *password, char **out_str) { nserror res; char *url_s; size_t url_l; char *str = NULL; const char *key; res = nsurl_get(url, NSURL_HOST, &url_s, &url_l); if (res != NSERROR_OK) { return res; } if ((*username == 0) && (*password == 0)) { key = "LoginDescription"; } else { key = "LoginAgain"; } str = messages_get_buff(key, url_s, realm); if (str != NULL) { NSLOG(netsurf, INFO, "key:%s url:%s realm:%s str:%s", key, url_s, realm, str); *out_str = str; } else { res = NSERROR_NOMEM; } free(url_s); return res; } /** * Handler to generate about scheme authentication query page * * \param ctx The fetcher context. * \return true if handled false if aborted. */ bool fetch_about_query_auth_handler(struct fetch_about_context *ctx) { nserror res; char *url_s; size_t url_l; const char *realm = ""; const char *username = ""; const char *password = ""; const char *title; char *description = NULL; struct nsurl *siteurl = NULL; const struct fetch_multipart_data *curmd; /* mutipart data iterator */ /* extract parameters from multipart post data */ curmd = fetch_about_get_multipart(ctx); while (curmd != NULL) { if (strcmp(curmd->name, "siteurl") == 0) { res = nsurl_create(curmd->value, &siteurl); if (res != NSERROR_OK) { return fetch_about_srverror(ctx); } } else if (strcmp(curmd->name, "realm") == 0) { realm = curmd->value; } else if (strcmp(curmd->name, "username") == 0) { username = curmd->value; } else if (strcmp(curmd->name, "password") == 0) { password = curmd->value; } curmd = curmd->next; } if (siteurl == NULL) { return fetch_about_srverror(ctx); } /* content is going to return ok */ fetch_about_set_http_code(ctx, 200); /* content type */ if (fetch_about_send_header(ctx, "Content-Type: text/html; charset=utf-8")) { goto fetch_about_query_auth_handler_aborted; } title = messages_get("LoginTitle"); res = fetch_about_ssenddataf(ctx, "\n\n" "%s\n" "\n" "\n" "\n" "

%s

\n", title, title); if (res != NSERROR_OK) { goto fetch_about_query_auth_handler_aborted; } res = fetch_about_ssenddataf(ctx, "
"); if (res != NSERROR_OK) { goto fetch_about_query_auth_handler_aborted; } res = get_authentication_description(siteurl, realm, username, password, &description); if (res == NSERROR_OK) { res = fetch_about_ssenddataf(ctx, "

%s

", description); free(description); if (res != NSERROR_OK) { goto fetch_about_query_auth_handler_aborted; } } res = fetch_about_ssenddataf(ctx, ""); if (res != NSERROR_OK) { goto fetch_about_query_auth_handler_aborted; } res = fetch_about_ssenddataf(ctx, "" "" "" "", messages_get("Username"), username); if (res != NSERROR_OK) { goto fetch_about_query_auth_handler_aborted; } res = fetch_about_ssenddataf(ctx, "" "" "" "", messages_get("Password"), password); if (res != NSERROR_OK) { goto fetch_about_query_auth_handler_aborted; } res = fetch_about_ssenddataf(ctx, "
"); if (res != NSERROR_OK) { goto fetch_about_query_auth_handler_aborted; } res = fetch_about_ssenddataf(ctx, "
" "" "" "
", messages_get("Login"), messages_get("Cancel")); if (res != NSERROR_OK) { goto fetch_about_query_auth_handler_aborted; } res = nsurl_get(siteurl, NSURL_COMPLETE, &url_s, &url_l); if (res != NSERROR_OK) { url_s = strdup(""); } res = fetch_about_ssenddataf(ctx, "", url_s); free(url_s); if (res != NSERROR_OK) { goto fetch_about_query_auth_handler_aborted; } res = fetch_about_ssenddataf(ctx, "", realm); if (res != NSERROR_OK) { goto fetch_about_query_auth_handler_aborted; } res = fetch_about_ssenddataf(ctx, "
\n\n"); if (res != NSERROR_OK) { goto fetch_about_query_auth_handler_aborted; } fetch_about_send_finished(ctx); nsurl_unref(siteurl); return true; fetch_about_query_auth_handler_aborted: nsurl_unref(siteurl); return false; }