summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/opie-login/passworddialogimpl.cpp7
1 files changed, 4 insertions, 3 deletions
diff --git a/core/opie-login/passworddialogimpl.cpp b/core/opie-login/passworddialogimpl.cpp
index 951c4e1..852708e 100644
--- a/core/opie-login/passworddialogimpl.cpp
+++ b/core/opie-login/passworddialogimpl.cpp
@@ -86,146 +86,147 @@ PasswordDialogImpl::PasswordDialogImpl( QWidget* parent )
PasswordDialogImpl::~PasswordDialogImpl() {
/* qt does the stuff for us */
}
void PasswordDialogImpl::done(int res) {
m_isSet = true;
/*
* The user hit 'Ok' see if we can safe the file
* if not an error will be raised and m_isSet altered.
* On cancel we will see if it is now ok...
*/
if ( res == Accepted )
writePassword();
else if(PasswordDialogImpl::needDialog() ) {
switch( QMessageBox::warning(this,tr("Trying to leave without password set") ,
tr("<qt>No password was set. This could lead to you not beeing"
"able to remotely connect to your machine."
"Do you want to continue not setting a password?</qt>" ),
QMessageBox::Ok, QMessageBox::Cancel ) ) {
case QMessageBox::Cancel:
m_isSet = false;
break;
case QMessageBox::Ok:
default:
break;
}
}
if(m_isSet)
PasswordDialog::done( res );
}
/*
* Lets see if we can write either shadow
*
*/
/**
* CRYPT the password and then tries to write it either to the shadow password
* or to the plain /etc/passwd
*/
void PasswordDialogImpl::writePassword() {
/*
* Check if both texts are the same
*/
if ( m_pass->text() != m_confirm->text() )
return error( tr("Passwords don't match"),
tr("<qt>The two passwords don't match. Please try again.</qt>") );
/*
* Now crypt the password so we can write it later
*/
char* password = ::crypt( m_pass->text().latin1(), crypt_make_salt() );
if ( !password )
return error( tr("Password not legal" ),
tr("<qt>The entered password is not a valid password."
"Please try entering a valid password.</qt>" ) );
/* rewind and rewrite the password file */
::setpwent();
FILE* file = ::fopen( "/etc/passwd.new", "w" );
struct passwd* pass;
while ( (pass = ::getpwent()) != 0l ) {
/* no shadow password support */
if ( pass->pw_uid == 0 )
pass->pw_passwd = password;
::putpwent( pass, file );
}
::fclose( file );
::endpwent();
::rename("/etc/passwd.new","/etc/passwd" );
/* should be done now */
#ifdef OPIE_LOGIN_SHADOW_PW
#error "Can't write Shadow Passwords fixme"
#endif
}
/**
* Raise an error. Delete input and set the focus after showing
* the error to the user
*/
void PasswordDialogImpl::error( const QString& caption, const QString& text ) {
m_isSet = false;
QMessageBox::critical(this,caption, text,
QMessageBox::Ok, QMessageBox::NoButton );
m_pass->setText("");
m_pass->setFocus();
m_confirm->setText("");
}
void PasswordDialogImpl::slotToggleEcho( bool b ) {
m_pass-> setEchoMode( b ? QLineEdit::Normal : QLineEdit::Password );
m_confirm->setEchoMode( b ? QLineEdit::Normal : QLineEdit::Password );
}
/////////////////////////
/// static functions
///
/**
* Ask whether or not we need to show the dialog. It returns true if
* no root password is set so that the user will be able to set one.
*/
bool PasswordDialogImpl::needDialog() {
/*
* This can cope with no password and shadow passwords
* Let us go through the user database until we find 'root' and then
* see if it is 'shadow' and see if shadow is empty or see if the password is empty
*/
bool need = false;
struct passwd *pwd;
::setpwent();
while((pwd = ::getpwent() ) ) {
/* found root */
if( pwd->pw_uid == 0 ) {
QString str = QString::fromLatin1(pwd->pw_passwd );
/*
- * If str is really empty it is passwordless anyway...
+ * If str is really empty it is passwordless anyway... or '*' is a hint to set one
+ * on OE/Familiar
* else it is shadow based
*/
- if(str.isEmpty() )
+ if(str.isEmpty() || str == '*' )
need = true;
- else if ( str == '*' || str == 'x' )
+ else if ( str == 'x' )
#ifdef OPIE_LOGIN_SHADOW_PW
need = QString::fromLatin1( ::getspnam( pwd->pw_name )->sp_pwdp ).isEmpty();
#else
;
#endif
break;
}
}
::endpwent();
return need;
}