Changeset - 5e1e32f03027
[Not reviewed]
0 1 0
Vitaly Takmazov - 7 years ago 2018-11-06 17:19:12
vitalyster@gmail.com
libpurple: 2FA support for Discord plugin
1 file changed with 35 insertions and 36 deletions:
0 comments (0 inline, 0 general)
backends/libpurple/main.cpp
Show inline comments
 
@@ -188,62 +188,37 @@ static std::string getAlias(PurpleBuddy *m_buddy) {
 
	return alias;
 
}
 

	
 
static boost::mutex dblock;
 
static std::string OAUTH_TOKEN = "hangouts_oauth_token";
 
static std::string STEAM_ACCESS_TOKEN = "steammobile_access_token";
 
static std::string DISCORD_ACCESS_TOKEN = "discord_access_token";
 

	
 
static bool getUserOAuthToken(const std::string user, std::string &token)
 
static bool getUserToken(const std::string user, const std::string token_name, std::string &token_value)
 
{
 
	boost::mutex::scoped_lock lock(dblock);
 
	UserInfo info;
 
	if(storagebackend->getUser(user, info) == false) {
 
		LOG4CXX_ERROR(logger, "Didn't find entry for " << user << " in the database!");
 
		return false;
 
	}
 
	token = "";
 
	token_value = "";
 
	int type = TYPE_STRING;
 
	storagebackend->getUserSetting((long)info.id, OAUTH_TOKEN, type, token);
 
	storagebackend->getUserSetting((long)info.id, token_name, type, token_value);
 
	return true;
 
}
 

	
 
static bool storeUserOAuthToken(const std::string user, const std::string OAuthToken)
 
static bool storeUserToken(const std::string user, const std::string token_name, const std::string token_value)
 
{
 
	boost::mutex::scoped_lock lock(dblock);
 
	UserInfo info;
 
	if(storagebackend->getUser(user, info) == false) {
 
		LOG4CXX_ERROR(logger, "Didn't find entry for " << user << " in the database!");
 
		return false;
 
	}
 
	storagebackend->updateUserSetting((long)info.id, OAUTH_TOKEN, OAuthToken);
 
	return true;
 
}
 

	
 
static bool getUserSteamAccessToken(const std::string user, std::string &token)
 
{
 
	boost::mutex::scoped_lock lock(dblock);
 
	UserInfo info;
 
	if(storagebackend->getUser(user, info) == false) {
 
		LOG4CXX_ERROR(logger, "Didn't find entry for " << user << " in the database!");
 
		return false;
 
	}
 
	token = "";
 
	int type = TYPE_STRING;
 
	storagebackend->getUserSetting((long)info.id, STEAM_ACCESS_TOKEN, type, token);
 
	return true;
 
}
 

	
 
static bool storeUserSteamAccessToken(const std::string user, const std::string token)
 
{
 
	boost::mutex::scoped_lock lock(dblock);
 
	UserInfo info;
 
	if(storagebackend->getUser(user, info) == false) {
 
		LOG4CXX_ERROR(logger, "Didn't find entry for " << user << " in the database!");
 
		return false;
 
	}
 
	storagebackend->updateUserSetting((long)info.id, STEAM_ACCESS_TOKEN, token);
 
	storagebackend->updateUserSetting((long)info.id, token_name, token_value);
 
	return true;
 
}
 

	
 
class SpectrumNetworkPlugin : public NetworkPlugin {
 
	public:
 
