Skip to content

Commit 41de689

Browse files
committed
refactor: Refactor PAM authenticate module
- Remove unused logic; - Improve readability; - Add docs & comments; This works fine.
1 parent bc4c5ba commit 41de689

File tree

12 files changed

+311
-1057
lines changed

12 files changed

+311
-1057
lines changed

REUSE.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ SPDX-FileCopyrightText = "None"
6969
SPDX-License-Identifier = "GPL-2.0-or-later"
7070

7171
[[annotations]]
72-
path = ["releng/prepare-relnotes", "src/auth/Auth.cpp", "src/auth/Auth.h", "src/auth/AuthMessages.h", "src/auth/AuthPrompt.cpp", "src/auth/AuthPrompt.h", "src/auth/AuthRequest.cpp", "src/auth/AuthRequest.h", "src/common/ConfigReader.cpp", "src/common/ConfigReader.h", "src/common/Configuration.cpp", "src/common/Configuration.h", "src/common/MessageHandler.h", "src/common/Messages.h", "src/common/SafeDataStream.cpp", "src/common/SafeDataStream.h", "src/common/Session.cpp", "src/common/Session.h", "src/common/SignalHandler.cpp", "src/common/SignalHandler.h", "src/common/SocketWriter.cpp", "src/common/SocketWriter.h", "src/common/ThemeConfig.cpp", "src/common/ThemeConfig.h", "src/common/ThemeMetadata.cpp", "src/common/ThemeMetadata.h", "src/common/VirtualTerminal.cpp", "src/common/VirtualTerminal.h", "src/common/XAuth.cpp", "src/common/XAuth.h", "src/daemon/DaemonApp.cpp", "src/daemon/DaemonApp.h", "src/daemon/Display.cpp", "src/daemon/Display.h", "src/daemon/DisplayManager.cpp", "src/daemon/DisplayManager.h", "src/daemon/DisplayServer.cpp", "src/daemon/DisplayServer.h", "src/daemon/Greeter.cpp", "src/daemon/Greeter.h", "src/daemon/PowerManager.cpp", "src/daemon/PowerManager.h", "src/daemon/Seat.cpp", "src/daemon/Seat.h", "src/daemon/SeatManager.cpp", "src/daemon/SeatManager.h", "src/daemon/SocketServer.cpp", "src/daemon/SocketServer.h", "src/daemon/TreelandConnector.cpp", "src/daemon/TreelandConnector.h", "src/daemon/Utils.h", "src/daemon/WaylandDisplayServer.cpp", "src/daemon/WaylandDisplayServer.h", "src/daemon/XorgDisplayServer.cpp", "src/daemon/XorgDisplayServer.h", "src/daemon/XorgUserDisplayServer.cpp", "src/daemon/XorgUserDisplayServer.h", "src/greeter/GreeterApp.h", "src/greeter/GreeterProxy.cpp", "src/greeter/GreeterProxy.h", "src/greeter/SessionModel.cpp", "src/greeter/SessionModel.h", "src/greeter/UserModel.cpp", "src/greeter/UserModel.h", "src/helper/Backend.cpp", "src/helper/Backend.h", "src/helper/HelperApp.cpp", "src/helper/HelperApp.h", "src/helper/HelperStartWayland.cpp", "src/helper/HelperStartX11User.cpp", "src/helper/UserSession.cpp", "src/helper/UserSession.h", "src/helper/backend/PamBackend.cpp", "src/helper/backend/PamBackend.h", "src/helper/backend/PamHandle.cpp", "src/helper/backend/PamHandle.h", "src/helper/waylandhelper.cpp", "src/helper/waylandhelper.h", "src/helper/waylandsocketwatcher.cpp", "src/helper/waylandsocketwatcher.h", "src/helper/xorguserhelper.cpp", "src/helper/xorguserhelper.h", "src/common/LogindDBusTypes.cpp", "src/common/LogindDBusTypes.h", "src/greeter/GreeterApp.cpp"]
72+
path = ["releng/prepare-relnotes", "src/auth/Auth.cpp", "src/auth/Auth.h", "src/auth/AuthMessages.h", "src/auth/AuthPrompt.cpp", "src/auth/AuthPrompt.h", "src/auth/AuthRequest.cpp", "src/auth/AuthRequest.h", "src/common/ConfigReader.cpp", "src/common/ConfigReader.h", "src/common/Configuration.cpp", "src/common/Configuration.h", "src/common/MessageHandler.h", "src/common/Messages.h", "src/common/SafeDataStream.cpp", "src/common/SafeDataStream.h", "src/common/Session.cpp", "src/common/Session.h", "src/common/SignalHandler.cpp", "src/common/SignalHandler.h", "src/common/SocketWriter.cpp", "src/common/SocketWriter.h", "src/common/ThemeConfig.cpp", "src/common/ThemeConfig.h", "src/common/ThemeMetadata.cpp", "src/common/ThemeMetadata.h", "src/common/VirtualTerminal.cpp", "src/common/VirtualTerminal.h", "src/common/XAuth.cpp", "src/common/XAuth.h", "src/daemon/DaemonApp.cpp", "src/daemon/DaemonApp.h", "src/daemon/Display.cpp", "src/daemon/Display.h", "src/daemon/DisplayManager.cpp", "src/daemon/DisplayManager.h", "src/daemon/DisplayServer.cpp", "src/daemon/DisplayServer.h", "src/daemon/Greeter.cpp", "src/daemon/Greeter.h", "src/daemon/PowerManager.cpp", "src/daemon/PowerManager.h", "src/daemon/Seat.cpp", "src/daemon/Seat.h", "src/daemon/SeatManager.cpp", "src/daemon/SeatManager.h", "src/daemon/SocketServer.cpp", "src/daemon/SocketServer.h", "src/daemon/TreelandConnector.cpp", "src/daemon/TreelandConnector.h", "src/daemon/Utils.h", "src/daemon/WaylandDisplayServer.cpp", "src/daemon/WaylandDisplayServer.h", "src/daemon/XorgDisplayServer.cpp", "src/daemon/XorgDisplayServer.h", "src/daemon/XorgUserDisplayServer.cpp", "src/daemon/XorgUserDisplayServer.h", "src/greeter/GreeterApp.h", "src/greeter/GreeterProxy.cpp", "src/greeter/GreeterProxy.h", "src/greeter/SessionModel.cpp", "src/greeter/SessionModel.h", "src/greeter/UserModel.cpp", "src/greeter/UserModel.h", "src/helper/Pam.cpp", "src/helper/Pam.h", "src/helper/HelperApp.cpp", "src/helper/HelperApp.h", "src/helper/HelperStartWayland.cpp", "src/helper/HelperStartX11User.cpp", "src/helper/UserSession.cpp", "src/helper/UserSession.h", "src/helper/waylandhelper.cpp", "src/helper/waylandhelper.h", "src/helper/waylandsocketwatcher.cpp", "src/helper/waylandsocketwatcher.h", "src/helper/xorguserhelper.cpp", "src/helper/xorguserhelper.h", "src/common/LogindDBusTypes.cpp", "src/common/LogindDBusTypes.h", "src/greeter/GreeterApp.cpp"]
7373
precedence = "aggregate"
7474
SPDX-FileCopyrightText = "None"
7575
SPDX-License-Identifier = "GPL-2.0-or-later"

