If we aren't doing signature validation, look instead for "release: cygwin" in the setup.ini files. If this fails for an official mirror, reject the mirror. If it fails for a purported private mirror, silently change the status of the site to "user site" and put a note in the log file. This change will take effect on the next setup run or if the user selects 'Back'. --- ini.cc | 29 ++++++++++++++++++++++++----- res.rc | 1 + resource.h | 1 + 3 files changed, 26 insertions(+), 5 deletions(-)
diff --git a/ini.cc b/ini.cc index 62b7e83..3cffa82 100644 --- a/ini.cc +++ b/ini.cc @@ -271,11 +271,15 @@ do_local_ini (HWND owner) } static void -mirror_warn (site_list_type site) +mirror_warn (site_list_type site, bool sig) { - Log (LOG_BABBLE) << "Signature validation failed for " << site.url - << " using the cygwin key but succeeded using other keys. " - << endLog; + if (sig) + Log (LOG_BABBLE) << "Signature validation failed for " << site.url + << " using the cygwin key but succeeded using other keys. " + << endLog; + else + Log (LOG_BABBLE) << "setup.ini from " << site.url + << " is not from the cygwin release." << endLog; Log (LOG_BABBLE) << "Changing status from 'mirror' to 'user site'." << endLog; SiteList::iterator i = find (all_site_list.begin (), all_site_list.end (), site); if (i != all_site_list.end ()) @@ -343,7 +347,7 @@ do_remote_ini (HWND owner) if (ini_file) { if (n->is_mirror && !main_key_only) - mirror_warn (*n); + mirror_warn (*n, true); break; } } @@ -369,6 +373,21 @@ do_remote_ini (HWND owner) } else { + if (NoVerifyOption && n->is_mirror && aBuilder.release != "cygwin") + { + if (n->from_mirrors_lst) + { + // Reject setup.ini. + note (owner, IDS_SETUPINI_NOTCYGWIN, + SetupBaseName.c_str (), n->url.c_str ()); + delete ini_file; + ini_file = NULL; + continue; + } + else + mirror_warn (*n, false); + } + /* save known-good setup.ini locally */ const std::string fp = "file://" + local_dir + "/" + rfc1738_escape_part (n->url) + diff --git a/res.rc b/res.rc index 14f1109..cd202e0 100644 --- a/res.rc +++ b/res.rc @@ -562,6 +562,7 @@ BEGIN IDS_MIRROR_LST "http://cygwin.com/mirrors.lst" IDS_ERR_OPEN_WRITE "Can't open %s for writing: %s" IDS_SETUPINI_MISSING "Unable to get %s from <%s>" + IDS_SETUPINI_NOTCYGWIN "%s from <%s> is not from cygwin release" IDS_OLD_SETUPINI "This setup.ini is older than the one you used last time you installed cygwin. Proceed anyway?" IDS_NOTHING_INSTALLED "Nothing needed to be installed" IDS_INSTALL_COMPLETE "Installation Complete" diff --git a/resource.h b/resource.h index 79575fb..666e93b 100644 --- a/resource.h +++ b/resource.h @@ -39,6 +39,7 @@ #define IDS_ELEVATED 139 #define IDS_INSTALLEDB_VERSION 140 #define IDS_DOWNLOAD_INCOMPLETE_EXIT 141 +#define IDS_SETUPINI_NOTCYGWIN 142 // Dialogs -- 2.15.1