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();
444 if (m_id == SIGNOND_NEW_IDENTITY) {
445 sendErrorReply(SIGNOND_STORE_FAILED_ERR_NAME,
446 SIGNOND_STORE_FAILED_ERR_STR);
456 BLAME() <<
"NULL database handler object.";
457 return SIGNOND_NEW_IDENTITY;
460 bool newIdentity = info.
isNew();
469 m_id = SIGNOND_NEW_IDENTITY;
471 TRACE() <<
"Error occurred while inserting/updating credentials.";
477 m_pSignonDaemon->identityStored(
this);
479 TRACE() <<
"FRESH, JUST STORED CREDENTIALS ID:" << m_id;
480 emit
infoUpdated((
int)SignOn::IdentityDataUpdated);
490 QDBusMessage errReply;
491 QDBusPendingReply<QVariantMap> reply;
496 QVariantMap resultParameters;
497 if (!reply.isError() && reply.count()) {
498 resultParameters = reply.argumentAt<0>();
501 m_message.createErrorReply(
502 SIGNOND_IDENTITY_OPERATION_CANCELED_ERR_NAME,
503 SIGNOND_IDENTITY_OPERATION_CANCELED_ERR_STR);
504 SIGNOND_BUS.send(errReply);
508 if (!resultParameters.contains(SSOUI_KEY_ERROR)) {
510 errReply = m_message.createErrorReply(SIGNOND_INTERNAL_SERVER_ERR_NAME,
511 SIGNOND_INTERNAL_SERVER_ERR_STR);
512 SIGNOND_BUS.send(errReply);
516 int errorCode = resultParameters.value(SSOUI_KEY_ERROR).toInt();
517 TRACE() <<
"error: " << errorCode;
518 if (errorCode != QUERY_ERROR_NONE) {
519 if (errorCode == QUERY_ERROR_CANCELED)
521 m_message.createErrorReply(
522 SIGNOND_IDENTITY_OPERATION_CANCELED_ERR_NAME,
523 SIGNOND_IDENTITY_OPERATION_CANCELED_ERR_STR);
526 m_message.createErrorReply(SIGNOND_INTERNAL_SERVER_ERR_NAME,
527 QString(QLatin1String(
"signon-ui call returned error %1")).
530 SIGNOND_BUS.send(errReply);
534 if (resultParameters.contains(SSOUI_KEY_PASSWORD)) {
538 BLAME() <<
"NULL database handler object.";
539 errReply = m_message.createErrorReply(SIGNOND_STORE_FAILED_ERR_NAME,
540 SIGNOND_STORE_FAILED_ERR_STR);
541 SIGNOND_BUS.send(errReply);
547 m_pInfo->
setPassword(resultParameters[SSOUI_KEY_PASSWORD].toString());
552 if (ret != SIGNOND_NEW_IDENTITY) {
553 QDBusMessage dbusreply = m_message.createReply();
554 dbusreply << quint32(m_id);
555 SIGNOND_BUS.send(dbusreply);
558 BLAME() <<
"Error during update";
564 errReply = m_message.createErrorReply(SIGNOND_INTERNAL_SERVER_ERR_NAME,
565 SIGNOND_INTERNAL_SERVER_ERR_STR);
566 SIGNOND_BUS.send(errReply);
575 QDBusMessage errReply;
576 QDBusPendingReply<QVariantMap> reply;
581 QVariantMap resultParameters;
582 if (!reply.isError() && reply.count()) {
583 resultParameters = reply.argumentAt<0>();
586 m_message.createErrorReply(
587 SIGNOND_IDENTITY_OPERATION_CANCELED_ERR_NAME,
588 SIGNOND_IDENTITY_OPERATION_CANCELED_ERR_STR);
589 SIGNOND_BUS.send(errReply);
593 if (!resultParameters.contains(SSOUI_KEY_ERROR)) {
595 errReply = m_message.createErrorReply(SIGNOND_INTERNAL_SERVER_ERR_NAME,
596 SIGNOND_INTERNAL_SERVER_ERR_STR);
597 SIGNOND_BUS.send(errReply);
601 int errorCode = resultParameters.value(SSOUI_KEY_ERROR).toInt();
602 TRACE() <<
"error: " << errorCode;
603 if (errorCode != QUERY_ERROR_NONE) {
604 if (errorCode == QUERY_ERROR_CANCELED)
605 errReply = m_message.createErrorReply(
606 SIGNOND_IDENTITY_OPERATION_CANCELED_ERR_NAME,
607 SIGNOND_IDENTITY_OPERATION_CANCELED_ERR_STR);
608 else if (errorCode == QUERY_ERROR_FORGOT_PASSWORD)
609 errReply = m_message.createErrorReply(
610 SIGNOND_FORGOT_PASSWORD_ERR_NAME,
611 SIGNOND_FORGOT_PASSWORD_ERR_STR);
613 errReply = m_message.createErrorReply(
614 SIGNOND_INTERNAL_SERVER_ERR_NAME,
615 QString(QLatin1String(
"signon-ui call "
616 "returned error %1")).
619 SIGNOND_BUS.send(errReply);
623 if (resultParameters.contains(SSOUI_KEY_PASSWORD)) {
627 BLAME() <<
"NULL database handler object.";
628 errReply = m_message.createErrorReply(SIGNOND_STORE_FAILED_ERR_NAME,
629 SIGNOND_STORE_FAILED_ERR_STR);
630 SIGNOND_BUS.send(errReply);
637 m_pInfo->
password() == resultParameters[SSOUI_KEY_PASSWORD].
640 if (!ret && resultParameters.contains(SSOUI_KEY_CONFIRMCOUNT)) {
641 int count = resultParameters[SSOUI_KEY_CONFIRMCOUNT].toInt();
642 TRACE() <<
"retry count:" << count;
644 resultParameters[SSOUI_KEY_CONFIRMCOUNT] = (count-1);
645 resultParameters[SSOUI_KEY_MESSAGEID] =
646 QUERY_MESSAGE_NOT_AUTHORIZED;
647 queryUserPassword(resultParameters);
655 QDBusMessage dbusreply = m_message.createReply();
657 SIGNOND_BUS.send(dbusreply);
662 errReply = m_message.createErrorReply(SIGNOND_INTERNAL_SERVER_ERR_NAME,
663 SIGNOND_INTERNAL_SERVER_ERR_STR);
664 SIGNOND_BUS.send(errReply);