1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
import re
with open('src/auth/Auth.cpp', 'r') as f:
content = f.read()
content = content.replace('waitForFinished(5000)', 'waitForFinished(300)')
with open('src/auth/Auth.cpp', 'w') as f:
f.write(content)
with open('src/daemon/Display.h', 'r') as f:
content = f.read()
content = content.replace(
'bool m_started { false };',
'bool m_started { false };\n bool m_fingerprintAuthActive { false };\n QString m_lastAttemptedUser;'
)
content = content.replace(
' bool startAuth(const QString &user, const QString &password,\n const Session &session);',
' bool startAuth(const QString &user, const QString &password,\n const Session &session);\n void onGreeterConnected();'
)
with open('src/daemon/Display.h', 'w') as f:
f.write(content)
with open('src/daemon/SocketServer.h', 'r') as f:
content = f.read()
content = content.replace(
' void login(QLocalSocket *socket,\n const QString &user, const QString &password,\n const Session &session);',
' void login(QLocalSocket *socket,\n const QString &user, const QString &password,\n const Session &session);\n void greeterConnected();'
)
with open('src/daemon/SocketServer.h', 'w') as f:
f.write(content)
with open('src/daemon/SocketServer.cpp', 'r') as f:
content = f.read()
content = content.replace(
' // emit signal\n }\n break;\n case GreeterMessages::Login:',
' // emit signal\n emit greeterConnected();\n }\n break;\n case GreeterMessages::Login:'
)
with open('src/daemon/SocketServer.cpp', 'w') as f:
f.write(content)
with open('src/daemon/Display.cpp', 'r') as f:
content = f.read()
content = content.replace(
' connect(m_socketServer, &SocketServer::login, this, &Display::login);',
' connect(m_socketServer, &SocketServer::login, this, &Display::login);\n connect(m_socketServer, &SocketServer::greeterConnected, this, &Display::onGreeterConnected);'
)
content = content.replace(
' void Display::login(QLocalSocket *socket,\n const QString &user, const QString &password,\n const Session &session) {\n m_socket = socket;',
' void Display::login(QLocalSocket *socket,\n const QString &user, const QString &password,\n const Session &session) {\n m_socket = socket;\n if (!user.isEmpty()) m_lastAttemptedUser = user;'
)
content = content.replace(
' if(password.isEmpty() && !m_auth->fingerprintlogin()){\n qDebug() << "use fingerprint because password is empty";\n m_auth->setFingerprintlogin(true);\n }',
' if(password.isEmpty() && !m_auth->fingerprintlogin()){\n qDebug() << "use fingerprint because password is empty";\n m_auth->setFingerprintlogin(true);\n }\n'
)
content = content.replace(
' if (m_auth->isActive()) {\n qWarning() << "Existing authentication ongoing, aborting";\n return false;\n }',
' if (m_auth->isActive()) {\n if (m_fingerprintAuthActive) {\n qDebug() << "Stopping fingerprint auth to allow password auth";\n m_auth->stop();\n m_fingerprintAuthActive = false;\n } else {\n qWarning() << "Existing authentication ongoing, aborting";\n return false;\n }\n }'
)
content = content.replace(
' void Display::slotAuthenticationFinished(const QString &user, bool success) {\n if (m_auth->autologin() && !success) {',
' void Display::slotAuthenticationFinished(const QString &user, bool success) {\n m_fingerprintAuthActive = false;\n if (!success && !m_auth->autologin() && !m_auth->fingerprintlogin()) { QTimer::singleShot(300, this, &Display::onGreeterConnected); }\n if (m_auth->autologin() && !success) {'
)
# Add onGreeterConnected function
content = content.replace(
' QString Display::findGreeterTheme() const {',
''' void Display::onGreeterConnected() {
QString lastUser = m_lastAttemptedUser.isEmpty() ? stateConfig.Last.User.get() : m_lastAttemptedUser;
if (lastUser.isEmpty() || lastUser == QLatin1String("sddm"))
return;
if (m_auth->isActive())
return;
QString lastSession = stateConfig.Last.Session.get();
Session::Type sessionType = Session::X11Session;
if (findSessionEntry(mainConfig.Wayland.SessionDir.get(), lastSession))
sessionType = Session::WaylandSession;
else if (findSessionEntry(mainConfig.X11.SessionDir.get(), lastSession))
sessionType = Session::X11Session;
else
return;
Session session;
session.setTo(sessionType, lastSession);
qDebug() << "Starting fingerprint auth for user:" << lastUser;
m_auth->setFingerprintlogin(true);
m_fingerprintAuthActive = true;
startAuth(lastUser, QString(), session);
m_auth->setFingerprintlogin(false);
}
QString Display::findGreeterTheme() const {'''
)
with open('src/daemon/Display.cpp', 'w') as f:
f.write(content)
print("Parallel auth fix applied.")
|