src/helper/Backend.cpp

Lines changed: 0 additions & 124 deletions
This file was deleted.

src/helper/Backend.h

Lines changed: 0 additions & 66 deletions
This file was deleted.

src/helper/CMakeLists.txt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,9 @@ include_directories(
55
)
66

77
set(HELPER_SOURCES
8-
Backend.cpp
98
HelperApp.cpp
109
UserSession.cpp
11-
backend/PamHandle.cpp
12-
backend/PamBackend.cpp
10+
Pam.cpp
1311
)
1412

1513
add_executable(ddm-helper ${HELPER_SOURCES})

src/helper/HelperApp.cpp

Lines changed: 43 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
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"
@@ -49,9 +49,13 @@
4949
#include <signal.h>
5050

5151
namespace 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

src/helper/HelperApp.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
class QLocalSocket;
3030

3131
namespace DDM {
32-
class Backend;
32+
class Pam;
3333
class UserSession;
3434
class HelperApp : public QCoreApplication
3535
{
@@ -61,13 +61,14 @@ namespace DDM {
6161

6262
private:
6363
qint64 m_id { -1 };
64-
Backend *m_backend { nullptr };
64+
Pam *m_pam { nullptr };
6565
UserSession *m_session { nullptr };
6666
QLocalSocket *m_socket { nullptr };
6767
QString m_user { };
6868
// TODO: get rid of this in a nice clean way along the way with moving to user session X server
6969
QByteArray m_cookie { };
7070
bool m_skipAuth = false;
71+
bool m_identifyOnly = false;
7172

7273
/*!
7374
\brief Write utmp/wtmp/btmp records when a user logs in

0 commit comments

Comments
 (0)