]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blobdiff - liblightdm-qt/greeter.cpp
Load all users only when really needed
[sojka/lightdm.git] / liblightdm-qt / greeter.cpp
index 607e50f2e2b34e8827611e969e390ed7028db764..d535a02222153752947a740243ac454a6a04dde9 100644 (file)
-#include "greeter.h"
+/*
+ * Copyright (C) 2010-2011 David Edmundson
+ * Copyright (C) 2010-2011 Robert Ancell
+ * Author: David Edmundson <kde@davidedmundson.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 2 or version 3 of the License.
+ * See http://www.gnu.org/copyleft/lgpl.html the full text of the license.
+ */
 
-#include "user.h"
-#include "sessionsmodel.h"
 
-#include <security/pam_appl.h>
-#include <pwd.h>
-#include <errno.h>
+#include "QLightDM/greeter.h"
 
-#include <QtNetwork/QHostInfo> //needed for localHostName
 #include <QtCore/QDebug>
 #include <QtCore/QDir>
 #include <QtCore/QVariant>
-#include <QtCore/QFile>
-#include <QtDBus/QDBusPendingReply>
+#include <QtCore/QSettings>
 
-
-typedef enum
-{
-    /* Messages from the greeter to the server */
-    GREETER_MESSAGE_CONNECT                 = 1,
-    GREETER_MESSAGE_START_AUTHENTICATION    = 2,
-    GREETER_MESSAGE_CONTINUE_AUTHENTICATION = 3,
-    GREETER_MESSAGE_LOGIN                   = 4,
-    GREETER_MESSAGE_CANCEL_AUTHENTICATION   = 5,
-
-    /* Messages from the server to the greeter */
-    GREETER_MESSAGE_CONNECTED               = 101,
-    GREETER_MESSAGE_QUIT                    = 102,
-    GREETER_MESSAGE_PROMPT_AUTHENTICATION   = 103,
-    GREETER_MESSAGE_END_AUTHENTICATION      = 104
-} GreeterMessage;
-
-#define HEADER_SIZE 8
+#include <lightdm.h>
 
 using namespace QLightDM;
 
-class GreeterPrivate
+class QLightDM::GreeterPrivate
 {
 public:
-    QString theme;
-    QString defaultLayout;
-    QString defaultSession;
-    QString timedUser;
-    int loginDelay;
-    
-    SessionsModel *sessionsModel;
-
-    QSettings *config;
-    bool haveConfig;
-
-    QList<User*> users;
-    bool haveUsers;
-
-    QDBusInterface* lightdmInterface;
-    QDBusInterface* powerManagementInterface;
-    QDBusInterface* consoleKitInterface;
-  
-    int toServerFd;
-    int fromServerFd;
-    QSocketNotifier *n;
-    char *readBuffer;
-    int nRead;
-    bool inAuthentication;
-    bool isAuthenticated;
-    QString authenticationUser;
+    GreeterPrivate(Greeter *parent);
+    LightDMGreeter *ldmGreeter;
+protected:
+    Greeter* q_ptr;
+
+    static void cb_showPrompt(LightDMGreeter *greeter, const gchar *text, LightDMPromptType type, gpointer data);
+    static void cb_showMessage(LightDMGreeter *greeter, const gchar *text, LightDMMessageType type, gpointer data);
+    static void cb_authenticationComplete(LightDMGreeter *greeter, gpointer data);
+    static void cb_autoLoginExpired(LightDMGreeter *greeter, gpointer data);
+    static void cb_idle(LightDMGreeter *greeter, gpointer data);
+    static void cb_reset(LightDMGreeter *greeter, gpointer data);
+
+private:
+    Q_DECLARE_PUBLIC(Greeter)
 };
 
-
-Greeter::Greeter(QObject *parent) :
-    QObject(parent),
-    d(new GreeterPrivate)
+GreeterPrivate::GreeterPrivate(Greeter *parent) :
+    q_ptr(parent)
 {
-    d->readBuffer = (char *)malloc (HEADER_SIZE);
-    d->nRead = 0;
-    d->haveConfig = false;
-    d->haveUsers = false;
-    
-    d->sessionsModel = new SessionsModel(this);
-}
+#if !defined(GLIB_VERSION_2_36)
+    g_type_init();
+#endif
+    ldmGreeter = lightdm_greeter_new();
 
