~ubuntu-branches/ubuntu/maverick/kdebase-workspace/maverick-proposed

« back to all changes in this revision

Viewing changes to libs/kdm/kgreet_generic.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Alessandro Ghersi
  • Date: 2010-07-08 01:11:52 UTC
  • mfrom: (1.1.43 upstream)
  • Revision ID: james.westby@ubuntu.com-20100708011152-z0h26httnjr91mmy
Tags: 4:4.4.92-0ubuntu1
* New upstream rc release:
  - Bump kde-sc-dev-latest to 4.4.92
  - Refresh patches
  - Update symbols
  - plasma-widgets-workspace replaces/conflicts plasma-widget-logout

Show diffs side-by-side

added added

removed removed

Lines of Context:
43
43
 
44
44
class KDMPasswordEdit : public KLineEdit {
45
45
public:
46
 
        KDMPasswordEdit( QWidget *parent = 0 ) : KLineEdit( parent )
47
 
        {
48
 
                if (::echoMode == -1)
49
 
                        setPasswordMode( true );
50
 
                else
51
 
                        setEchoMode( ::echoMode ? Password : NoEcho );
52
 
                setContextMenuPolicy( Qt::NoContextMenu );
53
 
        }
 
46
    KDMPasswordEdit(QWidget *parent = 0) : KLineEdit(parent)
 
47
    {
 
48
        if (::echoMode == -1)
 
49
            setPasswordMode(true);
 
50
        else
 
51
            setEchoMode(::echoMode ? Password : NoEcho);
 
52
        setContextMenuPolicy(Qt::NoContextMenu);
 
53
    }
54
54
};
55
55
 
56
 
KGenericGreeter::KGenericGreeter( KGreeterPluginHandler *_handler,
57
 
                                  QWidget *parent,
58
 
                                  const QString &_fixedEntity,
59
 
                                  Function _func, Context _ctx ) :
60
 
        QObject(),
61
 
        KGreeterPlugin( _handler ),
62
 
        m_lineEdit( 0 ),
63
 
        fixedUser( _fixedEntity ),
64
 
        func( _func ),
65
 
        ctx( _ctx ),
66
 
        exp( -1 ),
67
 
        running( false )
 
56
KGenericGreeter::KGenericGreeter(KGreeterPluginHandler *_handler,
 
57
                                 QWidget *parent,
 
58
                                 const QString &_fixedEntity,
 
59
                                 Function _func, Context _ctx) :
 
60
    QObject(),
 
61
    KGreeterPlugin(_handler),
 
62
    m_lineEdit(0),
 
63
    fixedUser(_fixedEntity),
 
64
    func(_func),
 
65
    ctx(_ctx),
 
66
    exp(-1),
 
67
    running(false)
68
68
{
69
 
        m_parentWidget = new QWidget( parent );
70
 
        m_parentWidget->setObjectName( "talker" );
71
 
        // XXX set some minimal size
72
 
        widgetList << m_parentWidget;
73
 
        m_grid = new QGridLayout( m_parentWidget );
74
 
        m_grid->setMargin( 0 );
 
69
    m_parentWidget = new QWidget(parent);
 
70
    m_parentWidget->setObjectName("talker");
 
71
    // XXX set some minimal size
 
72
    widgetList << m_parentWidget;
 
73
    m_grid = new QGridLayout(m_parentWidget);
 
74
    m_grid->setMargin(0);
75
75
 
76
 
        if (ctx == ExUnlock || ctx == ExChangeTok)
77
 
                fixedUser = KUser().loginName();
 
76
    if (ctx == ExUnlock || ctx == ExChangeTok)
 
77
        fixedUser = KUser().loginName();
78
78
}
79
79
 
80
80
// virtual
81
81
KGenericGreeter::~KGenericGreeter()
82
82
{
83
 
        abort();
84
 
        delete m_parentWidget;
85
 
}
86
 
 
87
 
void // virtual
88
 
KGenericGreeter::loadUsers( const QStringList &users )
89
 
{
90
 
        m_users = users;
91
 
}
92
 
 
93
 
void // virtual
94
 
KGenericGreeter::presetEntity( const QString &entity, int /* field */ )
95
 
{
96
 
        // assert( !running );
97
 
        curUser = entity;
 
83
    abort();
 
84
    delete m_parentWidget;
 
85
}
 
86
 
 
87
void // virtual
 
88
KGenericGreeter::loadUsers(const QStringList &users)
 
89
{
 
90
    m_users = users;
 
91
}
 
92
 
 
93
void // virtual
 
94
KGenericGreeter::presetEntity(const QString &entity, int /* field */)
 
