~lightdm-team/lightdm/1.4

« back to all changes in this revision

Viewing changes to liblightdm-qt/QLightDM/greeter.cpp

  • Committer: David Edmundson
  • Date: 2011-05-22 11:19:24 UTC
  • mto: This revision was merged to the branch mainline in revision 461.
  • Revision ID: david@davidedmundson.co.uk-20110522111924-aar5y8f75tm9q9xh
Added a users model

Show diffs side-by-side

added added

removed removed

Lines of Context:
5
5
#include "config.h"
6
6
 
7
7
#include <security/pam_appl.h>
8
 
#include <pwd.h>
9
 
#include <errno.h>
10
8
 
11
9
#include <QtNetwork/QHostInfo> //needed for localHostName
12
10
#include <QtCore/QDebug>
48
46
    SessionsModel *sessionsModel;
49
47
    Config *config;
50
48
 
51
 
    QList<User*> users;
52
 
    bool haveUsers;
53
 
 
54
49
    QDBusInterface* lightdmInterface;
55
50
    QDBusInterface* powerManagementInterface;
56
51
    QDBusInterface* consoleKitInterface;
72
67
{
73
68
    d->readBuffer = (char *)malloc (HEADER_SIZE);
74
69
    d->nRead = 0;
75
 
    d->haveUsers = false;
76
 
    
 
70
    d->config = 0;
77
71
    d->sessionsModel = new SessionsModel(this);
78
72
}
79
73
 
165
159
        busType = QDBusConnection::sessionBus();
166
160
    }
167
161
 
168
 
 
169
162
    d->lightdmInterface = new QDBusInterface("org.lightdm.LightDisplayManager", "/org/lightdm/LightDisplayManager", "org.lightdm.LightDisplayManager", busType);
170
163
    d->powerManagementInterface = new QDBusInterface("org.freedesktop.PowerManagement","/org/freedesktop/PowerManagement", "org.freedesktop.PowerManagement");
171
164
    d->consoleKitInterface = new QDBusInterface("org.freedesktop.ConsoleKit", "/org/freedesktop/ConsoleKit/Manager", "org.freedesktop.ConsoleKit");
172
165
 
 
166
    QString file;
 
167
    file = d->lightdmInterface->property("ConfigFile").toString();
 
168
    qDebug() << "Loading configuration from " << file;
 
169
    d->config = new Config(file, this);
 
170
 
173
171
    char* fd = getenv("LDM_TO_SERVER_FD");
174
172
    if(!fd) {
175
173
       qDebug() << "No LDM_TO_SERVER_FD environment variable";
197
195
    flush();
198
196
 
199
197
 
200
 
    QString file;
201
 
    file = d->lightdmInterface->property("ConfigFile").toString();
202
 
    qDebug() << "Loading configuration from " << file;
203
 
    d->config = new Config(file, this);
 
198
 
204
199
}
205
200
 
206
201
void Greeter::startAuthentication(const QString &username)
406
401
    return d->loginDelay;
407
402
}
408
403
 
409
 
void Greeter::loadUsers()
410
 