-Greeter::~Greeter()
-{
-    delete d->readBuffer;
-    delete d;
+    g_signal_connect (ldmGreeter, LIGHTDM_GREETER_SIGNAL_SHOW_PROMPT, G_CALLBACK (cb_showPrompt), this);
+    g_signal_connect (ldmGreeter, LIGHTDM_GREETER_SIGNAL_SHOW_MESSAGE, G_CALLBACK (cb_showMessage), this);
+    g_signal_connect (ldmGreeter, LIGHTDM_GREETER_SIGNAL_AUTHENTICATION_COMPLETE, G_CALLBACK (cb_authenticationComplete), this);
+    g_signal_connect (ldmGreeter, LIGHTDM_GREETER_SIGNAL_AUTOLOGIN_TIMER_EXPIRED, G_CALLBACK (cb_autoLoginExpired), this);
+    g_signal_connect (ldmGreeter, LIGHTDM_GREETER_SIGNAL_IDLE, G_CALLBACK (cb_idle), this);
+    g_signal_connect (ldmGreeter, LIGHTDM_GREETER_SIGNAL_RESET, G_CALLBACK (cb_reset), this);
 }
 
-static int intLength()
+void GreeterPrivate::cb_showPrompt(LightDMGreeter *greeter, const gchar *text, LightDMPromptType type, gpointer data)
 {
-    return 4;
+    Q_UNUSED(greeter);
+
+    GreeterPrivate *that = static_cast<GreeterPrivate*>(data);
+    QString message = QString::fromUtf8(text);
+
+    Q_EMIT that->q_func()->showPrompt(message, type == LIGHTDM_PROMPT_TYPE_QUESTION ?
+                                               Greeter::PromptTypeQuestion : Greeter::PromptTypeSecret);
 }
 
-static int stringLength(QString value)
+void GreeterPrivate::cb_showMessage(LightDMGreeter *greeter, const gchar *text, LightDMMessageType type, gpointer data)
 {
-    QByteArray a = value.toUtf8();  
-    return intLength() + a.size();
+    Q_UNUSED(greeter);
+
+    GreeterPrivate *that = static_cast<GreeterPrivate*>(data);
+    QString message = QString::fromUtf8(text);
+
+    Q_EMIT that->q_func()->showMessage(message, type == LIGHTDM_MESSAGE_TYPE_INFO ?
+                                                Greeter::MessageTypeInfo : Greeter::MessageTypeError);
 }
 
-void Greeter::writeInt(int value)
+void GreeterPrivate::cb_authenticationComplete(LightDMGreeter *greeter, gpointer data)
 {
-    char buffer[4];
-    buffer[0] = value >> 24;
-    buffer[1] = (value >> 16) & 0xFF;
-    buffer[2] = (value >> 8) & 0xFF;
-    buffer[3] = value & 0xFF;   
-    if (write(d->toServerFd, buffer, intLength()) != intLength()) {
-        qDebug() << "Error writing to server";
-    }
+    Q_UNUSED(greeter);
+    GreeterPrivate *that = static_cast<GreeterPrivate*>(data);
+    Q_EMIT that->q_func()->authenticationComplete();
 }
 
-void Greeter::writeString(QString value)
+void GreeterPrivate::cb_autoLoginExpired(LightDMGreeter *greeter, gpointer data)
 {
-    QByteArray a = value.toUtf8();
-    writeInt(a.size());
-    if (write(d->toServerFd, a.data(), a.size()) != a.size()) {
-        qDebug() << "Error writing to server";
-    }
+    Q_UNUSED(greeter);
+    GreeterPrivate *that = static_cast<GreeterPrivate*>(data);
+    Q_EMIT that->q_func()->autologinTimerExpired();
 }
 
-void Greeter::writeHeader(int id, int length)
+void GreeterPrivate::cb_idle(LightDMGreeter *greeter, gpointer data)
 {
-    writeInt(id);
-    writeInt(length);
+    Q_UNUSED(greeter);
+    GreeterPrivate *that = static_cast<GreeterPrivate*>(data);
+    Q_EMIT that->q_func()->idle();
 }
 
