void Display::startAuth(const QString &user, const QString &password, const Session &session) { m_passPhrase = password; // sanity check if (!session.isValid()) { qCritical() << "Invalid session" << session.fileName(); return; } if (session.xdgSessionType().isEmpty()) { qCritical() << "Failed to find XDG session type for session" << session.fileName(); return; } if (session.exec().isEmpty()) { qCritical() << "Failed to find command for session" << session.fileName(); return; } // cache last session m_lastSession = session; // save session desktop file name, we'll use it to set the // last session later, in slotAuthenticationFinished() m_sessionName = session.fileName(); // some information qDebug() << "Session" << m_sessionName << "selected, command:" << session.exec(); // create new VT for Wayland sessions otherwise use greeter vt int vt = terminalId(); if (session.xdgSessionType() == QLatin1String("wayland")) vt = VirtualTerminal::setUpNewVt(); m_lastSession.setVt(vt); QProcessEnvironment env; env.insert(QStringLiteral("PATH"), mainConfig.Users.DefaultPath.get()); if (session.xdgSessionType() == QLatin1String("x11")) env.insert(QStringLiteral("DISPLAY"), name()); env.insert(QStringLiteral("XDG_SEAT"), seat()->name()); env.insert(QStringLiteral("XDG_SEAT_PATH"), daemonApp->displayManager()->seatPath(seat()->name())); env.insert(QStringLiteral("XDG_SESSION_PATH"), daemonApp->displayManager()->sessionPath(QStringLiteral("Session%1").arg(daemonApp->newSessionId()))); env.insert(QStringLiteral("XDG_VTNR"), QString::number(vt)); env.insert(QStringLiteral("DESKTOP_SESSION"), session.desktopSession()); env.insert(QStringLiteral("XDG_CURRENT_DESKTOP"), session.desktopNames()); env.insert(QStringLiteral("XDG_SESSION_CLASS"), QStringLiteral("user")); env.insert(QStringLiteral("XDG_SESSION_TYPE"), session.xdgSessionType()); env.insert(QStringLiteral("XDG_SESSION_DESKTOP"), session.desktopNames()); m_auth->insertEnvironment(env); m_auth->setUser(user); m_auth->setSession(session.exec()); m_auth->start(); }
} } } // cache last session m_lastSession = session; // save session desktop file name, we'll use it to set the // last session later, in slotAuthenticationFinished() m_sessionName = session.fileName(); // some information qDebug() << "Session" << m_sessionName << "selected, command:" << session.exec(); // create new VT for Wayland sessions otherwise use greeter vt int vt = terminalId(); if (session.xdgSessionType() == QLatin1String("wayland")) vt = VirtualTerminal::setUpNewVt(); m_lastSession.setVt(vt); QProcessEnvironment env; env.insert(QStringLiteral("PATH"), mainConfig.Users.DefaultPath.get()); if (session.xdgSessionType() == QLatin1String("x11")) env.insert(QStringLiteral("DISPLAY"), name()); env.insert(QStringLiteral("XDG_SEAT_PATH"), daemonApp->displayManager()->seatPath(seat()->name())); env.insert(QStringLiteral("XDG_SESSION_PATH"), daemonApp->displayManager()->sessionPath(QStringLiteral("Session%1").arg(daemonApp->newSessionId()))); env.insert(QStringLiteral("DESKTOP_SESSION"), session.desktopSession()); env.insert(QStringLiteral("XDG_CURRENT_DESKTOP"), session.desktopNames()); env.insert(QStringLiteral("XDG_SESSION_CLASS"), QStringLiteral("user")); env.insert(QStringLiteral("XDG_SESSION_TYPE"), session.xdgSessionType()); env.insert(QStringLiteral("XDG_SEAT"), seat()->name());
void Display::startAuth(const QString &user, const QString &password, const QString &session) { QString sessionFileName = session; QString sessionName; QString xdgSessionName; QString command; m_passPhrase = password; // session directory QDir dir(mainConfig.XDisplay.SessionDir.get()); if (!sessionFileName.endsWith(".desktop")) { // prefer a .desktop file if it exists if (QFile::exists(dir.absoluteFilePath(sessionFileName + QStringLiteral(".desktop")))) sessionFileName += QStringLiteral(".desktop"); } if (sessionFileName.endsWith(".desktop")) { qDebug() << "Reading from" << sessionFileName; // session file QFile file(dir.absoluteFilePath(sessionFileName)); // open file if (file.open(QIODevice::ReadOnly)) { // read line-by-line QTextStream in(&file); while (!in.atEnd()) { QString line = in.readLine(); // line starting with Exec if (line.startsWith("Exec=")) command = line.mid(5); // Desktop names, change the separator if (line.startsWith("DesktopNames=")) { xdgSessionName = line.mid(13); xdgSessionName.replace(';', ':'); } } // close file file.close(); } // remove extension sessionName = sessionFileName.left(sessionFileName.lastIndexOf(".")); } else { command = sessionFileName; sessionName = sessionFileName; } if (command.isEmpty()) { qCritical() << "Failed to find command for session:" << sessionFileName; return; } // save session desktop file name, we'll use it to set the // last session later, in slotAuthenticationFinished() m_sessionName = sessionFileName; QProcessEnvironment env; env.insert("PATH", mainConfig.Users.DefaultPath.get()); env.insert("DISPLAY", name()); env.insert("XDG_SEAT", seat()->name()); env.insert("XDG_SEAT_PATH", daemonApp->displayManager()->seatPath(seat()->name())); env.insert("XDG_SESSION_PATH", daemonApp->displayManager()->sessionPath(QString("Session%1").arg(daemonApp->newSessionId()))); env.insert("XDG_VTNR", QString::number(terminalId())); env.insert("DESKTOP_SESSION", sessionName); env.insert("XDG_CURRENT_DESKTOP", xdgSessionName); env.insert("XDG_SESSION_CLASS", "user"); env.insert("XDG_SESSION_TYPE", m_displayServer->sessionType()); env.insert("XDG_SESSION_DESKTOP", xdgSessionName); m_auth->insertEnvironment(env); m_auth->setUser(user); m_auth->setSession(command); m_auth->start(); }