QueryData genChromeBasedExtensions(QueryContext& context, const fs::path& sub_dir) { QueryData results; auto users = usersFromContext(context); for (const auto& row : users) { if (row.count("uid") > 0 && row.count("directory") > 0) { // For each user, enumerate all of their chrome profiles. std::vector<std::string> profiles; fs::path extension_path = row.at("directory") / sub_dir; if (!resolveFilePattern(extension_path, profiles, GLOB_FOLDERS).ok()) { continue; } // For each profile list each extension in the Extensions directory. std::vector<std::string> extensions; for (const auto& profile : profiles) { listDirectoriesInDirectory(profile, extensions); } // Generate an addons list from their extensions JSON. std::vector<std::string> versions; for (const auto& extension : extensions) { listDirectoriesInDirectory(extension, versions); } // Extensions use /<EXTENSION>/<VERSION>/manifest.json. for (const auto& version : versions) { genExtension(row.at("uid"), version, results); } } } return results; }
QueryData genChromeBasedExtensions(QueryContext& context, const fs::path sub_dir) { QueryData results; auto homes = osquery::getHomeDirectories(); for (const auto& home : homes) { // For each user, enumerate all of their chrome profiles. std::vector<std::string> profiles; fs::path extension_path = home / sub_dir; if (!resolveFilePattern(extension_path, profiles, REC_LIST_FOLDERS).ok()) { continue; } // For each profile list each extension in the Extensions directory. std::vector<std::string> extensions; for (const auto& profile : profiles) { listDirectoriesInDirectory(profile, extensions); } // Generate an addons list from their extensions JSON. std::vector<std::string> versions; for (const auto& extension : extensions) { listDirectoriesInDirectory(extension, versions); } // Extensions use /<EXTENSION>/<VERSION>/manifest.json. for (const auto& version : versions) { genExtension(version, results); } } return results; }