mirror of
https://bitbucket.org/smil3y/kde-playground.git
synced 2025-02-23 18:32:51 +00:00
kdm: new toy display manager
most of the projects in this repo are toys btw Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
parent
7f4379ff66
commit
26a70a57ce
6 changed files with 414 additions and 0 deletions
|
@ -32,3 +32,4 @@ macro_optional_add_subdirectory (kfirewall)
|
||||||
macro_optional_add_subdirectory (khash)
|
macro_optional_add_subdirectory (khash)
|
||||||
macro_optional_add_subdirectory (kprintjobs)
|
macro_optional_add_subdirectory (kprintjobs)
|
||||||
macro_optional_add_subdirectory (plasma-wallpapers)
|
macro_optional_add_subdirectory (plasma-wallpapers)
|
||||||
|
macro_optional_add_subdirectory (kdm)
|
||||||
|
|
31
kdm/CMakeLists.txt
Normal file
31
kdm/CMakeLists.txt
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
project(kdm)
|
||||||
|
|
||||||
|
add_definitions(-DKDE_DEFAULT_DEBUG_AREA=1603)
|
||||||
|
|
||||||
|
add_executable(kdm kdm.cpp)
|
||||||
|
target_link_libraries(kdm
|
||||||
|
${QT_QTCORE_LIBRARY}
|
||||||
|
${QT_QTGUI_LIBRARY}
|
||||||
|
KDE4::kdeui
|
||||||
|
KDE4::plasma
|
||||||
|
)
|
||||||
|
|
||||||
|
install(
|
||||||
|
TARGETS kdm
|
||||||
|
DESTINATION ${KDE4_SBIN_INSTALL_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
########### next target ###############
|
||||||
|
|
||||||
|
add_executable(kdmhelper kdmhelper.cpp)
|
||||||
|
target_link_libraries(kdmhelper
|
||||||
|
KDE4::kdecore
|
||||||
|
crypt
|
||||||
|
)
|
||||||
|
|
||||||
|
install(
|
||||||
|
TARGETS kdmhelper
|
||||||
|
DESTINATION ${KDE4_LIBEXEC_INSTALL_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
kde4_install_auth_helper_files(kdmhelper org.kde.kdm.helper)
|
255
kdm/kdm.cpp
Normal file
255
kdm/kdm.cpp
Normal file
|
@ -0,0 +1,255 @@
|
||||||
|
/* This file is part of the KDE project
|
||||||
|
Copyright (C) 2023 Ivailo Monev <xakepa10@gmail.com>
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public
|
||||||
|
License version 2, as published by the Free Software Foundation.
|
||||||
|
|
||||||
|
This library 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
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public License
|
||||||
|
along with this library; see the file COPYING.LIB. If not, write to
|
||||||
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <QDir>
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QGraphicsView>
|
||||||
|
#include <QApplication>
|
||||||
|
#include <QGraphicsScene>
|
||||||
|
#include <QGraphicsWidget>
|
||||||
|
#include <QGraphicsGridLayout>
|
||||||
|
#include <QGraphicsLinearLayout>
|
||||||
|
#include <Plasma/Theme>
|
||||||
|
#include <Plasma/Frame>
|
||||||
|
#include <Plasma/ScrollWidget>
|
||||||
|
#include <Plasma/LineEdit>
|
||||||
|
#include <Plasma/PushButton>
|
||||||
|
#include <Plasma/IconWidget>
|
||||||
|
#include <Plasma/FlashingLabel>
|
||||||
|
#include <Plasma/ComboBox>
|
||||||
|
#include <KUser>
|
||||||
|
#include <KLineEdit>
|
||||||
|
#include <KComboBox>
|
||||||
|
#include <KAuthorization>
|
||||||
|
#include <KLocale>
|
||||||
|
#include <KDebug>
|
||||||
|
|
||||||
|
static const int s_minimumuid = 1000;
|
||||||
|
static const QSizeF s_usericonsize = QSizeF(70, 70);
|
||||||
|
|
||||||
|
class KDMBackground : public QGraphicsWidget
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
KDMBackground(QGraphicsItem *parent = nullptr, Qt::WindowFlags flags = 0);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0) final;
|
||||||
|
|
||||||
|
private:
|
||||||
|
QImage m_background;
|
||||||
|
QImage m_backgroundscaled;
|
||||||
|
};
|
||||||
|
|
||||||
|
KDMBackground::KDMBackground(QGraphicsItem *parent, Qt::WindowFlags flags)
|
||||||
|
: QGraphicsWidget(parent, flags)
|
||||||
|
{
|
||||||
|
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||||
|
m_background = QImage(Plasma::Theme::defaultTheme()->wallpaperPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
void KDMBackground::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
|
||||||
|
{
|
||||||
|
const QSize windowsize = size().toSize();
|
||||||
|
if (m_backgroundscaled.isNull() || windowsize != m_backgroundscaled.size()) {
|
||||||
|
m_backgroundscaled = m_background.scaled(windowsize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
|
||||||
|
}
|
||||||
|
painter->drawImage(QPoint(0, 0), m_backgroundscaled);
|
||||||
|
}
|
||||||
|
|
||||||
|
class KDMWindow : public QGraphicsView
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
KDMWindow(QWidget *parent = nullptr);
|
||||||
|
~KDMWindow();
|
||||||
|
|
||||||
|
private Q_SLOTS:
|
||||||
|
void slotUserClicked();
|
||||||
|
void slotPasswordChanged(const QString &password);
|
||||||
|
void slotLoginReleased();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QGraphicsScene* m_scene;
|
||||||
|
QGraphicsWidget* m_widget;
|
||||||
|
QGraphicsLinearLayout* m_layout;
|
||||||
|
Plasma::Frame* m_frame;
|
||||||
|
QGraphicsGridLayout* m_framelayout;
|
||||||
|
QGraphicsWidget* m_userswidget;
|
||||||
|
QGraphicsLinearLayout* m_userslayout;
|
||||||
|
Plasma::LineEdit* m_lineedit;
|
||||||
|
Plasma::PushButton* m_pushbutton;
|
||||||
|
Plasma::FlashingLabel* m_flashinglabel;
|
||||||
|
QGraphicsWidget* m_spacer;
|
||||||
|
Plasma::ComboBox* m_combobox;
|
||||||
|
QString m_loginname;
|
||||||
|
};
|
||||||
|
|
||||||
|
KDMWindow::KDMWindow(QWidget *parent)
|
||||||
|
: QGraphicsView(parent)
|
||||||
|
{
|
||||||
|
m_scene = new QGraphicsScene(this);
|
||||||
|
|
||||||
|
m_widget = new QGraphicsWidget();
|
||||||
|
m_layout = new QGraphicsLinearLayout(Qt::Vertical, m_widget);
|
||||||
|
m_widget->setLayout(m_layout);
|
||||||
|
|
||||||
|
m_frame = new Plasma::Frame(m_widget);
|
||||||
|
m_frame->setFrameShadow(Plasma::Frame::Sunken);
|
||||||
|
m_framelayout = new QGraphicsGridLayout(m_frame);
|
||||||
|
m_userswidget = new QGraphicsWidget(m_frame);
|
||||||
|
m_userslayout = new QGraphicsLinearLayout(Qt::Horizontal, m_userswidget);
|
||||||
|
foreach (const KUser &user, KUser::allUsers()) {
|
||||||
|
if (user.uid() < s_minimumuid) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Plasma::IconWidget* userwidget = new Plasma::IconWidget(m_userswidget);
|
||||||
|
QString usericon = user.faceIconPath();
|
||||||
|
if (usericon.isEmpty()) {
|
||||||
|
usericon = QString::fromLatin1("user-identity");
|
||||||
|
}
|
||||||
|
userwidget->setMinimumIconSize(s_usericonsize);
|
||||||
|
userwidget->setMaximumIconSize(s_usericonsize);
|
||||||
|
userwidget->setIcon(usericon);
|
||||||
|
const QString userloginname = user.loginName();
|
||||||
|
QString username = user.property(KUser::FullName);
|
||||||
|
if (username.isEmpty()) {
|
||||||
|
username = userloginname;
|
||||||
|
}
|
||||||
|
userwidget->setText(username);
|
||||||
|
userwidget->setProperty("_k_loginname", userloginname);
|
||||||
|
connect(
|
||||||
|
userwidget, SIGNAL(clicked()),
|
||||||
|
this, SLOT(slotUserClicked())
|
||||||
|
);
|
||||||
|
m_userslayout->addItem(userwidget);
|
||||||
|
}
|
||||||
|
m_userswidget->setLayout(m_userslayout);
|
||||||
|
m_framelayout->addItem(m_userswidget, 0, 0);
|
||||||
|
m_lineedit = new Plasma::LineEdit(m_frame);
|
||||||
|
m_lineedit->setClickMessage(i18n("Enter password..."));
|
||||||
|
m_lineedit->nativeWidget()->setPasswordMode(true);
|
||||||
|
connect(
|
||||||
|
m_lineedit, SIGNAL(textChanged(QString)),
|
||||||
|
this, SLOT(slotPasswordChanged(QString))
|
||||||
|
);
|
||||||
|
m_framelayout->addItem(m_lineedit, 1, 0);
|
||||||
|
m_pushbutton = new Plasma::PushButton(m_frame);
|
||||||
|
m_pushbutton->setText(i18n("Login"));
|
||||||
|
m_pushbutton->setIcon(KIcon("user-online"));
|
||||||
|
m_pushbutton->setEnabled(false);
|
||||||
|
connect(
|
||||||
|
m_pushbutton, SIGNAL(released()),
|
||||||
|
this, SLOT(slotLoginReleased())
|
||||||
|
);
|
||||||
|
m_framelayout->addItem(m_pushbutton, 2, 0);
|
||||||
|
m_frame->setLayout(m_framelayout);
|
||||||
|
m_layout->addItem(m_frame);
|
||||||
|
|
||||||
|
m_flashinglabel = new Plasma::FlashingLabel(m_widget);
|
||||||
|
m_flashinglabel->setAutohide(true);
|
||||||
|
m_layout->addItem(m_flashinglabel);
|
||||||
|
|
||||||
|
m_spacer = new QGraphicsWidget(m_widget);
|
||||||
|
m_spacer->setMinimumSize(50, 50);
|
||||||
|
m_layout->addItem(m_spacer);
|
||||||
|
m_combobox = new Plasma::ComboBox(m_widget);
|
||||||
|
QDir dir("/usr/share/xsessions");
|
||||||
|
foreach (const QString &entry, dir.entryList(QDir::Files)) {
|
||||||
|
if (entry.endsWith(".desktop")) {
|
||||||
|
QSettings desktopsettings("/usr/share/xsessions/" + entry);
|
||||||
|
const QString sessionname = desktopsettings.string("Desktop Entry/Name");
|
||||||
|
const QString sessionexec = desktopsettings.string("Desktop Entry/Exec");
|
||||||
|
if (!sessionname.isEmpty() && !sessionexec.isEmpty()) {
|
||||||
|
const QString sessionicon = desktopsettings.string("Desktop Entry/Icon");
|
||||||
|
m_combobox->nativeWidget()->addItem(QIcon::fromTheme(sessionicon), sessionname, sessionexec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_layout->addItem(m_combobox);
|
||||||
|
|
||||||
|
m_scene->addItem(m_widget);
|
||||||
|
m_scene->setBackgroundBrush(QBrush(QImage(Plasma::Theme::defaultTheme()->wallpaperPath())));
|
||||||
|
|
||||||
|
setScene(m_scene);
|
||||||
|
}
|
||||||
|
|
||||||
|
KDMWindow::~KDMWindow()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void KDMWindow::slotUserClicked()
|
||||||
|
{
|
||||||
|
Plasma::IconWidget* userwidget = qobject_cast<Plasma::IconWidget*>(sender());
|
||||||
|
m_loginname = userwidget->property("_k_loginname").toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
void KDMWindow::slotPasswordChanged(const QString &password)
|
||||||
|
{
|
||||||
|
m_pushbutton->setEnabled(!password.isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
void KDMWindow::slotLoginReleased()
|
||||||
|
{
|
||||||
|
if (m_loginname.isEmpty()) {
|
||||||
|
m_flashinglabel->flash(i18n("Select user first!"));
|
||||||
|
kWarning() << "Select user first!";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!KAuthorization::isAuthorized("org.kde.kdm.helper")) {
|
||||||
|
m_flashinglabel->flash(i18n("Not authorized!"));
|
||||||
|
kWarning() << "Not authorized!";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariantMap kdmarguments;
|
||||||
|
kdmarguments.insert("user", m_loginname);
|
||||||
|
kdmarguments.insert("password", m_lineedit->text());
|
||||||
|
int kdmreply = KAuthorization::execute(
|
||||||
|
"org.kde.kdm.helper", "check", kdmarguments
|
||||||
|
);
|
||||||
|
if (kdmreply != 0) {
|
||||||
|
m_flashinglabel->flash(i18n("Invalid password!"));
|
||||||
|
kWarning() << "Invalid password!" << kdmreply;
|
||||||
|
m_lineedit->setText(QString());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
qDebug() << Q_FUNC_INFO << "password matches";
|
||||||
|
kdmarguments.insert("session", m_loginname);
|
||||||
|
kdmreply = KAuthorization::execute(
|
||||||
|
"org.kde.kdm.helper", "login", kdmarguments
|
||||||
|
);
|
||||||
|
if (kdmreply != 0) {
|
||||||
|
m_flashinglabel->flash(i18n("Could not login!"));
|
||||||
|
kWarning() << "Could not login!" << kdmreply;
|
||||||
|
m_lineedit->setText(QString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char**argv)
|
||||||
|
{
|
||||||
|
QApplication app(argc, argv);
|
||||||
|
KDMWindow kdm;
|
||||||
|
kdm.showMaximized();
|
||||||
|
// kdm.show();
|
||||||
|
return app.exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "kdm.moc"
|
11
kdm/kdm.service
Normal file
11
kdm/kdm.service
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Katana Display Manager
|
||||||
|
After=systemd-user-sessions.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
ExecStart=/usr/sbin/kdm
|
||||||
|
Restart=always
|
||||||
|
# BusName=org.freedesktop.DisplayManager
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
Alias=display-manager.service
|
82
kdm/kdmhelper.cpp
Normal file
82
kdm/kdmhelper.cpp
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
/* This file is part of the KDE project
|
||||||
|
Copyright (C) 2023 Ivailo Monev <xakepa10@gmail.com>
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public
|
||||||
|
License version 2, as published by the Free Software Foundation.
|
||||||
|
|
||||||
|
This library 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
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public License
|
||||||
|
along with this library; see the file COPYING.LIB. If not, write to
|
||||||
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "kdmhelper.h"
|
||||||
|
|
||||||
|
#include <kdebug.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <shadow.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
KDMHelper::KDMHelper(const char* const helper, QObject *parent)
|
||||||
|
: KAuthorization(helper, parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int KDMHelper::check(const QVariantMap ¶meters)
|
||||||
|
{
|
||||||
|
const QByteArray userbytes = parameters.value("user").toByteArray();
|
||||||
|
const QByteArray passbytes = parameters.value("password").toByteArray();
|
||||||
|
if (userbytes.isEmpty() || passbytes.isEmpty()) {
|
||||||
|
return KAuthorization::HelperError;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct passwd* pw = ::getpwnam(userbytes.constData());
|
||||||
|
if (!pw) {
|
||||||
|
kWarning() << "null passwd struct";
|
||||||
|
return KAuthorization::HelperError;
|
||||||
|
}
|
||||||
|
|
||||||
|
QByteArray pw_passwd = pw->pw_passwd;
|
||||||
|
if (pw_passwd == "x" || pw_passwd == "*") {
|
||||||
|
if (::lckpwdf() != 0) {
|
||||||
|
kWarning() << "lckpwdf() failed";
|
||||||
|
return KAuthorization::HelperError;
|
||||||
|
}
|
||||||
|
::setspent();
|
||||||
|
struct spwd *spw = ::getspnam(userbytes.constData());
|
||||||
|
if (!spw) {
|
||||||
|
kWarning() << "null shadow passwd struct";
|
||||||
|
::endspent();
|
||||||
|
::ulckpwdf();
|
||||||
|
return KAuthorization::HelperError;
|
||||||
|
}
|
||||||
|
pw_passwd = spw->sp_pwdp;
|
||||||
|
::endspent();
|
||||||
|
::ulckpwdf();
|
||||||
|
}
|
||||||
|
if (passbytes == pw_passwd || ::crypt(passbytes.constData(), pw_passwd) == pw_passwd) {
|
||||||
|
return KAuthorization::NoError;
|
||||||
|
}
|
||||||
|
kWarning() << "password does not match";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int KDMHelper::login(const QVariantMap ¶meters)
|
||||||
|
{
|
||||||
|
if (!parameters.contains("user")) {
|
||||||
|
return KAuthorization::HelperError;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO:
|
||||||
|
return KAuthorization::NoError;
|
||||||
|
}
|
||||||
|
|
||||||
|
K_AUTH_MAIN("org.kde.kdm.helper", KDMHelper)
|
34
kdm/kdmhelper.h
Normal file
34
kdm/kdmhelper.h
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
/* This file is part of the KDE project
|
||||||
|
Copyright (C) 2023 Ivailo Monev <xakepa10@gmail.com>
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public
|
||||||
|
License version 2, as published by the Free Software Foundation.
|
||||||
|
|
||||||
|
This library 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
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public License
|
||||||
|
along with this library; see the file COPYING.LIB. If not, write to
|
||||||
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef KDMHELPER_H
|
||||||
|
#define KDMHELPER_H
|
||||||
|
|
||||||
|
#include <kauthorization.h>
|
||||||
|
|
||||||
|
class KDMHelper : public KAuthorization
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
KDMHelper(const char* const helper, QObject *parent = nullptr);
|
||||||
|
public Q_SLOTS:
|
||||||
|
int check(const QVariantMap ¶meters);
|
||||||
|
int login(const QVariantMap ¶meters);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // KDMHELPER_H
|
Loading…
Add table
Reference in a new issue