Example #1
0
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");
    }
}
Example #2
0
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();
}
Example #3
0
//	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);
}
Example #4
0
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();
}
Example #5
0
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*)));
			}
		}
	}
Example #6
0
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;
}
Example #7
0
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;
		}
	}
}