const char* miktex_get_aux_directory() { if (auxDirectory.Empty()) { return nullptr; } else { return auxDirectory.GetData(); } }
bool PackageManagerImpl::TryVerifyInstalledPackage(const string& packageId) { PackageInfo packageInfo = GetPackageInfo(packageId); PathName prefix; if (!session->IsAdminMode() && IsValidTimeT(packageInfo.timeInstalledByUser)) { prefix = session->GetSpecialPath(SpecialPath::UserInstallRoot); } if (prefix.Empty()) { prefix = session->GetSpecialPath(SpecialPath::CommonInstallRoot); } FileDigestTable fileDigests; if (!TryCollectFileDigests(prefix, packageInfo.runFiles, fileDigests) || !TryCollectFileDigests(prefix, packageInfo.docFiles, fileDigests) || !TryCollectFileDigests(prefix, packageInfo.sourceFiles, fileDigests)) { return false; } MD5Builder md5Builder; for (const pair<string, MD5> p : fileDigests) { PathName path(p.first); // we must dosify the path name for backward compatibility path.ConvertToDos(); md5Builder.Update(path.GetData(), path.GetLength()); md5Builder.Update(p.second.data(), p.second.size()); } bool ok = md5Builder.Final() == packageInfo.digest; if (!ok) { trace_mpm->WriteLine(TRACE_FACILITY, fmt::format(T_("package {0} verification failed: some files have been modified"), Q_(packageId))); trace_mpm->WriteLine(TRACE_FACILITY, fmt::format(T_("expected digest: {0}"), packageInfo.digest)); trace_mpm->WriteLine(TRACE_FACILITY, fmt::format(T_("computed digest: {0}"), md5Builder.GetMD5())); } return ok; }