QueryData genSafariExtensions(QueryContext& context) { QueryData results; // Iterate over each user auto users = usersFromContext(context); for (const auto& row : users) { if (row.count("uid") > 0 && row.count("directory") > 0) { auto dir = fs::path(row.at("directory")) / kSafariExtensionsPath; // Check that an extensions directory exists. if (!pathExists(dir).ok()) { continue; } // Glob the extension files. std::vector<std::string> paths; if (!resolveFilePattern(dir / kSafariExtensionsPattern, paths).ok()) { continue; } for (const auto& extension_path : paths) { genSafariExtension(row.at("uid"), extension_path, results); } } } return results; }
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 genBrowserPlugins(QueryContext& context) { QueryData results; std::vector<std::string> bundles; // The caller is not requesting a JOIN against users. // This is "special" logic for user data-based tables since there is a concept // of system-available browser extensions. if (context.constraints["uid"].notExistsOrMatches("0")) { std::vector<std::string> bundles; if (listDirectoriesInDirectory(kBrowserPluginsPath, bundles).ok()) { for (const auto& dir : bundles) { genBrowserPlugin("0", dir, results); } } } // Iterate over each user auto users = usersFromContext(context); for (const auto& row : users) { if (row.count("uid") > 0 && row.count("directory") > 0) { std::vector<std::string> bundles; auto dir = fs::path(row.at("directory")) / kBrowserPluginsPath; if (listDirectoriesInDirectory(dir, bundles).ok()) { for (const auto& dir : bundles) { genBrowserPlugin(row.at("uid"), dir, results); } } } } return results; }
QueryData getAuthorizedKeys(QueryContext& context) { QueryData results; // Iterate over each user QueryData users = usersFromContext(context); for (const auto& row : users) { if (row.count("uid") > 0 && row.count("directory") > 0) { genSSHkeysForUser(row.at("uid"), row.at("directory"), results); } } return results; }
QueryData getUserSshKeys(QueryContext& context) { QueryData results; // Iterate over each user auto users = usersFromContext(context); for (const auto& row : users) { auto uid = row.find("uid"); auto gid = row.find("gid"); auto directory = row.find("directory"); if (uid != row.end() && gid != row.end() && directory != row.end()) { genSSHkeyForHosts(uid->second, gid->second, directory->second, results); } } return results; }
QueryData genBrowserPlugins(QueryContext& context) { QueryData results; std::vector<std::string> bundles; // Lambda to walk through each browser plugin and process the plist file. auto enum_browser_plugins = [&results](const fs::path& path, const std::string& uid) { std::vector<std::string> bundles; if (listDirectoriesInDirectory(path, bundles).ok()) { for (const auto& dir : bundles) { genBrowserPlugin(uid, dir, results, false); } } // Check if the plugin is the 'Disabled' folder. std::vector<std::string> disabled_bundles; auto dis_path = path / "Disabled Plug-Ins"; if (listDirectoriesInDirectory(dis_path, disabled_bundles).ok()) { for (const auto& disabled_dir : disabled_bundles) { genBrowserPlugin(uid, disabled_dir, results, true); } } }; // The caller is not requesting a JOIN against users. This is "special" logic // for user data-based tables since there is a concept of system-available // browser extensions. if (context.constraints["uid"].notExistsOrMatches("0")) { enum_browser_plugins(kBrowserPluginsPath, "0"); } // Iterate over each user auto users = usersFromContext(context); for (const auto& row : users) { if (row.count("uid") > 0 && row.count("directory") > 0) { auto dir = fs::path(row.at("directory")) / kBrowserPluginsPath; enum_browser_plugins(dir, row.at("uid")); } } return results; }
QueryData genFirefoxAddons(QueryContext& context) { QueryData results; // Iterate over each user QueryData users = usersFromContext(context); for (const auto& row : users) { if (row.count("uid") > 0 && row.count("directory") > 0) { // For each user, enumerate all of their Firefox profiles. std::vector<std::string> profiles; auto directory = fs::path(row.at("directory")) / kFirefoxPath; if (!listDirectoriesInDirectory(directory, profiles).ok()) { continue; } // Generate an addons list from their extensions JSON. for (const auto& profile : profiles) { genFirefoxAddonsFromExtensions(row.at("uid"), profile, results); } } } return results; }