diff --git a/.gitignore b/.gitignore index 68edd33..d01f115 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /0.1.0.tar.gz /e707e22901049495818a9bedf71f0ba829564700.tar.gz /50ca5b20354b6d338ce8836a613af19cedb1dca2.tar.gz +/7a008602f5f0a4ed8586ce24012983458a687d4e.tar.gz diff --git a/fedora-Main.qml b/fedora-Main.qml index fcdf0bc..574ad79 100644 --- a/fedora-Main.qml +++ b/fedora-Main.qml @@ -27,16 +27,19 @@ import QtQuick 1.1 import SddmComponents 1.1 Rectangle { + + TextConstants { id: textConstants } + Connections { target: sddm onLoginSucceeded: { errorMessage.color = "green" - errorMessage.text = qsTr("Login succeeded.") + errorMessage.text = textConstants.loginSucceeded } onLoginFailed: { errorMessage.color = "red" - errorMessage.text = qsTr("Login failed.") + errorMessage.text = textConstants.loginFailed } } @@ -48,12 +51,6 @@ Rectangle { source: config.background fillMode: Image.Stretch } - Image { - id: plymouthLogo - x: geometry.width / 2 - width / 2 - y: geometry.height / 2 - height / 2 - source: "/usr/share/pixmaps/system-logo-white.png" - } } } @@ -65,6 +62,23 @@ Rectangle { height: geometry.height color: "transparent" + Image { + id: fedoraLogo + x: parent.width / 2 - width / 2 + y: parent.height / 2 - height / 2 + source: "/usr/share/pixmaps/system-logo-white.png" + } + + Rectangle { + x: geometry.x + y: geometry.y + width: parent.width + height: 34 + + opacity: 0.4 + color: "black" + } + Row { x: parent.x + 4 y: parent.y + 4 @@ -101,8 +115,9 @@ Rectangle { Button { id: rebootButton - text: qsTr("Reboot") - height: 24 + text: textConstants.reboot + height: 25 + width: 100 onClicked: sddm.reboot() @@ -111,8 +126,9 @@ Rectangle { Button { id: shutdownButton - text: qsTr("Shutdown") - height: 24 + text: textConstants.shutdown + height: 25 + width: 100 onClicked: sddm.powerOff() @@ -132,6 +148,19 @@ Rectangle { anchors.centerIn: parent spacing: 18 + Row { + width: parent.width + Text { + width: parent.width + color: "white" + text: textConstants.welcomeText.arg(sddm.hostName) + wrapMode: Text.WordWrap + font.pixelSize: 12 + elide: Text.ElideRight + horizontalAlignment: Text.AlignHCenter + } + } + Row { width: parent.width TextBox { @@ -183,13 +212,12 @@ Rectangle { } } - Column { width: parent.width Text { id: errorMessage anchors.horizontalCenter: parent.horizontalCenter - text: qsTr("Enter your user name and password.") + text: textConstants.prompt font.pixelSize: 10 color: "white" } diff --git a/sddm-auth.patch b/sddm-auth.patch index dab7512..a11887a 100644 --- a/sddm-auth.patch +++ b/sddm-auth.patch @@ -1,28 +1,114 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 78f33fe..4384274 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -7,6 +7,8 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) + set(CMAKE_AUTOMOC ON) + + add_definitions(-Wall -march=native -std=c++11) ++include(FeatureSummary) ++ + + if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Release) +@@ -27,7 +29,7 @@ find_package(PkgConfig) + + # PAM + if(NOT NO_PAM) +- find_package(PAM) ++ find_package(PAM REQUIRED) + + if(PAM_FOUND) + add_definitions(-DUSE_PAM) +@@ -42,6 +44,9 @@ find_package(XKB REQUIRED) + + if(USE_QT5) + find_package(Qt5Core REQUIRED) ++ find_package(Qt5Quick REQUIRED) ++ find_package(Qt5Gui REQUIRED) ++ find_package(Qt5Network REQUIRED) + find_package(Qt5DBus REQUIRED) + find_package(Qt5LinguistTools REQUIRED) + +@@ -97,6 +102,8 @@ set(CONFIG_FILE "${SYS_CONFIG_DIR}/sddm.conf" CACH + set(LOG_FILE "/var/log/sddm.log" CACHE PATH "Path of the sddm log file") + set(COMPONENTS_TRANSLATION_DIR "${DATA_INSTALL_DIR}/translations" CACHE PATH "Components translations directory") + ++feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) ++ + add_subdirectory(components) + add_subdirectory(data) + add_subdirectory(services) +diff --git a/data/themes/maldives/GeosansLight.ttf b/data/themes/maldives/GeosansLight.ttf +new file mode 100644 +index 0000000..055932a +Binary files /dev/null and b/data/themes/maldives/GeosansLight.ttf differ +diff --git a/data/themes/maldives/Main.qml b/data/themes/maldives/Main.qml +index ab5b013..037beb3 100644 +--- a/data/themes/maldives/Main.qml ++++ b/data/themes/maldives/Main.qml +@@ -46,7 +46,7 @@ Rectangle { + } + } + +- FontLoader { id: clockFont; source: "Sans" } ++ FontLoader { id: clockFont; source: "GeosansLight.ttf" } + + Repeater { + model: screenModel +diff --git a/data/themes/maui/GeosansLight.ttf b/data/themes/maui/GeosansLight.ttf +new file mode 100644 +index 0000000..055932a +Binary files /dev/null and b/data/themes/maui/GeosansLight.ttf differ +diff --git a/data/themes/maui/Main.qml b/data/themes/maui/Main.qml +index 1aa9bec..f5f062d 100644 +--- a/data/themes/maui/Main.qml ++++ b/data/themes/maui/Main.qml +@@ -45,7 +45,7 @@ Rectangle { + } + } + +- FontLoader { id: clockFont; source: "Sans" } ++ FontLoader { id: clockFont; source: "GeosansLight.ttf" } + + Repeater { + model: screenModel diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt -index 1d6d117..e1c4b4b 100644 +index a82ae45..a66e5d1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt -@@ -17,7 +17,6 @@ set(DAEMON_SOURCES +@@ -7,6 +7,7 @@ configure_file(common/Constants.h.in common/Constants.h IMMEDIATE @ONLY) + + set(DAEMON_SOURCES + common/Configuration.cpp ++ common/SafeDataStream.cpp + common/SocketWriter.cpp + daemon/Authenticator.cpp + daemon/DaemonApp.cpp +@@ -17,7 +18,6 @@ set(DAEMON_SOURCES daemon/PowerManager.cpp daemon/Seat.cpp daemon/SeatManager.cpp - daemon/Session.cpp daemon/SignalHandler.cpp daemon/SocketServer.cpp - daemon/xdmcp/Packet.cpp -@@ -32,11 +31,6 @@ if(USE_QT5) + ) +@@ -28,13 +28,7 @@ if(USE_QT5) + qt5_add_dbus_adaptor(DAEMON_SOURCES ${CMAKE_SOURCE_DIR}/data/interfaces/org.freedesktop.DisplayManager.Session.xml daemon/DisplayManager.h SDDM::DisplayManagerSession) add_executable(sddm ${DAEMON_SOURCES}) - target_link_libraries(sddm ${LIBXCB_LIBRARIES}) +- target_link_libraries(sddm ${LIBXCB_LIBRARIES}) - if(PAM_FOUND) - target_link_libraries(sddm ${PAM_LIBRARIES}) - else() - target_link_libraries(sddm crypt) - endif() - qt5_use_modules(sddm DBus Network) +- qt5_use_modules(sddm DBus Network) ++ target_link_libraries(sddm ${LIBXCB_LIBRARIES} Qt5::Core Qt5::DBus Qt5::Network) else() set(QT_USE_QTNETWORK TRUE) -@@ -58,6 +49,43 @@ endif() + set(QT_USE_QTDBUS TRUE) +@@ -55,6 +49,41 @@ endif() install(TARGETS sddm DESTINATION ${BIN_INSTALL_DIR}) @@ -31,21 +117,19 @@ index 1d6d117..e1c4b4b 100644 +set(AUTHENTICATOR_SOURCES + auth/AuthenticatorApp.cpp + auth/Method.cpp ++ auth/PAM.cpp + auth/Session.cpp + common/Configuration.cpp ++ common/SafeDataStream.cpp +) -+if(PAM_FOUND) -+ set(AUTHENTICATOR_SOURCES -+ ${AUTHENTICATOR_SOURCES} -+ auth/PAM.cpp -+ ) -+endif() + +if(USE_QT5) + add_executable(sddm-auth ${AUTHENTICATOR_SOURCES}) -+ target_link_libraries(sddm-auth ${LIBXCB_LIBRARIES}) ++ target_link_libraries(sddm-auth Qt5::Core) + if(PAM_FOUND) + target_link_libraries(sddm-auth ${PAM_LIBRARIES}) ++ set_target_properties(sddm-auth PROPERTIES COMPILE_DEFINITIONS "USE_PAM=1") ++ + else() + target_link_libraries(sddm-auth crypt) + endif() @@ -66,12 +150,22 @@ index 1d6d117..e1c4b4b 100644 ## GREETER ## set(GREETER_SOURCES +@@ -72,8 +101,7 @@ set(GREETER_SOURCES + + if(USE_QT5) + add_executable(sddm-greeter ${GREETER_SOURCES}) +- target_link_libraries(sddm-greeter ${LIBXCB_LIBRARIES} ${LIBXKB_LIBRARIES}) +- qt5_use_modules(sddm-greeter Quick) ++ target_link_libraries(sddm-greeter ${LIBXCB_LIBRARIES} ${LIBXKB_LIBRARIES} Qt5::Core Qt5::Quick Qt5::Gui) + else() + set(QT_USE_QTDECLARATIVE TRUE) + include(${QT_USE_FILE}) diff --git a/src/auth/AuthenticatorApp.cpp b/src/auth/AuthenticatorApp.cpp new file mode 100644 -index 0000000..dc4f039 +index 0000000..be72de2 --- /dev/null +++ b/src/auth/AuthenticatorApp.cpp -@@ -0,0 +1,177 @@ +@@ -0,0 +1,206 @@ +/* + * + * Copyright (C) 2013 Martin Bříza @@ -137,16 +231,15 @@ index 0000000..dc4f039 + + void AuthenticatorApp::readFromParent(int fd) { + qDebug() << " AUTH: Message received" << m_input.bytesAvailable(); -+ QDataStream inStream(&m_input); ++ SafeDataStream inStream(&m_input); + quint32 command = quint32(AuthMessages::AuthNone); ++ inStream.receive(); + inStream >> command; + qDebug() << "Command" << command; -+ handleMessage(AuthMessages(command)); ++ handleMessage(AuthMessages(command), inStream); + } + -+ void AuthenticatorApp::handleMessage(AuthMessages command) { -+ QDataStream inStream(&m_input); -+ QDataStream outStream(&m_output); ++ void AuthenticatorApp::handleMessage(AuthMessages command, SafeDataStream& inStream) { + switch (command) { + case AuthMessages::Start: { + QString user, session, password; @@ -165,45 +258,47 @@ index 0000000..dc4f039 + + QProcessEnvironment AuthenticatorApp::requestEnvironment(const QString &user) { + qDebug() << " AUTH: requestEnvironment start"; -+ QDataStream inStream(&m_input); -+ QDataStream outStream(&m_output); ++ SafeDataStream inStream(&m_input); ++ SafeDataStream outStream(&m_output); + quint32 command = quint32(AuthMessages::AuthNone); + int count; ++ QStringList envList; + QProcessEnvironment env; + + qDebug() << "Requesting environment for user" << user; + outStream << quint32(AuthMessages::RequestEnv) << user; ++ outStream.send(); + -+ inStream >> command; ++ inStream.receive(); ++ inStream >> command >> envList; + if (command != quint32(AuthMessages::Env)) { + qDebug() << " AUTH: Received out of order message" << command << "when waiting for Env"; -+ handleMessage(AuthMessages(command)); ++ handleMessage(AuthMessages(command), inStream); + return env; + } ++ qDebug() << " AUTH: Received environment:" << envList; + -+ inStream >> count; -+ while (count--) { -+ QString entry; -+ inStream >> entry; -+ env.insert(entry.left(entry.indexOf("=")), entry.mid(entry.indexOf("=") + 1)); -+ } ++ foreach (const QString &s, envList) ++ env.insert(s.left(s.indexOf("=")), s.mid(s.indexOf("=") + 1)); + + return env; + } + + int AuthenticatorApp::requestSessionId() { + qDebug() << " AUTH: requestSessionId start"; -+ QDataStream inStream(&m_input); -+ QDataStream outStream(&m_output); ++ SafeDataStream inStream(&m_input); ++ SafeDataStream outStream(&m_output); + quint32 command = quint32(AuthMessages::AuthNone); + int id; + + outStream << quint32(AuthMessages::RequestSessionID); ++ outStream.send(); + ++ inStream.receive(); + inStream >> command; + if (command != quint32(AuthMessages::SessionID)) { + qDebug() << " AUTH: Received out of order message" << command << "when waiting for SessionID"; -+ handleMessage(AuthMessages(command)); ++ handleMessage(AuthMessages(command), inStream); + return -1; + } + inStream >> id; @@ -214,17 +309,19 @@ index 0000000..dc4f039 + + bool AuthenticatorApp::requestCookieTo(const QString& path, const QString &user) { + qDebug() << " AUTH: requestCookieTo start"; -+ QDataStream inStream(&m_input); -+ QDataStream outStream(&m_output); ++ SafeDataStream inStream(&m_input); ++ SafeDataStream outStream(&m_output); + quint32 command = quint32(AuthMessages::AuthNone); + qDebug() << " AUTH: Requesting Cookie to path" << path << "for user" << user; + + outStream << quint32(AuthMessages::RequestCookieLink) << path << user; ++ outStream.send(); + ++ inStream.receive(); + inStream >> command; + if (command != quint32(AuthMessages::CookieLink)) { -+ qDebug() << " AUTH: Received out of order message" << command << "when waiting for SessionID"; -+ handleMessage(AuthMessages(command)); ++ qDebug() << " AUTH: Received out of order message" << command << "when waiting for CookieLink"; ++ handleMessage(AuthMessages(command), inStream); + return false; + } + @@ -232,14 +329,40 @@ index 0000000..dc4f039 + return true; + } + ++ QString AuthenticatorApp::requestDisplay() { ++ qDebug() << " AUTH: requestDisplay start"; ++ SafeDataStream inStream(&m_input); ++ SafeDataStream outStream(&m_output); ++ quint32 command = quint32(AuthMessages::AuthNone); ++ qDebug() << " AUTH: Requesting Display"; ++ QString display; ++ ++ outStream << quint32(AuthMessages::RequestDisplay); ++ outStream.send(); ++ ++ inStream.receive(); ++ inStream >> command; ++ if (command != quint32(AuthMessages::Display)) { ++ qDebug() << " AUTH: Received out of order message" << command << "when waiting for Display"; ++ handleMessage(AuthMessages(command), inStream); ++ return display; ++ } ++ inStream >> display; ++ ++ qDebug() << " AUTH: requestDisplay end"; ++ return display; ++ } ++ + void AuthenticatorApp::slotLoginFailed() { -+ QDataStream outStream(&m_output); ++ SafeDataStream outStream(&m_output); + outStream << quint32(AuthMessages::LoginFailed); ++ outStream.send(); + } + + void AuthenticatorApp::slotLoginSucceeded(QString user) { -+ QDataStream outStream(&m_output); ++ SafeDataStream outStream(&m_output); + outStream << quint32(AuthMessages::LoginSucceeded) << m_method->name() << user; ++ outStream.send(); + } +} + @@ -251,10 +374,10 @@ index 0000000..dc4f039 +#include "AuthenticatorApp.moc" diff --git a/src/auth/AuthenticatorApp.h b/src/auth/AuthenticatorApp.h new file mode 100644 -index 0000000..d0ea73b +index 0000000..6c54d02 --- /dev/null +++ b/src/auth/AuthenticatorApp.h -@@ -0,0 +1,68 @@ +@@ -0,0 +1,70 @@ +/* + * + * Copyright (C) 2013 Martin Bříza @@ -279,6 +402,7 @@ index 0000000..d0ea73b +#define AUTHENTICATORAPP_H + +#include "Messages.h" ++#include "SafeDataStream.h" + +#include +#include @@ -299,6 +423,7 @@ index 0000000..d0ea73b + QProcessEnvironment requestEnvironment(const QString &user); + int requestSessionId(); + bool requestCookieTo(const QString &path, const QString &user); ++ QString requestDisplay(); + + signals: + void started(const QString &user, const QString &session, const QString &password, bool passwordless); @@ -310,7 +435,7 @@ index 0000000..d0ea73b + + private slots: + void readFromParent(int fd); -+ void handleMessage(AuthMessages command); ++ void handleMessage(AuthMessages command, SafeDataStream &inStream); + + private: + static AuthenticatorApp *self; @@ -325,10 +450,10 @@ index 0000000..d0ea73b +#endif // AUTHENTICATORAPP_H diff --git a/src/auth/Method.cpp b/src/auth/Method.cpp new file mode 100644 -index 0000000..5e1c758 +index 0000000..aef1661 --- /dev/null +++ b/src/auth/Method.cpp -@@ -0,0 +1,328 @@ +@@ -0,0 +1,330 @@ +/* + * + * Copyright (C) 2013 Martin Bříza @@ -425,21 +550,23 @@ index 0000000..5e1c758 + bool Method::authenticate() { +#ifdef USE_PAM + if (m_pam) -+ delete m_pam; ++ m_pam->deleteLater(); + + m_pam = new PamService(m_user, m_password, m_passwordless); + + if (!m_pam) + return false; -+/* ++ ++ QString display = AuthenticatorApp::instance()->requestDisplay(); ++ + // set tty -+ if (!m_pam->setItem(PAM_TTY, ":0")) ++ if (!m_pam->setItem(PAM_TTY, qPrintable(display))) + return false; + + // set display name -+ if (!m_pam->setItem(PAM_XDISPLAY, ":0")) ++ if (!m_pam->setItem(PAM_XDISPLAY, qPrintable(display))) + return false; -+*/ ++ + // set username + if (!m_pam->setItem(PAM_USER, qPrintable(m_user))) + return false; @@ -738,10 +865,10 @@ index 0000000..e13133a +#endif // METHOD_H diff --git a/src/auth/PAM.cpp b/src/auth/PAM.cpp new file mode 100644 -index 0000000..d9845d3 +index 0000000..5229891 --- /dev/null +++ b/src/auth/PAM.cpp -@@ -0,0 +1,260 @@ +@@ -0,0 +1,266 @@ +/* + * PAM Authenticator backend + * @@ -766,6 +893,8 @@ index 0000000..d9845d3 + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + */ ++ ++#ifdef USE_PAM +#include "PAM.h" + +#include @@ -774,7 +903,7 @@ index 0000000..d9845d3 + + bool PamService::putEnv(const QProcessEnvironment& env) { + foreach (const QString& s, env.toStringList()) { -+ result = pam_putenv(handle, s.toAscii()); ++ result = pam_putenv(handle, s.toLatin1()); + if (result != PAM_SUCCESS) { + qWarning() << " AUTH: PAM: putEnv:" << pam_strerror(handle, result); + return false; @@ -987,7 +1116,7 @@ index 0000000..d9845d3 + } + + PamService::PamService(const QString &user, const QString &password, bool passwordless, QObject *parent) -+ : user(user), password(password), passwordless(passwordless) { ++ : QObject(parent), user(user), password(password), passwordless(passwordless) { + // create context + m_converse = { &PamService::converse, this }; + // start service @@ -1003,12 +1132,15 @@ index 0000000..d9845d3 + } +}; + ++#include "PAM.moc" ++ ++#endif // USE_PAM diff --git a/src/auth/PAM.h b/src/auth/PAM.h new file mode 100644 -index 0000000..f885ab5 +index 0000000..51134ab --- /dev/null +++ b/src/auth/PAM.h -@@ -0,0 +1,216 @@ +@@ -0,0 +1,217 @@ +/* + * PAM Authenticator backend + * Copyright (C) 2013 Martin Bříza @@ -1055,7 +1187,8 @@ index 0000000..f885ab5 + * + * Error messages are automatically reported to qDebug + */ -+ class PamService { ++ class PamService : public QObject { ++ Q_OBJECT + + public: + /** @@ -1067,9 +1200,9 @@ index 0000000..f885ab5 + * \param passwordless true if no password is required + * \param parent parent QObject + */ -+ explicit PamService(const QString &user, const QString &password, bool passwordless, QObject *parent = 0); ++ PamService(const QString &user, const QString &password, bool passwordless, QObject *parent = 0); + -+ virtual ~PamService(); ++ ~PamService(); + + /** + * Conversation function for the pam_conv structure @@ -1227,10 +1360,10 @@ index 0000000..f885ab5 +#endif // PAM_H diff --git a/src/auth/Session.cpp b/src/auth/Session.cpp new file mode 100644 -index 0000000..138948a +index 0000000..006a70e --- /dev/null +++ b/src/auth/Session.cpp -@@ -0,0 +1,107 @@ +@@ -0,0 +1,103 @@ +/*************************************************************************** +* Copyright (c) 2013 Abdurrahman AVCI +* @@ -1321,11 +1454,7 @@ index 0000000..138948a + exit(EXIT_FAILURE); + + } -+/* FIXME -+ // add cookie -+ Display *display = qobject_cast(authenticator->parent()); -+ display->addCookie(QString("%1/.Xauthority").arg(m_dir)); -+*/ ++ + // change to user home dir + if (chdir(qPrintable(m_dir))) { + qCritical() << " AUTH: Failed to change dir to user home."; @@ -1340,10 +1469,10 @@ index 0000000..138948a +} diff --git a/src/auth/Session.h b/src/auth/Session.h new file mode 100644 -index 0000000..1f075d3 +index 0000000..ebf4979 --- /dev/null +++ b/src/auth/Session.h -@@ -0,0 +1,51 @@ +@@ -0,0 +1,54 @@ +/*************************************************************************** +* Copyright (c) 2013 Abdurrahman AVCI +* @@ -1369,11 +1498,12 @@ index 0000000..1f075d3 +#include + +namespace SDDM { ++ + class Session : public QProcess { + Q_OBJECT + Q_DISABLE_COPY(Session) + public: -+ explicit Session(const QString &name, QObject *parent = 0); ++ explicit Session(const QString &name, QObject *parent); + + const QString &name() const; + @@ -1386,20 +1516,26 @@ index 0000000..1f075d3 + void setupChildProcess(); + + private: ++ + QString m_name { "" }; + QString m_user { "" }; + QString m_dir { "" }; ++ + int m_uid { 0 }; + int m_gid { 0 }; + }; +} + +#endif // SDDM_SESSION_H +diff --git a/src/common/.AuthenticatorWrapper.cpp.kate-swp b/src/common/.AuthenticatorWrapper.cpp.kate-swp +new file mode 100644 +index 0000000..3253e12 +Binary files /dev/null and b/src/common/.AuthenticatorWrapper.cpp.kate-swp differ diff --git a/src/common/Messages.h b/src/common/Messages.h -index c779791..00f27de 100644 +index c779791..40470cb 100644 --- a/src/common/Messages.h +++ b/src/common/Messages.h -@@ -40,6 +40,20 @@ namespace SDDM { +@@ -40,6 +40,22 @@ namespace SDDM { LoginFailed }; @@ -1414,17 +1550,137 @@ index c779791..00f27de 100644 + RequestSessionID, + SessionID, + RequestCookieLink, -+ CookieLink ++ CookieLink, ++ RequestDisplay, ++ Display + }; + enum Capability { None = 0x0000, PowerOff = 0x0001, +diff --git a/src/common/SafeDataStream.cpp b/src/common/SafeDataStream.cpp +new file mode 100644 +index 0000000..eb41563 +--- /dev/null ++++ b/src/common/SafeDataStream.cpp +@@ -0,0 +1,64 @@ ++/* ++ * ++ * Copyright (C) 2013 Martin Bříza ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ */ ++ ++#include "SafeDataStream.h" ++ ++#include ++ ++namespace SDDM { ++ ++ SafeDataStream::SafeDataStream(QIODevice* stream) : QDataStream(new QByteArray(), QIODevice::ReadWrite), ++ m_stream(stream) { ++ } ++ ++ void SafeDataStream::clear() { ++ QBuffer *buf = qobject_cast(device()); ++ if (buf) { ++ buf->reset(); ++ buf->buffer().clear(); ++ } ++ } ++ ++ void SafeDataStream::receive() { ++ QByteArray header; ++ header = m_stream->read(sizeof(uint)); ++ if (header.size() < sizeof(uint)) { ++ m_stream->waitForReadyRead(-1); ++ header.append(m_stream->read(sizeof(uint) - header.size())); ++ } ++ uint len = *(uint *) header.constData(); ++ while (len > 0) { ++ QByteArray chunk = m_stream->read(len); ++ len -= chunk.size(); ++ this->writeRawData(chunk.constData(), chunk.size()); ++ } ++ device()->reset(); ++ } ++ ++ void SafeDataStream::send() { ++ device()->reset(); ++ QByteArray data = device()->readAll(); ++ uint len = data.size(); ++ m_stream->write((char *) &len, sizeof(uint)); ++ qint64 status = m_stream->write(data.constData(), data.size()); ++ m_stream->waitForBytesWritten(-1); ++ } ++ ++} +diff --git a/src/common/SafeDataStream.h b/src/common/SafeDataStream.h +new file mode 100644 +index 0000000..80c333f +--- /dev/null ++++ b/src/common/SafeDataStream.h +@@ -0,0 +1,42 @@ ++/* ++ * This class wraps QDataStream in a blocking way waiting for the entire message to be received ++ * Copyright (C) 2013 Martin Bříza ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ */ ++ ++#ifndef SAFEDATASTREAM_H ++#define SAFEDATASTREAM_H ++ ++#include ++#include ++ ++namespace SDDM { ++ ++ class SafeDataStream : public QDataStream ++ { ++ public: ++ SafeDataStream(QIODevice *stream); ++ void clear(); ++ void send(); ++ void receive(); ++ private: ++ QIODevice *m_stream; ++ }; ++ ++} ++ ++#endif // SAFEDATASTREAM_H diff --git a/src/daemon/Authenticator.cpp b/src/daemon/Authenticator.cpp -index bd7a88c..4db3f42 100644 +index 47b77f4..7503d65 100644 --- a/src/daemon/Authenticator.cpp +++ b/src/daemon/Authenticator.cpp -@@ -18,408 +18,123 @@ +@@ -18,414 +18,130 @@ ***************************************************************************/ #include "Authenticator.h" @@ -1560,11 +1816,15 @@ index bd7a88c..4db3f42 100644 - } -#endif - -- Authenticator::Authenticator(QObject *parent) : QObject(parent) { +- Authenticator::Authenticator(Display *parent) : QObject(parent), m_display(parent) { - } - - Authenticator::~Authenticator() { - stop(); +- } +- +- Display *Authenticator::display() const { +- return m_display; + m_started = true; + qDebug() << " DAEMON: Started the authenticator process."; } @@ -1580,15 +1840,12 @@ index bd7a88c..4db3f42 100644 - bool Authenticator::start(const QString &user, const QString &password, const QString &session) { - return doStart(user, password, session, false); + void Authenticator::readFromChild() { -+ QDataStream stream(this); -+ while (this->bytesAvailable()) { -+ quint32 command; -+ stream >> command; -+ qDebug() << " DAEMON: Received message" << command << "from the authenticator"; -+ handleMessage(AuthMessages(command)); -+ if (stream.status() != QDataStream::Ok) -+ break; -+ } ++ SafeDataStream stream(this); ++ quint32 command; ++ stream.receive(); ++ stream >> command; ++ qDebug() << " DAEMON: Received message" << command << "from the authenticator"; ++ handleMessage(AuthMessages(command), stream); } - bool Authenticator::doStart(const QString &user, const QString &password, const QString &session, bool passwordless) { @@ -1618,20 +1875,20 @@ index bd7a88c..4db3f42 100644 - // line starting with Exec - if (line.startsWith("Exec=")) - command = line.mid(5); -+ void Authenticator::handleMessage(AuthMessages command) { -+ QDataStream stream(this); +- } +- +- // close file +- file.close(); ++ void Authenticator::handleMessage(AuthMessages command, SafeDataStream &stream) { + switch (command) { + case AuthMessages::RequestEnv: { + QString user; + stream >> user; + QStringList env = m_display->sessionEnv(user).toStringList(); -+ stream << quint32(AuthMessages::Env) << env.count(); -+ foreach (const QString &s, env) { -+ stream << s; - } -- -- // close file -- file.close(); ++ qDebug() << "Environment for user" << user << "will be" << env; ++ stream.clear(); ++ stream << quint32(AuthMessages::Env) << env; ++ stream.send(); + break; } - @@ -1651,8 +1908,7 @@ index bd7a88c..4db3f42 100644 - } - - // get display and display -- Display *display = qobject_cast(parent()); -- Seat *seat = qobject_cast(display->parent()); +- Seat *seat = m_display->seat(); - -#ifdef USE_PAM - if (m_pam) @@ -1684,11 +1940,11 @@ index bd7a88c..4db3f42 100644 - return false; - - // set tty -- if ((m_pam->result = pam_set_item(m_pam->handle, PAM_TTY, qPrintable(display->name()))) != PAM_SUCCESS) +- if ((m_pam->result = pam_set_item(m_pam->handle, PAM_TTY, qPrintable(m_display->name()))) != PAM_SUCCESS) - return false; - - // set display name -- if ((m_pam->result = pam_set_item(m_pam->handle, PAM_XDISPLAY, qPrintable(display->name()))) != PAM_SUCCESS) +- if ((m_pam->result = pam_set_item(m_pam->handle, PAM_XDISPLAY, qPrintable(m_display->name()))) != PAM_SUCCESS) - return false; - - // open session @@ -1727,8 +1983,20 @@ index bd7a88c..4db3f42 100644 - - // return fail - return false; +- } +- +- // check if password is not empty +- if (sp->sp_pwdp && sp->sp_pwdp[0]) { +- +- // encrypt password +- char *encrypted = crypt(qPrintable(password), sp->sp_pwdp); +- +- if (strcmp(encrypted, sp->sp_pwdp)) +- return false; + case AuthMessages::RequestSessionID: ++ stream.clear(); + stream << quint32(AuthMessages::SessionID) << int(DaemonApp::instance()->newSessionId()); ++ stream.send(); + break; + case AuthMessages::RequestCookieLink: { + QString path, user; @@ -1739,20 +2007,20 @@ index bd7a88c..4db3f42 100644 + pw = getpwnam(qPrintable(user)); + if(pw) + chown(qPrintable(path), pw->pw_uid, pw->pw_gid); ++ stream.clear(); + stream << quint32(AuthMessages::CookieLink); ++ stream.send(); + break; } -- -- // check if password is not empty -- if (sp->sp_pwdp && sp->sp_pwdp[0]) { -- -- // encrypt password -- char *encrypted = crypt(qPrintable(password), sp->sp_pwdp); -- -- if (strcmp(encrypted, sp->sp_pwdp)) -- return false; -- } -- } ++ case AuthMessages::RequestDisplay: ++ stream.clear(); ++ stream << quint32(AuthMessages::Display) << m_display->name(); ++ stream.send(); ++ break; ++ default: ++ qWarning() << " DAEMON: Child sent message type" << quint32(command) << "which cannot be handled."; ++ break; + } - - char *mapped = strdup(qPrintable(user)); -#endif @@ -1798,7 +2066,10 @@ index bd7a88c..4db3f42 100644 - // add to the hash - if (index != -1) - env.insert(s.left(index), s.mid(index + 1)); +- +- free(envlist[i]); - } +- free(envlist); -#else - // we strdup'd the string before in this branch - free(mapped); @@ -1809,12 +2080,12 @@ index bd7a88c..4db3f42 100644 - env.insert("USER", pw->pw_name); - env.insert("LOGNAME", pw->pw_name); - env.insert("PATH", daemonApp->configuration()->defaultPath()); -- env.insert("DISPLAY", display->name()); +- env.insert("DISPLAY", m_display->name()); - env.insert("XAUTHORITY", QString("%1/.Xauthority").arg(pw->pw_dir)); - env.insert("XDG_SEAT", seat->name()); - env.insert("XDG_SEAT_PATH", daemonApp->displayManager()->seatPath(seat->name())); - env.insert("XDG_SESSION_PATH", daemonApp->displayManager()->sessionPath(process->name())); -- env.insert("XDG_VTNR", QString::number(display->terminalId())); +- env.insert("XDG_VTNR", QString::number(m_display->terminalId())); - env.insert("DESKTOP_SESSION", sessionName); - env.insert("GDMSESSION", sessionName); - process->setProcessEnvironment(env); @@ -1835,10 +2106,7 @@ index bd7a88c..4db3f42 100644 - - // return fail - return false; -+ default: -+ qWarning() << " DAEMON: Child sent message type" << quint32(command) << "which cannot be handled."; -+ break; - } +- } - - // log message - qDebug() << " DAEMON: User session started."; @@ -1865,8 +2133,9 @@ index bd7a88c..4db3f42 100644 - // terminate process - process->terminate(); -+ QDataStream stream(this); ++ SafeDataStream stream(this); + stream << quint32(AuthMessages::Start) << user << session << password << passwordless; ++ stream.send(); - // wait for finished - if (!process->waitForFinished(5000)) @@ -1893,8 +2162,9 @@ index bd7a88c..4db3f42 100644 - // delete session process - process->deleteLater(); - process = nullptr; -+ QDataStream stream(this); ++ SafeDataStream stream(this); + stream << quint32(AuthMessages::End); ++ stream.send(); -#ifdef USE_PAM - if (m_pam) { @@ -1914,14 +2184,15 @@ index bd7a88c..4db3f42 100644 } } diff --git a/src/daemon/Authenticator.h b/src/daemon/Authenticator.h -index 23e91ec..4989af4 100644 +index b6c8261..ff9a26b 100644 --- a/src/daemon/Authenticator.h +++ b/src/daemon/Authenticator.h -@@ -20,42 +20,40 @@ +@@ -20,45 +20,41 @@ #ifndef SDDM_AUTHENTICATOR_H #define SDDM_AUTHENTICATOR_H +#include "Messages.h" ++#include "SafeDataStream.h" + #include +#include @@ -1931,28 +2202,29 @@ index 23e91ec..4989af4 100644 -#ifdef USE_PAM - class PamService; -#endif +- class Display; - class Session; -- class AuthenticatorPrivate; - class Authenticator : public QObject { + class Display; + class Authenticator : public QProcess { Q_OBJECT Q_DISABLE_COPY(Authenticator) public: -- Authenticator(QObject *parent = 0); +- Authenticator(Display *parent); - ~Authenticator(); + explicit Authenticator(Display *parent = nullptr); -- public slots: -- bool start(const QString &user, const QString &session); -- bool start(const QString &user, const QString &password, const QString &session); +- Display *display() const; + private slots: + void readFromChild(); -+ void handleMessage(AuthMessages command); ++ void handleMessage(AuthMessages command, SafeDataStream &stream); + void forwardErrorOutput(); -+ public slots: + public slots: +- bool start(const QString &user, const QString &session); +- bool start(const QString &user, const QString &password, const QString &session); +- + void start(QLocalSocket *socket, const QString& user, const QString& session, const QString& password, bool passwordless); void stop(); - void finished(); @@ -1965,21 +2237,22 @@ index 23e91ec..4989af4 100644 private: - bool doStart(const QString &user, const QString &password, const QString &session, bool passwordless); - +- bool m_started { false }; + QString m_name; -+ Display *m_display { nullptr }; -+ QLocalSocket *m_parentSocket { nullptr }; // to be got rid of soon - bool m_started { false }; + Display *m_display { nullptr }; - -#ifdef USE_PAM - PamService *m_pam { nullptr }; -#endif - - Session *process { nullptr }; ++ QLocalSocket *m_parentSocket { nullptr }; // to be got rid of soon ++ bool m_started { false }; }; } diff --git a/src/daemon/Display.cpp b/src/daemon/Display.cpp -index 80aa95a..d473fdb 100644 +index f1a54b4..d18d839 100644 --- a/src/daemon/Display.cpp +++ b/src/daemon/Display.cpp @@ -23,9 +23,11 @@ @@ -1994,8 +2267,8 @@ index 80aa95a..d473fdb 100644 #include #include -@@ -156,6 +124,32 @@ namespace SDDM { - return cookie; +@@ -117,12 +119,38 @@ namespace SDDM { + return m_seat; } + QProcessEnvironment Display::sessionEnv(const QString& user) const { @@ -2022,42 +2295,20 @@ index 80aa95a..d473fdb 100644 + env.insert("XDG_SEAT_PATH", daemonApp->displayManager()->seatPath(seat->name())); + env.insert("XDG_VTNR", QString::number(terminalId())); + return env; -+ } -+ ++ } ++ void Display::addCookie(const QString &file) { // log message qDebug() << " DAEMON: Adding cookie to" << file; -@@ -183,6 +167,29 @@ namespace SDDM { - if (m_started) - return; -+ // generate cookie -+ std::random_device rd; -+ std::mt19937 gen(rd()); -+ std::uniform_int_distribution<> dis(0, 15); -+ -+ // resever 32 bytes -+ m_cookie.reserve(32); -+ -+ // create a random hexadecimal number -+ const char *digits = "0123456789abcdef"; -+ for (int i = 0; i < 32; ++i) -+ m_cookie[i] = digits[dis(gen)]; -+ -+ // generate auth file -+ addCookie(m_authPath); -+ -+ // set display server params -+ m_displayServer->setDisplay(m_display); -+ m_displayServer->setAuthPath(m_authPath); -+ -+ // start display server -+ m_displayServer->start(); -+ - if (m_displayServer != nullptr) { - // set display server params - m_displayServer->setDisplay(m_display); -@@ -201,7 +199,7 @@ namespace SDDM { +- // remove file +- QFile::remove(file); ++ // remove the file ++ QFile::remove(m_authPath); + + QString cmd = QString("%1 -f %2 -q").arg(daemonApp->configuration()->xauthPath()).arg(file); + +@@ -176,7 +204,7 @@ namespace SDDM { m_started = true; // start session @@ -2066,37 +2317,39 @@ index 80aa95a..d473fdb 100644 // return return; -@@ -264,20 +260,13 @@ namespace SDDM { +@@ -237,20 +265,18 @@ namespace SDDM { void Display::login(QLocalSocket *socket, const QString &user, const QString &password, const QString &session) { // start session - if (!m_authenticator->start(user, password, session)) { - // emit signal - emit loginFailed(socket); -- ++ connect(m_authenticator, SIGNAL(loginFailed(QLocalSocket*)), this, SIGNAL(loginFailed(QLocalSocket*))); ++ connect(m_authenticator, SIGNAL(loginSucceeded(QLocalSocket*)), this, SIGNAL(loginSucceeded(QLocalSocket*))); ++ m_authenticator->start(socket, user, session, password, false); + - // return - return; - } -- ++ m_user = user; ++ m_session = session; ++ } + - // save last user and last session - daemonApp->configuration()->setLastUser(user); - daemonApp->configuration()->setLastSession(session); -- daemonApp->configuration()->save(); ++ void Display::slotLoginSucceeded(QLocalSocket* sock) { ++ daemonApp->configuration()->setLastUser(m_user); ++ daemonApp->configuration()->setLastSession(m_session); + daemonApp->configuration()->save(); - - // emit signal - emit loginSucceeded(socket); -+ connect(m_authenticator, SIGNAL(loginFailed(QLocalSocket*)), this, SIGNAL(loginFailed(QLocalSocket*))); -+ connect(m_authenticator, SIGNAL(loginSucceeded(QLocalSocket*)), this, SIGNAL(loginSucceeded(QLocalSocket*))); -+ m_authenticator->start(socket, user, session, password, false); -+ -+ // save last user and last session FIXME -+// daemonApp->configuration()->setLastUser(user); -+// daemonApp->configuration()->setLastSession(session); -+// daemonApp->configuration()->save(); } ++ } diff --git a/src/daemon/Display.h b/src/daemon/Display.h -index 9c475a9..5c22f8b 100644 +index 46d320b..c163853 100644 --- a/src/daemon/Display.h +++ b/src/daemon/Display.h @@ -21,6 +21,7 @@ @@ -2115,12 +2368,37 @@ index 9c475a9..5c22f8b 100644 const QString &name() const; +@@ -54,11 +56,13 @@ namespace SDDM { + + void login(QLocalSocket *socket, const QString &user, const QString &password, const QString &session); + ++ void slotLoginSucceeded(QLocalSocket *sock); ++ + signals: + void stopped(); + +- void loginFailed(QLocalSocket *socket); +- void loginSucceeded(QLocalSocket *socket); ++ void loginFailed(QLocalSocket*); ++ void loginSucceeded(QLocalSocket*); + + private: + bool m_relogin { true }; +@@ -71,6 +75,8 @@ namespace SDDM { + QString m_cookie { "" }; + QString m_socket { "" }; + QString m_authPath { "" }; ++ QString m_user { "" }; ++ QString m_session { "" }; + + Authenticator *m_authenticator { nullptr }; + DisplayServer *m_displayServer { nullptr }; diff --git a/src/daemon/Session.cpp b/src/daemon/Session.cpp deleted file mode 100644 -index de86c64..0000000 +index ec61498..0000000 --- a/src/daemon/Session.cpp +++ /dev/null -@@ -1,109 +0,0 @@ +@@ -1,106 +0,0 @@ -/*************************************************************************** -* Copyright (c) 2013 Abdurrahman AVCI -* @@ -2154,7 +2432,7 @@ index de86c64..0000000 -#include - -namespace SDDM { -- Session::Session(const QString &name, QObject *parent) : QProcess(parent), m_name(name) { +- Session::Session(const QString &name, Authenticator *parent) : QProcess(parent), m_authenticator(parent), m_name(name) { - } - - const QString &Session::name() const { @@ -2181,8 +2459,6 @@ index de86c64..0000000 - if (daemonApp->configuration()->testing) - return; - -- Authenticator *authenticator = qobject_cast(parent()); -- - if (initgroups(qPrintable(m_user), m_gid)) { - qCritical() << " DAEMON: Failed to initialize user groups."; - @@ -2215,8 +2491,7 @@ index de86c64..0000000 - } - - // add cookie -- Display *display = qobject_cast(authenticator->parent()); -- display->addCookie(QString("%1/.Xauthority").arg(m_dir)); +- m_authenticator->display()->addCookie(QString("%1/.Xauthority").arg(m_dir)); - - // change to user home dir - if (chdir(qPrintable(m_dir))) { @@ -2232,10 +2507,10 @@ index de86c64..0000000 -} diff --git a/src/daemon/Session.h b/src/daemon/Session.h deleted file mode 100644 -index 1f075d3..0000000 +index eb27402..0000000 --- a/src/daemon/Session.h +++ /dev/null -@@ -1,51 +0,0 @@ +@@ -1,56 +0,0 @@ -/*************************************************************************** -* Copyright (c) 2013 Abdurrahman AVCI -* @@ -2261,11 +2536,13 @@ index 1f075d3..0000000 -#include - -namespace SDDM { +- class Authenticator; +- - class Session : public QProcess { - Q_OBJECT - Q_DISABLE_COPY(Session) - public: -- explicit Session(const QString &name, QObject *parent = 0); +- explicit Session(const QString &name, Authenticator *parent); - - const QString &name() const; - @@ -2278,12 +2555,42 @@ index 1f075d3..0000000 - void setupChildProcess(); - - private: +- Authenticator *m_authenticator; +- - QString m_name { "" }; - QString m_user { "" }; - QString m_dir { "" }; +- - int m_uid { 0 }; - int m_gid { 0 }; - }; -} - -#endif // SDDM_SESSION_H +diff --git a/src/greeter/ScreenModel.cpp b/src/greeter/ScreenModel.cpp +index fc2b586..abadb0a 100644 +--- a/src/greeter/ScreenModel.cpp ++++ b/src/greeter/ScreenModel.cpp +@@ -28,6 +28,7 @@ + #include + #include + #endif ++#include + + namespace SDDM { + class Screen { +@@ -168,11 +169,14 @@ namespace SDDM { + + for (int i = 0; i < screenCount; ++i) { + QRect geometry = QApplication::desktop()->screenGeometry(i); ++ qDebug() << "Screen" << geometry << QApplication::desktop()->screen(i)->pos(); + // add to the screens list + d->screens << ScreenPtr { new Screen { QString("Screen %1").arg(i + 1), geometry } }; + // extend available geometry + d->geometry = d->geometry.united(geometry); + } ++ QApplication::desktop()->screen()->setGeometry(d->geometry); ++ QApplication::desktop()->screen()->showMaximized(); + #endif + endResetModel(); + diff --git a/sddm-auth2.patch b/sddm-auth2.patch deleted file mode 100644 index 1bea83c..0000000 --- a/sddm-auth2.patch +++ /dev/null @@ -1,90 +0,0 @@ ---- ./sddm-50ca5b20354b6d338ce8836a613af19cedb1dca2/src/auth/AuthenticatorApp.cpp.auth2 2013-11-06 20:54:19.505419712 +0100 -+++ ./sddm-50ca5b20354b6d338ce8836a613af19cedb1dca2/src/auth/AuthenticatorApp.cpp 2013-11-06 20:54:28.079461963 +0100 -@@ -158,6 +158,28 @@ namespace SDDM { - return true; - } - -+ QString AuthenticatorApp::requestDisplay() { -+ qDebug() << " AUTH: requestDisplay start"; -+ QDataStream inStream(&m_input); -+ QDataStream outStream(&m_output); -+ quint32 command = quint32(AuthMessages::AuthNone); -+ qDebug() << " AUTH: Requesting Display"; -+ QString display; -+ -+ outStream << quint32(AuthMessages::RequestDisplay); -+ -+ inStream >> command; -+ if (command != quint32(AuthMessages::Display)) { -+ qDebug() << " AUTH: Received out of order message" << command << "when waiting for SessionID"; -+ handleMessage(AuthMessages(command)); -+ return display; -+ } -+ inStream >> display; -+ -+ qDebug() << " AUTH: requestDisplay end"; -+ return display; -+ } -+ - void AuthenticatorApp::slotLoginFailed() { - QDataStream outStream(&m_output); - outStream << quint32(AuthMessages::LoginFailed); ---- ./sddm-50ca5b20354b6d338ce8836a613af19cedb1dca2/src/auth/AuthenticatorApp.h.auth2 2013-11-06 20:54:15.730401120 +0100 -+++ ./sddm-50ca5b20354b6d338ce8836a613af19cedb1dca2/src/auth/AuthenticatorApp.h 2013-11-06 20:54:48.392562174 +0100 -@@ -42,6 +42,7 @@ namespace SDDM { - QProcessEnvironment requestEnvironment(const QString &user); - int requestSessionId(); - bool requestCookieTo(const QString &path, const QString &user); -+ QString requestDisplay(); - - signals: - void started(const QString &user, const QString &session, const QString &password, bool passwordless); ---- ./sddm-50ca5b20354b6d338ce8836a613af19cedb1dca2/src/auth/Method.cpp.auth2 2013-11-06 20:54:12.875387062 +0100 -+++ ./sddm-50ca5b20354b6d338ce8836a613af19cedb1dca2/src/auth/Method.cpp 2013-11-06 20:54:29.735470126 +0100 -@@ -100,15 +100,17 @@ namespace SDDM { - - if (!m_pam) - return false; --/* -+ -+ QString display = AuthenticatorApp::instance()->requestDisplay(); -+ - // set tty -- if (!m_pam->setItem(PAM_TTY, ":0")) -+ if (!m_pam->setItem(PAM_TTY, qPrintable(display))) - return false; - - // set display name -- if (!m_pam->setItem(PAM_XDISPLAY, ":0")) -+ if (!m_pam->setItem(PAM_XDISPLAY, qPrintable(display))) - return false; --*/ -+ - // set username - if (!m_pam->setItem(PAM_USER, qPrintable(m_user))) - return false; ---- ./sddm-50ca5b20354b6d338ce8836a613af19cedb1dca2/src/daemon/Authenticator.cpp.auth2 2013-11-06 20:54:08.851367254 +0100 -+++ ./sddm-50ca5b20354b6d338ce8836a613af19cedb1dca2/src/daemon/Authenticator.cpp 2013-11-06 20:54:31.903480815 +0100 -@@ -106,6 +106,9 @@ namespace SDDM { - stream << quint32(AuthMessages::CookieLink); - break; - } -+ case AuthMessages::RequestDisplay: -+ stream << quint32(AuthMessages::Display) << m_display->name(); -+ break; - default: - qWarning() << " DAEMON: Child sent message type" << quint32(command) << "which cannot be handled."; - break; ---- ./sddm-50ca5b20354b6d338ce8836a613af19cedb1dca2/src/common/Messages.h.auth2 2013-11-06 20:54:10.842377053 +0100 -+++ ./sddm-50ca5b20354b6d338ce8836a613af19cedb1dca2/src/common/Messages.h 2013-11-06 20:54:34.084491570 +0100 -@@ -51,7 +51,9 @@ namespace SDDM { - RequestSessionID, - SessionID, - RequestCookieLink, -- CookieLink -+ CookieLink, -+ RequestDisplay, -+ Display - }; - - enum Capability { diff --git a/sddm.conf b/sddm.conf index 84914f1..09b50d8 100644 --- a/sddm.conf +++ b/sddm.conf @@ -16,11 +16,11 @@ CurrentTheme=fedora MinimumUid=1000 MaximumUid=65000 LastUser= -RememberLastUser=false +RememberLastUser=true AutoUser= HideUsers= HideShells= AutoRelogin=false MinimumVT=1 -Numlock=on +Numlock=none XDMCPServer=false diff --git a/sddm.spec b/sddm.spec index 6140025..118f52c 100644 --- a/sddm.spec +++ b/sddm.spec @@ -1,9 +1,9 @@ %global _hardened_build 1 -%global sddm_commit 50ca5b20354b6d338ce8836a613af19cedb1dca2 +%global sddm_commit 7a008602f5f0a4ed8586ce24012983458a687d4e Name: sddm Version: 0.2.0 -Release: 0.20.20130914git%(echo %{sddm_commit} | cut -c-8)%{?dist} +Release: 0.21.20131125git%(echo %{sddm_commit} | cut -c-8)%{?dist} # code GPLv2+, fedora theme CC-BY-SA License: GPLv2+ and CC-BY-SA Summary: QML based X11 desktop manager @@ -33,7 +33,6 @@ Patch2: sddm-git.e707e229-session-list.patch Patch3: sddm-0.2.0-0.11.20130914git50ca5b20-xdmcp.patch Patch4: sddm-auth.patch -Patch5: sddm-auth2.patch Provides: service(graphical-login) = sddm @@ -74,9 +73,9 @@ A collection of sddm themes, including: circles, elarun, maldives, maui. %setup -q -n %{name}-%{sddm_commit} %patch2 -p1 -b .session-list -%patch3 -p1 -b .xdmcp +# disabled for now +#%patch3 -p1 -b .xdmcp %patch4 -p1 -b .auth -%patch5 -p2 -b .auth2 # get rid of the architecture flag sed -i "s/-march=native//" CMakeLists.txt @@ -149,6 +148,14 @@ install -Dpm 644 %{SOURCE23} %{buildroot}%{_datadir}/apps/sddm/themes/fedora/the %{_datadir}/apps/sddm/themes/maui/ %changelog +* Mon Nov 25 2013 Martin Briza - 0.2.0-0.21.20131125git7a008602 +- Rebase to current upstream +- Fix the theme (and improve it by a bit) +- Fix the authentication stack +- Don't touch numlock on startup +- Disabled the XDMCP server until it's accepted upstream +- Resolves: #1016902 #1028799 #1031415 #1031745 #1020921 #1008951 #1004621 + * Tue Nov 05 2013 Martin Briza - 0.2.0-0.20.20130914git50ca5b20 - Fix xdisplay and tty vars diff --git a/sources b/sources index ce0c57f..3f82cbc 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -490703ab69c3518f27d7e27fe18ce7fc 50ca5b20354b6d338ce8836a613af19cedb1dca2.tar.gz +23b2a10ad2a2f188c9a2cc4bcd35c275 7a008602f5f0a4ed8586ce24012983458a687d4e.tar.gz