void XTelepathyPasswordAuthOperation::storeCredentials(const QString &secret) { QString username = m_account->parameters().value(QStringLiteral("account")).toString(); Accounts::Manager *manager = KAccounts::accountsManager(); Accounts::Account *account = manager->account(m_accountStorageId); SignOn::Identity *identity; if (account) { Accounts::AccountService *service = new Accounts::AccountService(account, manager->service(QString()), this); Accounts::AuthData authData = service->authData(); identity = SignOn::Identity::existingIdentity(authData.credentialsId(), this); } else { // there's no valid KAccounts account, so let's try creating one QString providerName = QStringLiteral("ktp-"); providerName.append(m_account->serviceName()); qDebug() << "Creating account with providerName" << providerName; account = manager->createAccount(providerName); account->setDisplayName(m_account->displayName()); account->setValue("uid", m_account->objectPath()); account->setValue("username", username); account->setValue(QStringLiteral("auth/mechanism"), QStringLiteral("password")); account->setValue(QStringLiteral("auth/method"), QStringLiteral("password")); account->setEnabled(true); Accounts::ServiceList services = account->services(); Q_FOREACH(const Accounts::Service &service, services) { account->selectService(service); account->setEnabled(true); } }
void GetCredentialsJob::Private::getCredentials() { Accounts::Account *acc = manager->account(id); if (!acc) { qWarning() << "Unable to find account for id" << id; if (repeatedTries < 3) { qDebug() << "Retrying in 2s"; QTimer::singleShot(2000, q, SLOT(getCredentials())); repeatedTries++; } else { qDebug() << repeatedTries << "ending with error"; q->setError(KJob::UserDefinedError); q->setErrorText(QLatin1String("Could not find account")); q->emitResult(); } return; } Accounts::AccountService *service = new Accounts::AccountService(acc, manager->service(serviceType), q); Accounts::AuthData serviceAuthData = service->authData(); authData = serviceAuthData.parameters(); SignOn::Identity *identity = SignOn::Identity::existingIdentity(acc->credentialsId(), q); if (!identity) { qWarning() << "Unable to find identity for account id" << id; q->setError(KJob::UserDefinedError); q->setErrorText(QLatin1String("Could not find credentials")); q->emitResult(); return; } authData["AccountUsername"] = acc->value(QLatin1String("username")).toString(); QPointer<SignOn::AuthSession> authSession = identity->createSession(authMethod.isEmpty() ? serviceAuthData.method() : authMethod); if (!authSession) { qWarning() << "Unable to create auth session for" << authMethod << serviceAuthData.method(); q->setError(KJob::UserDefinedError); q->setErrorText(QLatin1String("Could not create auth session")); q->emitResult(); return; } QObject::connect(authSession.data(), &SignOn::AuthSession::response, [this, identity](const SignOn::SessionData &data) { sessionData = data; q->emitResult(); }); QObject::connect(authSession.data(), &SignOn::AuthSession::error, [this](const SignOn::Error &error) { qDebug() << error.message(); q->setError(KJob::UserDefinedError); q->setErrorText(error.message()); q->emitResult(); }); authSession->process(serviceAuthData.parameters(), authMechanism.isEmpty() ? serviceAuthData.mechanism() : authMechanism); }