GUI: Add autofill

Make login GUI automatically fill email and password fields
Users no longer need to type email and password again just because normal login method failed due to reCAPTCHA and GUI was launched
This commit is contained in:
Sude 2019-04-22 17:39:10 +03:00
parent ea0ec2a9bd
commit deb29802d2
3 changed files with 25 additions and 2 deletions

View File

@ -25,6 +25,7 @@ class GuiLogin : public QObject
virtual ~GuiLogin(); virtual ~GuiLogin();
void Login(); void Login();
void Login(const std::string& username, const std::string& password);
std::string getCode(); std::string getCode();
std::vector<std::string> getCookies(); std::vector<std::string> getCookies();
@ -32,6 +33,8 @@ class GuiLogin : public QObject
QWebEngineCookieStore *cookiestore; QWebEngineCookieStore *cookiestore;
std::vector<std::string> cookies; std::vector<std::string> cookies;
std::string auth_code; std::string auth_code;
std::string login_username;
std::string login_password;
public slots: public slots:
void loadFinished(bool success); void loadFinished(bool success);

View File

@ -28,7 +28,20 @@ void GuiLogin::loadFinished(bool success)
{ {
QWebEngineView *view = qobject_cast<QWebEngineView*>(sender()); QWebEngineView *view = qobject_cast<QWebEngineView*>(sender());
std::string url = view->page()->url().toString().toUtf8().constData(); std::string url = view->page()->url().toString().toUtf8().constData();
if (success && url.find("https://embed.gog.com/on_login_success") != std::string::npos)
// Autofill login form
if (success && url.find("https://login.gog.com/auth?client_id=") != std::string::npos)
{
if (!this->login_username.empty() && !this->login_password.empty())
{
std::string js_fill_username = "document.getElementById(\"login_username\").value = \"" + this->login_username + "\";";
std::string js_fill_password = "document.getElementById(\"login_password\").value = \"" + this->login_password + "\";";
std::string js = js_fill_username + js_fill_password;
view->page()->runJavaScript(QString::fromStdString(js));
}
}
// Get auth code
else if (success && url.find("https://embed.gog.com/on_login_success") != std::string::npos)
{ {
std::string find_str = "code="; std::string find_str = "code=";
auto pos = url.find(find_str); auto pos = url.find(find_str);
@ -67,10 +80,17 @@ void GuiLogin::cookieAdded(const QNetworkCookie& cookie)
} }
void GuiLogin::Login() void GuiLogin::Login()
{
this->Login(std::string(), std::string());
}
void GuiLogin::Login(const std::string& username, const std::string& password)
{ {
QByteArray redirect_uri = QUrl::toPercentEncoding(QString::fromStdString(Globals::galaxyConf.getRedirectUri())); QByteArray redirect_uri = QUrl::toPercentEncoding(QString::fromStdString(Globals::galaxyConf.getRedirectUri()));
std::string auth_url = "https://auth.gog.com/auth?client_id=" + Globals::galaxyConf.getClientId() + "&redirect_uri=" + redirect_uri.toStdString() + "&response_type=code"; std::string auth_url = "https://auth.gog.com/auth?client_id=" + Globals::galaxyConf.getClientId() + "&redirect_uri=" + redirect_uri.toStdString() + "&response_type=code";
QUrl url = QString::fromStdString(auth_url); QUrl url = QString::fromStdString(auth_url);
this->login_username = username;
this->login_password = password;
std::vector<char> version_string( std::vector<char> version_string(
Globals::globalConfig.sVersionString.c_str(), Globals::globalConfig.sVersionString.c_str(),

View File

@ -323,7 +323,7 @@ int Website::Login(const std::string& email, const std::string& password)
return res = 0; return res = 0;
} }
GuiLogin gl; GuiLogin gl;
gl.Login(); gl.Login(email, password);
auto cookies = gl.getCookies(); auto cookies = gl.getCookies();
for (auto cookie : cookies) for (auto cookie : cookies)