95
{
 
96
    // assert(!running);
 
97
    curUser = entity;
98
98
}
99
99
 
100
100
QString // virtual
101
101
KGenericGreeter::getEntity() const
102
102
{
103
 
        return fixedUser.isEmpty() ? curUser : fixedUser;
104
 
}
105
 
 
106
 
void // virtual
107
 
KGenericGreeter::setUser( const QString &user )
108
 
{
109
 
        // assert( running );
110
 
        // assert( fixedUser.isEmpty() );
111
 
        if (!(kgreeterplugin_info.flags & KGreeterPluginInfo::Presettable))
112
 
                return; // Not interested in PAM telling us who logged in
113
 
        if (exp) {
114
 
                abort();
115
 
                start();
116
 
        }
117
 
        curUser = user;
118
 
        if (m_lineEdit) { // could be null if plugin is misconfigured
119
 
                m_lineEdit->setText( user );
120
 
                m_lineEdit->selectAll();
121
 
                m_lineEdit->setFocus();
122
 
        }
123
 
}
124
 
 
125
 
void // virtual
126
 
KGenericGreeter::setEnabled( bool enable )
127
 
{
128
 
        // assert( func == Authenticate && ctx == Shutdown );
129
 
        // XXX this is likely to bear some bogosity
130
 
        foreach (QWidget *w, m_children)
131
 
                w->setEnabled( enable );
132
 
        if (enable && m_lineEdit)
133
 
                m_lineEdit->setFocus();
134
 
}
135
 
 
136
 
bool // virtual
137
 
KGenericGreeter::textMessage( const char *text, bool err )
138
 
{
139
 
        if (err)
140
 
                return false;
141
 
 
142
 
        if (m_infoMsgs.isEmpty())
143
 
                revive();
144
 
        QString qtext = QString::fromUtf8( text );
145
 
        m_infoMsgs.append( qtext );
146
 
        QLabel *label = new QLabel( qtext, m_parentWidget );
147
 
        m_grid->addWidget( label, m_line++, 0, 1, 2 );
148
 
        m_children.append( label );
149
 
 
150
 
        return true;
151
 
}
152
 
 
153
 
void // virtual
154
 
KGenericGreeter::textPrompt( const char *prompt, bool echo, bool /* nonBlocking */ )
155
 
{
156
 
        exp =
157
 
                exp >= 0 ||
158
 
                func != Authenticate ||
159
 
                !(kgreeterplugin_info.flags & KGreeterPluginInfo::Presettable);
160
 
 
161
 
        if (!exp && !fixedUser.isEmpty()) {
162
 
                handler->gplugReturnText( fixedUser.toLocal8Bit(),
163
 
                                          KGreeterPluginHandler::IsUser );
164
 
                return;
165
 
        }
166
 
 
167
 
        if (m_infoMsgs.isEmpty())
168
 
                revive();
169
 
        else
170
 
                m_infoMsgs.clear();
171
 
 
172
 
        QLabel *label = new QLabel( QString::fromUtf8( prompt ).trimmed() );
173
 
        m_grid->addWidget( label, m_line, 0 );
174
 
        m_children.append( label );
175
 
        m_echo = echo;
176
 
        if (echo) {
177
 
                m_lineEdit = new KLineEdit;
178
 
                m_lineEdit->setContextMenuPolicy( Qt::NoContextMenu );
179
 
                if (!exp) {
180
 
                        if (!m_users.isEmpty()) {
181
 
                                KCompletion *userNamesCompletion = new KCompletion;
182
 
                                userNamesCompletion->setItems( m_users );
183
 
                                m_lineEdit->setCompletionObject( userNamesCompletion );
184
 
                                m_lineEdit->setAutoDeleteCompletionObject( true );
185
 
                                m_lineEdit->setCompletionMode( KGlobalSettings::CompletionAuto );
186
 
                        }
187
 
                        if (!curUser.isEmpty()) {
188
 
                                m_lineEdit->setText( curUser );
189
 
                                m_lineEdit->selectAll();
190
 
                                connect( m_lineEdit, SIGNAL(selectionChanged()), SLOT(slotChanged()) );
191
 
                        }
192
 
                        connect( m_lineEdit, SIGNAL(editingFinished()), SLOT(slotLoginLostFocus()) );
193
 
                }
194
 
                connect( m_lineEdit, SIGNAL(editingFinished()), SLOT(slotChanged()) );
195
 
                connect( m_lineEdit, SIGNAL(textChanged( const QString & )), SLOT(slotChanged()) );
196
 
        } else {
197
 
                m_lineEdit = new KDMPasswordEdit;
198
 
        }
199
 
        m_lineEdit->setMinimumWidth(
200
 
                m_lineEdit->fontMetrics().width( "This is a long password" ) );
201
 
        m_grid->addWidget( m_lineEdit, m_line, 1 );
202
 
        m_children.append( m_lineEdit );
203
 
        m_lineEdit->show();
204
 
        m_lineEdit->setFocus();
205
 
}
206
 
 
207
 
