1 #include <QDesktopServices>
2 #include <QHash>
3 
4 #include "seafile-applet.h"
5 #include "account-mgr.h"
6 #include "api/api-error.h"
7 #include "api/requests.h"
8 #include "utils/utils.h"
9 
10 #include "auto-login-service.h"
11 
12 namespace {
13 
14 } // namespace
15 
SINGLETON_IMPL(AutoLoginService)16 SINGLETON_IMPL(AutoLoginService)
17 
18 AutoLoginService::AutoLoginService(QObject *parent)
19     : QObject(parent)
20 {
21 }
22 
startAutoLogin(const QString & next_url)23 void AutoLoginService::startAutoLogin(const QString& next_url)
24 {
25     const Account account = seafApplet->accountManager()->currentAccount();
26     QUrl absolute_url = QUrl(next_url).isRelative()
27                             ? account.getAbsoluteUrl(next_url)
28                             : next_url;
29     if (!account.isValid() || !account.isAtLeastVersion(4, 2, 0)) {
30         QDesktopServices::openUrl(absolute_url);
31         return;
32     }
33 
34     absolute_url.setScheme("");
35     absolute_url.setHost("");
36     absolute_url.setPort(-1);
37     QString next = absolute_url.toString().mid(2);
38     GetLoginTokenRequest *req = new GetLoginTokenRequest(account, next);
39 
40     connect(req, SIGNAL(success(const QString&)),
41             this, SLOT(onGetLoginTokenSuccess(const QString&)));
42 
43     connect(req, SIGNAL(failed(const ApiError&)),
44             this, SLOT(onGetLoginTokenFailed(const ApiError&)));
45 
46     req->send();
47 }
48 
onGetLoginTokenSuccess(const QString & token)49 void AutoLoginService::onGetLoginTokenSuccess(const QString& token)
50 {
51     GetLoginTokenRequest *req = (GetLoginTokenRequest *)(sender());
52     // printf("login token is %s\n", token.toUtf8().data());
53 
54     QUrl url = req->account().getAbsoluteUrl("/client-login/");
55     QString next_url = req->nextUrl();
56 
57     QHash<QString, QString> params;
58     params.insert("token", token);
59     params.insert("next", req->nextUrl());
60     url = includeQueryParams(url, params);
61 
62     QDesktopServices::openUrl(url);
63     req->deleteLater();
64 }
65 
onGetLoginTokenFailed(const ApiError & error)66 void AutoLoginService::onGetLoginTokenFailed(const ApiError& error)
67 {
68     GetLoginTokenRequest *req = (GetLoginTokenRequest *)(sender());
69     qWarning("get login token failed: %s\n", error.toString().toUtf8().data());
70     // server doesn't support client directly login, or other errors happened.
71     // We open the server url directly in this case;
72     QDesktopServices::openUrl(req->account().getAbsoluteUrl(req->nextUrl()));
73     req->deleteLater();
74 }
75