-void Greeter::flush()
+void GreeterPrivate::cb_reset(LightDMGreeter *greeter, gpointer data)
 {
-    fsync(d->toServerFd);
+    Q_UNUSED(greeter);
+    GreeterPrivate *that = static_cast<GreeterPrivate*>(data);
+    Q_EMIT that->q_func()->reset();
 }
 
-int Greeter::getPacketLength()
+Greeter::Greeter(QObject *parent) :
+    QObject(parent),
+    d_ptr(new GreeterPrivate(this))
 {
-    int offset = intLength();
-    return readInt(&offset);
 }
 
-int Greeter::readInt(int *offset)
+Greeter::~Greeter()
 {
-    if(d->nRead - *offset < intLength()) {
-        qDebug() << "Not enough space for int, need " << intLength() << ", got " << (d->nRead - *offset);
-        return 0;
-    }
-
-    char *buffer = d->readBuffer + *offset;
-    int value = buffer[0] << 24 | buffer[1] << 16 | buffer[2] << 8 | buffer[3];
-    *offset += intLength();
-    return value;
+    delete d_ptr;
 }
 
-QString Greeter::readString(int *offset)
+
+bool Greeter::connectToDaemonSync()
 {
-    int length = readInt(offset);
-    if(d->nRead - *offset < length) {
-        qDebug() << "Not enough space for string, need " << length << ", got " << (d->nRead - *offset);
-        return "";
-    }
-    char *start = d->readBuffer + *offset;
-    *offset += length;
-    return QString::fromUtf8(start, length);
+    Q_D(Greeter);
+    return lightdm_greeter_connect_to_daemon_sync(d->ldmGreeter, NULL);
 }
 
-void Greeter::connectToServer()
+bool Greeter::connectSync()
 {
-    QDBusConnection busType = QDBusConnection::systemBus();
-    QString ldmBus(qgetenv("LDM_BUS"));
-    if(ldmBus == QLatin1String("SESSION")) {
-        busType = QDBusConnection::sessionBus();
-    }
-
-
-    d->lightdmInterface = new QDBusInterface("org.lightdm.LightDisplayManager", "/org/lightdm/LightDisplayManager", "org.lightdm.LightDisplayManager", busType);
-    d->powerManagementInterface = new QDBusInterface("org.freedesktop.PowerManagement","/org/freedesktop/PowerManagement", "org.freedesktop.PowerManagement");
-    d->consoleKitInterface = new QDBusInterface("org.freedesktop.ConsoleKit", "/org/freedesktop/ConsoleKit/Manager", "org.freedesktop.ConsoleKit");
-
-    char* fd = getenv("LDM_TO_SERVER_FD");
-    if(!fd) {
-       qDebug() << "No LDM_TO_SERVER_FD environment variable";
-       return;
-    }
-    d->toServerFd = atoi(fd);
-
-
-    qDebug() << "***connecting to server";
-    QFile toServer;
-    qDebug() << toServer.open(d->toServerFd, QIODevice::WriteOnly);
-
-    fd = getenv("LDM_FROM_SERVER_FD");
-    if(!fd) {
-       qDebug() << "No LDM_FROM_SERVER_FD environment variable";
-       return;
-    }
-    d->fromServerFd = atoi(fd);
-
-    d->n = new QSocketNotifier(d->fromServerFd, QSocketNotifier::Read);
-    connect(d->n, SIGNAL(activated(int)), this, SLOT(onRead(int)));
-
-    qDebug() << "Connecting to display manager...";
-    writeHeader(GREETER_MESSAGE_CONNECT, 0);
-    flush();
+    Q_D(Greeter);
+    return lightdm_greeter_connect_to_daemon_sync(d->ldmGreeter, NULL);
 }
 
-void Greeter::startAuthentication(const QString &username)
+void Greeter::authenticate(const QString &username)
 {
-    d->inAuthentication = true;
-    d->isAuthenticated = false;
-    d->authenticationUser = username;
-    qDebug() << "Starting authentication for user " << username << "...";
-    writeHeader(GREETER_MESSAGE_START_AUTHENTICATION, stringLength(username));
-    writeString(username);
-    flush();     
+    Q_D(Greeter);
+    lightdm_greeter_authenticate(d->ldmGreeter, username.toLocal8Bit().data(), NULL);
 }
 
