00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "password.h"
00021 #include "config.h"
00022 #include "global.h"
00023 #include "backend/contact.h"
00024 #include <qlabel.h>
00025 #include <qlineedit.h>
00026 #include <qtextview.h>
00027 #include <qstring.h>
00028 #include <qapplication.h>
00029 #include <qfile.h>
00030
00031
00032 #include <qdialog.h>
00033
00034 #include <unistd.h>
00035 #include "passwordbase_p.h"
00036
00037 class PasswordDialog : public PasswordBase
00038 {
00039 Q_OBJECT
00040
00041 public:
00042 PasswordDialog( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
00043 ~PasswordDialog();
00044
00045 void clear();
00046 void setPrompt( const QString& );
00047
00048 signals:
00049 void passwordEntered( const QString& );
00050
00051 protected:
00052 bool eventFilter( QObject*, QEvent* );
00053 void keyPressEvent( QKeyEvent * );
00054
00055 private:
00056 void input( QString );
00057 friend class Password;
00058 QString text;
00059 };
00060
00061
00062 extern "C" char *crypt(const char *key, const char *salt);
00063 static QString qcrypt(const QString& k, const char *salt)
00064 {
00065 return QString::fromUtf8(crypt(k.utf8(),salt));
00066 }
00067
00068
00069
00070
00071
00072 PasswordDialog::PasswordDialog( QWidget* parent, const char* name, WFlags fl )
00073 : PasswordBase( parent, name, fl )
00074 {
00075 QRect desk = qApp->desktop()->geometry();
00076
00077 if ( desk.width() < 220 ) {
00078 QFont f( font() );
00079 f.setPointSize( 18 );
00080 setFont( f );
00081 f.setPointSize( 12 );
00082 prompt->setFont( f );
00083 }
00084
00085 button_0->installEventFilter( this );
00086 button_1->installEventFilter( this );
00087 button_2->installEventFilter( this );
00088 button_3->installEventFilter( this );
00089 button_4->installEventFilter( this );
00090 button_5->installEventFilter( this );
00091 button_6->installEventFilter( this );
00092 button_7->installEventFilter( this );
00093 button_8->installEventFilter( this );
00094 button_9->installEventFilter( this );
00095 button_OK->installEventFilter( this );
00096 setFocus();
00097 }
00098
00099
00100
00101
00102 PasswordDialog::~PasswordDialog()
00103 {
00104
00105 }
00106
00107
00108
00113 bool PasswordDialog::eventFilter( QObject*o, QEvent*e )
00114 {
00115 if ( e->type() == QEvent::MouseButtonRelease ) {
00116 if ( o == button_OK ) {
00117 emit passwordEntered( text );
00118 } else {
00119 QLabel *l = (QLabel*)o;
00120 input(l->text());
00121 }
00122 }
00123 return FALSE;
00124 }
00125
00126
00131 void PasswordDialog::keyPressEvent( QKeyEvent * )
00132 {
00133 #if 0
00134 if ( e->key() == Key_Enter || e->key() == Key_Return )
00135 emit passwordEntered( text );
00136 else
00137 input( e->text() );
00138 #endif
00139 }
00140
00141
00146 void PasswordDialog::input( QString c )
00147 {
00148 text += c;
00149 display->setText( text );
00150 }
00151
00156 void PasswordDialog::setPrompt( const QString& s )
00157 {
00158 prompt->setText( s );
00159 }
00160
00161 void PasswordDialog::clear()
00162 {
00163 text = "";
00164 input("");
00165 }
00166
00167 class PasswdDlg : public QDialog
00168 {
00169 public:
00170 PasswdDlg( QWidget *parent, const char * name, bool modal, bool fullscreen = FALSE )
00171 : QDialog( parent, name, modal, fullscreen ? WStyle_NoBorder | WStyle_Customize | WStyle_StaysOnTop : 0 ),
00172 modl(modal)
00173 {
00174 passw = new PasswordDialog( this );
00175
00176 if ( fullscreen ) {
00177 QRect desk = qApp->desktop()->geometry();
00178 setGeometry( 0, 0, desk.width(), desk.height() );
00179 }
00180
00181 connect( passw, SIGNAL(passwordEntered(const QString&)),
00182 this, SLOT(accept()) );
00183 }
00184
00185 void resizeEvent( QResizeEvent * )
00186 {
00187 passw->resize( size() );
00188 }
00189
00190 void reset()
00191 {
00192 passw->clear();
00193 }
00194
00195 void execNonModal()
00196 {
00197 if ( !modl ) {
00198 reset();
00199 showFullScreen();
00200 do {
00201 qApp->enter_loop();
00202 } while (result()!=1);
00203 }
00204 }
00205
00206 void accept()
00207 {
00208 if ( !modl )
00209 qApp->exit_loop();
00210 QDialog::accept();
00211 }
00212
00213 PasswordDialog *passw;
00214 bool modl;
00215 };
00216
00217 class OwnerDlg : public QDialog
00218 {
00219 Q_OBJECT
00220 public:
00221
00222 OwnerDlg( QWidget *parent, const char * name, Contact c,
00223 bool modal, bool fullscreen = FALSE )
00224 : QDialog( parent, name, modal,
00225 fullscreen ?
00226 WStyle_NoBorder | WStyle_Customize | WStyle_StaysOnTop : 0 )
00227 {
00228 if ( fullscreen ) {
00229 QRect desk = qApp->desktop()->geometry();
00230 setGeometry( 0, 0, desk.width(), desk.height() );
00231 }
00232
00233
00234 QString text = "<H1>" + tr("Owner Information") + "</H1>";
00235 text += c.toRichText();
00236 tv = new QTextView(this);
00237 tv->setText(text);
00238
00239 tv->viewport()->installEventFilter(this);
00240 }
00241
00242 void resizeEvent( QResizeEvent * )
00243 {
00244 tv->resize( size() );
00245 }
00246
00247 bool eventFilter(QObject *o, QEvent *e)
00248 {
00249 if (e->type() == QEvent::KeyPress || e->type() == QEvent::MouseButtonPress ) {
00250 accept();
00251 return TRUE;
00252 }
00253 return QWidget::eventFilter(o, e);
00254 }
00255
00256 void mousePressEvent( QMouseEvent * ) { accept(); }
00257
00258 private:
00259 QTextView *tv;
00260 };
00261
00269 QString Password::getPassword( const QString& prompt )
00270 {
00271 PasswdDlg pd(0,0,TRUE);
00272 pd.passw->setPrompt( prompt );
00273
00274 pd.showMaximized();
00275 int r = pd.exec();
00276
00277 if ( r == QDialog::Accepted ) {
00278 if (pd.passw->text.isEmpty())
00279 return "";
00280 else
00281 return qcrypt(pd.passw->text,"a0");
00282 } else {
00283 return QString::null;
00284 }
00285 }
00286
00287
00297 bool Password::needToAuthenticate(bool at_poweron)
00298 {
00299 Config cfg("Security");
00300 cfg.setGroup("Passcode");
00301 QString passcode = cfg.readEntry("passcode");
00302
00303 return ( !passcode.isEmpty()
00304 && (!at_poweron || cfg.readNumEntry("passcode_poweron",0)) );
00305 }
00306
00315 void Password::authenticate(bool at_poweron)
00316 {
00317 Config cfg("Security");
00318 cfg.setGroup("Passcode");
00319 QString passcode = cfg.readEntry("passcode");
00320 if ( !passcode.isEmpty()
00321 && (!at_poweron || cfg.readNumEntry("passcode_poweron",0)) )
00322 {
00323
00324 PasswdDlg pd(0,0,TRUE,TRUE);
00325
00326
00327 OwnerDlg *oi = 0;
00328 QString vfilename = Global::applicationFileName("addressbook",
00329 "businesscard.vcf");
00330 if (QFile::exists(vfilename)) {
00331 Contact c;
00332 c = Contact::readVCard( vfilename )[0];
00333
00334 oi = new OwnerDlg(0, 0, c, TRUE, TRUE);
00335 }
00336
00337 pd.reset();
00338 pd.exec();
00339 while (qcrypt(pd.passw->text, "a0") != passcode) {
00340 if (oi)
00341 oi->exec();
00342 pd.reset();
00343 pd.exec();
00344 }
00345 } else if ( at_poweron ) {
00346
00347
00348
00349
00350
00351 }
00352 }
00353
00354 #include "password.moc"