@@ -48,6 +48,7 @@ public:
48 this, SLOT(finishPam()));
48 this, SLOT(finishPam()));
49 connect(this, SIGNAL(showMessage(QString, QLightDM::Greeter::MessageType)),
49 connect(this, SIGNAL(showMessage(QString, QLightDM::Greeter::MessageType)),
50 greeter, SIGNAL(showMessage(QString, QLightDM::Greeter::MessageType)));
50 greeter, SIGNAL(showMessage(QString, QLightDM::Greeter::MessageType)));
51+ // This next connect is how we pass ResponseFutures between threads
51 connect(this, SIGNAL(showPrompt(QString, QLightDM::Greeter::PromptType, QLightDM::GreeterImpl::ResponseFuture)),
52 connect(this, SIGNAL(showPrompt(QString, QLightDM::Greeter::PromptType, QLightDM::GreeterImpl::ResponseFuture)),
52 this, SLOT(handlePrompt(QString, QLightDM::Greeter::PromptType, QLightDM::GreeterImpl::ResponseFuture)));
53 this, SLOT(handlePrompt(QString, QLightDM::Greeter::PromptType, QLightDM::GreeterImpl::ResponseFuture)));
@@ -68,11 +69,11 @@ public:
68 conversation.conv = converseWithPam;
69 conversation.conv = converseWithPam;
69 conversation.appdata_ptr = static_cast<void*>(this);
70 conversation.appdata_ptr = static_cast<void*>(this);
71− if (pam_start("lightdm", username.toUtf8(),
72+ if (pam_start("lightdm", username.toUtf8(), &conversation, &pamHandle) == PAM_SUCCESS) {
72− &conversation, &pamHandle) == PAM_SUCCESS) {
73 futureWatcher.setFuture(QtConcurrent::run(authenticateWithPam, pamHandle));
73 futureWatcher.setFuture(QtConcurrent::run(authenticateWithPam, pamHandle));
75 greeterPrivate->authenticated = false;
75 greeterPrivate->authenticated = false;
76+ Q_EMIT greeter->showMessage("Internal error: could not start PAM authentication", QLightDM::Greeter::MessageTypeError);
76 Q_EMIT greeter->authenticationComplete();
77 Q_EMIT greeter->authenticationComplete();
@@ -80,12 +81,15 @@ public:
80 static int authenticateWithPam(pam_handle* pamHandle)
81 static int authenticateWithPam(pam_handle* pamHandle)
82 int pamStatus = pam_authenticate(pamHandle, 0);
83 int pamStatus = pam_authenticate(pamHandle, 0);
83− if (pamStatus == PAM_SUCCESS)
84+ if (pamStatus == PAM_SUCCESS) {
84− pamStatus = pam_acct_mgmt(pamHandle, 0);
85+ pamStatus = pam_acct_mgmt(pamHandle, 0);
85− if (pamStatus == PAM_NEW_AUTHTOK_REQD)
87+ if (pamStatus == PAM_NEW_AUTHTOK_REQD) {
86− pamStatus = pam_chauthtok(pamHandle, PAM_CHANGE_EXPIRED_AUTHTOK);
88+ pamStatus = pam_chauthtok(pamHandle, PAM_CHANGE_EXPIRED_AUTHTOK);
87− if (pamStatus == PAM_SUCCESS)
90+ if (pamStatus == PAM_SUCCESS) {
88− pam_setcred(pamHandle, PAM_REINITIALIZE_CRED);
91+ pam_setcred(pamHandle, PAM_REINITIALIZE_CRED);
89 return pamStatus;
93 return pamStatus;
@@ -101,11 +105,10 @@ public:
102 GreeterImpl* impl = static_cast<GreeterImpl*>(appdata_ptr);
106 GreeterImpl* impl = static_cast<GreeterImpl*>(appdata_ptr);
104− bool raise_error = false;
105 int count;
108 int count;
106 QVector<ResponseFuture> responses;
109 QVector<ResponseFuture> responses;
108− for (count = 0; count < num_msg && !raise_error; ++count)
111+ for (count = 0; count < num_msg; ++count)
110 switch (msg[count]->msg_style)
113 switch (msg[count]->msg_style)
@@ -123,21 +126,25 @@ public:
123 responses.append(ResponseFuture());
126 responses.append(ResponseFuture());
124 responses.last().reportStarted();
127 responses.last().reportStarted();
125 Q_EMIT impl->showPrompt(message, Greeter::PromptTypeSecret, responses.last());
128 Q_EMIT impl->showPrompt(message, Greeter::PromptTypeSecret, responses.last());
127 case PAM_TEXT_INFO:
131 case PAM_TEXT_INFO:
129 QString message(msg[count]->msg);
133 QString message(msg[count]->msg);
130 Q_EMIT impl->showMessage(message, Greeter::MessageTypeInfo);
134 Q_EMIT impl->showMessage(message, Greeter::MessageTypeInfo);
134 QString message(msg[count]->msg);
139 QString message(msg[count]->msg);
135 Q_EMIT impl->showMessage(message, Greeter::MessageTypeError);
140 Q_EMIT impl->showMessage(message, Greeter::MessageTypeError);
140 int i = 0;
146 int i = 0;
147+ bool raise_error = false;
142 for (auto &response : responses)
149 for (auto &response : responses)