36
37
bool UserAuthenticatorPam::AuthenticateStart(std::string const& username,
37
38
AuthenticateEndCallback const& authenticate_cb)
39
43
first_prompt_ = true;
40
44
username_ = username;
41
45
authenticate_cb_ = authenticate_cb;
42
pam_handle_ = nullptr;
44
if (!InitPam() || !pam_handle_)
47
glib::Object<GTask> task(g_task_new(nullptr, cancellable_, [] (GObject*, GAsyncResult*, gpointer data) {
48
auto self = static_cast<UserAuthenticatorPam*>(data);
49
pam_end(self->pam_handle_, self->status_);
50
self->authenticate_cb_(self->status_ == PAM_SUCCESS);
53
g_task_set_task_data(task, this, nullptr);
55
g_task_run_in_thread(task, [] (GTask* task, gpointer, gpointer data, GCancellable*) {
56
auto self = static_cast<UserAuthenticatorPam*>(data);
58
self->status_ = pam_authenticate(self->pam_handle_, 0);
60
if (self->status_ == PAM_SUCCESS)
62
int status2 = pam_acct_mgmt(self->pam_handle_, 0);
64
if (status2 == PAM_NEW_AUTHTOK_REQD)
65
status2 = pam_chauthtok(self->pam_handle_, PAM_CHANGE_EXPIRED_AUTHTOK);
67
if (unity::Settings::Instance().pam_check_account_type())
68
self->status_ = status2;
70
pam_setcred(self->pam_handle_, PAM_REINITIALIZE_CRED);
48
g_thread_try_new(nullptr, AuthenticationThreadFunc, this, &error);
53
gpointer UserAuthenticatorPam::AuthenticationThreadFunc(gpointer data)
55
auto self = static_cast<UserAuthenticatorPam*>(data);
57
if (!self->InitPam() || !self->pam_handle_)
59
self->pam_handle_ = nullptr;
60
self->source_manager_.AddTimeout(0, [self] { self->start_failed.emit(); return false; });
64
self->status_ = pam_authenticate(self->pam_handle_, 0);
66
if (self->status_ == PAM_SUCCESS)
68
int status2 = pam_acct_mgmt(self->pam_handle_, 0);
70
if (status2 == PAM_NEW_AUTHTOK_REQD)
71
status2 = pam_chauthtok(self->pam_handle_, PAM_CHANGE_EXPIRED_AUTHTOK);
73
if (unity::Settings::Instance().pam_check_account_type())
74
self->status_ = status2;
76
pam_setcred(self->pam_handle_, PAM_REINITIALIZE_CRED);
79
pam_end(self->pam_handle_, self->status_);
80
self->pam_handle_ = nullptr;
81
self->source_manager_.AddTimeout(0, [self] { self->authenticate_cb_(self->status_ == PAM_SUCCESS); return false; });
77
85
bool UserAuthenticatorPam::InitPam()