bool // virtual
208
 
KGenericGreeter::binaryPrompt( const char *, bool )
209
 
{
210
 
        // FIXME
211
 
        return true;
 
103
    return fixedUser.isEmpty() ? curUser : fixedUser;
 
104
}
 
105
 
 
106
void // virtual
 
107
KGenericGreeter::setUser(const QString &user)
 
108
{
 
109
    // assert(running);
 
110
    // assert(fixedUser.isEmpty());
 
111
    if (!(kgreeterplugin_info.flags & KGreeterPluginInfo::Presettable))
 
112
        return; // Not interested in PAM telling us who logged in
 
113
    if (exp) {
 
114
        abort();
 
115
        start();
 
116
    }
 
117
    curUser = user;
 
118
    if (m_lineEdit) { // could be null if plugin is misconfigured
 
119
        m_lineEdit->setText(user);
 
120
        m_lineEdit->selectAll();
 
121
        m_lineEdit->setFocus();
 
122
    }
 
123
}
 
124
 
 
125
void // virtual
 
126
KGenericGreeter::setEnabled(bool enable)
 
127
{
 
128
    // assert(func == Authenticate && ctx == Shutdown);
 
129
    // XXX this is likely to bear some bogosity
 
130
    foreach (QWidget *w, m_children)
 
131
        w->setEnabled(enable);
 
132
    if (enable && m_lineEdit)
 
133
        m_lineEdit->setFocus();
 
134
}
 
135
 
 
136
bool // virtual
 
137
KGenericGreeter::textMessage(const char *text, bool err)
 
138
{
 
139
    if (err)
 
140
        return false;
 
141
 
 
142
    if (m_infoMsgs.isEmpty())
 
143
        revive();
 
144
    QString qtext = QString::fromUtf8(text);
 
145
    m_infoMsgs.append(qtext);
 
146
    QLabel *label = new QLabel(qtext, m_parentWidget);
 
147
    m_grid->addWidget(label, m_line++, 0, 1, 2);
 
148
    m_children.append(label);
 
149
 
 
150
    return true;
 
151
}
 
152
 
 
153
void // virtual
 
154
KGenericGreeter::textPrompt(const char *prompt, bool echo, bool /* nonBlocking */)
 
155
{
 
156
    exp =
 
157
        exp >= 0 ||
 
158
        func != Authenticate ||
 
159
        !(kgreeterplugin_info.flags & KGreeterPluginInfo::Presettable);
 
160
 
 
161
    if (!exp && !fixedUser.isEmpty()) {
 
162
        handler->gplugReturnText(fixedUser.toLocal8Bit(),
 
163
                                 KGreeterPluginHandler::IsUser);
 
164
        return;
 
165
    }
 
166
 
 
167
    if (m_infoMsgs.isEmpty())
 
168
        revive();
 
169
    else
 
170
        m_infoMsgs.clear();
 
171
 
 
172
    QLabel *label = new QLabel(QString::fromUtf8(prompt).trimmed());
 
173
    m_grid->addWidget(label, m_line, 0);
 
174
    m_children.append(label);
 
175
    m_echo = echo;
 
176
    if (echo) {
 
177
        m_lineEdit = new KLineEdit;
 
178
        m_lineEdit->setContextMenuPolicy(Qt::NoContextMenu);
 
179
        if (!exp) {
 
180
            if (!m_users.isEmpty()) {
 
181
                KCompletion *userNamesCompletion = new KCompletion;
 
182
                userNamesCompletion->setItems(m_users);
 
183
                m_lineEdit->setCompletionObject(userNamesCompletion);
 
184
                m_lineEdit->setAutoDeleteCompletionObject(true);
 
185
                m_lineEdit->setCompletionMode(KGlobalSettings::CompletionAuto);
 
186
            }
 
187
            if (!curUser.isEmpty()) {
 
188
                m_lineEdit->setText(curUser);
 
189
                m_lineEdit->selectAll();
 
190
                connect(m_lineEdit, SIGNAL(selectionChanged()), SLOT(slotChanged()));
 
191
            }
 
192
            connect(m_lineEdit, SIGNAL(editingFinished()), SLOT(slotLoginLostFocus()));
 
193
        }
 
194
        connect(m_lineEdit, SIGNAL(editingFinished()), SLOT(slotChanged()));
 
195
        connect(m_lineEdit, SIGNAL(textChanged(const QString &)), SLOT(slotChanged()));
 
196
    } else {
 
197
        m_lineEdit = new KDMPasswordEdit;
 
198
    }
 
199
    m_lineEdit->setMinimumWidth(
 
200
        m_lineEdit->fontMetrics().width("This is a long password"));
 
201
    m_grid->addWidget(m_lineEdit, m_line, 1);
 
202
    m_children.append(m_lineEdit);
 
203
    m_lineEdit->show();
 
204
    m_lineEdit->setFocus();
 
205
}
 
