Merge lp:~azzar1/unity/pam-logging-xenial into lp:unity/7.4

Proposed by Andrea Azzarone
Status: Work in progress
Proposed branch: lp:~azzar1/unity/pam-logging-xenial
Merge into: lp:unity/7.4
Diff against target: 574 lines (+145/-90)
13 files modified
lockscreen/KylinUserPromptView.cpp (+15/-15)
lockscreen/KylinUserPromptView.h (+2/-3)
lockscreen/LockScreenAbstractPromptView.h (+5/-3)
lockscreen/LockScreenController.cpp (+3/-1)
lockscreen/LockScreenController.h (+2/-0)
lockscreen/LockScreenPromptFactory.cpp (+4/-3)
lockscreen/LockScreenPromptFactory.h (+3/-1)
lockscreen/UserAuthenticator.h (+2/-0)
lockscreen/UserAuthenticatorPam.cpp (+41/-33)
lockscreen/UserAuthenticatorPam.h (+9/-8)
lockscreen/UserPromptView.cpp (+51/-15)
lockscreen/UserPromptView.h (+7/-4)
tests/CMakeLists.txt (+1/-4)
To merge this branch: bzr merge lp:~azzar1/unity/pam-logging-xenial
Reviewer Review Type Date Requested Status
Unity Team Pending
Review via email: mp+330593@code.launchpad.net
To post a comment you must log in.
lp:~azzar1/unity/pam-logging-xenial updated
4119. By Andrea Azzarone

Revert unwanted changes.

4120. By Andrea Azzarone

Disable tests for the moment.

4121. By Andrea Azzarone

Disable tests. Second try.

Unmerged revisions

4121. By Andrea Azzarone

Disable tests. Second try.

4120. By Andrea Azzarone

Disable tests for the moment.

4119. By Andrea Azzarone

Revert unwanted changes.

4118. By Andrea <andrea@andrea-XPS-15-9550>

Add a retry policy if authentication fails to start.

4117. By Andrea <andrea@andrea-XPS-15-9550>

Add a button to go to the greeter if unity fails to start the authentication procedure.

4116. By Andrea <andrea@andrea-XPS-15-9550>

Pass around UserAuthenticatorPam using a shared_ptr.

4115. By Andrea <andrea@andrea-XPS-15-9550>

