void UserManagerBackend::refreshGroups() { qDebug() << "Refreshing group list..."; groupList.clear(); QFile groupFile(chroot + "/etc/group"); if ( groupFile.open(QIODevice::ReadOnly) ) { QTextStream stream(&groupFile); stream.setCodec("UTF-8"); QString line; while ( !stream.atEnd() ) { line = stream.readLine(); if ((line.indexOf("#") != 0) && (! line.isEmpty())) { //Make sure it isn't a comment or blank QString groupname = line.section(":",0,0); int gid = line.section(":",2,2).toInt(); QString memberString = line.section(":",3,3); QStringList members = memberString.split(","); groupList[gid] = Group(groupname, gid, members); } } } else { //Unable to open file error qWarning("Error! Unable to open /etc/group"); } }
void lmcMessaging::loadGroups(void) { bool defaultFound = false; QSettings groupSettings( groupFile(), QSettings::IniFormat ); int size = groupSettings.beginReadArray(IDS_GROUPHDR); for(int index = 0; index < size; index++) { groupSettings.setArrayIndex(index); QString groupId = groupSettings.value(IDS_GROUP).toString(); QString group = groupSettings.value(IDS_GROUPNAME).toString(); groupList.append(Group(groupId, group)); // check if the default group is present in the group list if(groupId.compare(GRP_DEFAULT_ID) == 0) defaultFound = true; } groupSettings.endArray(); if(groupList.count() == 0 || !defaultFound) groupList.append(Group(GRP_DEFAULT_ID, GRP_DEFAULT)); size = groupSettings.beginReadArray(IDS_GROUPMAPHDR); for(int index = 0; index < size; index++) { groupSettings.setArrayIndex(index); QString user = groupSettings.value(IDS_USER).toString(); QString group = groupSettings.value(IDS_GROUP).toString(); userGroupMap.insert(user, group); } groupSettings.endArray(); }
// save groups and group mapping void lmcMessaging::saveGroups(void) { QSettings groupSettings( groupFile(), QSettings::IniFormat ); groupSettings.beginWriteArray(IDS_GROUPHDR); for(int index = 0; index < groupList.count(); index++) { groupSettings.setArrayIndex(index); groupSettings.setValue(IDS_GROUP, groupList[index].id); groupSettings.setValue(IDS_GROUPNAME, groupList[index].name); } groupSettings.endArray(); groupSettings.beginWriteArray(IDS_GROUPMAPHDR); QMapIterator<QString, QString> i(userGroupMap); int count = 0; while(i.hasNext()) { groupSettings.setArrayIndex(count); i.next(); groupSettings.setValue(IDS_USER, i.key()); groupSettings.setValue(IDS_GROUP, i.value()); count++; } groupSettings.endArray(); groupSettings.sync(); // make sure the correct version is set in the preferences file // so the group settings will not be wrongly migrated next time // application starts pSettings->setValue(IDS_VERSION, IDA_VERSION); }
void InstanceList::saveGroupList() { QString groupFileName = m_instDir + "/instgroups.json"; QFile groupFile(groupFileName); // if you can't open the file, fail if (!groupFile.open(QIODevice::WriteOnly| QIODevice::Truncate)) { // An error occurred. Ignore it. qDebug("Failed to read instance group file."); return; } QTextStream out(&groupFile); QMap<QString, QSet<QString> > groupMap; for(auto instance: m_instances) { QString id = instance->id(); QString group = instance->group(); if(group.isEmpty()) continue; if(!groupMap.count(group)) { QSet<QString> set; set.insert(id); groupMap[group] = set; } else { QSet<QString> &set = groupMap[group]; set.insert(id); } } QJsonObject toplevel; toplevel.insert("formatVersion",QJsonValue(QString("1"))); QJsonObject groupsArr; for(auto iter = groupMap.begin(); iter != groupMap.end(); iter++) { auto list = iter.value(); auto name = iter.key(); QJsonObject groupObj; QJsonArray instanceArr; groupObj.insert("hidden",QJsonValue(QString("false"))); for(auto item: list) { instanceArr.append(QJsonValue(item)); } groupObj.insert("instances",instanceArr); groupsArr.insert(name,groupObj); } toplevel.insert("groups",groupsArr); QJsonDocument doc(toplevel); groupFile.write(doc.toJson()); groupFile.close(); }
InstanceList::InstListError InstanceList::loadList() { QDir dir(m_instDir); QDirIterator iter(dir); QString groupFileName = m_instDir + "/instgroups.json"; // temporary map from instance ID to group name QMap<QString, QString> groupMap; // HACK: this is really an if. breaks after one iteration. while (QFileInfo(groupFileName).exists()) { QFile groupFile(groupFileName); if (!groupFile.open(QIODevice::ReadOnly)) { // An error occurred. Ignore it. qDebug("Failed to read instance group file."); break; } QTextStream in(&groupFile); QString jsonStr = in.readAll(); groupFile.close(); QJsonParseError error; QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonStr.toUtf8(), &error); if (error.error != QJsonParseError::NoError) { qWarning(QString("Failed to parse instance group file: %1 at offset %2"). arg(error.errorString(), QString::number(error.offset)).toUtf8()); break; } if (!jsonDoc.isObject()) { qWarning("Invalid group file. Root entry should be an object."); break; } QJsonObject rootObj = jsonDoc.object(); // Make sure the format version matches. if (rootObj.value("formatVersion").toVariant().toInt() == GROUP_FILE_FORMAT_VERSION) { // Get the group list. if (!rootObj.value("groups").isObject()) { qWarning("Invalid group list JSON: 'groups' should be an object."); break; } // Iterate through the list. QJsonObject groupList = rootObj.value("groups").toObject(); for (QJsonObject::iterator iter = groupList.begin(); iter != groupList.end(); iter++) { QString groupName = iter.key(); // If not an object, complain and skip to the next one. if (!iter.value().isObject()) { qWarning(QString("Group '%1' in the group list should " "be an object.").arg(groupName).toUtf8()); continue; } QJsonObject groupObj = iter.value().toObject(); /* // Create the group object. InstanceGroup *group = new InstanceGroup(groupName, this); groups.push_back(group); // If 'hidden' isn't a bool value, just assume it's false. if (groupObj.value("hidden").isBool() && groupObj.value("hidden").toBool()) { group->setHidden(groupObj.value("hidden").toBool()); } */ if (!groupObj.value("instances").isArray()) { qWarning(QString("Group '%1' in the group list is invalid. " "It should contain an array " "called 'instances'.").arg(groupName).toUtf8()); continue; } // Iterate through the list of instances in the group. QJsonArray instancesArray = groupObj.value("instances").toArray(); for (QJsonArray::iterator iter2 = instancesArray.begin(); iter2 != instancesArray.end(); iter2++) { groupMap[(*iter2).toString()] = groupName; } } } break; } m_instances.clear(); while (iter.hasNext()) { QString subDir = iter.next(); if (QFileInfo(PathCombine(subDir, "instance.cfg")).exists()) { Instance *instPtr = NULL; InstanceLoader::InstLoaderError error = InstanceLoader::get(). loadInstance(instPtr, subDir); if (error != InstanceLoader::NoError && error != InstanceLoader::NotAnInstance) { QString errorMsg = QString("Failed to load instance %1: "). arg(QFileInfo(subDir).baseName()).toUtf8(); switch (error) { default: errorMsg += QString("Unknown instance loader error %1"). arg(error); break; } qDebug(errorMsg.toUtf8()); } else if (!instPtr) { qDebug(QString("Error loading instance %1. Instance loader returned null."). arg(QFileInfo(subDir).baseName()).toUtf8()); } else { QSharedPointer<Instance> inst(instPtr); auto iter = groupMap.find(inst->id()); if(iter != groupMap.end()) { inst->setGroup((*iter)); } qDebug(QString("Loaded instance %1").arg(inst->name()).toUtf8()); inst->setParent(this); m_instances.append(inst); connect(instPtr, SIGNAL(propertiesChanged(Instance*)),this, SLOT(propertiesChanged(Instance*))); } } }
ActionReply Helper::save(QVariantMap args) { ActionReply reply; QString configFileName = GRUB_CONFIG; QByteArray rawConfigFileContents = args.value("rawConfigFileContents").toByteArray(); QByteArray rawDefaultEntry = args.value("rawDefaultEntry").toByteArray(); bool memtest = args.value("memtest").toBool(); bool security = args.value("security").toBool(); QFile::copy(configFileName, configFileName + ".original"); QFile file(configFileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { reply = ActionReply::HelperErrorReply(); reply.addData("errorDescription", file.errorString()); return reply; } file.write(rawConfigFileContents); file.close(); if (args.contains("memtest")) { QFile::Permissions permissions = QFile::permissions(GRUB_MEMTEST); if (memtest) { permissions |= (QFile::ExeOwner | QFile::ExeUser | QFile::ExeGroup | QFile::ExeOther); } else { permissions &= ~(QFile::ExeOwner | QFile::ExeUser | QFile::ExeGroup | QFile::ExeOther); } QFile::setPermissions(GRUB_MEMTEST, permissions); } if (args.contains("security")) { QString filePath(QString(GRUB_CONFIGDIR)+QString(GRUB_SECURITY)); QFile::Permissions permissions = QFile::permissions(filePath); if (security) { permissions |= (QFile::ExeOwner | QFile::ExeUser | QFile::ExeGroup | QFile::ExeOther); } else { permissions &= ~(QFile::ExeOwner | QFile::ExeUser | QFile::ExeGroup | QFile::ExeOther); } QFile::setPermissions(filePath, permissions); } if (args.contains("securityUsers")) { QByteArray rawUsersFileContents = args.value("securityUsers").toByteArray(); //qDebug() << rawUsersFileContents; QFile usersFile(QString(GRUB_CONFIGDIR)+QString(GRUB_SECURITY)); usersFile.open(QIODevice::WriteOnly | QIODevice::Text); usersFile.write(rawUsersFileContents); usersFile.close(); } if (args.contains("securityGroupsList")) { QStringList groupFilesList = args.value("securityGroupsList").toString().split("/"); for ( int i=0; i<groupFilesList.count(); ++i ) { QByteArray rawGroupFileContent = args.value(QString("GroupContent_")+groupFilesList[i]).toByteArray(); //qDebug() << groupFilesList[i] << rawGroupFileContent; QFile groupFile(QString(GRUB_CONFIGDIR)+groupFilesList[i]); groupFile.open(QIODevice::WriteOnly | QIODevice::Text); groupFile.write(rawGroupFileContent); groupFile.close(); } //qDebug() << "Groups modified :" << groupFilesList; } ActionReply grub_mkconfigReply = executeCommand(QStringList() << GRUB_MKCONFIG_EXE << "-o" << GRUB_MENU); if (grub_mkconfigReply.failed()) { return grub_mkconfigReply; } ActionReply grub_set_defaultReply = executeCommand(QStringList() << GRUB_SET_DEFAULT_EXE << rawDefaultEntry); if (grub_set_defaultReply.failed()) { return grub_set_defaultReply; } return grub_mkconfigReply; }
void InstanceList::loadGroupList(QMap<QString, QString> & groupMap) { QString groupFileName = m_instDir + "/instgroups.json"; // if there's no group file, fail if(!QFileInfo(groupFileName).exists()) return; QFile groupFile(groupFileName); // if you can't open the file, fail if (!groupFile.open(QIODevice::ReadOnly)) { // An error occurred. Ignore it. qDebug("Failed to read instance group file."); return; } QTextStream in(&groupFile); QString jsonStr = in.readAll(); groupFile.close(); QJsonParseError error; QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonStr.toUtf8(), &error); // if the json was bad, fail if (error.error != QJsonParseError::NoError) { qWarning(QString("Failed to parse instance group file: %1 at offset %2"). arg(error.errorString(), QString::number(error.offset)).toUtf8()); return; } // if the root of the json wasn't an object, fail if (!jsonDoc.isObject()) { qWarning("Invalid group file. Root entry should be an object."); return; } QJsonObject rootObj = jsonDoc.object(); // Make sure the format version matches, otherwise fail. if (rootObj.value("formatVersion").toVariant().toInt() != GROUP_FILE_FORMAT_VERSION) return; // Get the groups. if it's not an object, fail if (!rootObj.value("groups").isObject()) { qWarning("Invalid group list JSON: 'groups' should be an object."); return; } // Iterate through all the groups. QJsonObject groupMapping = rootObj.value("groups").toObject(); for (QJsonObject::iterator iter = groupMapping.begin(); iter != groupMapping.end(); iter++) { QString groupName = iter.key(); // If not an object, complain and skip to the next one. if (!iter.value().isObject()) { qWarning(QString("Group '%1' in the group list should " "be an object.").arg(groupName).toUtf8()); continue; } QJsonObject groupObj = iter.value().toObject(); if (!groupObj.value("instances").isArray()) { qWarning(QString("Group '%1' in the group list is invalid. " "It should contain an array " "called 'instances'.").arg(groupName).toUtf8()); continue; } // Iterate through the list of instances in the group. QJsonArray instancesArray = groupObj.value("instances").toArray(); for (QJsonArray::iterator iter2 = instancesArray.begin(); iter2 != instancesArray.end(); iter2++) { groupMap[(*iter2).toString()] = groupName; } } }