aboutsummaryrefslogtreecommitdiff
path: root/src/common/updates.cpp
diff options
context:
space:
mode:
authorRiccardo Spagni <ric@spagni.net>2017-02-21 11:16:43 +0200
committerRiccardo Spagni <ric@spagni.net>2017-02-21 11:16:43 +0200
commitd11dbe7dc24c8ab30afc2ce6b004885979ee8be6 (patch)
tree878f7b040b6fa675f6f117b0b7ca285570c4ceb1 /src/common/updates.cpp
parentd2059dfab297c01f0edf35dfb07acf5ebc42543e (diff)
parenta5a0a3c8944f7cd6b5b72aaf2b9c41c7b3c40358 (diff)
downloadmonzero-core-d11dbe7dc24c8ab30afc2ce6b004885979ee8be6.tar.gz
monzero-core-d11dbe7dc24c8ab30afc2ce6b004885979ee8be6.tar.xz
monzero-core-d11dbe7dc24c8ab30afc2ce6b004885979ee8be6.zip
Merge pull request #1744
a5a0a3c8 core: updates can now be downloaded (and SHA256 hash checked) (moneromooo-monero) 216f062e util: add a SHA256 function (moneromooo-monero) 4bf78492 mlog: only silence errors for net by default, not net.* (moneromooo-monero) d282cfcc core: test key images against validity domain (moneromooo-monero) efb72e74 http_client: add a couple consts (moneromooo-monero) f640512c Optionally query moneropulse DNS records to check for updates (moneromooo-monero) e3cae4ae core: display any fork warning at startup too (moneromooo-monero) 969ad710 dns_utils: fix first checked DNS entry being ignored (moneromooo-monero) 08c3f380 util: add a vercmp function to compare version numbers (moneromooo-monero) e8a7525c dns_utils: factor TXT record loading code from checkpoint code (moneromooo-monero)
Diffstat (limited to 'src/common/updates.cpp')
-rw-r--r--src/common/updates.cpp114
1 files changed, 114 insertions, 0 deletions
diff --git a/src/common/updates.cpp b/src/common/updates.cpp
new file mode 100644
index 000000000..936106881
--- /dev/null
+++ b/src/common/updates.cpp
@@ -0,0 +1,114 @@
+// Copyright (c) 2017, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+// conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+// of conditions and the following disclaimer in the documentation and/or other
+// materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+// used to endorse or promote products derived from this software without specific
+// prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "util.h"
+#include "dns_utils.h"
+#include "updates.h"
+
+#undef MONERO_DEFAULT_LOG_CATEGORY
+#define MONERO_DEFAULT_LOG_CATEGORY "updates"
+
+namespace tools
+{
+ bool check_updates(const std::string &software, const std::string &buildtag, bool testnet, std::string &version, std::string &hash)
+ {
+ std::vector<std::string> records;
+ bool found = false;
+
+ MDEBUG("Checking updates for " << buildtag << " " << software);
+
+ // All four MoneroPulse domains have DNSSEC on and valid
+ static const std::vector<std::string> dns_urls = {
+ };
+
+ static const std::vector<std::string> testnet_dns_urls = { "testver.moneropulse.net"
+ };
+
+ if (!tools::dns_utils::load_txt_records_from_dns(records, testnet ? testnet_dns_urls : dns_urls))
+ return false;
+
+ for (const auto& record : records)
+ {
+ std::vector<std::string> fields;
+ boost::split(fields, record, boost::is_any_of(":"));
+ if (fields.size() != 4)
+ {
+ MWARNING("Updates record does not have 4 fields: " << record);
+ continue;
+ }
+
+ if (software != fields[0] || buildtag != fields[1])
+ continue;
+
+ bool alnum = true;
+ for (auto c: hash)
+ if (!isalnum(c))
+ alnum = false;
+ if (hash.size() != 64 && !alnum)
+ {
+ MWARNING("Invalid hash: " << hash);
+ continue;
+ }
+
+ // use highest version
+ if (found)
+ {
+ int cmp = vercmp(version.c_str(), fields[2].c_str());
+ if (cmp > 0)
+ continue;
+ if (cmp == 0 && hash != fields[3])
+ MWARNING("Two matches found for " << software << " version " << version << " on " << buildtag);
+ }
+
+ version = fields[2];
+ hash = fields[3];
+
+ MINFO("Found new version " << version << " with hash " << hash);
+ found = true;
+ }
+ return found;
+ }
+
+ std::string get_update_url(const std::string &software, const std::string &subdir, const std::string &buildtag, const std::string &version)
+ {
+ static const char base[] = "https://downloads.getmonero.org/";
+#ifdef _WIN32
+ static const char extension[] = ".zip";
+#else
+ static const char extension[] = ".tar.bz2";
+#endif
+
+ std::string url;
+
+ url = base;
+ if (!subdir.empty())
+ url += subdir + "/";
+ url = url + software + "-" + buildtag + "-v" + version + extension;
+ return url;
+ }
+}