SHOW:
|
|
- or go back to the newest paste.
1 | ||
2 | // create-online-sync-account.pro | |
3 | TEMPLATE = app | |
4 | TARGET = create-online-sync-account | |
5 | CONFIG += link_pkgconfig | |
6 | PKGCONFIG += accounts-qt5 libsignon-qt5 | |
7 | ||
8 | QT += network | |
9 | SOURCES = main.cpp CreateOnlineSyncAccount.cpp | |
10 | HEADERS = CreateOnlineSyncAccount.h | |
11 | ||
12 | // main.cpp | |
13 | #include <QCoreApplication> | |
14 | #include <QObject> | |
15 | #include <QtDebug> | |
16 | #include "CreateOnlineSyncAccount.h" | |
17 | ||
18 | int main(int argc, char *argv[]) | |
19 | { | |
20 | QCoreApplication app(argc, argv); | |
21 | CreateOnlineSyncAccount c; | |
22 | QString remotePath, mode, username, password; | |
23 | ||
24 | if (argc != 3 && argc != 5) { | |
25 | qWarning() << "usage: create-online-sync-account <remotePath> <legacy> <username> <password>"; | |
26 | return 1; | |
27 | } | |
28 | ||
29 | remotePath = QString::fromLatin1(argv[1]); | |
30 | mode = QString::fromLatin1(argv[2]); | |
31 | if (argc == 5) username = QString::fromLatin1(argv[3]); | |
32 | if (argc == 5) password = QString::fromLatin1(argv[4]); | |
33 | ||
34 | if (mode != QStringLiteral("legacy")) { | |
35 | // actually we don't support oauth2 yet | |
36 | // to support that, we would also need as parameters: | |
37 | // auth path / token path / redirect uri / scopes etc. | |
38 | qWarning() << "oauth2 not currently supported"; | |
39 | return 1; | |
40 | } | |
41 | ||
42 | QObject::connect(&c, SIGNAL(done()), &app, SLOT(quit())); | |
43 | c.createOnlineSyncAccount(remotePath, mode, username, password); | |
44 | return app.exec(); | |
45 | } | |
46 | ||
47 | ||
48 | // createonlinesyncaccount.h | |
49 | #ifndef CREATEONLINESYNCACCOUNT_H | |
50 | #define CREATEONLINESYNCACCOUNT_H | |
51 | ||
52 | #include <QObject> | |
53 | ||
54 | #include <Accounts/Account> | |
55 | #include <Accounts/Manager> | |
56 | #include <Accounts/AccountService> | |
57 | #include <SignOn/Error> | |
58 | #include <SignOn/Identity> | |
59 | #include <SignOn/AuthSession> | |
60 | #include <SignOn/SessionData> | |
61 | ||
62 | class CreateOnlineSyncAccount : public QObject | |
63 | { | |
64 | Q_OBJECT | |
65 | ||
66 | public: | |
67 | CreateOnlineSyncAccount(QObject *parent = 0); | |
68 | ~CreateOnlineSyncAccount(); | |
69 | ||
70 | void createOnlineSyncAccount(const QString &remotePath, | |
71 | const QString &mode, | |
72 | const QString &username, | |
73 | const QString &password); | |
74 | ||
75 | public Q_SLOTS: | |
76 | void credentialsStored(quint32 credentialsId); | |
77 | void credentialsFailed(); | |
78 | ||
79 | Q_SIGNALS: | |
80 | void done(); | |
81 | ||
82 | private: | |
83 | Accounts::Manager *m_accountManager; | |
84 | Accounts::Account *m_account; | |
85 | SignOn::Identity *m_identity; | |
86 | }; | |
87 | ||
88 | #endif | |
89 | ||
90 | // createonlinesyncaccount.cpp | |
91 | #include "CreateOnlineSyncAccount.h" | |
92 | #include <QtDebug> | |
93 | #include <QUrl> | |
94 | #include <Accounts/Service> | |
95 | #include <SignOn/Identity> | |
96 | #include <SignOn/IdentityInfo> | |
97 | ||
98 | ||
99 | CreateOnlineSyncAccount::CreateOnlineSyncAccount(QObject *parent) | |
100 | : QObject(parent) | |
101 | , m_accountManager(new Accounts::Manager(this)) | |
102 | , m_account(0) | |
103 | , m_identity(0) | |
104 | { | |
105 | } | |
106 | ||
107 | CreateOnlineSyncAccount::~CreateOnlineSyncAccount() | |
108 | { | |
109 | delete m_account; | |
110 | delete m_identity; | |
111 | } | |
112 | ||
113 | void CreateOnlineSyncAccount::createOnlineSyncAccount(const QString &remotePath, | |
114 | const QString &mode, | |
115 | const QString &username, | |
116 | const QString &password) | |
117 | { | |
118 | Q_UNUSED(mode) // until we take tokenpaths/redirecturis etc as parameters also... | |
119 | ||
120 | m_account = m_accountManager->createAccount("caldav"); // change this as required! | |
121 | if (!m_account) { | |
122 | qWarning() << "error: couldn't create onlinesync account"; | |
123 | emit done(); | |
124 | } | |
125 | ||
126 | Accounts::Service srv = m_accountManager->service("caldav-yahoo"); // change this as required! | |
127 | if (!srv.isValid()) { | |
128 | qWarning() << "error: couldn't retrieve caldav service"; | |
129 | emit done(); | |
130 | } | |
131 | ||
132 | m_account->setDisplayName("caldav account"); | |
133 | m_account->selectService(srv); | |
134 | m_account->setValue("Remote database", remotePath); | |
135 | m_account->setValue("auth/method", "password"); | |
136 | m_account->setValue("auth/mechanism", "password"); | |
137 | m_account->setEnabled(true); | |
138 | m_account->selectService(Accounts::Service()); | |
139 | m_account->setEnabled(false); // disable globally until credentials are set. | |
140 | ||
141 | m_account->syncAndBlock(); | |
142 | ||
143 | QMap<QString, QStringList> methodMechs; | |
144 | methodMechs.insert("password", QStringList() << "password"); | |
145 | SignOn::IdentityInfo *info = new SignOn::IdentityInfo(m_account->displayName(), username, methodMechs); | |
146 | info->setSecret(password, true); | |
147 | QUrl url(remotePath); | |
148 | info->setRealms(QStringList() << url.host()); | |
149 | info->setType(SignOn::IdentityInfo::Application); | |
150 | ||
151 | m_identity = SignOn::Identity::newIdentity(*info); | |
152 | connect(m_identity, SIGNAL(error(const SignOn::Error &)), | |
153 | this, SLOT(credentialsFailed())); | |
154 | connect(m_identity, SIGNAL(credentialsStored(const quint32)), | |
155 | this, SLOT(credentialsStored(quint32))); | |
156 | - | this, SLOT(credentialsStored())); |
156 | + | |
157 | m_identity->storeCredentials(); | |
158 | } | |
159 | ||
160 | void CreateOnlineSyncAccount::credentialsFailed() | |
161 | { | |
162 | qWarning() << "error: failed to store credentials"; | |
163 | emit done(); | |
164 | } | |
165 | ||
166 | void CreateOnlineSyncAccount::credentialsStored(quint32 credentialsId) | |
167 | { | |
168 | Accounts::Service srv = m_accountManager->service("caldav-yahoo"); // change this as required! | |
169 | m_account->selectService(srv); | |
170 | m_account->setCredentialsId(credentialsId); | |
171 | m_account->selectService(Accounts::Service()); | |
172 | ||
173 | m_account->setCredentialsId(credentialsId); // global service. | |
174 | m_account->setEnabled(true); | |
175 | m_account->syncAndBlock(); | |
176 | ||
177 | qWarning() << "success!"; | |
178 | emit done(); | |
179 | } |