206
 
 
207
bool // virtual
 
208
KGenericGreeter::binaryPrompt(const char *, bool)
 
209
{
 
210
    // FIXME
 
211
    return true;
212
212
}
213
213
 
214
214
void // virtual
215
215
KGenericGreeter::start()
216
216
{
217
 
        exp = -1;
218
 
        running = true;
219
 
        handler->gplugStart();
 
217
    exp = -1;
 
218
    running = true;
 
219
    handler->gplugStart();
220
220
}
221
221
 
222
222
void // virtual
232
232
void // virtual
233
233
KGenericGreeter::next()
234
234
{
235
 
        if (m_lineEdit) {
236
 
                m_lineEdit->setEnabled( false );
237
 
                QString text = m_lineEdit->text();
238
 
                m_lineEdit = 0;
239
 
                handler->gplugReturnText( text.toLocal8Bit(),
240
 
                                          !m_echo ?
241
 
                                             KGreeterPluginHandler::IsSecret :
242
 
                                             !exp ?
243
 
                                                KGreeterPluginHandler::IsUser : 0 );
244
 
        }
 
235
    if (m_lineEdit) {
 
236
        m_lineEdit->setEnabled(false);
 
237
        QString text = m_lineEdit->text();
 
238
        m_lineEdit = 0;
 
239
        handler->gplugReturnText(text.toLocal8Bit(),
 
240
                                 !m_echo ?
 
241
                                     KGreeterPluginHandler::IsSecret :
 
242
                                     !exp ?
 
243
                                         KGreeterPluginHandler::IsUser : 0);
 
244
    }
245
245
}
246
246
 
247
247
void // virtual
248
248
KGenericGreeter::abort()
249
249
{
250
 
        running = false;
251
 
        if (exp >= 0) {
252
 
                exp = -1;
253
 
                handler->gplugReturnText( 0, 0 );
254
 
        }
 
250
    running = false;
 
251
    if (exp >= 0) {
 
252
        exp = -1;
 
253
        handler->gplugReturnText(0, 0);
 
254
    }
255
255
}
256
256
 
257
257
void // virtual
258
258
KGenericGreeter::succeeded()
259
259
{
260
 
        failed(); // redefining terms :-D
 
260
    failed(); // redefining terms :-D
261
261
}
262
262
 
263
263
void // virtual
264
264
KGenericGreeter::failed()
265
265
{
266
 
        // assert( running || timed_login );
267
 
        if (!m_infoMsgs.isEmpty()) {
268
 
                QString text = "<qt>";
269
 
                foreach (const QString &msg, m_infoMsgs)
270
 
                        text += "<p>" + Qt::escape( msg ) + "</p>";
271
 
                text += "</qt>";
272
 
                revive();
273
 
                handler->gplugMsgBox( QMessageBox::Information, text );
274
 
        } else {
275
 
                foreach (QWidget *w, m_children)
276
 
                        w->setEnabled( false );
277
 
        }
278
 
        exp = -1;
279
 
        running = false;
 
266
    // assert(running || timed_login);
 
267
    if (!m_infoMsgs.isEmpty()) {
 
268
        QString text = "<qt>";
 
269
        foreach (const QString &msg, m_infoMsgs)
 
270
            text += "<p>" + Qt::escape(msg) + "</p>";
 
271
        text += "</qt>";
 
272
        revive();
 
273
        handler->gplugMsgBox(QMessageBox::Information, text);
 
274
    } else {
 
275
        foreach (QWidget *w, m_children)
 
276
            w->setEnabled(false);
 
277
    }
 
278
    exp = -1;
 
279
    running = false;
280
280
}
281
281
 