		SpectrumNetworkPlugin() : NetworkPlugin() {
 
@@ -402,12 +377,16 @@ class SpectrumNetworkPlugin : public NetworkPlugin {
 
				adminAlias = "hangouts";
 
			}
 
			else if (protocol == "prpl-steam-mobile") {
 
				adminLegacyName = "steam-mobile";
 
				adminAlias = "steam-mobile";
 
			}
 
            else if (protocol == "prpl-eionrobb-discord") {
 
                adminLegacyName = "discord";
 
                adminAlias = "discord";
 
            }
 

	
 
			if (!purple_find_prpl_wrapped(protocol.c_str())) {
 
				LOG4CXX_INFO(logger,  name.c_str() << ": Invalid protocol '" << protocol << "'");
 
				np->handleDisconnected(user, 1, "Invalid protocol " + protocol);
 
				return;
 
			}
 
@@ -436,22 +415,28 @@ class SpectrumNetworkPlugin : public NetworkPlugin {
 
			purple_account_set_password_wrapped(account, password.c_str());
 
			purple_account_set_bool_wrapped(account, "custom_smileys", FALSE);
 
			purple_account_set_bool_wrapped(account, "direct_connect", FALSE);
 
			purple_account_set_bool_wrapped(account, "compat-verification", TRUE);
 
			if (protocol == "prpl-hangouts") {
 
				std::string token;
 
				if (getUserOAuthToken(user, token)) {
 
				if (getUserToken(user, OAUTH_TOKEN, token)) {
 
					purple_account_set_password_wrapped(account, token.c_str());
 
				}
 
			}
 
			else if (protocol == "prpl-steam-mobile") {
 
				std::string token;
 
				if (getUserSteamAccessToken(user, token)) {
 
				if (getUserToken(user, STEAM_ACCESS_TOKEN, token)) {
 
					purple_account_set_string_wrapped(account, "access_token", token.c_str());
 
				}
 
			}
 
            else if (protocol == "prpl-eionrobb-discord") {
 
                std::string token;
 
                if (getUserToken(user, DISCORD_ACCESS_TOKEN, token)) {
 
                    purple_account_set_string_wrapped(account, "token", token.c_str());
 
                }
 
            }
 

	
 
			setDefaultAccountOptions(account);
 

	
 
			// Enable account + privacy lists
 
			purple_account_set_enabled_wrapped(account, "spectrum", TRUE);
 

	
 
@@ -464,13 +449,13 @@ class SpectrumNetworkPlugin : public NetworkPlugin {
 
			// Set the status
 
			const PurpleStatusType *status_type = purple_account_get_status_type_with_primitive_wrapped(account, PURPLE_STATUS_AVAILABLE);
 
			if (status_type != NULL) {
 
				purple_account_set_status_wrapped(account, purple_status_type_get_id_wrapped(status_type), TRUE, NULL);
 
			}
 
			// OAuth helper
 
			if (protocol == "prpl-hangouts") {
 
			if (protocol == "prpl-hangouts" || protocol == "prpl-steam-mobile" || protocol == "prpl-eionrobb-discord") {
 
				LOG4CXX_INFO(logger, user << ": Adding Buddy " << adminLegacyName << " " << adminAlias);
 
				handleBuddyChanged(user, adminLegacyName, adminAlias, std::vector<std::string>(), pbnetwork::STATUS_ONLINE);
 
			}
 
		}
 

	
 
		void handleLogoutRequest(const std::string &user, const std::string &legacyName) {
 
@@ -1694,12 +1679,23 @@ void * requestInput(const char *title, const char *primary,const char *secondary
 
			req->user_data = user_data;
 
			req->account = account;
 
			req->mainJID = np->m_accounts[account];
 
			np->m_inputRequests[req->mainJID] = req;
 
			return NULL;
 
		}
 
        else if (primaryString == "Enter Discord auth code") {
 
            LOG4CXX_INFO(logger, "prpl-discord 2FA request");
 
            np->handleMessage(np->m_accounts[account], np->adminLegacyName, std::string("2FA code: "));
 
            inputRequest *req = new inputRequest;
 
            req->ok_cb = (PurpleRequestInputCb)ok_cb;
 
            req->user_data = user_data;
 
            req->account = account;
 
            req->mainJID = np->m_accounts[account];
 
            np->m_inputRequests[req->mainJID] = req;
 
            return NULL;
 
        }
 
		else {
 
			LOG4CXX_WARN(logger, "Unhandled request input. primary=" << primaryString);
 
		}
 
	}
 
    else if (title) {
 
        std::string titleString(title);
 
@@ -2120,17 +2116,20 @@ static void signed_on(PurpleConnection *gc, gpointer unused) {
 
#endif
 
	purple_roomlist_get_list_wrapped(gc);
 

	
 
	// For prpl-gg
 
	execute_purple_plugin_action(gc, "Download buddylist from Server");
 
	if (CONFIG_STRING(config, "service.protocol") == "prpl-hangouts") {
 
		storeUserOAuthToken(np->m_accounts[account], purple_account_get_password_wrapped(account));
 
		storeUserToken(np->m_accounts[account], OAUTH_TOKEN, purple_account_get_password_wrapped(account));
 
	}
 
	else if (CONFIG_STRING(config, "service.protocol") == "prpl-steam-mobile") {
 
		storeUserSteamAccessToken(np->m_accounts[account], purple_account_get_string_wrapped(account, "access_token", NULL));
 
		storeUserToken(np->m_accounts[account], STEAM_ACCESS_TOKEN, purple_account_get_string_wrapped(account, "access_token", NULL));
 
	}
 
    else if (CONFIG_STRING(config, "service.protocol") == "prpl-eionrobb-discord") {
 
        storeUserToken(np->m_accounts[account], DISCORD_ACCESS_TOKEN, purple_account_get_string_wrapped(account, "token", NULL));
 
    }
 
}
 

	
 
static void printDebug(PurpleDebugLevel level, const char *category, const char *arg_s) {
 
	std::string c("");
 
	std::string args(arg_s);
 
	args.erase(args.size() - 1);
0 comments (0 inline, 0 general)