Fix how address is logged when a wrong password is supplied
[oweals/minetest.git] / src / convert_json.cpp
index 7a69071ef2f3064c031cb9567b53e946dcb29b42..e03508e21fe2d0a77a76013d3f3a79a3168c9a0c 100644 (file)
@@ -25,74 +25,42 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "mods.h"
 #include "config.h"
 #include "log.h"
+#include "settings.h"
+#include "httpfetch.h"
+#include "porting.h"
 
-#if USE_CURL
-#include <curl/curl.h>
-
-static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp)
+Json::Value fetchJsonValue(const std::string &url,
+               std::vector<std::string> *extra_headers)
 {
-    ((std::string*)userp)->append((char*)contents, size * nmemb);
-    return size * nmemb;
-}
-
-#endif
-
-Json::Value                 fetchJsonValue(const std::string url,
-                                                                                                       struct curl_slist *chunk) {
-#if USE_CURL
-       std::string liststring;
-       CURL *curl;
-
-       curl = curl_easy_init();
-       if (curl)
-       {
-               CURLcode res;
+       HTTPFetchRequest fetch_request;
+       HTTPFetchResult fetch_result;
+       fetch_request.url = url;
+       fetch_request.caller = HTTPFETCH_SYNC;
 
-               curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
-               curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
-               curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
-               curl_easy_setopt(curl, CURLOPT_WRITEDATA, &liststring);
+       if (extra_headers != NULL)
+               fetch_request.extra_headers = *extra_headers;
 
-               if (chunk != 0)
-                       curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
+       httpfetch_sync(fetch_request, fetch_result);
 
-
-               res = curl_easy_perform(curl);
-               if (res != CURLE_OK)
-                       errorstream<<"Jsonreader: "<< url <<" not found (internet connection?)"<<std::endl;
-               curl_easy_cleanup(curl);
+       if (!fetch_result.succeeded) {
+               return Json::Value();
        }
-
        Json::Value root;
        Json::Reader reader;
-       std::istringstream stream(liststring);
-       if (!liststring.size()) {
-               return Json::Value();
-       }
+       std::istringstream stream(fetch_result.data);
 
-       if (!reader.parse( stream, root ) )
-       {
+       if (!reader.parse(stream, root)) {
                errorstream << "URL: " << url << std::endl;
                errorstream << "Failed to parse json data " << reader.getFormattedErrorMessages();
-               errorstream << "data: \"" << liststring << "\"" << std::endl;
+               errorstream << "data: \"" << fetch_result.data << "\"" << std::endl;
                return Json::Value();
        }
 
-       if (root.isArray()) {
-               return root;
-       }
-       if ((root["list"].isArray())) {
-               return root["list"];
-       }
-       else {
-               return root;
-       }
-#endif
-       return Json::Value();
+       return root;
 }
 
 std::vector<ModStoreMod>    readModStoreList(Json::Value& modlist) {
-       std::vector<ModStoreMod> retval;
+               std::vector<ModStoreMod> retval;
 
        if (modlist.isArray()) {
                for (unsigned int i = 0; i < modlist.size(); i++)
@@ -102,15 +70,20 @@ std::vector<ModStoreMod>    readModStoreList(Json::Value& modlist) {
 
                        //id
                        if (modlist[i]["id"].asString().size()) {
-                               const char* id_raw = modlist[i]["id"].asString().c_str();
+                               std::string id_raw = modlist[i]["id"].asString();
                                char* endptr = 0;
-                               int numbervalue = strtol(id_raw,&endptr,10);
+                               int numbervalue = strtol(id_raw.c_str(),&endptr,10);
 
-                               if ((*id_raw != 0) && (*endptr == 0)) {
+                               if ((id_raw != "") && (*endptr == 0)) {
                                        toadd.id = numbervalue;
                                }
+                               else {
+                                       errorstream << "readModStoreList: missing id" << std::endl;
+                                       toadd.valid = false;
+                               }
                        }
                        else {
+                               errorstream << "readModStoreList: missing id" << std::endl;
                                toadd.valid = false;
                        }
 
@@ -119,6 +92,7 @@ std::vector<ModStoreMod>    readModStoreList(Json::Value& modlist) {
                                toadd.title = modlist[i]["title"].asString();
                        }
                        else {
+                               errorstream << "readModStoreList: missing title" << std::endl;
                                toadd.valid = false;
                        }
 
@@ -127,6 +101,7 @@ std::vector<ModStoreMod>    readModStoreList(Json::Value& modlist) {
                                toadd.basename = modlist[i]["basename"].asString();
                        }
                        else {
+                               errorstream << "readModStoreList: missing basename" << std::endl;
                                toadd.valid = false;
                        }
 
@@ -157,15 +132,16 @@ ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
                        ModStoreVersionEntry toadd;
 
                        if (details["version_set"][i]["id"].asString().size()) {
-                               const char* id_raw = details["version_set"][i]["id"].asString().c_str();
+                               std::string id_raw = details["version_set"][i]["id"].asString();
                                char* endptr = 0;
-                               int numbervalue = strtol(id_raw,&endptr,10);
+                               int numbervalue = strtol(id_raw.c_str(),&endptr,10);
 
-                               if ((*id_raw != 0) && (*endptr == 0)) {
+                               if ((id_raw != "") && (*endptr == 0)) {
                                        toadd.id = numbervalue;
                                }
                        }
                        else {
+                               errorstream << "readModStoreModDetails: missing version_set id" << std::endl;
                                retval.valid = false;
                        }
 
@@ -179,6 +155,7 @@ ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
                                toadd.file = details["version_set"][i]["file"].asString();
                        }
                        else {
+                               errorstream << "readModStoreModDetails: missing version_set file" << std::endl;
                                retval.valid = false;
                        }
 
@@ -196,6 +173,7 @@ ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
        }
 
        if (retval.versions.size() < 1) {
+               infostream << "readModStoreModDetails: not a single version specified!" << std::endl;
                retval.valid = false;
        }
 
@@ -206,21 +184,23 @@ ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
 
                        if (details["categories"][i]["id"].asString().size()) {
 
-                               const char* id_raw = details["categories"][i]["id"].asString().c_str();
+                               std::string id_raw = details["categories"][i]["id"].asString();
                                char* endptr = 0;
-                               int numbervalue = strtol(id_raw,&endptr,10);
+                               int numbervalue = strtol(id_raw.c_str(),&endptr,10);
 
-                               if ((*id_raw != 0) && (*endptr == 0)) {
+                               if ((id_raw != "") && (*endptr == 0)) {
                                        toadd.id = numbervalue;
                                }
                        }
                        else {
+                               errorstream << "readModStoreModDetails: missing categories id" << std::endl;
                                retval.valid = false;
                        }
                        if (details["categories"][i]["title"].asString().size()) {
                                toadd.name = details["categories"][i]["title"].asString();
                        }
                        else {
+                               errorstream << "readModStoreModDetails: missing categories title" << std::endl;
                                retval.valid = false;
                        }
 
@@ -237,18 +217,20 @@ ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
        if (details["author"].isObject()) {
                if (details["author"]["id"].asString().size()) {
 
-                       const char* id_raw = details["author"]["id"].asString().c_str();
+                       std::string id_raw = details["author"]["id"].asString();
                        char* endptr = 0;
-                       int numbervalue = strtol(id_raw,&endptr,10);
+                       int numbervalue = strtol(id_raw.c_str(),&endptr,10);
 
-                       if ((*id_raw != 0) && (*endptr == 0)) {
+                       if ((id_raw != "") && (*endptr == 0)) {
                                retval.author.id = numbervalue;
                        }
                        else {
+                               errorstream << "readModStoreModDetails: missing author id (convert)" << std::endl;
                                retval.valid = false;
                        }
                }
                else {
+                       errorstream << "readModStoreModDetails: missing author id" << std::endl;
                        retval.valid = false;
                }
 
@@ -256,10 +238,12 @@ ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
                        retval.author.username = details["author"]["username"].asString();
                }
                else {
+                       errorstream << "readModStoreModDetails: missing author username" << std::endl;
                        retval.valid = false;
                }
        }
        else {
+               errorstream << "readModStoreModDetails: missing author" << std::endl;
                retval.valid = false;
        }
 
@@ -267,15 +251,16 @@ ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
        if (details["license"].isObject()) {
                if (details["license"]["id"].asString().size()) {
 
-                       const char* id_raw = details["license"]["id"].asString().c_str();
+                       std::string id_raw = details["license"]["id"].asString();
                        char* endptr = 0;
-                       int numbervalue = strtol(id_raw,&endptr,10);
+                       int numbervalue = strtol(id_raw.c_str(),&endptr,10);
 
-                       if ((*id_raw != 0) && (*endptr == 0)) {
+                       if ((id_raw != "") && (*endptr == 0)) {
                                retval.license.id = numbervalue;
                        }
                }
                else {
+                       errorstream << "readModStoreModDetails: missing license id" << std::endl;
                        retval.valid = false;
                }
 
@@ -283,6 +268,7 @@ ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
                        retval.license.shortinfo = details["license"]["short"].asString();
                }
                else {
+                       errorstream << "readModStoreModDetails: missing license short" << std::endl;
                        retval.valid = false;
                }
 
@@ -292,18 +278,52 @@ ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
 
        }
 
+       //titlepic
+       if (details["titlepic"].isObject()) {
+               if (details["titlepic"]["id"].asString().size()) {
+
+                       std::string id_raw = details["titlepic"]["id"].asString();
+                       char* endptr = 0;
+                       int numbervalue = strtol(id_raw.c_str(),&endptr,10);
+
+                       if ((id_raw != "") && (*endptr == 0)) {
+                               retval.titlepic.id = numbervalue;
+                       }
+               }
+
+               if (details["titlepic"]["file"].asString().size()) {
+                       retval.titlepic.file = details["titlepic"]["file"].asString();
+               }
+
+               if (details["titlepic"]["desc"].asString().size()) {
+                       retval.titlepic.description = details["titlepic"]["desc"].asString();
+               }
+
+               if (details["titlepic"]["mod"].asString().size()) {
+
+                       std::string mod_raw = details["titlepic"]["mod"].asString();
+                       char* endptr = 0;
+                       int numbervalue = strtol(mod_raw.c_str(),&endptr,10);
+
+                       if ((mod_raw != "") && (*endptr == 0)) {
+                               retval.titlepic.mod = numbervalue;
+                       }
+               }
+       }
+
        //id
        if (details["id"].asString().size()) {
 
-               const char* id_raw = details["id"].asString().c_str();
+               std::string id_raw = details["id"].asString();
                char* endptr = 0;
-               int numbervalue = strtol(id_raw,&endptr,10);
+               int numbervalue = strtol(id_raw.c_str(),&endptr,10);
 
-               if ((*id_raw != 0) && (*endptr == 0)) {
+               if ((id_raw != "") && (*endptr == 0)) {
                        retval.id = numbervalue;
                }
        }
        else {
+               errorstream << "readModStoreModDetails: missing id" << std::endl;
                retval.valid = false;
        }
 
@@ -312,6 +332,7 @@ ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
                retval.title = details["title"].asString();
        }
        else {
+               errorstream << "readModStoreModDetails: missing title" << std::endl;
                retval.valid = false;
        }
 
@@ -320,6 +341,7 @@ ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
                retval.basename = details["basename"].asString();
        }
        else {
+               errorstream << "readModStoreModDetails: missing basename" << std::endl;
                retval.valid = false;
        }
 
@@ -334,18 +356,10 @@ ModStoreModDetails          readModStoreModDetails(Json::Value& details) {
        }
 
        //value
-       if (details["rating"].asString().size()) {
-
-               const char* id_raw = details["rating"].asString().c_str();
-               char* endptr = 0;
-               float numbervalue = strtof(id_raw,&endptr);
-
-               if ((*id_raw != 0) && (*endptr == 0)) {
-                       retval.rating = numbervalue;
-               }
-       }
-       else {
-               retval.rating = 0.0;
+       if (details["value"].isInt()) {
+               retval.rating = details["value"].asInt();
+       } else {
+               retval.rating = 0;
        }
 
        //depends