282
282
void // virtual
283
283
KGenericGreeter::revive()
284
284
{
285
 
        // assert( !running );
286
 
        foreach (QWidget *w, m_children)
287
 
                w->deleteLater();
288
 
        m_children.clear();
289
 
        m_infoMsgs.clear();
290
 
        m_lineEdit = 0;
291
 
        m_line = 0;
 
285
    // assert(!running);
 
286
    foreach (QWidget *w, m_children)
 
287
        w->deleteLater();
 
288
    m_children.clear();
 
289
    m_infoMsgs.clear();
 
290
    m_lineEdit = 0;
 
291
    m_line = 0;
292
292
}
293
293
 
294
294
void // virtual
295
295
KGenericGreeter::clear()
296
296
{
297
 
        // assert( !running && !passwd1Edit );
298
 
        revive();
299
 
        curUser = QString::null;
 
297
    // assert(!running && !passwd1Edit);
 
298
    revive();
 
299
    curUser = QString::null;
300
300
}
301
301
 
302
302
 
304
304
void
305
305
KGenericGreeter::slotLoginLostFocus()
306
306
{
307
 
        m_lineEdit->setText( m_lineEdit->text().trimmed() );
308
 
        if (curUser != m_lineEdit->text()) {
309
 
                curUser = m_lineEdit->text();
310
 
                handler->gplugSetUser( curUser );
311
 
        }
 
307
    m_lineEdit->setText(m_lineEdit->text().trimmed());
 
308
    if (curUser != m_lineEdit->text()) {
 
309
        curUser = m_lineEdit->text();
 
310
        handler->gplugSetUser(curUser);
 
311
    }
312
312
}
313
313
 
314
314
void
315
315
KGenericGreeter::slotChanged()
316
316
{
317
 
        handler->gplugChanged();
 
317
    handler->gplugChanged();
318
318
}
319
319
 
320
320
// factory
321
 
static bool init( const QString &,
322
 
                  QVariant (*getConf)( void *, const char *, const QVariant & ),
323
 
                  void *ctx )
 
321
static bool init(const QString &,
 
322
                 QVariant(*getConf)(void *, const char *, const QVariant &),
 
323
                 void *ctx)
324
324
{
325
 
        echoMode = getConf( ctx, "EchoMode", QVariant( -1 ) ).toInt();
326
 
        // Fielded entities are not supported per se.
327
 
        // This implies that the first field is the presettable entity, if any.
328
 
        if (getConf( ctx, "generic.Presettable", QVariant( false ) ).toBool())
329
 
                kgreeterplugin_info.flags |= KGreeterPluginInfo::Presettable;
330
 
        KGlobal::locale()->insertCatalog( "kgreet_generic" );
331
 
        return true;
 
325
    echoMode = getConf(ctx, "EchoMode", QVariant(-1)).toInt();
 
326
    // Fielded entities are not supported per se.
 
327
    // This implies that the first field is the presettable entity, if any.
 
328
    if (getConf(ctx, "generic.Presettable", QVariant(false)).toBool())
 
329
        kgreeterplugin_info.flags |= KGreeterPluginInfo::Presettable;
 
330
    KGlobal::locale()->insertCatalog("kgreet_generic");
 
331
    return true;
332
332
}
333
333
 
334
 
static void done( void )
 
334
static void done(void)
335
335
{
336
 
        KGlobal::locale()->removeCatalog( "kgreet_generic" );
 
336
    KGlobal::locale()->removeCatalog("kgreet_generic");
337
337
}
338
338
 
339
339
static KGreeterPlugin *
340
 
create( KGreeterPluginHandler *handler,
341
 
        QWidget *parent,
342
 
        const QString &fixedEntity,
343
 
        KGreeterPlugin::Function func,
344
 
        KGreeterPlugin::Context ctx )
 
340
create(KGreeterPluginHandler *handler,
 
341
       QWidget *parent,
 
342
       const QString &fixedEntity,
 
343
       KGreeterPlugin::Function func,
 
344
       KGreeterPlugin::Context ctx)
345
345
{
346
 
        return new KGenericGreeter( handler, parent, fixedEntity, func, ctx );
 
346
    return new KGenericGreeter(handler, parent, fixedEntity, func, ctx);
347
347
}
348
348
 
349
349
KDE_EXPORT KGreeterPluginInfo kgreeterplugin_info = {
350
 
        I18N_NOOP2("@item:inmenu authentication method", "Generic"), "generic",
351
 
        KGreeterPluginInfo::Local,
352
 
        init, done, create
 
350
    I18N_NOOP2("@item:inmenu authentication method", "Generic"), "generic",
 
351
    KGreeterPluginInfo::Local,
 
352
    init, done, create
353
353
};
354
354
 
355
355
#include "kgreet_generic.moc"