1919 */
2020
2121#include " HelperApp.h"
22- #include " Backend .h"
22+ #include " Pam .h"
2323#include " Configuration.h"
2424#include " UserSession.h"
2525#include " SafeDataStream.h"
4949#include < signal.h>
5050
5151namespace DDM {
52+ static Request passwordRequest{
53+ { { AuthPrompt::LOGIN_PASSWORD, QStringLiteral (" Password: " ), true } }
54+ };
55+
5256 HelperApp::HelperApp (int & argc, char ** argv)
5357 : QCoreApplication(argc, argv)
54- , m_backend(Backend::get (this ))
58+ , m_pam( new Pam (this ))
5559 , m_session(new UserSession(this ))
5660 , m_socket(new QLocalSocket(this )) {
5761 qInstallMessageHandler (HelperMessageHandler);
@@ -99,6 +103,7 @@ namespace DDM {
99103 return ;
100104 }
101105 m_user = args[pos + 1 ];
106+ m_pam->user = m_user;
102107 }
103108
104109 if ((pos = args.indexOf (QStringLiteral (" --display-server" ))) >= 0 ) {
@@ -108,19 +113,10 @@ namespace DDM {
108113 return ;
109114 }
110115 m_session->setDisplayServerCommand (args[pos + 1 ]);
111- m_backend->setDisplayServer (true );
112- }
113-
114- if ((pos = args.indexOf (QStringLiteral (" --autologin" ))) >= 0 ) {
115- m_backend->setAutologin (true );
116- }
117-
118- if ((pos = args.indexOf (QStringLiteral (" --greeter" ))) >= 0 ) {
119- m_backend->setGreeter (true );
120116 }
121117
122118 if ((pos = args.indexOf (QStringLiteral (" --identify-only" ))) >= 0 ) {
123- m_backend-> setIdentifyOnly ( true ) ;
119+ m_identifyOnly = true ;
124120 }
125121
126122 if ((pos = args.indexOf (QStringLiteral (" --skip-auth" ))) >= 0 ) {
@@ -134,7 +130,7 @@ namespace DDM {
134130 }
135131
136132 connect (m_socket, &QLocalSocket::connected, this , &HelperApp::doAuth);
137- if (!m_backend-> identifyOnly () ){
133+ if (!m_identifyOnly ){
138134 connect (m_session, &UserSession::finished, this , &HelperApp::sessionFinished);
139135 }
140136
@@ -153,7 +149,7 @@ namespace DDM {
153149 if (str.status () != QDataStream::Ok)
154150 qCritical () << " Couldn't write initial message:" << str.status ();
155151
156- if (!m_backend ->start (m_user )) {
152+ if (!m_pam ->start ()) {
157153 authenticated (QString ());
158154
159155 // write failed login to btmp
@@ -167,20 +163,22 @@ namespace DDM {
167163 }
168164
169165 Q_ASSERT (getuid () == 0 );
170- if (!m_skipAuth && !m_backend->authenticate ()) {
171- authenticated (QString ());
172-
173- // write failed login to btmp
174- const QProcessEnvironment env = m_session->processEnvironment ();
175- const QString displayId = env.value (QStringLiteral (" DISPLAY" ));
176- const QString vt = env.value (QStringLiteral (" XDG_VTNR" ));
177- utmpLogin (vt, displayId, m_user, 0 , false );
178-
179- exit (Auth::HELPER_AUTH_ERROR);
180- return ;
166+ if (!m_skipAuth) {
167+ Request req = request (passwordRequest);
168+ if (req.prompts .length () <= 0 || !m_pam->authenticate (req.prompts [0 ].response )) {
169+ authenticated (QString ());
170+
171+ // write failed login to btmp
172+ const QProcessEnvironment env = m_session->processEnvironment ();
173+ const QString displayId = env.value (QStringLiteral (" DISPLAY" ));
174+ const QString vt = env.value (QStringLiteral (" XDG_VTNR" ));
175+ utmpLogin (vt, displayId, m_user, 0 , false );
176+
177+ exit (Auth::HELPER_AUTH_ERROR);
178+ return ;
179+ }
181180 }
182181
183- m_user = m_backend->userName ();
184182 QProcessEnvironment env = authenticated (m_user);
185183
186184 if (env.value (QStringLiteral (" XDG_SESSION_CLASS" )) == QLatin1String (" greeter" )) {
@@ -200,16 +198,30 @@ namespace DDM {
200198 env.insert (m_session->processEnvironment ());
201199 m_session->setProcessEnvironment (env);
202200
203- if (!m_backend->openSession ()) {
201+ auto sessionEnv = m_pam->openSession (env);
202+ if (!sessionEnv.has_value ()) {
204203 sessionOpened (false , 0 );
205204 exit (Auth::HELPER_SESSION_ERROR);
206205 return ;
207206 }
208207
209- sessionOpened (true , m_backend->sessionId ());
208+ env = *sessionEnv;
209+ int sessionId = env.value (QStringLiteral (" XDG_SESSION_ID" )).toInt ();
210+ sessionOpened (true , sessionId);
211+
212+ struct passwd *pw;
213+ pw = getpwnam (qPrintable (m_user));
214+ if (pw) {
215+ env.insert (QStringLiteral (" HOME" ), QString::fromLocal8Bit (pw->pw_dir ));
216+ env.insert (QStringLiteral (" PWD" ), QString::fromLocal8Bit (pw->pw_dir ));
217+ env.insert (QStringLiteral (" SHELL" ), QString::fromLocal8Bit (pw->pw_shell ));
218+ env.insert (QStringLiteral (" USER" ), QString::fromLocal8Bit (pw->pw_name ));
219+ env.insert (QStringLiteral (" LOGNAME" ), QString::fromLocal8Bit (pw->pw_name ));
220+ }
221+ m_session->setProcessEnvironment (env);
222+ m_session->start ();
210223
211224 // write successful login to utmp/wtmp
212- const QProcessEnvironment env = m_session->processEnvironment ();
213225 const QString displayId = env.value (QStringLiteral (" DISPLAY" ));
214226 const QString vt = env.value (QStringLiteral (" XDG_VTNR" ));
215227 if (env.value (QStringLiteral (" XDG_SESSION_CLASS" )) != QLatin1String (" greeter" )) {
@@ -323,8 +335,8 @@ namespace DDM {
323335 Q_ASSERT (getuid () == 0 );
324336
325337 m_session->stop ();
326- if (!m_backend-> identifyOnly () ){
327- m_backend ->closeSession ();
338+ if (!m_identifyOnly && m_pam-> sessionOpened ){
339+ m_pam ->closeSession ();
328340 }
329341
330342 // write logout to utmp/wtmp
0 commit comments