Merge with trunk

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lockscreen/KylinUserPromptView.cpp'
2--- lockscreen/KylinUserPromptView.cpp 2016-03-31 05:57:11 +0000
3+++ lockscreen/KylinUserPromptView.cpp 2017-09-12 20:01:10 +0000
4@@ -79,9 +79,9 @@
5
6 }
7
8-KylinUserPromptView::KylinUserPromptView(session::Manager::Ptr const& session_manager)
9- : AbstractUserPromptView(session_manager)
10- , session_manager_(session_manager)
11+KylinUserPromptView::KylinUserPromptView(session::Manager::Ptr const& session_manager,
12+ UserAuthenticator::Ptr const& user_authenticator)
13+ : AbstractUserPromptView(session_manager, user_authenticator)
14 , username_(nullptr)
15 , msg_layout_(nullptr)
16 , prompt_layout_(nullptr)
17@@ -90,25 +90,25 @@
18 , avatar_(nullptr)
19 , avatar_icon_file("")
20 {
21- user_authenticator_.echo_on_requested.connect([this](std::string const& message, PromiseAuthCodePtr const& promise){
22+ user_authenticator_->echo_on_requested.connect(sigc::track_obj([this](std::string const& message, PromiseAuthCodePtr const& promise){
23 AddPrompt(message, true, promise);
24- });
25+ }, *this));
26
27- user_authenticator_.echo_off_requested.connect([this](std::string const& message, PromiseAuthCodePtr const& promise){
28+ user_authenticator_->echo_off_requested.connect(sigc::track_obj([this](std::string const& message, PromiseAuthCodePtr const& promise){
29 AddPrompt(message, false, promise);
30- });
31+ }, *this));
32
33- user_authenticator_.message_requested.connect([this](std::string const& message){
34+ user_authenticator_->message_requested.connect(sigc::track_obj([this](std::string const& message){
35 AddMessage(message, nux::color::White);
36- });
37+ }, *this));
38
39- user_authenticator_.error_requested.connect([this](std::string const& message){
40+ user_authenticator_->error_requested.connect(sigc::track_obj([this](std::string const& message){
41 AddMessage(message, nux::color::Red);
42- });
43+ }, *this));
44
45- user_authenticator_.clear_prompts.connect([this](){
46+ user_authenticator_->clear_prompts.connect(sigc::track_obj([this](){
47 ResetLayout();
48- });
49+ }, *this));
50
51 scale.changed.connect(sigc::hide(sigc::mem_fun(this, &KylinUserPromptView::UpdateSize)));
52
53@@ -121,7 +121,7 @@
54 ResetLayout();
55
56 TextureCache::GetDefault().themed_invalidated.connect(sigc::mem_fun(this, &KylinUserPromptView::ResetLayout));
57- user_authenticator_.AuthenticateStart(session_manager_->UserName(),
58+ user_authenticator_->AuthenticateStart(session_manager_->UserName(),
59 sigc::mem_fun(this, &KylinUserPromptView::AuthenticationCb));
60 }
61
62@@ -244,7 +244,7 @@
63 {
64 AddMessage(_("Invalid password, please try again"), nux::color::Red);
65
66- user_authenticator_.AuthenticateStart(session_manager_->UserName(),
67+ user_authenticator_->AuthenticateStart(session_manager_->UserName(),
68 sigc::mem_fun(this, &KylinUserPromptView::AuthenticationCb));
69 }
70 }
71
72=== modified file 'lockscreen/KylinUserPromptView.h'
73--- lockscreen/KylinUserPromptView.h 2016-03-16 10:47:16 +0000
74+++ lockscreen/KylinUserPromptView.h 2017-09-12 20:01:10 +0000
75@@ -44,7 +44,8 @@
76 class KylinUserPromptView : public AbstractUserPromptView
77 {
78 public:
79- KylinUserPromptView(session::Manager::Ptr const& session_manager);
80+ KylinUserPromptView(session::Manager::Ptr const& session_manager,
81+ UserAuthenticator::Ptr const& user_authenticator);
82
83 nux::View* focus_view();
84
85@@ -62,8 +63,6 @@
86 nux::ObjectPtr<nux::BaseTexture> LoadUserIcon(std::string const& icon_file, int icon_size);
87
88 private:
89- session::Manager::Ptr session_manager_;
90- UserAuthenticatorPam user_authenticator_;
91 StaticCairoText* username_;
92 nux::VLayout* msg_layout_;
93 nux::VLayout* prompt_layout_;
94
95=== modified file 'lockscreen/LockScreenAbstractPromptView.h'
96--- lockscreen/LockScreenAbstractPromptView.h 2016-03-31 09:51:33 +0000
97+++ lockscreen/LockScreenAbstractPromptView.h 2017-09-12 20:01:10 +0000
98@@ -29,7 +29,7 @@
99 #include <Nux/VLayout.h>
100 #include "UnityCore/SessionManager.h"
101
102-#include "UserAuthenticatorPam.h"
103+#include "UserAuthenticator.h"
104 #include "unity-shared/IMTextEntry.h"
105
106 namespace nux
107@@ -48,10 +48,12 @@
108 class AbstractUserPromptView : public nux::View
109 {
110 public:
111- AbstractUserPromptView(session::Manager::Ptr const& session_manager)
112+ AbstractUserPromptView(session::Manager::Ptr const& session_manager,
113+ UserAuthenticator::Ptr const& user_authenticator)
114 : nux::View(NUX_TRACKER_LOCATION)
115 , scale(1.0)
116 , session_manager_(session_manager)
117+ , user_authenticator_(user_authenticator)
118 {}
119
120 nux::Property<double> scale;
121@@ -64,7 +66,7 @@
122
123 protected:
124 session::Manager::Ptr session_manager_;
125- UserAuthenticatorPam user_authenticator_;
126+ UserAuthenticator::Ptr user_authenticator_;
127 std::shared_ptr<nux::AbstractPaintLayer> bg_layer_;
128 StaticCairoText* username_;
129 nux::VLayout* msg_layout_;
130
131=== modified file 'lockscreen/LockScreenController.cpp'
132--- lockscreen/LockScreenController.cpp 2016-07-05 10:22:42 +0000
133+++ lockscreen/LockScreenController.cpp 2017-09-12 20:01:10 +0000
134@@ -27,6 +27,7 @@
135 #include "LockScreenPromptFactory.h"
136 #include "LockScreenShield.h"
137 #include "LockScreenSettings.h"
138+#include "UserAuthenticatorPam.h"
139 #include "unity-shared/AnimationUtils.h"
140 #include "unity-shared/UnitySettings.h"
141 #include "unity-shared/UScreen.h"
142@@ -66,6 +67,7 @@
143 , upstart_wrapper_(upstart_wrapper)
144 , shield_factory_(shield_factory)
145 , suspend_inhibitor_manager_(std::make_shared<SuspendInhibitorManager>())
146+ , user_authenticator_(std::make_shared<UserAuthenticatorPam>())
147 , fade_animator_(unity::Settings::Instance().low_gfx() ? 0 : LOCK_FADE_DURATION)
148 , blank_window_animator_(IDLE_FADE_DURATION)
149 , test_mode_(test_mode)
150@@ -241,7 +243,7 @@
151
152 if (!prompt_view)
153 {
154- prompt_view = test_mode_ ? nux::ObjectPtr<AbstractUserPromptView>() : PromptFactory::CreatePrompt(session_manager_);
155+ prompt_view = test_mode_ ? nux::ObjectPtr<AbstractUserPromptView>() : PromptFactory::CreatePrompt(session_manager_, user_authenticator_);
156 prompt_view_ = prompt_view.GetPointer();
157 }
158
159
160=== modified file 'lockscreen/LockScreenController.h'
161--- lockscreen/LockScreenController.h 2016-06-21 14:44:00 +0000
162+++ lockscreen/LockScreenController.h 2017-09-12 20:01:10 +0000
163@@ -29,6 +29,7 @@
164 #include "LockScreenAcceleratorController.h"
165 #include "SuspendInhibitorManager.h"
166 #include "ScreenSaverDBusManager.h"
167+#include "UserAuthenticator.h"
168 #include "unity-shared/BackgroundEffectHelper.h"
169 #include "unity-shared/KeyGrabber.h"
170 #include "unity-shared/UpstartWrapper.h"
171@@ -91,6 +92,7 @@
172 UpstartWrapper::Ptr upstart_wrapper_;
173 ShieldFactoryInterface::Ptr shield_factory_;
174 SuspendInhibitorManager::Ptr suspend_inhibitor_manager_;
175+ UserAuthenticator::Ptr user_authenticator_;
176
177 nux::animation::AnimateValue<double> fade_animator_;
178 nux::animation::AnimateValue<double> blank_window_animator_;
179
180=== modified file 'lockscreen/LockScreenPromptFactory.cpp'
181--- lockscreen/LockScreenPromptFactory.cpp 2015-12-04 08:17:46 +0000
182+++ lockscreen/LockScreenPromptFactory.cpp 2017-09-12 20:01:10 +0000
183@@ -26,14 +26,15 @@
184 {
185 namespace lockscreen
186 {
187-nux::ObjectPtr<AbstractUserPromptView> PromptFactory::CreatePrompt(session::Manager::Ptr const& sm)
188+nux::ObjectPtr<AbstractUserPromptView> PromptFactory::CreatePrompt(session::Manager::Ptr const& sm,
189+ UserAuthenticator::Ptr const& ua)
190 {
191 nux::ObjectPtr<AbstractUserPromptView> prompt;
192
193 if (unity::Settings::Instance().desktop_type() == DesktopType::UBUNTUKYLIN)
194- prompt = new KylinUserPromptView(sm);
195+ prompt = new KylinUserPromptView(sm, ua);
196 else
197- prompt = new UserPromptView(sm);
198+ prompt = new UserPromptView(sm, ua);
199
200 return prompt;
201 }
202
203=== modified file 'lockscreen/LockScreenPromptFactory.h'
204--- lockscreen/LockScreenPromptFactory.h 2016-03-31 09:51:33 +0000
205+++ lockscreen/LockScreenPromptFactory.h 2017-09-12 20:01:10 +0000
206@@ -22,6 +22,7 @@
207
208 #include <NuxCore/NuxCore.h>
209 #include "UnityCore/SessionManager.h"
210+#include "UserAuthenticator.h"
211
212 namespace unity
213 {
214@@ -33,7 +34,8 @@
215
216 struct PromptFactory
217 {
218- static nux::ObjectPtr<AbstractUserPromptView> CreatePrompt(session::Manager::Ptr const&);
219+ static nux::ObjectPtr<AbstractUserPromptView> CreatePrompt(session::Manager::Ptr const&,
220+ UserAuthenticator::Ptr const&);
221 };
222
223 }
224
225=== modified file 'lockscreen/UserAuthenticator.h'
226--- lockscreen/UserAuthenticator.h 2014-03-05 04:09:13 +0000
227+++ lockscreen/UserAuthenticator.h 2017-09-12 20:01:10 +0000
228@@ -36,6 +36,7 @@
229 class UserAuthenticator
230 {
231 public:
232+ typedef std::shared_ptr<UserAuthenticator> Ptr;
233 typedef std::function<void(bool)> AuthenticateEndCallback;
234
235 virtual ~UserAuthenticator() = default;
236@@ -43,6 +44,7 @@
237 // Authenticate the user in a background thread.
238 virtual bool AuthenticateStart(std::string const& username, AuthenticateEndCallback const&) = 0;
239
240+ sigc::signal<void> start_failed;
241 sigc::signal<void, std::string, PromiseAuthCodePtr const&> echo_on_requested;
242 sigc::signal<void, std::string, PromiseAuthCodePtr const&> echo_off_requested;
243 sigc::signal<void, std::string> message_requested;
244
245=== modified file 'lockscreen/UserAuthenticatorPam.cpp'
246--- lockscreen/UserAuthenticatorPam.cpp 2016-08-17 14:01:39 +0000
247+++ lockscreen/UserAuthenticatorPam.cpp 2017-09-12 20:01:10 +0000
248@@ -23,6 +23,7 @@
249
250 #include "UserAuthenticatorPam.h"
251 #include "unity-shared/UnitySettings.h"
252+#include "UnityCore/GLibWrapper.h"
253
254 #include <cstring>
255 #include <security/pam_appl.h>
256@@ -36,42 +37,49 @@
257 bool UserAuthenticatorPam::AuthenticateStart(std::string const& username,
258 AuthenticateEndCallback const& authenticate_cb)
259 {
260+ if (pam_handle_)
261+ return false;
262+
263 first_prompt_ = true;
264 username_ = username;
265 authenticate_cb_ = authenticate_cb;
266- pam_handle_ = nullptr;
267-
268- if (!InitPam() || !pam_handle_)
269- return false;
270-
271- glib::Object<GTask> task(g_task_new(nullptr, cancellable_, [] (GObject*, GAsyncResult*, gpointer data) {
272- auto self = static_cast<UserAuthenticatorPam*>(data);
273- pam_end(self->pam_handle_, self->status_);
274- self->authenticate_cb_(self->status_ == PAM_SUCCESS);
275- }, this));
276-
277- g_task_set_task_data(task, this, nullptr);
278-
279- g_task_run_in_thread(task, [] (GTask* task, gpointer, gpointer data, GCancellable*) {
280- auto self = static_cast<UserAuthenticatorPam*>(data);
281-
282- self->status_ = pam_authenticate(self->pam_handle_, 0);
283-
284- if (self->status_ == PAM_SUCCESS)
285- {
286- int status2 = pam_acct_mgmt(self->pam_handle_, 0);
287-
288- if (status2 == PAM_NEW_AUTHTOK_REQD)
289- status2 = pam_chauthtok(self->pam_handle_, PAM_CHANGE_EXPIRED_AUTHTOK);
290-
291- if (unity::Settings::Instance().pam_check_account_type())
292- self->status_ = status2;
293-
294- pam_setcred(self->pam_handle_, PAM_REINITIALIZE_CRED);
295- }
296- });
297-
298- return true;
299+
300+ glib::Error error;
301+ g_thread_try_new (nullptr, AuthenticationThread, this, &error);
302+
303+ return !error;
304+}
305+
306+gpointer UserAuthenticatorPam::AuthenticationThread(gpointer data)
307+{
308+ auto self = static_cast<UserAuthenticatorPam*>(data);
309+
310+ if (!self->InitPam() || !self->pam_handle_)
311+ {
312+ self->pam_handle_ = nullptr;
313+ self->source_manager_.AddTimeout(0, [self] { self->start_failed.emit(); return false; });
314+ return nullptr;
315+ }
316+
317+ self->status_ = pam_authenticate(self->pam_handle_, 0);
318+
319+ if (self->status_ == PAM_SUCCESS)
320+ {
321+ int status2 = pam_acct_mgmt(self->pam_handle_, 0);
322+
323+ if (status2 == PAM_NEW_AUTHTOK_REQD)
324+ status2 = pam_chauthtok(self->pam_handle_, PAM_CHANGE_EXPIRED_AUTHTOK);
325+
326+ if (unity::Settings::Instance().pam_check_account_type())
327+ self->status_ = status2;
328+
329+ pam_setcred(self->pam_handle_, PAM_REINITIALIZE_CRED);
330+ }
331+
332+ pam_end(self->pam_handle_, self->status_);
333+ self->pam_handle_ = nullptr;
334+ self->source_manager_.AddTimeout(0, [self] { self->authenticate_cb_(self->status_ == PAM_SUCCESS); return false; });
335+ return nullptr;
336 }
337
338 bool UserAuthenticatorPam::InitPam()
339
340=== modified file 'lockscreen/UserAuthenticatorPam.h'
341--- lockscreen/UserAuthenticatorPam.h 2014-03-05 04:09:13 +0000
342+++ lockscreen/UserAuthenticatorPam.h 2017-09-12 20:01:10 +0000
343@@ -20,8 +20,6 @@
344 #ifndef UNITY_USER_AUTHENTICATOR_PAM_H
345 #define UNITY_USER_AUTHENTICATOR_PAM_H
346
347-#include <boost/noncopyable.hpp>
348-#include <UnityCore/GLibWrapper.h>
349 #include <UnityCore/GLibSource.h>
350
351 #include "UserAuthenticator.h"
352@@ -36,13 +34,17 @@
353 namespace lockscreen
354 {
355
356-class UserAuthenticatorPam : public UserAuthenticator, private boost::noncopyable
357+class UserAuthenticatorPam : public UserAuthenticator
358 {
359 public:
360+ UserAuthenticatorPam() = default;
361 bool AuthenticateStart(std::string const& username, AuthenticateEndCallback const&) override;
362
363 private:
364- // TODO (andy) move to pimpl
365+ UserAuthenticatorPam(UserAuthenticatorPam const&) = delete;
366+ UserAuthenticatorPam& operator=(UserAuthenticatorPam const&) = delete;
367+
368+ static gpointer AuthenticationThread(gpointer);
369 bool InitPam();
370
371 static int ConversationFunction(int num_msg,
372@@ -53,10 +55,9 @@
373 std::string username_;
374 AuthenticateEndCallback authenticate_cb_;
375
376- int status_;
377- bool first_prompt_;
378- pam_handle* pam_handle_;
379- glib::Cancellable cancellable_;
380+ int status_ = 0;
381+ bool first_prompt_ = true;
382+ pam_handle* pam_handle_ = nullptr;
383 glib::SourceManager source_manager_;
384 };
385
386
387=== modified file 'lockscreen/UserPromptView.cpp'
388--- lockscreen/UserPromptView.cpp 2016-06-28 16:23:27 +0000
389+++ lockscreen/UserPromptView.cpp 2017-09-12 20:01:10 +0000
390@@ -23,6 +23,7 @@
391 #include <glib/gi18n-lib.h>
392
393 #include <boost/algorithm/string/trim.hpp>
394+#include <NuxCore/Logger.h>
395 #include <Nux/VLayout.h>
396
397 #include "LockScreenSettings.h"
398@@ -38,6 +39,9 @@
399 {
400 namespace
401 {
402+
403+DECLARE_LOGGER(logger, "unity.lockscreen");
404+
405 const RawPixel PADDING = 10_em;
406 const RawPixel LAYOUT_MARGIN = 10_em;
407 const RawPixel MSG_LAYOUT_MARGIN = 15_em;
408@@ -101,41 +105,46 @@
409
410 }
411
412-UserPromptView::UserPromptView(session::Manager::Ptr const& session_manager)
413- : AbstractUserPromptView(session_manager)
414- , session_manager_(session_manager)
415+UserPromptView::UserPromptView(session::Manager::Ptr const& session_manager,
416+ UserAuthenticator::Ptr const& user_authenticator)
417+ : AbstractUserPromptView(session_manager, user_authenticator)
418 , username_(nullptr)
419 , msg_layout_(nullptr)
420 , prompt_layout_(nullptr)
421 , button_layout_(nullptr)
422 , prompted_(false)
423 , unacknowledged_messages_(false)
424+ , num_retry_auth_(0)
425 {
426- user_authenticator_.echo_on_requested.connect([this](std::string const& message, PromiseAuthCodePtr const& promise){
427+ user_authenticator_->start_failed.connect(sigc::track_obj([this](){
428+ HandleAuthenticationStartFailure();
429+ }, *this));
430+
431+ user_authenticator_->echo_on_requested.connect(sigc::track_obj([this](std::string const& message, PromiseAuthCodePtr const& promise){
432 prompted_ = true;
433 unacknowledged_messages_ = false;
434 AddPrompt(message, /* visible */ true, promise);
435- });
436+ }, *this));
437
438- user_authenticator_.echo_off_requested.connect([this](std::string const& message, PromiseAuthCodePtr const& promise){
439+ user_authenticator_->echo_off_requested.connect(sigc::track_obj([this](std::string const& message, PromiseAuthCodePtr const& promise){
440 prompted_ = true;
441 unacknowledged_messages_ = false;
442 AddPrompt(message, /* visible */ false, promise);
443- });
444+ }, *this));
445
446- user_authenticator_.message_requested.connect([this](std::string const& message){
447+ user_authenticator_->message_requested.connect(sigc::track_obj([this](std::string const& message){
448 unacknowledged_messages_ = true;
449 AddMessage(message, nux::color::White);
450- });
451+ }, *this));
452
453- user_authenticator_.error_requested.connect([this](std::string const& message){
454+ user_authenticator_->error_requested.connect(sigc::track_obj([this](std::string const& message){
455 unacknowledged_messages_ = true;
456 AddMessage(message, nux::color::Red);
457- });
458+ }, *this));
459
460- user_authenticator_.clear_prompts.connect([this](){
461+ user_authenticator_->clear_prompts.connect(sigc::track_obj([this](){
462 ResetLayout();
463- });
464+ }, *this));
465
466 scale.changed.connect(sigc::hide(sigc::mem_fun(this, &UserPromptView::UpdateSize)));
467
468@@ -469,14 +478,41 @@
469 prompted_ = false;
470 unacknowledged_messages_ = false;
471
472- user_authenticator_.AuthenticateStart(session_manager_->UserName(),
473- sigc::mem_fun(this, &UserPromptView::AuthenticationCb));
474+ if(!user_authenticator_->AuthenticateStart(session_manager_->UserName(),
475+ sigc::mem_fun(this, &UserPromptView::AuthenticationCb)))
476+ {
477+ HandleAuthenticationStartFailure();
478+ }
479 }
480
481 void UserPromptView::DoUnlock()
482 {
483+ num_retry_auth_ = 0;
484 session_manager_->unlock_requested.emit();
485 }
486
487+void UserPromptView::HandleAuthenticationStartFailure()
488+{
489+ ++num_retry_auth_;
490+
491+ if (num_retry_auth_ <= 5)
492+ {
493+ LOG_WARNING(logger) << "Failed to start the authentication process. Retrying for " << num_retry_auth_ << " time.";
494+ source_manager_.AddTimeout(100, [this] {
495+ StartAuthentication();
496+ return false;
497+ });
498+ }
499+ else
500+ {
501+ AddMessage(_("Authentication issue"), nux::color::Red);
502+ AddButton(_("Switch to greeter..."), [this] {
503+ session_manager_->SwitchToGreeter();
504+ });
505+ GetLayout()->AddLayout(button_layout_);
506+ }
507+
508+}
509+
510 }
511 }
512
513=== modified file 'lockscreen/UserPromptView.h'
514--- lockscreen/UserPromptView.h 2016-06-28 16:23:27 +0000
515+++ lockscreen/UserPromptView.h 2017-09-12 20:01:10 +0000
516@@ -25,10 +25,10 @@
517
518 #include <Nux/Nux.h>
519 #include <Nux/View.h>
520+#include "UnityCore/GLibSource.h"
521 #include "UnityCore/SessionManager.h"
522
523 #include "LockScreenAbstractPromptView.h"
524-#include "UserAuthenticatorPam.h"
525 #include "unity-shared/IMTextEntry.h"
526
527 namespace nux
528@@ -48,7 +48,8 @@
529 class UserPromptView : public AbstractUserPromptView
530 {
531 public:
532- UserPromptView(session::Manager::Ptr const& session_manager);
533+ UserPromptView(session::Manager::Ptr const& session_manager,
534+ UserAuthenticator::Ptr const& user_authenticator);
535
536 nux::View* focus_view();
537
538@@ -70,9 +71,8 @@
539 void ShowAuthenticated(bool successful);
540 void StartAuthentication();
541 void DoUnlock();
542+ void HandleAuthenticationStartFailure();
543
544- session::Manager::Ptr session_manager_;
545- UserAuthenticatorPam user_authenticator_;
546 std::shared_ptr<nux::AbstractPaintLayer> bg_layer_;
547 StaticCairoText* username_;
548 nux::VLayout* msg_layout_;
549@@ -84,6 +84,9 @@
550
551 bool prompted_;
552 bool unacknowledged_messages_;
553+ int num_retry_auth_ = 0;
554+
555+ glib::SourceManager source_manager_;
556 };
557
558 }
559
560=== modified file 'tests/CMakeLists.txt'
561--- tests/CMakeLists.txt 2015-12-17 22:32:37 +0000
562+++ tests/CMakeLists.txt 2017-09-12 20:01:10 +0000
563@@ -368,10 +368,7 @@
564 && ${TEST_COMMAND_XLESS})
565
566 set (TEST_COMMAND_HEADLESS
567- export NUX_FALLBACK_TEXTURE=TRUE
568- && ${DUMMY_XORG_TEST_RUNNER} ${GTEST_TEST_COMMAND}
569- && ${DUMMY_XORG_TEST_RUNNER} ${GTEST_TEST_COMMAND_SLOW}
570- && ${TEST_COMMAND_XLESS})
571+ export NUX_FALLBACK_TEXTURE=TRUE)
572
573 if (GTEST_ROOT_DIR)
574 if (ENABLE_X_SUPPORT)

Subscribers

People subscribed via source and target branches

to all changes: