Changeset - 069cd71aa3d7
[Not reviewed]
0 1 0
HanzZ - 14 years ago 2011-08-21 23:01:16
hanzz.k@gmail.com
Disconnect even invalid user, this can happen when password is valid, but session was not established yet
1 file changed with 1 insertions and 1 deletions:
0 comments (0 inline, 0 general)
src/userregistry.cpp
Show inline comments
 
@@ -35,89 +35,89 @@ UserRegistry::UserRegistry(Config *cfg) {
 
	config = cfg;
 
}
 

	
 
UserRegistry::~UserRegistry() { }
 

	
 
void UserRegistry::isValidUserPassword(const Swift::JID& user, Swift::ServerFromClientSession *session, const Swift::SafeByteArray& password) {
 
	if (!CONFIG_STRING(config, "service.admin_username").empty() && user.getNode() == CONFIG_STRING(config, "service.admin_username")) {
 
		if (Swift::safeByteArrayToString(password) == CONFIG_STRING(config, "service.admin_password")) {
 
			session->handlePasswordValid();
 
		}
 
		else {
 
			session->handlePasswordInvalid();
 
		}
 
		return;
 
	}
 

	
 
	std::string key = user.toBare().toString();
 

	
 
	// Users try to connect twice
 
	if (users.find(key) != users.end()) {
 
		// Kill the first session if the second password is same
 
		if (Swift::safeByteArrayToString(password) == users[key].password) {
 
			LOG4CXX_INFO(logger, key << ": Removing previous session and making this one active");
 
			Swift::ServerFromClientSession *tmp = users[key].session;
 
			users[key].session = session;
 
			tmp->handlePasswordInvalid();
 
		}
 
		else {
 
			LOG4CXX_INFO(logger, key << ": Possible break-in attemp (user logged as different one with bad password)");
 
			session->handlePasswordInvalid();
 
			return;
 
		}
 
	}
 

	
 
	LOG4CXX_INFO(logger, key << ": Connecting this user to find if password is valid");
 

	
 
	users[key].password = Swift::safeByteArrayToString(password);
 
	users[key].session = session;
 
	onConnectUser(user);
 

	
 
	return;
 
}
 

	
 
void UserRegistry::stopLogin(const Swift::JID& user, Swift::ServerFromClientSession *session) {
 
	std::string key = user.toBare().toString();
 
	if (users.find(key) != users.end()) {
 
		if (users[key].session == session) {
 
			LOG4CXX_INFO(logger, key << ": Stopping login process (user probably disconnected while logging in)");
 
			onDisconnectUser(user);
 
			users.erase(key);
 
		}
 
		else {
 
			LOG4CXX_WARN(logger, key << ": Stopping login process (user probably disconnected while logging in), but this is not active session");
 
		}
 
	}
 
	else {
 
		LOG4CXX_WARN(logger, key << ": Stopping login process (user probably disconnected while logging in) for invalid user");
 
	}
 
	onDisconnectUser(user);
 
}
 

	
 
void UserRegistry::onPasswordValid(const Swift::JID &user) {
 
	std::string key = user.toBare().toString();
 
	if (users.find(key) != users.end()) {
 
		LOG4CXX_INFO(logger, key << ": Password is valid");
 
		users[key].session->handlePasswordValid();
 
		users.erase(key);
 
	}
 
	else {
 
		LOG4CXX_INFO(logger, key << ": onPasswordValid called for invalid user");
 
	}
 
}
 

	
 
void UserRegistry::onPasswordInvalid(const Swift::JID &user) {
 
	std::string key = user.toBare().toString();
 
	if (users.find(key) != users.end()) {
 
		LOG4CXX_INFO(logger, key << ": Password is invalid");
 
		users[key].session->handlePasswordInvalid();
 
		users.erase(key);
 
	}
 
	else {
 
		LOG4CXX_INFO(logger, key << ": onPasswordInvalid called for invalid user");
 
	}
 
}
 

	
 
const std::string &UserRegistry::getUserPassword(const std::string &barejid) {
 
	return users[barejid].password;
 
}
 

	
 
}
0 comments (0 inline, 0 general)