diff options
| -rw-r--r-- | LICENSE.txt | 2 | ||||
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | debian/changelog | 6 | ||||
| -rw-r--r-- | debian/copyright | 2 | ||||
| -rw-r--r-- | libcommon/Makefile | 3 | ||||
| -rw-r--r-- | libcommon/url.cpp | 32 | ||||
| -rw-r--r-- | libcommon/url.h | 6 | ||||
| -rw-r--r-- | plugins/static-files/static-files.cpp | 3 | ||||
| -rw-r--r-- | plugins/webbox/webbox.cpp | 33 | ||||
| -rw-r--r-- | webserver.1 | 2 | ||||
| -rw-r--r-- | webserver.conf | 8 | 
11 files changed, 63 insertions, 36 deletions
diff --git a/LICENSE.txt b/LICENSE.txt index b868bb7..89ed2c4 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright 2020 Roland Reichwein +Copyright 2021 Roland Reichwein  Redistribution and use in source and binary forms, with or without  modification, are permitted provided that the following conditions are met: @@ -165,6 +165,8 @@ DISTFILES= \  	libcommon/stringutil.cpp \  	libcommon/tempfile.h \  	libcommon/tempfile.cpp \ +	libcommon/url.h \ +	libcommon/url.cpp \  	plugins/cgi/cgi.h \  	plugins/cgi/Makefile \  	plugins/cgi/cgi.cpp \ diff --git a/debian/changelog b/debian/changelog index cb34ab9..ba76792 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +webserver (1.14) unstable; urgency=medium + +  * Bugfix: URL decoding in static files plugin + + -- Roland Reichwein <mail@reichwein.it>  Fri, 24 Sep 2021 10:47:07 +0200 +  webserver (1.13) unstable; urgency=medium    * Code cleanup (Boost tests instead of google tests) diff --git a/debian/copyright b/debian/copyright index 4b3a1b3..8e3ebb6 100644 --- a/debian/copyright +++ b/debian/copyright @@ -1,4 +1,4 @@ -This package is Copyright 2020 by Roland Reichwein <mail@reichwein.it> +This package is Copyright 2021 by Roland Reichwein <mail@reichwein.it>  Both upstream source code and Debian packaging is licensed under the BSD  license: diff --git a/libcommon/Makefile b/libcommon/Makefile index d3d781d..ddff9fc 100644 --- a/libcommon/Makefile +++ b/libcommon/Makefile @@ -10,7 +10,8 @@ PROGSRC=\      file.cpp \      mime.cpp \      stringutil.cpp \ -    tempfile.cpp +    tempfile.cpp \ +    url.cpp  SRC=$(PROGSRC) diff --git a/libcommon/url.cpp b/libcommon/url.cpp new file mode 100644 index 0000000..5baf603 --- /dev/null +++ b/libcommon/url.cpp @@ -0,0 +1,32 @@ +#include "url.h" + +std::string urlDecode(std::string s) +{ + std::string result; + + size_t pos = 0; + while (pos < s.size()) { +  char c {s[pos]}; +  if (c == '+') { +   result += ' '; +  } else if (c == '%' && pos + 2 < s.size()) { +   try { +    int i = stoi(s.substr(pos + 1, 2), 0, 16); +    if (i < 0 || i > 255) +     return result; + +    result += static_cast<char>(i); +   } catch (...) { +    return result; +   } + +   pos += 2; +  } else { +   result += c; +  } +  pos++; + } + + return result; +} + diff --git a/libcommon/url.h b/libcommon/url.h new file mode 100644 index 0000000..bd60616 --- /dev/null +++ b/libcommon/url.h @@ -0,0 +1,6 @@ +#pragma once + +#include <string> + +std::string urlDecode(std::string s); + diff --git a/plugins/static-files/static-files.cpp b/plugins/static-files/static-files.cpp index b2dcdca..ad78e48 100644 --- a/plugins/static-files/static-files.cpp +++ b/plugins/static-files/static-files.cpp @@ -1,6 +1,7 @@  #include "static-files.h"  #include "libcommon/mime.h" +#include "libcommon/url.h"  #include <boost/algorithm/string/predicate.hpp> @@ -81,7 +82,7 @@ std::string static_files_plugin::generate_page(    if (pos != target.npos)     target = target.substr(0, pos); -  std::string rel_target{GetRequestParam("rel_target")}; +  std::string rel_target{urlDecode(GetRequestParam("rel_target"))};    pos = rel_target.find('?');    if (pos != rel_target.npos)     rel_target = rel_target.substr(0, pos); diff --git a/plugins/webbox/webbox.cpp b/plugins/webbox/webbox.cpp index 26d49c8..c8e4b38 100644 --- a/plugins/webbox/webbox.cpp +++ b/plugins/webbox/webbox.cpp @@ -4,6 +4,7 @@  #include "libcommon/tempfile.h"  #include "libcommon/file.h"  #include "libcommon/stringutil.h" +#include "libcommon/url.h"  #include <boost/algorithm/string/predicate.hpp>  #include <boost/algorithm/string/replace.hpp> @@ -45,36 +46,6 @@ namespace {    { "500", "Internal Server Error" }   }; - std::string urlDecode(std::string s) - { -  std::string result; - -  size_t pos = 0; -  while (pos < s.size()) { -   char c {s[pos]}; -   if (c == '+') { -    result += ' '; -   } else if (c == '%' && pos + 2 < s.size()) { -    try { -     int i = stoi(s.substr(pos + 1, 2), 0, 16); -     if (i < 0 || i > 255) -      return result; - -     result += static_cast<char>(i); -    } catch (...) { -     return result; -    } - -    pos += 2; -   } else { -    result += c; -   } -   pos++; -  } - -  return result; - } -   std::unordered_map<std::string, std::string> ParseQueryString(const std::string& s, const std::string& webboxPath)   {    std::unordered_map<std::string, std::string> result; @@ -376,7 +347,7 @@ protected:   virtual std::string start(CommandParameters& p)   {    p.m_SetResponseHeader("content_type", "text/plain"); -  return p.m_GetServerParam("version") + "<br/>(C) 2020 <a href=\"https://www.reichwein.it/\">Reichwein.IT</a>"; +  return p.m_GetServerParam("version") + "<br/>(C) 2021 <a href=\"https://www.reichwein.it/\">Reichwein.IT</a>";   }  }; diff --git a/webserver.1 b/webserver.1 index 39da1eb..c1c4245 100644 --- a/webserver.1 +++ b/webserver.1 @@ -1,4 +1,4 @@ -.TH webserver 1 "30 April 2020" "Version 1.3" "Webserver Manual" +.TH webserver 1 "30 April 2021" "Version 1.14" "Webserver Manual"  .SH NAME  webserver \- A small webserver diff --git a/webserver.conf b/webserver.conf index 9ff0b0e..5e97cd2 100644 --- a/webserver.conf +++ b/webserver.conf @@ -16,6 +16,8 @@     <host>ip6-localhost</host>     <host>127.0.0.1</host>     <host>[::1]</host> +   <host>reichwein.mooo.com</host> +   <host>[2001:a61:410:c001:5e51:4fff:fea2:ec7f]</address>     <path requested="/">      <plugin>static-files</plugin> @@ -134,6 +136,12 @@    </socket>    <socket> +   <address>2001:a61:410:c001:5e51:4fff:fea2:ec7f</address> +   <port>80</port> +   <protocol>http</protocol> +   <site>antcom.de</site> +  </socket> +  <socket>     <address>::1</address>     <port>8080</port>     <protocol>http</protocol>  | 
