diff --git a/huggle/Localization/en.xml b/huggle/Localization/en.xml index 8787f602b..8a2555a81 100644 --- a/huggle/Localization/en.xml +++ b/huggle/Localization/en.xml @@ -298,6 +298,7 @@ Switch to read-only One or more projects ($1) do not allow you to login with edit permissions (reason: $2). Do you want to switch to read-only mode instead? Project $1 switched to read-only mode + This functionality is not yet implemented. Please contact developers at huggle@lists.wikimedia.org. $1 edits per minute, $2 reverts per minute, level $3 Stop provider Resume provider diff --git a/huggle/apiquery.cpp b/huggle/apiquery.cpp index d3ceaf6be..8b38935c8 100644 --- a/huggle/apiquery.cpp +++ b/huggle/apiquery.cpp @@ -407,6 +407,7 @@ void ApiQuery::SetAction(const Action action) this->ActionPart = "clearhasmsg"; this->UsingPOST = true; return; + ///! \todo ActionQuery still used ? case ActionQuery: this->ActionPart = "query"; this->IsContinuous = true; @@ -416,6 +417,10 @@ void ApiQuery::SetAction(const Action action) this->ActionPart = "login"; this->EnforceLogin = false; return; + case ClientLogin: + this->ActionPart = "clientlogin"; + this->EnforceLogin = false; + return; case ActionLogout: this->ActionPart = "logout"; return; diff --git a/huggle/apiquery.hpp b/huggle/apiquery.hpp index 576cc2e2c..e7e16ed69 100644 --- a/huggle/apiquery.hpp +++ b/huggle/apiquery.hpp @@ -31,6 +31,7 @@ namespace Huggle ActionClearHasMsg, ActionQuery, ActionLogin, + ClientLogin, ActionLogout, //ActionTokens, ActionPurge, diff --git a/huggle/login.cpp b/huggle/login.cpp index 834c2f65e..a760344ce 100644 --- a/huggle/login.cpp +++ b/huggle/login.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #define LOGINFORM_LOGIN 0 #define LOGINFORM_SITEINFO 1 @@ -554,21 +555,20 @@ void Login::PerformLoginPart2(WikiSite *site) this->Statuses[site] = WaitingForToken; this->LoginQueries.remove(site); query->DecRef(); - query = new ApiQuery(ActionLogin, site); + query = new ApiQuery(ClientLogin, site); this->LoginQueries.insert(site, query); - query->HiddenQuery = true; + //query->HiddenQuery = true; query->IncRef(); if (hcfg->SystemConfig_BotPassword) { - query->Parameters = "lgname=" + QUrl::toPercentEncoding(hcfg->SystemConfig_BotLogin) - + "&lgpassword=" + QUrl::toPercentEncoding(hcfg->TemporaryConfig_Password) - + "&lgtoken=" + QUrl::toPercentEncoding(token); + query->Parameters = "username=" + QUrl::toPercentEncoding(hcfg->SystemConfig_BotLogin) + + "&password=" + QUrl::toPercentEncoding(hcfg->TemporaryConfig_Password); } else { - query->Parameters = "lgname=" + QUrl::toPercentEncoding(hcfg->SystemConfig_Username) - + "&lgpassword=" + QUrl::toPercentEncoding(hcfg->TemporaryConfig_Password) - + "&lgtoken=" + QUrl::toPercentEncoding(token); + query->Parameters = "username=" + QUrl::toPercentEncoding(hcfg->SystemConfig_Username) + + "&password=" + QUrl::toPercentEncoding(hcfg->TemporaryConfig_Password); } + query->Parameters = query->Parameters + "&loginreturnurl=http://example.com/&rememberMe=1&logintoken=" + QUrl::toPercentEncoding(token); query->UsingPOST = true; query->Process(); } @@ -1269,42 +1269,71 @@ bool Login::ProcessOutput(WikiSite *site) ApiQuery *query = this->LoginQueries[site]; // Check what the result was ApiQueryResult *result = query->GetApiQueryResult(); - ApiQueryResultNode *ln = result->GetNode("login"); - QString result_code = ln->GetAttribute("result"); - QString reason = ln->GetAttribute("reason"); - if (result_code.isEmpty()) + ApiQueryResultNode *ln = result->GetNode("clientlogin"); + QString status = ln->GetAttribute("status"); + if (status.isEmpty()) { this->DisplayError(_l("api.php-invalid-response")); return false; } - if (result_code == "Success") + + if (status == "PASS") return true; - if (result_code == "EmptyPass") - { - this->DisplayError(_l("login-password-empty")); + if (status == "UI") { + // Need a user interaction like captacha or 2FA + //QString v_id = ln->ChildNodes.at(0)->GetAttribute("id", "unknown"); + //if (v_id == "TOTPAuthenticationRequest"){ + if (true){ + // 2FA is requierd (TOTP code needed) + QString totp = QInputDialog::getText(this, "Two factor authentification", "Please enter the 2FA code from your device:"); + query = new ApiQuery(ClientLogin, site); + //query->HiddenQuery = true; + query->IncRef(); + query->Parameters = "username=" + QUrl::toPercentEncoding(hcfg->SystemConfig_BotLogin) + + "&password=" + QUrl::toPercentEncoding(hcfg->TemporaryConfig_Password) + + "&OATHToken=" + totp + "&loginreturnurl=http://example.com/&rememberMe=1&logintoken=" + QUrl::toPercentEncoding(this->Tokens[site]); + query->UsingPOST = true; + query->Process(); + ApiQueryResult *result = query->GetApiQueryResult(); + ApiQueryResultNode *ln = result->GetNode("clientlogin"); + } return false; } - if (result_code == "WrongPass") - { - /// \bug This sometimes doesn't work properly - this->ui->lineEdit_password->setFocus(); - this->DisplayError(_l("login-error-password")); + if (status == "REDIRECT") + // Need to login using another web service + this->DisplayError(_l("not-implemented")); return false; - } - if (result_code == "NoName") + if (status == "FAIL") { - this->DisplayError(_l("login-fail-wrong-name")); - return false; - } - if (result_code == "NotExists") - { - this->DisplayError(_l("login-username-doesnt-exist")); + QString message = ln->GetAttribute("message"); + QString message_code = ln->GetAttribute("messagecode"); + if (message_code == "wrongpassword") { + /// \bug This sometimes doesn't work properly + this->ui->lineEdit_password->setFocus(); + this->DisplayError(_l("login-error-password")); + return false; + } + /// \todo Verify these error codes + if (message_code == "EmptyPass") + { + this->DisplayError(_l("login-password-empty")); + return false; + } + if (message_code == "NoName") + { + this->DisplayError(_l("login-fail-wrong-name")); + return false; + } + if (message_code == "NotExists") + { + this->DisplayError(_l("login-username-doesnt-exist")); + return false; + } + if (message.isEmpty()) + message = message_code; + this->DisplayError(_l("login-api", message)); return false; } - if (reason.isEmpty()) - reason = result_code; - this->DisplayError(_l("login-api", reason)); - return false; } void Login::on_ButtonOK_clicked()