27 #include <QVariantMap>
32 #include "SignOn/uisessiondata.h"
33 #include "SignOn/uisessiondata_priv.h"
34 #include "signoncommon.h"
39 #define SIGNON_RETURN_IF_CAM_UNAVAILABLE(_ret_arg_) do { \
40 if (!(CredentialsAccessManager::instance()->credentialsSystemOpened())) { \
41 sendErrorReply(internalServerErrName, \
42 internalServerErrStr + \
43 QLatin1String("Could not access Signon Database."));\
48 namespace SignonDaemonNS {
53 SignonIdentity::SignonIdentity(quint32
id,
int timeout,
54 SignonDaemon *parent):
55 SignonDisposable(timeout, parent),
57 m_pSignonDaemon(parent),
65 static quint32 incr = 0;
66 QString objectName = SIGNOND_DAEMON_OBJECTPATH + QLatin1String(
"/Identity_")
67 + QString::number(incr++, 16);
68 setObjectName(objectName);
77 SignonIdentity::~SignonIdentity()
82 QDBusConnection connection = SIGNOND_BUS;
83 connection.unregisterObject(objectName());
86 if (credentialsStored())
87 m_pSignonDaemon->m_storedIdentities.remove(m_id);
89 m_pSignonDaemon->m_unstoredIdentities.remove(objectName());
94 bool SignonIdentity::init()
96 QDBusConnection connection = SIGNOND_BUS;
98 if (!connection.isConnected()) {
99 QDBusError err = connection.lastError();
100 TRACE() <<
"Connection cannot be established:" <<
101 err.errorString(err.type()) ;
105 QDBusConnection::RegisterOptions registerOptions =
106 QDBusConnection::ExportAllContents;
109 registerOptions = QDBusConnection::ExportAdaptors;
111 if (!connection.registerObject(objectName(),
this, registerOptions)) {
112 TRACE() <<
"Object cannot be registered: " << objectName();
116 return (m_registered =
true);
124 if (!identity->init()) {
125 TRACE() <<
"The created identity is invalid and will be deleted.\n";
138 QDBusConnection connection = SIGNOND_BUS;
139 connection.unregisterObject(objectName());
140 m_registered =
false;
150 bool needLoadFromDB =
true;
152 needLoadFromDB =
false;
153 if (queryPassword && m_pInfo->
password().isEmpty()) {
154 needLoadFromDB =
true;
158 if (needLoadFromDB) {
177 if (!queryPassword) {
185 TRACE() <<
"addReference: " << reference;
191 BLAME() <<
"NULL database handler object.";
196 (static_cast<QDBusContext>(*
this)).message());
203 TRACE() <<
"removeReference: " << reference;
209 BLAME() <<
"NULL database handler object.";
214 (static_cast<QDBusContext>(*
this)).message());
227 BLAME() <<
"Identity not found.";
228 sendErrorReply(SIGNOND_IDENTITY_NOT_FOUND_ERR_NAME,
229 SIGNOND_IDENTITY_NOT_FOUND_ERR_STR);
230 return SIGNOND_NEW_IDENTITY;
233 BLAME() <<
"Password cannot be stored.";
234 sendErrorReply(SIGNOND_STORE_FAILED_ERR_NAME,
235 SIGNOND_STORE_FAILED_ERR_STR);
236 return SIGNOND_NEW_IDENTITY;
240 setDelayedReply(
true);
241 m_message = message();
244 QVariantMap uiRequest;
245 uiRequest.insert(SSOUI_KEY_QUERYPASSWORD,
true);
246 uiRequest.insert(SSOUI_KEY_USERNAME, info.
userName());
247 uiRequest.insert(SSOUI_KEY_MESSAGE, displayMessage);
248 uiRequest.insert(SSOUI_KEY_CAPTION, info.
caption());
250 TRACE() <<
"Waiting for reply from signon-ui";
251 QDBusPendingCallWatcher *watcher =
252 new QDBusPendingCallWatcher(m_signonui->
queryDialog(uiRequest),
this);
253 connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
254 this, SLOT(
queryUiSlot(QDBusPendingCallWatcher*)));
262 TRACE() <<
"QUERYING INFO";
271 sendErrorReply(SIGNOND_CREDENTIALS_NOT_AVAILABLE_ERR_NAME,
272 SIGNOND_CREDENTIALS_NOT_AVAILABLE_ERR_STR +
273 QLatin1String(
"Database querying error occurred."));
274 return QVariantMap();
279 sendErrorReply(SIGNOND_IDENTITY_NOT_FOUND_ERR_NAME,
280 SIGNOND_IDENTITY_NOT_FOUND_ERR_STR);
281 return QVariantMap();
288 void SignonIdentity::queryUserPassword(
const QVariantMap ¶ms) {
289 TRACE() <<
"Waiting for reply from signon-ui";
290 QDBusPendingCallWatcher *watcher =
new QDBusPendingCallWatcher(
292 connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),
this,
306 BLAME() <<
"Identity not found.";
307 sendErrorReply(SIGNOND_IDENTITY_NOT_FOUND_ERR_NAME,
308 SIGNOND_IDENTITY_NOT_FOUND_ERR_STR);
312 BLAME() <<
"Password is not stored.";
313 sendErrorReply(SIGNOND_CREDENTIALS_NOT_AVAILABLE_ERR_NAME,
314 SIGNOND_CREDENTIALS_NOT_AVAILABLE_ERR_STR);
319 setDelayedReply(
true);
320 m_message = message();
323 QVariantMap uiRequest;
324 uiRequest.unite(params);
325 uiRequest.insert(SSOUI_KEY_QUERYPASSWORD,
true);
326 uiRequest.insert(SSOUI_KEY_USERNAME, info.
userName());
327 uiRequest.insert(SSOUI_KEY_CAPTION, info.
caption());
329 queryUserPassword(uiRequest);
341 sendErrorReply(SIGNOND_CREDENTIALS_NOT_AVAILABLE_ERR_NAME,
342 SIGNOND_CREDENTIALS_NOT_AVAILABLE_ERR_STR +
343 QLatin1String(
"Database querying error occurred."));
360 TRACE() <<
"Error occurred while inserting/updating credentials.";
361 sendErrorReply(SIGNOND_REMOVE_FAILED_ERR_NAME,
362 SIGNOND_REMOVE_FAILED_ERR_STR +
363 QLatin1String(
"Database error occurred."));
372 TRACE() <<
"Signout request. Identity ID: " <<
id();
381 if (
id() != SIGNOND_NEW_IDENTITY) {
386 TRACE() <<
"clear data failed";
400 QString secret = info.value(SIGNOND_IDENTITY_INFO_SECRET).toString();
403 (static_cast<QDBusContext>(*
this)).message());
405 bool storeSecret = info.value(SIGNOND_IDENTITY_INFO_STORESECRET).toBool();
406 QVariant container = info.value(SIGNOND_IDENTITY_INFO_AUTHMETHODS);
408 qdbus_cast<
MethodMap>(container.value<QDBusArgument>());
411 QStringList ownerList =
412 info.value(SIGNOND_IDENTITY_INFO_OWNER).toStringList();
414 ownerList.append(appId);
422 info.value(SIGNOND_IDENTITY_INFO_USERNAME).toString();
424 info.value(SIGNOND_IDENTITY_INFO_CAPTION).toString();
426 info.value(SIGNOND_IDENTITY_INFO_REALMS).toStringList();
427 QStringList accessControlList =
428 info.value(SIGNOND_IDENTITY_INFO_ACL).toStringList();
429 int type = info.value(SIGNOND_IDENTITY_INFO_TYPE).toInt();
447 if (m_id == SIGNOND_NEW_IDENTITY) {
448 sendErrorReply(SIGNOND_STORE_FAILED_ERR_NAME,
449 SIGNOND_STORE_FAILED_ERR_STR);
460 BLAME() <<
"NULL database handler object.";
461 return SIGNOND_NEW_IDENTITY;
464 bool newIdentity = info.
isNew();
473 m_id = SIGNOND_NEW_IDENTITY;
475 TRACE() <<
"Error occurred while inserting/updating credentials.";
481 m_pSignonDaemon->identityStored(
this);
492 TRACE() <<
"FRESH, JUST STORED CREDENTIALS ID:" << m_id;
493 emit
infoUpdated((
int)SignOn::IdentityDataUpdated);
503 QDBusMessage errReply;
504 QDBusPendingReply<QVariantMap> reply;
509 QVariantMap resultParameters;
510 if (!reply.isError() && reply.count()) {
511 resultParameters = reply.argumentAt<0>();
514 m_message.createErrorReply(
515 SIGNOND_IDENTITY_OPERATION_CANCELED_ERR_NAME,
516 SIGNOND_IDENTITY_OPERATION_CANCELED_ERR_STR);
517 SIGNOND_BUS.send(errReply);
521 if (!resultParameters.contains(SSOUI_KEY_ERROR)) {
523 errReply = m_message.createErrorReply(SIGNOND_INTERNAL_SERVER_ERR_NAME,
524 SIGNOND_INTERNAL_SERVER_ERR_STR);
525 SIGNOND_BUS.send(errReply);
529 int errorCode = resultParameters.value(SSOUI_KEY_ERROR).toInt();
530 TRACE() <<
"error: " << errorCode;
531 if (errorCode != QUERY_ERROR_NONE) {
532 if (errorCode == QUERY_ERROR_CANCELED)
534 m_message.createErrorReply(
535 SIGNOND_IDENTITY_OPERATION_CANCELED_ERR_NAME,
536 SIGNOND_IDENTITY_OPERATION_CANCELED_ERR_STR);
539 m_message.createErrorReply(SIGNOND_INTERNAL_SERVER_ERR_NAME,
540 QString(QLatin1String(
"signon-ui call returned error %1")).
543 SIGNOND_BUS.send(errReply);
547 if (resultParameters.contains(SSOUI_KEY_PASSWORD)) {
551 BLAME() <<
"NULL database handler object.";
552 errReply = m_message.createErrorReply(SIGNOND_STORE_FAILED_ERR_NAME,
553 SIGNOND_STORE_FAILED_ERR_STR);
554 SIGNOND_BUS.send(errReply);
560 m_pInfo->
setPassword(resultParameters[SSOUI_KEY_PASSWORD].toString());
565 if (ret != SIGNOND_NEW_IDENTITY) {
566 QDBusMessage dbusreply = m_message.createReply();
567 dbusreply << quint32(m_id);
568 SIGNOND_BUS.send(dbusreply);
571 BLAME() <<
"Error during update";
577 errReply = m_message.createErrorReply(SIGNOND_INTERNAL_SERVER_ERR_NAME,
578 SIGNOND_INTERNAL_SERVER_ERR_STR);
579 SIGNOND_BUS.send(errReply);
588 QDBusMessage errReply;
589 QDBusPendingReply<QVariantMap> reply;
594 QVariantMap resultParameters;
595 if (!reply.isError() && reply.count()) {
596 resultParameters = reply.argumentAt<0>();
599 m_message.createErrorReply(
600 SIGNOND_IDENTITY_OPERATION_CANCELED_ERR_NAME,
601 SIGNOND_IDENTITY_OPERATION_CANCELED_ERR_STR);
602 SIGNOND_BUS.send(errReply);
606 if (!resultParameters.contains(SSOUI_KEY_ERROR)) {
608 errReply = m_message.createErrorReply(SIGNOND_INTERNAL_SERVER_ERR_NAME,
609 SIGNOND_INTERNAL_SERVER_ERR_STR);
610 SIGNOND_BUS.send(errReply);
614 int errorCode = resultParameters.value(SSOUI_KEY_ERROR).toInt();
615 TRACE() <<
"error: " << errorCode;
616 if (errorCode != QUERY_ERROR_NONE) {
617 if (errorCode == QUERY_ERROR_CANCELED)
618 errReply = m_message.createErrorReply(
619 SIGNOND_IDENTITY_OPERATION_CANCELED_ERR_NAME,
620 SIGNOND_IDENTITY_OPERATION_CANCELED_ERR_STR);
621 else if (errorCode == QUERY_ERROR_FORGOT_PASSWORD)
622 errReply = m_message.createErrorReply(
623 SIGNOND_FORGOT_PASSWORD_ERR_NAME,
624 SIGNOND_FORGOT_PASSWORD_ERR_STR);
626 errReply = m_message.createErrorReply(
627 SIGNOND_INTERNAL_SERVER_ERR_NAME,
628 QString(QLatin1String(
"signon-ui call "
629 "returned error %1")).
632 SIGNOND_BUS.send(errReply);
636 if (resultParameters.contains(SSOUI_KEY_PASSWORD)) {
640 BLAME() <<
"NULL database handler object.";
641 errReply = m_message.createErrorReply(SIGNOND_STORE_FAILED_ERR_NAME,
642 SIGNOND_STORE_FAILED_ERR_STR);
643 SIGNOND_BUS.send(errReply);
650 m_pInfo->
password() == resultParameters[SSOUI_KEY_PASSWORD].
653 if (!ret && resultParameters.contains(SSOUI_KEY_CONFIRMCOUNT)) {
654 int count = resultParameters[SSOUI_KEY_CONFIRMCOUNT].toInt();
655 TRACE() <<
"retry count:" << count;
657 resultParameters[SSOUI_KEY_CONFIRMCOUNT] = (count-1);
658 resultParameters[SSOUI_KEY_MESSAGEID] =
659 QUERY_MESSAGE_NOT_AUTHORIZED;
660 queryUserPassword(resultParameters);
668 QDBusMessage dbusreply = m_message.createReply();
670 SIGNOND_BUS.send(dbusreply);
675 errReply = m_message.createErrorReply(SIGNOND_INTERNAL_SERVER_ERR_NAME,
676 SIGNOND_INTERNAL_SERVER_ERR_STR);
677 SIGNOND_BUS.send(errReply);