-void Greeter::provideSecret(const QString &secret)
+void Greeter::authenticateAsGuest()
 {
-    qDebug() << "Providing secret to display manager";
-    writeHeader(GREETER_MESSAGE_CONTINUE_AUTHENTICATION, intLength() + stringLength(secret));
-    // FIXME: Could be multiple secrets required
-    writeInt(1);
-    writeString(secret);
-    flush();
+    Q_D(Greeter);
+    lightdm_greeter_authenticate_as_guest(d->ldmGreeter, NULL);
 }
 
-void Greeter::cancelAuthentication()
+void Greeter::authenticateAutologin()
 {
-    qDebug() << "Cancelling authentication";
-    writeHeader(GREETER_MESSAGE_CANCEL_AUTHENTICATION, 0);
-    flush();  
+    Q_D(Greeter);
+    lightdm_greeter_authenticate_autologin(d->ldmGreeter, NULL);
 }
 
-bool Greeter::inAuthentication() const
+void Greeter::authenticateRemote(const QString &session, const QString &username)
 {
-    return d->inAuthentication;
+    Q_D(Greeter);
+    lightdm_greeter_authenticate_remote(d->ldmGreeter, session.toLocal8Bit().data(), username.toLocal8Bit().data(), NULL);
 }
 
-bool Greeter::isAuthenticated() const
+void Greeter::respond(const QString &response)
 {
-    return d->isAuthenticated;
+    Q_D(Greeter);
+    lightdm_greeter_respond(d->ldmGreeter, response.toLocal8Bit().data(), NULL);
 }
 
-QString Greeter::authenticationUser() const
+void Greeter::cancelAuthentication()
 {
-    return d->authenticationUser;
-}
-
-void Greeter::login(const QString &username, const QString &session, const QString &language)
-{
-    qDebug() << "Logging in as " << username << " for session " << session << " with language " << language;
-    writeHeader(GREETER_MESSAGE_LOGIN, stringLength(username) + stringLength(session) + stringLength(language));
-    writeString(username);
-    writeString(session);
-    writeString(language);
-    flush();
-}
-
-void Greeter::loginWithDefaults(const QString &username)
-{
-    login(username, NULL, NULL);
-}
-
-void Greeter::onRead(int fd)
-{
-    //qDebug() << "Reading from server";
-
-    int nToRead = HEADER_SIZE;
-    if(d->nRead >= HEADER_SIZE)
-        nToRead += getPacketLength();
-  
-    ssize_t nRead;
-    nRead = read(fd, d->readBuffer + d->nRead, nToRead - d->nRead);
-    if(nRead < 0)
-    {
-        qDebug() << "Error reading from server";
-        return;
-    }
-    if (nRead == 0)
-    {
-        qDebug() << "EOF reading from server";
-        return;
-    }  
-
-    //qDebug() << "Read " << nRead << "octets";
-    d->nRead += nRead;
-    if(d->nRead != nToRead)
-        return;
-  
-    /* If have header, rerun for content */
-    if(d->nRead == HEADER_SIZE)
-    {
-        nToRead = getPacketLength();
-        if(nToRead > 0)
-        {
-            d->readBuffer = (char *)realloc(d->readBuffer, HEADER_SIZE + nToRead);
-            onRead(fd);
-            return;
-        }
-    }
-
-    int offset = 0;
-    int id = readInt(&offset);
-    readInt(&offset);
-    int nMessages, returnCode;
-    switch(id)
-    {
-    case GREETER_MESSAGE_CONNECTED:
-        d->theme = readString(&offset);
-        d->defaultLayout = readString(&offset);
-        d->defaultSession = readString(&offset);
-        d->timedUser = readString(&offset);
-        d->loginDelay = readInt(&offset);
-        qDebug() << "Connected theme=" << d->theme << " default-layout=" << d->defaultLayout << " default-session=" << d->defaultSession << " timed-user=" << d->timedUser << " login-delay" << d->loginDelay;
-
-        /* Set timeout for default login */
-        if(d->timedUser != "" && d->loginDelay > 0)
-        {
-            qDebug() << "Logging in as " << d->timedUser << " in " << d->loginDelay << " seconds";
-            //FIXME: d->login_timeout = g_timeout_add (d->login_delay * 1000, timed_login_cb, greeter);
-        }
-        emit connected();
-        break;
-    case GREETER_MESSAGE_QUIT:
-        qDebug() << "Got quit request from server";
-        emit quit();
-        break;
-    case GREETER_MESSAGE_PROMPT_AUTHENTICATION:
-        nMessages = readInt(&offset);
-        qDebug() << "Prompt user with " << nMessages << " message(s)";
-        for(int i = 0; i < nMessages; i++)
-        {
-            int msg_style = readInt (&offset);
-            QString msg = readString (&offset);
-
-            // FIXME: Should stop on prompts?
-            switch (msg_style)
-            {
-            case PAM_PROMPT_ECHO_OFF:
-            case PAM_PROMPT_ECHO_ON:
-                emit showPrompt(msg);
-                break;
-            case PAM_ERROR_MSG:
-                emit showError(msg);
-                break;
-            case PAM_TEXT_INFO:
-                emit showMessage(msg);
-                break;
-            }
-        }
-        break;
-    case GREETER_MESSAGE_END_AUTHENTICATION:
-        returnCode = readInt(&offset);
-        qDebug() << "Authentication complete with return code " << returnCode;
-        d->isAuthenticated = (returnCode == 0);
-        if(!d->isAuthenticated) {
-            d->authenticationUser = "";
-        }
-        emit authenticationComplete(d->isAuthenticated);
-        d->inAuthentication = false;
-        break;
-    default:
-        qDebug() << "Unknown message from server: " << id;
-    }
-
-    d->nRead = 0;
+    Q_D(Greeter);
+    lightdm_greeter_cancel_authentication(d->ldmGreeter, NULL);
 }
 
