Blob Blame Raw


#include "permissionsmanager.h"

// TnzBase includes
#include "tenv.h"

// TnzCore includes
#include "tsystem.h"
#include "tstream.h"

//=========================================================

namespace
{

class User
{
public:
	string m_name;
	std::vector<string> m_svnUsernames;
	std::vector<string> m_svnPasswords;
	User(string name) : m_name(name) {}

	void addSvnUsername(string username) { m_svnUsernames.push_back(username); }
	void addSvnPassword(string password) { m_svnPasswords.push_back(password); }

	string getSvnUsername(int index)
	{
		if (index < 0 || index >= (int)m_svnUsernames.size())
			return "";
		return m_svnUsernames.at(index);
	}

	string getSvnPassword(int index)
	{
		if (index < 0 || index >= (int)m_svnPasswords.size())
			return "";
		return m_svnPasswords.at(index);
	}
};

} // namespace

//---------------------------------------------------------

class PermissionsManager::Imp
{
public:
	std::map<string, User *> m_users;

	// utente corrente
	User *m_user;

	Imp()
		: m_user(0)
	{
		loadPermissions();
		m_user = findUser(TSystem::getUserName().toStdString(), false);
		if (!m_user)
			m_user = findUser("guest", false);
	}

	~Imp()
	{
		for (std::map<string, User *>::iterator u = m_users.begin();
			 u != m_users.end(); ++u)
			delete u->second;
	}

	User *findUser(string userName, bool create = true)
	{
		std::map<string, User *>::iterator i = m_users.find(userName);
		if (i != m_users.end())
			return i->second;
		if (!create)
			return 0;
		User *user = new User(userName);
		m_users[userName] = user;
		return user;
	}

	string getSVNUserName(int index)
	{
		User *user = findUser(TSystem::getUserName().toStdString(), false);
		if (!user)
			user = findUser("guest", false);
		if (!user)
			return "";
		return user->getSvnUsername(index);
	}

	string getSVNPassword(int index)
	{
		User *user = findUser(TSystem::getUserName().toStdString(), false);
		if (!user)
			user = findUser("guest", false);
		if (!user)
			return "";
		return user->getSvnPassword(index);
	}

	TFilePath getPermissionFile()
	{
		return TEnv::getConfigDir() + "permissions.xml";
	}
	void loadPermissions();
};

//---------------------------------------------------------

void PermissionsManager::Imp::loadPermissions()
{
	TFilePath fp = getPermissionFile();
	TIStream is(fp);
	if (!is)
		return;

	string tagName;
	if (!is.matchTag(tagName) || tagName != "permissions")
		return;

	while (is.matchTag(tagName))
		if (tagName == "users") {
			while (is.matchTag(tagName)) {
				if (tagName != "user")
					return;
				string userName;
				is.getTagParam("name", userName);
				if (userName == "")
					return;
				User *user = findUser(userName);
				while (is.matchTag(tagName)) {
					if (tagName == "roles") {
						//  <roles> is no longer used
						is.skipCurrentTag();
					} else if (tagName == "svn") {
						string name;
						is.getTagParam("name", name);
						string password;
						is.getTagParam("password", password);
						user->addSvnUsername(name);
						user->addSvnPassword(password);
					} else
						return;
				}
				if (!is.matchEndTag())
					return; // </user>
			}
			if (!is.matchEndTag())
				return; // </users>
		} else if (tagName == "roles") {
			//  <roles> is no longer used
			is.skipCurrentTag();
		} else
			return;
}

//---------------------------------------------------------

//=========================================================

PermissionsManager::PermissionsManager()
{
	m_imp = new Imp();
}

//---------------------------------------------------------

PermissionsManager::~PermissionsManager()
{
	delete m_imp;
}

//---------------------------------------------------------

PermissionsManager *PermissionsManager::instance()
{
	static PermissionsManager _instance;
	return &_instance;
}

//---------------------------------------------------------

std::string PermissionsManager::getSVNUserName(int index) const
{
	return m_imp->getSVNUserName(index);
}

//---------------------------------------------------------

std::string PermissionsManager::getSVNPassword(int index) const
{
	return m_imp->getSVNPassword(index);
}