{
411
 
    QStringList hiddenUsers, hiddenShells;
412
 
    int minimumUid;
413
 
    QList<User*> users, oldUsers, newUsers, changedUsers;
414
 
 
415
 
    minimumUid = d->config->minimumUid();
416
 
    hiddenUsers = d->config->hiddenUsers();
417
 
    hiddenShells = d->config->hiddenShells();
418
 
 
419
 
    setpwent();
420
 
 
421
 
    while(TRUE)
422
 
    {
423
 
        struct passwd *entry;
424
 
        User *user;
425
 
        QStringList tokens;
426
 
        QString realName, image;
427
 
        QFile *imageFile;
428
 
        int i;
429
 
 
430
 
        errno = 0;
431
 
        entry = getpwent();
432
 
        if(!entry)
433
 
            break;
434
 
 
435
 
        /* Ignore system users */
436
 
        if(entry->pw_uid < minimumUid)
437
 
            continue;
438
 
 
439
 
        /* Ignore users disabled by shell */
440
 
        if(entry->pw_shell)
441
 
        {
442
 
            for(i = 0; i < hiddenShells.size(); i++)
443
 
                if(entry->pw_shell == hiddenShells.at(i))
444
 
                    break;
445
 
            if(i < hiddenShells.size())
446
 
                continue;
447
 
        }
448
 
 
449
 
        /* Ignore certain users */
450
 
        for(i = 0; i < hiddenUsers.size(); i++)
451
 
            if(entry->pw_name == hiddenUsers.at(i))
452
 
                break;
453
 
        if(i < hiddenUsers.size())
454
 
            continue;
455
 
 
456
 
        tokens = QString(entry->pw_gecos).split(",");
457
 
        if(tokens.size() > 0 && tokens.at(i) != "")
458
 
            realName = tokens.at(i);
459
 
      
460
 
        QDir homeDir(entry->pw_dir);
461
 
        imageFile = new QFile(homeDir.filePath(".face"));
462
 
        if(!imageFile->exists())
463
 
        {
464
 
            delete imageFile;
465
 
            imageFile = new QFile(homeDir.filePath(".face.icon"));
466
 
        }
467
 
        if(imageFile->exists())
468
 
            image = "file://" + imageFile->fileName();
469
 
        delete imageFile;
470
 
 
471
 
        user = new User(entry->pw_name, realName, entry->pw_dir, image, FALSE);
472
 
 
473
 
        /* Update existing users if have them */
474
 
        bool matchedUser = false;
475
 
        foreach(User *info, d->users)
476
 
        {
477
 
            if(info->name() == user->name())
478
 
            {
479
 
                matchedUser = true;
480
 
                if(info->update(user->realName(), user->homeDirectory(), user->image(), user->isLoggedIn()))
481
 
                    changedUsers.append(user);
482
 
                delete user;
483
 
                user = info;
484
 
                break;
485
 
            }
486
 
        }
487
 
        if(!matchedUser)
488
 
        {
489
 
            /* Only notify once we have loaded the user list */
490
 
            if(d->haveUsers)
491
 
                newUsers.append(user);
492
 
        }
493
 
        users.append(user);
494
 
    }
495
 
 
496
 
    if(errno != 0)
497
 
        qDebug() << "Failed to read password database: " << strerror(errno);
498
 
 
499
 
    endpwent();
500
 
 
501
 
    /* Use new user list */
502
 
    oldUsers = d->users;
503
 
    d->users = users;
504
 
 
505
 
    /* Notify of changes */
506
 
    foreach(User *user, newUsers)
507
 
    {
508
 
        qDebug() << "User " << user->name() << " added";
509
 
        emit userAdded(user);
510
 
    }
511
 
 
512
 
    foreach(User *user, changedUsers)
513
 
    {
514
 
        qDebug() << "User " << user->name() << " changed";
515
 
        emit userChanged(user);
516
 
    }
517
 
 
518
 
    foreach(User *user, oldUsers)
519
 
    {
520
 
        /* See if this user is in the current list */
521
 
        bool existing = false;
522
 
        foreach(User *new_user, d->users)
523
 
        {
524
 
            if (new_user == user)
525
 
            {
526
 
                existing = true;
527
 
                break;
528
 
            }
529
 
        }
530
 
 
531
 
        if(!existing)
532
 
        {
533
 
            qDebug() << "User " << user->name() << " removed";
534
 
            emit userRemoved(user);
535
 
            delete user;
536
 
        }
537
 
    }
538
 
}
539
 
 
540
 
void Greeter::updateUsers()
541
 
{
542
 
    if (d->haveUsers) {
543
 
        return;
544
 
    }
545
 
 
546
 
    /** Load users if we need to. */
547
 
    if (d->config->loadUsers()) {
548
 
        loadUsers();
549
 
    }
550
 
 
551
 
    d->haveUsers = true;
552
 
}
553
 
 
554
 
QList<User*> Greeter::users()
555
 
{
556
 
    updateUsers();
557
 
    return d->users;
558
 
}
559
 
 
560
 
SessionsModel* Greeter::sessionsModel() const
561
 
{
562
 
    return d->sessionsModel; 
563
 
}
564
 
 
 
404
Config* Greeter::config() const
 
405
{
 
406
    return d->config;
 
407
}
565
408
 
566
409
bool Greeter::canSuspend() const
567
410
{