-QString Greeter::hostname() const
+void Greeter::cancelAutologin()
 {
-    return QHostInfo::localHostName();
+    Q_D(Greeter);
+    lightdm_greeter_cancel_autologin(d->ldmGreeter);
 }
 
-QString Greeter::theme() const
+bool Greeter::inAuthentication() const
 {
-    return d->theme;
+    Q_D(const Greeter);
+    return lightdm_greeter_get_in_authentication(d->ldmGreeter);
 }
 
-QVariant Greeter::getProperty(const QString &name) const
+bool Greeter::isAuthenticated() const
 {
-    return QVariant(); //FIXME TODO
+    Q_D(const Greeter);
+    return lightdm_greeter_get_is_authenticated(d->ldmGreeter);
 }
 
-QString Greeter::defaultLanguage() const
+QString Greeter::authenticationUser() const
 {
-    return getenv("LANG");
+    Q_D(const Greeter);
+    return QString::fromUtf8(lightdm_greeter_get_authentication_user(d->ldmGreeter));
 }
 
-QString Greeter::defaultLayout() const
+void Greeter::setLanguage (const QString &language)
 {
-    return d->defaultLayout;
+    Q_D(Greeter);
+    lightdm_greeter_set_language(d->ldmGreeter, language.toLocal8Bit().constData(), NULL);
 }
 
-QString Greeter::defaultSession() const
+void Greeter::setResettable (bool resettable)
 {
-    return d->defaultSession;
+    Q_D(Greeter);
+    lightdm_greeter_set_resettable(d->ldmGreeter, resettable);
 }
 
-QString Greeter::timedLoginUser() const
+bool Greeter::startSessionSync(const QString &session)
 {
-    return d->timedUser;
+    Q_D(Greeter);
+    return lightdm_greeter_start_session_sync(d->ldmGreeter, session.toLocal8Bit().constData(), NULL);
 }
 
-int Greeter::timedLoginDelay() const
+QString Greeter::ensureSharedDataDirSync(const QString &username)
 {
-    return d->loginDelay;
+    Q_D(Greeter);
+    return QString::fromUtf8(lightdm_greeter_ensure_shared_data_dir_sync(d->ldmGreeter, username.toLocal8Bit().constData(), NULL));
 }
 
-void Greeter::loadConfig()
-{
-    if(d->haveConfig)
-        return;
-  
-     QString file;
-     if(false)
-       file = d->lightdmInterface->property("ConfigFile").toString();
-     qDebug() << "Loading configuration from " << file;
-     d->config = new QSettings(file, QSettings::IniFormat);
 
-    d->haveConfig = true;
+QString Greeter::getHint(const QString &name) const
+{
+    Q_D(const Greeter);
+    return lightdm_greeter_get_hint(d->ldmGreeter, name.toLocal8Bit().constData());
 }
 
-void Greeter::loadUsers()
+QString Greeter::defaultSessionHint() const
 {
-    QStringList hiddenUsers, hiddenShells;
-    int minimumUid;
-    QList<User*> users, oldUsers, newUsers, changedUsers;
-
-    loadConfig();
-
-    if(d->config->contains("UserManager/minimum-uid"))
-        minimumUid = d->config->value("UserManager/minimum-uid").toInt();
-    else
-        minimumUid = 500;
-
-    if (d->config->contains("UserManager/hidden-shells"))
-        hiddenUsers = d->config->value("UserManager/hidden-shells").toString().split(" ");
-    else
-        hiddenUsers << "nobody" << "nobody4" << "noaccess";
-
-    if (d->config->contains("UserManager/hidden-shells"))
-        hiddenShells = d->config->value("UserManager/hidden-shells").toString().split(" ");
-    else
-        hiddenShells << "/bin/false" << "/usr/sbin/nologin";
-
-    setpwent();
-
-    while(TRUE)
-    {
-        struct passwd *entry;
-        User *user;
-        QStringList tokens;
-        QString realName, image;
-        QFile *imageFile;
-        int i;
-
-        errno = 0;
-        entry = getpwent();
-        if(!entry)
-            break;
-
-        /* Ignore system users */
-        if(entry->pw_uid < minimumUid)
-            continue;
-
-        /* Ignore users disabled by shell */
-        if(entry->pw_shell)
-        {
-            for(i = 0; i < hiddenShells.size(); i++)
-                if(entry->pw_shell == hiddenShells.at(i))
-                    break;
-            if(i < hiddenShells.size())
-                continue;
-        }
-
-        /* Ignore certain users */
-        for(i = 0; i < hiddenUsers.size(); i++)
-            if(entry->pw_name == hiddenUsers.at(i))
-                break;
-        if(i < hiddenUsers.size())
-            continue;
-        tokens = QString(entry->pw_gecos).split(",");
-        if(tokens.size() > 0 && tokens.at(i) != "")
-            realName = tokens.at(i);
-      
-        QDir homeDir(entry->pw_dir);
-        imageFile = new QFile(homeDir.filePath(".face"));
-        if(!imageFile->exists())
-        {
-            delete imageFile;
-            imageFile = new QFile(homeDir.filePath(".face.icon"));
-        }
-        if(imageFile->exists())
-            image = "file://" + imageFile->fileName();
-        delete imageFile;
-
-        user = new User(entry->pw_name, realName, entry->pw_dir, image, FALSE);
-
-        /* Update existing users if have them */
-        bool matchedUser = false;
-        foreach(User *info, d->users)
-        {
-            if(info->name() == user->name())
-            {
-                matchedUser = true;
-                if(info->update(user->realName(), user->homeDirectory(), user->image(), user->isLoggedIn()))
-                    changedUsers.append(user);
-                delete user;
-                user = info;
-                break;
-            }
-        }
-        if(!matchedUser)
-        {
-            /* Only notify once we have loaded the user list */
-            if(d->haveUsers)
-                newUsers.append(user);
-        }
-        users.append(user);
-    }
-
-    if(errno != 0)
-        qDebug() << "Failed to read password database: " << strerror(errno);
-
-    endpwent();
-
-    /* Use new user list */
-    oldUsers = d->users;
-    d->users = users;
-
-    /* Notify of changes */
-    foreach(User *user, newUsers)
-    {
-        qDebug() << "User " << user->name() << " added";
-        emit userAdded(user);
-    }
-
-    foreach(User *user, changedUsers)
-    {
-        qDebug() << "User " << user->name() << " changed";
-        emit userChanged(user);
-    }
-
-    foreach(User *user, oldUsers)
-    {
-        /* See if this user is in the current list */
-        bool existing = false;
-        foreach(User *new_user, d->users)
-        {
-            if (new_user == user)
-            {
-                existing = true;
-                break;
-            }
-        }
-
-        if(!existing)
-        {
-            qDebug() << "User " << user->name() << " removed";
-            emit userRemoved(user);
-            delete user;
-        }
-    }
+    Q_D(const Greeter);
+    return QString::fromUtf8(lightdm_greeter_get_default_session_hint(d->ldmGreeter));
 }
 
-void Greeter::updateUsers()
+bool Greeter::hideUsersHint() const
 {
-    if (d->haveUsers) {
-        return;
-    }
-  
-    loadConfig();
-
-    /* User listing is disabled */
-    if (d->config->contains("UserManager/load-users") &&
-        !d->config->value("UserManager/load-users").toBool())
-    {
-        d->haveUsers = true;
-        return;
-    }
-
-    loadUsers();
-
-    d->haveUsers = true;
+    Q_D(const Greeter);
+    return lightdm_greeter_get_hide_users_hint(d->ldmGreeter);
 }
 
-QList<User*> Greeter::users()
+bool Greeter::showManualLoginHint() const
 {
-    updateUsers();
-    return d->users;
+    Q_D(const Greeter);
+    return lightdm_greeter_get_show_manual_login_hint(d->ldmGreeter);
 }
 
-SessionsModel* Greeter::sessionsModel() const
+bool Greeter::showRemoteLoginHint() const
 {
-    return d->sessionsModel; 
+    Q_D(const Greeter);
+    return lightdm_greeter_get_show_remote_login_hint(d->ldmGreeter);
 }
 
-
-bool Greeter::canSuspend() const
+bool Greeter::lockHint() const
 {
-    QDBusReply<bool> reply = d->powerManagementInterface->call("CanSuspend");
-    if (reply.isValid())
-        return reply.value();
-    else
-        return false;
+    Q_D(const Greeter);
+    return lightdm_greeter_get_lock_hint(d->ldmGreeter);
 }
 
-void Greeter::suspend()
+bool Greeter::hasGuestAccountHint() const
 {
-    d->powerManagementInterface->call("Suspend");
+    Q_D(const Greeter);
+    return lightdm_greeter_get_has_guest_account_hint(d->ldmGreeter);
 }
 
-bool Greeter::canHibernate() const
+QString Greeter::selectUserHint() const
 {
-    QDBusReply<bool> reply = d->powerManagementInterface->call("CanHibernate");
-    if (reply.isValid())
-        return reply.value();
-    else
-        return false;
+    Q_D(const Greeter);
+    return QString::fromUtf8(lightdm_greeter_get_select_user_hint(d->ldmGreeter));
 }
 
-void Greeter::hibernate()
+bool Greeter::selectGuestHint() const
 {
-    d->powerManagementInterface->call("Hibernate");
+    Q_D(const Greeter);
+    return lightdm_greeter_get_select_guest_hint(d->ldmGreeter);
 }
 
-bool Greeter::canShutdown() const
+QString Greeter::autologinUserHint() const
 {
-    QDBusReply<bool> reply = d->consoleKitInterface->call("CanStop");
-    if (reply.isValid())
-        return reply.value();
-    else
-        return false;
+    Q_D(const Greeter);
+    return QString::fromUtf8(lightdm_greeter_get_autologin_user_hint(d->ldmGreeter));
 }
 
-void Greeter::shutdown()
+bool Greeter::autologinGuestHint() const
 {
-    d->consoleKitInterface->call("stop");
+    Q_D(const Greeter);
+    return lightdm_greeter_get_autologin_guest_hint(d->ldmGreeter);
 }
 
-bool Greeter::canRestart() const
+int Greeter::autologinTimeoutHint() const
 {
-    QDBusReply<bool> reply = d->consoleKitInterface->call("CanRestart");
-    if (reply.isValid())
-        return reply.value();
-    else
-        return false;
+    Q_D(const Greeter);
+    return lightdm_greeter_get_autologin_timeout_hint(d->ldmGreeter);
 }
 
-void Greeter::restart()
+QString Greeter::hostname() const
 {
-    d->consoleKitInterface->call("Restart");
+    return QString::fromUtf8(lightdm_get_hostname());
 }
+
+#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
+#include "greeter_moc5.cpp"
+#else
+#include "greeter_moc4.cpp"
+#endif