summaryrefslogtreecommitdiffstats
path: root/kdepasswd
diff options
context:
space:
mode:
Diffstat (limited to 'kdepasswd')
-rw-r--r--kdepasswd/LICENSE.readme124
-rw-r--r--kdepasswd/Makefile.am17
-rw-r--r--kdepasswd/README3
-rw-r--r--kdepasswd/kcm/Makefile.am20
-rw-r--r--kdepasswd/kcm/README27
-rw-r--r--kdepasswd/kcm/chfacedlg.cpp188
-rw-r--r--kdepasswd/kcm/chfacedlg.h69
-rw-r--r--kdepasswd/kcm/chfnprocess.cpp100
-rw-r--r--kdepasswd/kcm/chfnprocess.h33
-rw-r--r--kdepasswd/kcm/kcm_useraccount.desktop203
-rw-r--r--kdepasswd/kcm/kcm_useraccount.kcfg44
-rw-r--r--kdepasswd/kcm/kcm_useraccount_pass.kcfg21
-rw-r--r--kdepasswd/kcm/main.cpp344
-rw-r--r--kdepasswd/kcm/main.h79
-rw-r--r--kdepasswd/kcm/main_widget.ui294
-rw-r--r--kdepasswd/kcm/pass.kcfgc5
-rw-r--r--kdepasswd/kcm/pics/Apple.pngbin0 -> 3749 bytes
-rw-r--r--kdepasswd/kcm/pics/BeachBall.pngbin0 -> 4104 bytes
-rw-r--r--kdepasswd/kcm/pics/Blowfish.pngbin0 -> 5031 bytes
-rw-r--r--kdepasswd/kcm/pics/Bug.pngbin0 -> 4304 bytes
-rw-r--r--kdepasswd/kcm/pics/Butterfly.pngbin0 -> 4952 bytes
-rw-r--r--kdepasswd/kcm/pics/CREDITS21
-rw-r--r--kdepasswd/kcm/pics/Car.pngbin0 -> 4602 bytes
-rw-r--r--kdepasswd/kcm/pics/Cow.pngbin0 -> 6275 bytes
-rw-r--r--kdepasswd/kcm/pics/Daemon.pngbin0 -> 5642 bytes
-rw-r--r--kdepasswd/kcm/pics/Dog.pngbin0 -> 5637 bytes
-rw-r--r--kdepasswd/kcm/pics/Elephant.pngbin0 -> 6384 bytes
-rw-r--r--kdepasswd/kcm/pics/Flower.pngbin0 -> 4423 bytes
-rw-r--r--kdepasswd/kcm/pics/Frog.pngbin0 -> 4511 bytes
-rw-r--r--kdepasswd/kcm/pics/Ghost.pngbin0 -> 4752 bytes
-rw-r--r--kdepasswd/kcm/pics/Guitar.pngbin0 -> 4622 bytes
-rw-r--r--kdepasswd/kcm/pics/Heart.pngbin0 -> 3778 bytes
-rw-r--r--kdepasswd/kcm/pics/Konqui.pngbin0 -> 5652 bytes
-rw-r--r--kdepasswd/kcm/pics/Lion.pngbin0 -> 7820 bytes
-rw-r--r--kdepasswd/kcm/pics/Makefile.am10
-rw-r--r--kdepasswd/kcm/pics/Monkey.pngbin0 -> 5479 bytes
-rw-r--r--kdepasswd/kcm/pics/Penguin.pngbin0 -> 4829 bytes
-rw-r--r--kdepasswd/kcm/pics/Pig.pngbin0 -> 6057 bytes
-rw-r--r--kdepasswd/kcm/pics/Rabbit.pngbin0 -> 4834 bytes
-rw-r--r--kdepasswd/kcm/pics/Ring.pngbin0 -> 5143 bytes
-rw-r--r--kdepasswd/kcm/pics/Scream.pngbin0 -> 5543 bytes
-rw-r--r--kdepasswd/kcm/pics/Shark.pngbin0 -> 4224 bytes
-rw-r--r--kdepasswd/kcm/pics/Splash.pngbin0 -> 4847 bytes
-rw-r--r--kdepasswd/kcm/pics/Star.pngbin0 -> 2991 bytes
-rw-r--r--kdepasswd/kcm/pics/Teddybear.pngbin0 -> 5580 bytes
-rw-r--r--kdepasswd/kcm/pics/Turtle.pngbin0 -> 5208 bytes
-rw-r--r--kdepasswd/kcm/settings.kcfgc5
-rw-r--r--kdepasswd/kdepasswd.cpp79
-rw-r--r--kdepasswd/kdepasswd.desktop80
-rw-r--r--kdepasswd/passwd.cpp284
-rw-r--r--kdepasswd/passwd.h43
-rw-r--r--kdepasswd/passwddlg.cpp169
-rw-r--r--kdepasswd/passwddlg.h49
53 files changed, 2311 insertions, 0 deletions
diff --git a/kdepasswd/LICENSE.readme b/kdepasswd/LICENSE.readme
new file mode 100644
index 000000000..23b7877d0
--- /dev/null
+++ b/kdepasswd/LICENSE.readme
@@ -0,0 +1,124 @@
+kdepasswd - a KDE front end to passwd
+
+Copyright (c) 1999,2000 by Geert Jansen <jansen@kde.org>
+
+ The "Artistic License"
+
+ Preamble
+
+ The intent of this document is to state the conditions under which a
+ Package may be copied, such that the Copyright Holder maintains some
+ semblance of artistic control over the development of the package,
+ while giving the users of the package the right to use and
+ distribute the Package in a more-or-less customary fashion, plus the
+ right to make reasonable modifications.
+
+ Definitions:
+
+ * "Package" refers to the collection of files distributed by the
+ Copyright Holder, and derivatives of that collection of files
+ created through textual modification.
+
+ * "Standard Version" refers to such a Package if it has not been
+ modified, or has been modified in accordance with the wishes of
+ the Copyright Holder.
+
+ * "Copyright Holder" is whoever is named in the copyright or
+ copyrights for the package.
+
+ * "You" is you, if you're thinking about copying or distributing
+ this Package.
+
+ * "Reasonable copying fee" is whatever you can justify on the
+ basis of media cost, duplication charges, time of people
+ involved, and so on. (You will not be required to justify it to
+ the Copyright Holder, but only to the computing community at
+ large as a market that must bear the fee.)
+
+ * "Freely Available" means that no fee is charged for the item
+ itself, though there may be fees involved in handling the item.
+ It also means that recipients of the item may redistribute it
+ under the same conditions they received it.
+
+ 1. You may make and give away verbatim copies of the source form of
+ the Standard Version of this Package without restriction, provided
+ that you duplicate all of the original copyright notices and
+ associated disclaimers.
+
+ 2. You may apply bug fixes, portability fixes and other
+ modifications derived from the Public Domain or from the Copyright
+ Holder. A Package modified in such a way shall still be considered
+ the Standard Version.
+
+ 3. You may otherwise modify your copy of this Package in any way,
+ provided that you insert a prominent notice in each changed file
+ stating how and when you changed that file, and provided that you do
+ at least ONE of the following:
+
+ a) place your modifications in the Public Domain or
+ otherwise make them Freely Available, such as by posting
+ said modifications to Usenet or an equivalent medium, or
+ placing the modifications on a major archive site such as
+ ftp.uu.net, or by allowing the Copyright Holder to include
+ your modifications in the Standard Version of the Package.
+
+ b) use the modified Package only within your corporation
+ or organization.
+
+ c) rename any non-standard executables so the names do not
+ conflict with standard executables, which must also be
+ provided, and provide a separate manual page for each
+ non-standard executable that clearly documents how it
+ differs from the Standard Version.
+
+ d) make other distribution arrangements with the Copyright
+ Holder.
+
+ 4. You may distribute the programs of this Package in object code or
+ executable form, provided that you do at least ONE of the following:
+
+ a) distribute a Standard Version of the executables and
+ library files, together with instructions (in the manual
+ page or equivalent) on where to get the Standard Version.
+
+ b) accompany the distribution with the machine-readable
+ source of the Package with your modifications.
+
+ c) accompany any non-standard executables with their
+ corresponding Standard Version executables, giving the
+ non-standard executables non-standard names, and clearly
+ documenting the differences in manual pages (or
+ equivalent), together with instructions on where to get
+ the Standard Version.
+
+ d) make other distribution arrangements with the Copyright
+ Holder.
+
+ 5. You may charge a reasonable copying fee for any distribution of
+ this Package. You may charge any fee you choose for support of this
+ Package. You may not charge a fee for this Package itself. However,
+ you may distribute this Package in aggregate with other (possibly
+ commercial) programs as part of a larger (possibly commercial)
+ software distribution provided that you do not advertise this
+ Package as a product of your own.
+
+ 6. The scripts and library files supplied as input to or produced as
+ output from the programs of this Package do not automatically fall
+ under the copyright of this Package, but belong to whomever
+ generated them, and may be sold commercially, and may be aggregated
+ with this Package.
+
+ 7. C or perl subroutines supplied by you and linked into this
+ Package shall not be considered part of this Package.
+
+ 8. The name of the Copyright Holder may not be used to endorse or
+ promote products derived from this software without specific prior
+ written permission.
+
+ 9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+ The End
+
+
diff --git a/kdepasswd/Makefile.am b/kdepasswd/Makefile.am
new file mode 100644
index 000000000..6653bbc27
--- /dev/null
+++ b/kdepasswd/Makefile.am
@@ -0,0 +1,17 @@
+
+SUBDIRS = kcm
+
+bin_PROGRAMS = kdepasswd
+kdepasswd_SOURCES = kdepasswd.cpp passwd.cpp passwddlg.cpp
+kdepasswd_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+kdepasswd_LDADD = $(LIB_KIO)
+
+METASOURCES = AUTO
+AM_CPPFLAGS= -I$(top_srcdir)/libkonq $(all_includes)
+noinst_HEADERS = passwd.h passwddlg.h
+
+xdg_apps_DATA = kdepasswd.desktop
+
+messages:
+ $(XGETTEXT) $(kdepasswd_SOURCES) -o $(podir)/kdepasswd.pot
+
diff --git a/kdepasswd/README b/kdepasswd/README
new file mode 100644
index 000000000..50bbe54fd
--- /dev/null
+++ b/kdepasswd/README
@@ -0,0 +1,3 @@
+kdepasswd: A KDE front end to the Unix passwd command.
+
+Please report bugs to Geert Jansen <jansen@kde.org>
diff --git a/kdepasswd/kcm/Makefile.am b/kdepasswd/kcm/Makefile.am
new file mode 100644
index 000000000..fee3b3cd2
--- /dev/null
+++ b/kdepasswd/kcm/Makefile.am
@@ -0,0 +1,20 @@
+SUBDIRS = pics
+kde_module_LTLIBRARIES = kcm_useraccount.la
+kcm_useraccount_la_SOURCES = main_widget.ui chfnprocess.cpp \
+ main.cpp chfacedlg.cpp settings.kcfgc pass.kcfgc
+kcm_useraccount_la_LDFLAGS = $(all_libraries) -module -avoid-version -no-undefined
+kcm_useraccount_la_LIBADD = $(top_builddir)/libkonq/libkonq.la
+
+AM_CPPFLAGS = -I$(top_srcdir)/libkonq $(all_includes)
+
+kde_kcfg_DATA = kcm_useraccount.kcfg kcm_useraccount_pass.kcfg
+
+METASOURCES = AUTO
+
+noinst_HEADERS = main.h chfnprocess.h chfacedlg.h
+
+xdg_apps_DATA = kcm_useraccount.desktop
+
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/useraccount.pot
diff --git a/kdepasswd/kcm/README b/kdepasswd/kcm/README
new file mode 100644
index 000000000..563ce7e53
--- /dev/null
+++ b/kdepasswd/kcm/README
@@ -0,0 +1,27 @@
+
+Thu Jan 29 00:34:49 CET 2004
+Frans Englich <frans.englich@telia.com>
+
+KCM useraccount is a merge of the former kdebase/kcontrol/email
+and kdeutils/kdepasswd/userinfo/. They existed in KDE 3.1, at least.
+
+As a bonus, on top of saving the stuff with KEMailSettings it tries
+also to save the realname to /etc/passwd. This is done via chfn, wrapped
+in ChfnProcess, chfnprocess.h - which is the place to ifdef/modify so
+other systems/ychfn/whatever works.
+/etc/passwd is not the primary goal, the focus is on KDE's settings. The KCM
+tries to hide the implementation differences and play nice with the
+user - keep that in mind.
+
+The "face" term is rather scary.. For example I don't think the user immediately
+associate to the login image when a phrase such as this is thrown in the face:
+"Your administrator has disallowed changing your face". Keep it in mind..
+
+Some information which was available in userinfo is left out - the home
+folder and shell info. A typical user is not interested in the info nor
+knows what it means. And the advanced users already knows it.
+
+If further information is added, think twice if it should not be
+added in a "Details..." dialog - is it useful for the majority or not?
+The SMTP setting as well as UID should be moved to that dialog too, IMO.
+
diff --git a/kdepasswd/kcm/chfacedlg.cpp b/kdepasswd/kcm/chfacedlg.cpp
new file mode 100644
index 000000000..1894ac814
--- /dev/null
+++ b/kdepasswd/kcm/chfacedlg.cpp
@@ -0,0 +1,188 @@
+/**
+ * Copyright 2003 Braden MacDonald <bradenm_k@shaw.ca>
+ * Copyright 2003 Ravikiran Rajagopal <ravi@ee.eng.ohio-state.edu>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ *
+ *
+ * Please see the README
+ *
+ */
+
+/**
+ * @file UserInfo's Dialog for changing your face.
+ * @author Braden MacDonald
+ */
+
+#include <qstring.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qpixmap.h>
+#include <qimage.h>
+#include <qpushbutton.h>
+#include <qdir.h>
+#include <qcheckbox.h>
+
+#include <kdialogbase.h>
+#include <klocale.h>
+#include <kfiledialog.h>
+#include <kiconview.h>
+#include <kimagefilepreview.h>
+#include <kimageio.h>
+#include <kmessagebox.h>
+#include <konq_operations.h>
+#include <kurl.h>
+
+#include "chfacedlg.h"
+#include "settings.h" // KConfigXT
+
+
+
+/**
+ * TODO: It would be nice if the widget were in a .ui
+ */
+ChFaceDlg::ChFaceDlg(const QString& picsdir, QWidget *parent, const char *name, bool modal)
+ : KDialogBase( parent, name, modal, i18n("Change your Face"), Ok|Cancel, Ok, true )
+{
+ QWidget *page = new QWidget(this);
+ setMainWidget( page );
+
+ QVBoxLayout *top = new QVBoxLayout(page, 0, spacingHint());
+
+ QLabel *header = new QLabel( i18n("Select a new face:"), page );
+ top->addWidget( header );
+
+ m_FacesWidget = new KIconView( page );
+ m_FacesWidget->setSelectionMode( QIconView::Single );
+ m_FacesWidget->setItemsMovable( false );
+ m_FacesWidget->setMinimumSize( 400, 200 );
+
+ connect( m_FacesWidget, SIGNAL( selectionChanged( QIconViewItem * ) ), SLOT( slotFaceWidgetSelectionChanged( QIconViewItem * ) ) );
+
+ connect( m_FacesWidget, SIGNAL( doubleClicked( QIconViewItem *, const QPoint & ) ), SLOT( slotOk() ) );
+
+ top->addWidget( m_FacesWidget );
+
+ // Buttons to get more pics
+ QHBoxLayout * morePics = new QHBoxLayout( 0, 0, spacingHint() );
+ QPushButton *browseBtn = new QPushButton( i18n("Custom &Image..."), page );
+ connect( browseBtn, SIGNAL( clicked() ), SLOT( slotGetCustomImage() ) );
+ morePics->addWidget( browseBtn );
+#if 0
+ QPushButton *acquireBtn = new QPushButton( i18n("&Acquire Image..."), page );
+ acquireBtn->setEnabled( false );
+ morePics->addWidget( acquireBtn );
+#endif
+ morePics->addStretch();
+ top->addLayout( morePics );
+
+ // Filling the icon view
+ QDir facesDir( picsdir );
+ if ( facesDir.exists() )
+ {
+ QStringList picslist = facesDir.entryList( QDir::Files );
+ for ( QStringList::Iterator it = picslist.begin(); it != picslist.end(); ++it )
+ new QIconViewItem( m_FacesWidget, (*it).section(".",0,0), QPixmap( picsdir + *it ) );
+ }
+ facesDir.setPath( KCFGUserAccount::userFaceDir() );
+ if ( facesDir.exists() )
+ {
+ QStringList picslist = facesDir.entryList( QDir::Files );
+ for ( QStringList::Iterator it = picslist.begin(); it != picslist.end(); ++it )
+ new QIconViewItem( m_FacesWidget, "/"+(*it) == KCFGUserAccount::customFaceFile() ?
+ i18n("(Custom)") : (*it).section(".",0,0),
+ QPixmap( KCFGUserAccount::userFaceDir() + *it ) );
+ }
+
+ m_FacesWidget->setResizeMode( QIconView::Adjust );
+ //m_FacesWidget->setGridX( FACE_PIX_SIZE - 10 );
+ m_FacesWidget->arrangeItemsInGrid();
+
+ enableButtonOK( false );
+ //connect( this, SIGNAL( okClicked() ), SLOT( slotSaveCustomImage() ) );
+
+ resize( 420, 400 );
+}
+
+void ChFaceDlg::addCustomPixmap( QString imPath, bool saveCopy )
+{
+ QImage pix( imPath );
+ // TODO: save pix to TMPDIR/userinfo-tmp,
+ // then scale and copy *that* to ~/.faces
+
+ if (pix.isNull())
+ {
+ KMessageBox::sorry( this, i18n("There was an error loading the image.") );
+ return;
+ }
+ if ( (pix.width() > KCFGUserAccount::faceSize())
+ || (pix.height() > KCFGUserAccount::faceSize()) )
+ pix = pix.scale( KCFGUserAccount::faceSize(), KCFGUserAccount::faceSize(), QImage::ScaleMin );// Should be no bigger than certain size.
+
+ if ( saveCopy )
+ {
+ // If we should save a copy:
+ QDir userfaces( KCFGUserAccount::userFaceDir() );
+ if ( !userfaces.exists( ) )
+ userfaces.mkdir( userfaces.absPath() );
+
+ pix.save( userfaces.absPath() + "/.userinfo-tmp" , "PNG" );
+ KonqOperations::copy( this, KonqOperations::COPY, KURL::List( KURL( userfaces.absPath() + "/.userinfo-tmp" ) ), KURL( userfaces.absPath() + "/" + QFileInfo(imPath).fileName().section(".",0,0) ) );
+#if 0
+ if ( !pix.save( userfaces.absPath() + "/" + imPath , "PNG" ) )
+ KMessageBox::sorry(this, i18n("There was an error saving the image:\n%1").arg( userfaces.absPath() ) );
+#endif
+ }
+
+ QIconViewItem* newface = new QIconViewItem( m_FacesWidget, QFileInfo(imPath).fileName().section(".",0,0) , pix );
+ newface->setKey( KCFGUserAccount::customKey() );// Add custom items to end
+ m_FacesWidget->ensureItemVisible( newface );
+ m_FacesWidget->setCurrentItem( newface );
+}
+
+void ChFaceDlg::slotGetCustomImage( )
+{
+ QCheckBox* checkWidget = new QCheckBox( i18n("&Save copy in custom faces folder for future use"), 0 );
+
+ KFileDialog *dlg = new KFileDialog( QDir::homeDirPath(), KImageIO::pattern( KImageIO::Reading ),
+ this, 0, true, checkWidget);
+
+ dlg->setOperationMode( KFileDialog::Opening );
+ dlg->setCaption( i18n("Choose Image") );
+ dlg->setMode( KFile::File | KFile::LocalOnly );
+
+ KImageFilePreview *ip = new KImageFilePreview( dlg );
+ dlg->setPreviewWidget( ip );
+ if (dlg->exec() == QDialog::Accepted)
+ addCustomPixmap( dlg->selectedFile(), checkWidget->isChecked() );
+ // Because we give it a parent we have to close it ourselves.
+ dlg->close(true);
+}
+
+#if 0
+void ChFaceDlg::slotSaveCustomImage()
+{
+ if ( m_FacesWidget->currentItem()->key() == USER_CUSTOM_KEY)
+ {
+ QDir userfaces( QDir::homeDirPath() + USER_FACES_DIR );
+ if ( !userfaces.exists( ) )
+ userfaces.mkdir( userfaces.absPath() );
+
+ if ( !m_FacesWidget->currentItem()->pixmap()->save( userfaces.absPath() + USER_CUSTOM_FILE , "PNG" ) )
+ KMessageBox::sorry(this, i18n("There was an error saving the image:\n%1").arg( userfaces.absPath() ) );
+ }
+}
+#endif
+
+#include "chfacedlg.moc"
diff --git a/kdepasswd/kcm/chfacedlg.h b/kdepasswd/kcm/chfacedlg.h
new file mode 100644
index 000000000..1802ccd92
--- /dev/null
+++ b/kdepasswd/kcm/chfacedlg.h
@@ -0,0 +1,69 @@
+/**
+ * Copyright 2003 Braden MacDonald <bradenm_k@shaw.ca>
+ * Copyright 2003 Ravikiran Rajagopal <ravi@ee.eng.ohio-state.edu>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ *
+ *
+ * Please see the README
+ *
+ */
+
+/**
+ * @file UserInfo-chface: Dialog for choosing a new face for your user.
+ * @author Braden MacDonald
+ */
+
+#ifndef CHFACEDLG_H
+#define CHFACEDLG_H
+
+#include <qobject.h>
+
+#include <kiconview.h> // declaration below
+
+enum FacePerm { adminOnly = 1, adminFirst = 2, userFirst = 3, userOnly = 4};
+
+class KDialogBase;
+
+class ChFaceDlg : public KDialogBase
+{
+ Q_OBJECT
+public:
+
+
+ ChFaceDlg(const QString& picsdirs, QWidget *parent=0, const char *name=0, bool modal=true);
+
+
+ QPixmap getFaceImage() const
+ {
+ if(m_FacesWidget->currentItem())
+ return *(m_FacesWidget->currentItem()->pixmap());
+ else
+ return QPixmap();
+ }
+
+private slots:
+ void slotFaceWidgetSelectionChanged( QIconViewItem *item )
+ { enableButtonOK( !item->pixmap()->isNull() ); }
+
+ void slotGetCustomImage();
+ //void slotSaveCustomImage();
+
+private:
+ void addCustomPixmap( QString imPath, bool saveCopy );
+
+ KIconView *m_FacesWidget;
+};
+
+#endif // CHFACEDLG_H
diff --git a/kdepasswd/kcm/chfnprocess.cpp b/kdepasswd/kcm/chfnprocess.cpp
new file mode 100644
index 000000000..ec39a152a
--- /dev/null
+++ b/kdepasswd/kcm/chfnprocess.cpp
@@ -0,0 +1,100 @@
+/***************************************************************************
+ * Copyright 2003 Braden MacDonald <bradenm_k@shaw.ca> *
+ * Copyright 2003 Ravikiran Rajagopal <ravi@ee.eng.ohio-state.edu> *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License (version 2) as *
+ * published by the Free Software Foundation. *
+ * *
+ ***************************************************************************/
+
+/**
+ * @file Change a user's 'finger' information, specifically their full name.
+ * derived from kdepasswd.
+ */
+
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <qcstring.h>
+
+#include <kdesu/process.h>
+#include <kdebug.h>
+#include <kdebug.h>
+#include "chfnprocess.h"
+
+
+int ChfnProcess::exec(const char *pass, const char *name)
+{
+ // Try to set the default locale to make the parsing of the output
+ // of `chfn' easier.
+ putenv((char*)"LC_ALL=C");
+
+ QCStringList args;
+ args += "-f";
+ args += name;
+ int ret = PtyProcess::exec("chfn", args);
+ if (ret < 0)
+ return ChfnNotFound;
+
+ ret = ConverseChfn(pass);
+
+ waitForChild();
+ return ret;
+}
+
+
+/*
+ * The actual work.
+ * Return values: -1 = unknown error, 0 = ok, >0 = error code.
+ */
+int ChfnProcess::ConverseChfn(const char *pass)
+{
+ int status=-1;
+
+ QCString line;
+ while(1)
+ {
+ line = readLine();
+
+ if ( line.isEmpty() )
+ continue;// discard line
+
+ if ( line.contains( "Password: " )/*isPrompt( line, "password" )*/ )
+ {
+ WaitSlave();
+ write(m_Fd, pass, strlen(pass));
+ write(m_Fd, "\n", 1);
+ }
+
+ line = readLine(); // Let's see what the outcome was
+
+ if ( line.contains( "Changing finger info" ) )
+ {
+ // do nothing
+ }
+ else if ( line.contains( "information changed" ) )
+ {
+ status=0;
+ break;
+ }
+ else if ( line.isEmpty() )
+ {
+ status=0;
+ break;
+ }
+ else if ( line.contains( "Password error" ) || line.contains("Incorrect password") )
+ {
+ status=PasswordError;
+ break;
+ }
+ else
+ {
+ status=MiscError;
+ m_Error=line;
+ break;
+ }
+ }
+ return status;
+}
+
diff --git a/kdepasswd/kcm/chfnprocess.h b/kdepasswd/kcm/chfnprocess.h
new file mode 100644
index 000000000..f8bb4e0cf
--- /dev/null
+++ b/kdepasswd/kcm/chfnprocess.h
@@ -0,0 +1,33 @@
+/***************************************************************************
+ * Copyright 2003 Braden MacDonald <bradenm_k@shaw.ca> *
+ * Copyright 2003 Ravikiran Rajagopal <ravi@ee.eng.ohio-state.edu> *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License (version 2) as *
+ * published by the Free Software Foundation. *
+ * *
+ ***************************************************************************/
+
+#ifndef CHFNPROC_H
+#define CHFNPROC_H
+
+#include <qcstring.h>
+#include <kdesu/process.h>
+
+class ChfnProcess : public PtyProcess
+{
+public:
+
+ enum Errors { ChfnNotFound=1, PasswordError=2, MiscError=3 };
+
+ int exec(const char *pass, const char *name);
+
+ QCString error() { return m_Error; }
+
+private:
+ int ConverseChfn(const char *pass);
+
+ QCString m_Error;
+};
+
+#endif
diff --git a/kdepasswd/kcm/kcm_useraccount.desktop b/kdepasswd/kcm/kcm_useraccount.desktop
new file mode 100644
index 000000000..cd7064225
--- /dev/null
+++ b/kdepasswd/kcm/kcm_useraccount.desktop
@@ -0,0 +1,203 @@
+[Desktop Entry]
+Icon=personal
+Categories=Qt;KDE;X-KDE-settings-security;
+X-KDE-ParentApp=kcontrol
+X-KDE-Library=useraccount
+Type=Application
+Exec=kcmshell kcm_useraccount
+Name=Password & User Account
+Name[af]=Gebruiker rekening en Wagwoord
+Name[ar]=كلمة المرور و حساب المستخدم
+Name[be]=Пароль і ўліковы запіс карыстальніка
+Name[bg]=Потребител
+Name[bn]=পাসওয়ার্ড এবং ব্যবহারকারী অ্যাকাউন্ট
+Name[br]=Tremenger ha gont an arveriad
+Name[bs]=Šifra i korisnički račun
+Name[ca]=Contrasenya i compte d'usuari
+Name[cs]=Heslo a uživatelský účet
+Name[csb]=Parola ë kònto brëkòwnika
+Name[cy]=Cyfrinair a Chyfrif Defnyddiwr
+Name[da]=Kodeord og brugerkonto
+Name[de]=Passwort & Benutzerzugang
+Name[el]=Κωδικός πρόσβασης & Πληροφορίες χρήστη
+Name[eo]=Pasvorto kaj uzanta konto
+Name[es]=Contraseña y cuenta de usuario
+Name[et]=Parool ja kasutaja konto
+Name[eu]=Pasahitza eta erabiltzaile kontua
+Name[fa]=اسم رمز و حساب کاربری
+Name[fi]=Salasanat ja käyttäjätilit
+Name[fr]=Compte utilisateur et mot de passe
+Name[fy]=Wachtwurd en brûkersbehear
+Name[ga]=Focal Faire & Cuntas Úsáideora
+Name[gl]=Contrasinal e Conta de Usuario
+Name[he]=ססמה ומידע על החשבון משתמש
+Name[hi]=पासवर्ड तथा उपयोक्ता खाता
+Name[hr]=Lozinka i korisnički nalozi
+Name[hu]=Név és jelszó
+Name[is]=Lykilorð og notandaaðgangur
+Name[it]=Password e account utente
+Name[ja]=パスワード & ユーザアカウント
+Name[ka]=მომხმარებლის ანგარიშები და პაროლები
+Name[kk]=Пароль мен тіркелгі
+Name[km]=ពាក្យ​សម្ងាត់ & គណនី​អ្នក​ប្រើ
+Name[ko]=비밀번호와 사용자 계정
+Name[lt]=Slaptažodis ir naudotojo paskyra
+Name[lv]=Paroles un lietotāju konti
+Name[mk]=Лозинка и корисничка сметка
+Name[ms]=Kata Laluan & Akaun Pengguna
+Name[mt]=Password u kont tal-user
+Name[nb]=Passord og brukerkonto
+Name[nds]=Passwoort & Brukerkonto
+Name[ne]=पासवर्ड र प्रयोगकर्ता खाता
+Name[nl]=Wachtwoord en gebruikerbeheer
+Name[nn]=Passord og brukarkonto
+Name[pa]=ਉਪਭੋਗੀ ਖਾਤਾ ਅਤੇ ਗੁਪਤ-ਕੋਡ
+Name[pl]=Hasło i konto użytkownika
+Name[pt]=Senha e Conta do Utilizador
+Name[pt_BR]=Senha & Conta do Usuário
+Name[ro]=Parolă și cont utilizator
+Name[ru]=Профиль пользователя
+Name[rw]=Ijambobanga & Konti Ukoresha
+Name[se]=Beassansánit ja geavaheaddjekontut
+Name[sk]=Heslo a účet
+Name[sl]=Geslo in uporabniški račun
+Name[sr]=Лозинка и кориснички налог
+Name[sr@Latn]=Lozinka i korisnički nalog
+Name[sv]=Lösenord och användarkonto
+Name[ta]=கடவுச்சொல் & பயனர் கணக்கு
+Name[te]=పాస్ వర్డ్ & యూజర్ ఖాతా
+Name[tg]=Гузарвожа ва номи истифодакунанда
+Name[th]=รหัสผ่านและบัญชีผู้ใช้
+Name[tr]=Parola ve Kullanıcı Hesabı
+Name[tt]=Sersüz & Qullanuçı Xisabı
+Name[uk]=Пароль і рахунок користувача
+Name[uz]=Maxfiy soʻz va foydalanuvchi hisobi
+Name[uz@cyrillic]=Махфий сўз ва фойдаланувчи ҳисоби
+Name[vi]=Mật khẩu & Tài khoản Người dùng
+Name[wa]=Sicret et conte uzeu
+Name[zh_CN]=密码和用户信息
+Name[zh_TW]=密碼與帳號資訊
+Keywords=password,email,name,organization,realname,login image,face,echo mode
+Keywords[ar]=كلمة المرور,البريد الإلكتروني,الإسم,المنظمة/الشركة,الإسم الحقيقي,صورة تسجيل الدخول,الوجه,نمط الصدى
+Keywords[be]=Пароль,Электроннай пошта,Імя,Назва,Арганізацыя,Сапраўднае імя,Твар,Малюнак уваходу,password,email,name,organization,realname,login image,face,echo mode
+Keywords[bg]=парола, е-поща, организация, сметка, потребител, вход, включване, password, email, name, organization, realname, login image, face, echo mode
+Keywords[bs]=password,email,name,organization,realname,login image,face,echo mode,šifra,e-mail,ime,organizacija,pravo ime,stvarno ime,slika,lice
+Keywords[ca]=contrasenya,correu,nom,organització,nom real,imatge de connexió,aspecte,mode d'eco
+Keywords[cs]=heslo,email,jméno,organizace,přihlašovací obrázek,režim odezvy
+Keywords[csb]=parola,e-maila,miono,nôzwëskò,òrganizacëjô,logòwanié,brëkòwnik,miono brëkòwnika,òbrôzk,skarń,gwiôzdczi,wëskrzëniwanié parolów
+Keywords[da]=kodeord,email,e-mail,organisation,rigtigt navn,login-billede,hoved, ekkotilstand
+Keywords[de]=Passwort,E-Mail,Name,Organisation,Tatsächlicher Name,Login,Anmeldebild,Bild,Echomodus
+Keywords[el]=κωδικός πρόσβασης;email;όνομα;οργανισμός;πραγματικό όνομα;εικόνα σύνδεσης;πρόσωπο; τρόπος εμφάνισης
+Keywords[en_GB]=password,email,name,organisation,realname,login image,face,echo mode
+Keywords[eo]=pasvorto,retpoŝto,nomo,organizaĵo,realnomo,salutbildo,vizaĝo,eĥo moduso
+Keywords[es]=contraseña;correo electrónico;nombre;organización;nombre real;imagen de acceso;cara;modo de eco
+Keywords[et]=parool;email;nimi;organisatsioon;pärisnimi;kasutaja pilt;nägu; echo režiim
+Keywords[eu]=pasahitza;helb-elek;izena;erakundea;benetako izena;sarrerako irudia,aurpegia,echo modua
+Keywords[fa]=اسم رمز، رایانامه، نام، سازمان، نام واقعی، تصویر ورود، چهره، حالت پژواک
+Keywords[fi]=salasana,sähköposti,nimi,organisaatio,oikea nimi,kirjautumiskuva,naama,kaiutustilanus,kaiutustapa
+Keywords[fr]=mot de passe,email,courrier électronique,adresse électronique,organisation,non complet,image d'identification,mode d'affichage,face
+Keywords[fy]=wachtwoord,wachtwurd,e-mail,e-post,organisatie,organisaasje,naam,namme,login,aanmelden,oanmelde,afbeelding,ôfbyldings,gezicht,echo,asterisk
+Keywords[ga]=focal faire,ríomhphost,ainm,eagras,fíorainm,íomhá logála isteach,aghaidh,mód macalla
+Keywords[gl]=contrasinal,correo-e,nome,organización,nome real,imaxe de início,cara, modo eco
+Keywords[he]=ססמאות, דוא"ל, שם, ארגון, שם אמתי,תמונת כניסה, מצב echo, password,email,name,organization,realname,login image,face,echo mode
+Keywords[hr]=password,email,name,organization,realname,login image,face,echo mode,lozinka,e-pošta,naziv,ime,organizacija,pravo ime,slika prijave,lice,odzivnik
+Keywords[hu]=jelszó,e-mail,név,szervezet,valódi név,bejelentkezési kép,arc,kiírási mód
+Keywords[it]=password,email,nome,organizzazione,nome vero,immagine login,icona login,immagine accesso,faccia,modo echo
+Keywords[ja]=パスワード;Eメール;名前;組織;本名;ログイン画像;顔;エコーモード
+Keywords[km]=ពាក្យ​សម្ងាត់; អ៊ីមែល; ឈ្មោះ; អង្គការ; ឈ្មោះ​ពិត; រូបភាព​ពេល​ចូល; មុខ; របៀបបង្ហាញ
+Keywords[lt]=password,email,name,organization,realname,login image,face,echo mode,slaptažodis,e. paštas,el.paštas,vardas,organizacija,tikrasis vardas,veidas
+Keywords[mk]=password,email,name,organization,realname,login,image,face,echo mode,лозинка,е-пошта,електронска пошта,име,организација,вистинско име,слика за најава,лице
+Keywords[nb]=passord,e-post,navn,organisasjon,fullt navn,innloggingsbilde,ansikt,ekkomodus
+Keywords[nds]=Passwoort,EMail,Nettpost,Nettbreef,Organisatschoon,Naam,echte Naam,Anmellenbild,Loginbild,Gesicht,Echometood
+Keywords[ne]=पासवर्ड, इमेल, नाम, सङ्गठन, वास्तविकनाम, लागइन छवि, मोहडा, प्रतिध्वनि मोड
+Keywords[nl]=wachtwoord,e-mail,organisatie,naam,login,aanmelden,afbeelding,gezicht,echo,asterisk
+Keywords[nn]=passord;e-post;namn;organisasjon;fullt namn;innloggingsbilete;fjes;ekkomodus
+Keywords[pa]=ਗੁਪਤ-ਕੋਡ,ਈ-ਮੇਲ,ਨਾਂ,ਸੰਗਠਨ,ਅਸਲੀ ਨਾਂ,login image,face,echo mode
+Keywords[pl]=hasło,e-mail,imię,nazwisko,organizacja,login,użytkownik,nazwa użytkownika,obrazek,twarz,gwiazdki,pokazywanie haseł
+Keywords[pt]=senha,e-mail,nome,organização,nome real,imagem de ligação,cara,modo de eco
+Keywords[pt_BR]=senha,e-mail,nome,organização,nome real,imagem de login,aparência,modo de ecoar
+Keywords[ro]=parolă,email,nume,organizație,nume real,imagine de logare,față,mod ecou
+Keywords[ru]=password,email,name,organization,realname,login image,face,echo mode,пароль,имя,организация,электронная почта
+Keywords[se]=beassansátni,e-boasta,namma,organisašuvdna,olles namma,sisačálihangovva,amadádju,skájahanmodus
+Keywords[sl]=geslo;e-pošta;ime;organizacija;pravo ime;slika prijave;prijavna slika,obraz;način odmeva
+Keywords[sr]=password,email,name,organization,realname,login image,face,echo mode,лозинка,е-пошта,име,организација,ехо,режим,лице
+Keywords[sr@Latn]=password,email,name,organization,realname,login image,face,echo mode,lozinka,e-pošta,ime,organizacija,eho,režim,lice
+Keywords[sv]=lösenord;e-post;namn;organisation;verkligt namn;inloggningsbild;bild;ekoläge
+Keywords[th]=รหัสผ่าน, อีเมล,ชื่อ,องค์กร,ชื่อจริง,ภาพสำหรับล็อกอิน,ใบหน้า,โหมดแสดงอักษร
+Keywords[tr]=parola,e-posta,isim,gerçek isim,giriş resmi,yüz
+Keywords[uk]=пароль,адреса електронної пошти,організація,ім'я,фотографія,зображення
+Keywords[uz]=maxfiy soʻz,elektron pochta,foydalanuvchi,haqiqiy ismi,nishoncha,tashkilot, echo mode
+Keywords[uz@cyrillic]=махфий сўз,электрон почта,фойдаланувчи,ҳақиқий исми,нишонча,ташкилот, echo mode
+Keywords[vi]=mật khẩu,email,tên,cơ quan,tên thật,hình đăng nhập,mặt cười,chế độ báo lại
+Keywords[wa]=sicret,motd di passe,emile,no,soce,vray no,imådje d' elodjaedje,face,tiesse,echo mode,mode echo
+Keywords[zh_CN]=password,email,name,organization,realname,login image,face,echo mode,密码,电子邮件,姓名,组织,真实姓名,登陆图像,头像,回显
+Keywords[zh_TW]=password,email,name,organization,realname,login image,face,echo mode,密碼,電子郵件,組織,真名,登入圖片,面貌,回音模式
+Comment=User information such as password, name and email
+Comment[af]=Gebruiker informasie, soos naam, wagwoord en e-pos
+Comment[ar]=معلومات عن المستخدم مثل كلمة المرور ، الإسم و عنوان البريد الإلكتروني
+Comment[be]=Інфармацыя аб карыстальніку, напр. пароль, імя і электронны адрас
+Comment[bg]=Настройване на потребителската сметка, паролата, името и е-пощата
+Comment[bn]=ব্যবহারকারী তথ্য, যথা পাসওয়ার্ড, নাম এবং ই-মেইল
+Comment[br]=Titouroù diwar-benn an arveriad (tremenger, anv, chomlec'h postel)
+Comment[bs]=Informacije o korisniku kao što su šifra, ime i e-mail
+Comment[ca]=Informació de l'usuari com ara contrasenya, nom i correu
+Comment[cs]=Informace o uživateli, jako heslo, jméno nebo email
+Comment[csb]=Wëdowiédzô ò kònce brëkòwnika: parola, miono ë nôzwëskò, e-maila ëtd.
+Comment[cy]=Gwybodaeth ddefnyddiwr fel cyfrinair, enw ac ebost
+Comment[da]=Brugerinformation såsom kodeord, navn og e-mail
+Comment[de]=Benutzerinformation wie Passwort, Name, E-Mail-Adresse
+Comment[el]=Πληροφορίες χρήστη όπως ο κωδικός πρόσβασης, το όνομα και το email
+Comment[eo]=Uzantaj informoj kiel pasvorto, nomo kaj retpoŝto
+Comment[es]=Información del usuario como la contraseña, el nombre o el correo electrónico
+Comment[et]=Kasutajainfo, nt. parool, nimi ja e-posti aadress
+Comment[eu]=Erabiltzaileari buruzko informazioa; pasahitza, izena eta posta-helbidea, adibidez.
+Comment[fa]=استفاده از اطلاعاتی نظیر اسم رمز، نام و رایانامه
+Comment[fi]=Käyttäjien tiedot, kuten salasanat, nimet ja sähköpostiosoite
+Comment[fr]=Informations sur l'utilisateur, comme le mot de passe, le nom, et l'adresse électronique
+Comment[fy]=Brûkersynformaasje sa as wachtwurd, namme en e-adres
+Comment[gl]=Información do usuario como contrasinal, nome e correo-e
+Comment[he]=מידע אישי כגון ססמה, שם וכתובת דוא"ל
+Comment[hi]=उपयोक्ता जानकारी जैसे कि पासवर्ड, नाम तथा ई-मेल
+Comment[hr]=Korisnički podaci poput lozinke, imena i e-pošte
+Comment[hu]=A felhasználójellemzők, például az e-mail cím vagy a jelszó beállítása
+Comment[is]=Upplýsingar um notandann eins og til dæmis póstfang, lykilorð og nafn
+Comment[it]=Informazioni utente come password, nome ed email
+Comment[ja]=パスワード、名前、Eメールなどのユーザ情報
+Comment[ka]=ცნობები მომხმარებლების შესახებ, როგორიცაა პაროლი, სახელი და ელ-ფოსტა
+Comment[kk]=Паролі, аты және эл.пошта адресі секілді пайдаланушының мәліметі
+Comment[km]=ព័ត៌មាន​អ្នក​ប្រើ​ដូចជា ពាក្យ​សម្ងាត់,ឈ្មោះ និង​អ៊ីមែល
+Comment[ko]=비밀번호, 이름, 전자우편 주소 같은 개인 정보
+Comment[lt]=Naudotojo informacija, tokia, kaip slaptažodis, vardas ir e. pašto adresas
+Comment[lv]=Lietotāja informācija kā parole, vārds un e-pasts
+Comment[mk]=Кориснички информации како лозинка, име и е-пошта
+Comment[ms]=Maklumat pengguna seperti kata laluan, nama dan e-mel
+Comment[mt]=Informazzjoni dwar il-user, bħal isem, password u email
+Comment[nb]=Brukerinformasjon som passord, navn og e-postadresse
+Comment[nds]=Brukerinformatschonen, as t.B. Passwoort, Naam un Nettpostadress
+Comment[ne]=पासवर्ड, नाम, र इमेल जस्तो प्रयोगकर्ता सूचना
+Comment[nl]=Gebruikerinformatie zoals wachtwoord, naam en e-mailadres
+Comment[nn]=Brukarinformasjon som passord, namn og e-postadresse
+Comment[pa]=ਉਪਭੋਗੀ ਜਾਣਕਾਰੀ ਜਿਵੇਂ ਕਿ ਗੁਪਤ-ਕੋਡ, ਨਾਂ ਅਤੇ ਈ-ਮੇਲ
+Comment[pl]=Informacje o koncie użytkownika: hasło, imię i nazwisko, e-mail itd.
+Comment[pt]=Informações do utilizador, como a senha, o nome e o e-mail
+Comment[pt_BR]=Informações do usuário tais como senha, nome e e-mail
+Comment[ro]=Informații despre utilizator, precum parola, numele și adresa de e-mail
+Comment[ru]=Сведения о пользователе, такие как пароль, имя и e-mail
+Comment[rw]=Amakuru y'ukoresha nk'ijambobanga,izina na imeli
+Comment[se]=Geavaheaddjedieđut nugo beassansátni, namma ja e-boasta
+Comment[sk]=Informácie o používateľovi, ako heslo, meno a e-mail
+Comment[sl]=Uporabniške informacije, kot so geslo, ime in e-pošta
+Comment[sr]=Информације о кориснику као што је лозинка, име и е-пошта
+Comment[sr@Latn]=Informacije o korisniku kao što je lozinka, ime i e-pošta
+Comment[sv]=Användarinformation som lösenord, namn och e-post
+Comment[ta]=பயனர் தகவல் கடவுச்சொல்லைப் போல, பெயர் மற்றும் மிண்ணஞ்சல்
+Comment[th]=ข้อมูลของผู้ใช้ เช่น รหัสผ่าน, ชื่อ และอีเมล
+Comment[tr]=Parola, isim ve e-posta gibi kullanıcı bilgisi
+Comment[tt]=Qullanuçı caylawı: sersüz, isem, email kebek närsälär
+Comment[uk]=Інформація про користувача така як: пароль, ім'я та адреса електронної пошти
+Comment[uz]=Foydalanuvchining ismi, maxfiy soʻzi va elektron pochtasi kabi maʼlumot
+Comment[uz@cyrillic]=Фойдаланувчининг исми, махфий сўзи ва электрон почтаси каби маълумот
+Comment[vi]=Thông tin về người dùng như mật khẩu, tên và email
+Comment[wa]=Informåcion d' uzeus come les sicrets, nos et emiles
+Comment[zh_CN]=像密码、姓名和电子邮件这样的用户信息
+Comment[zh_TW]=使用者資訊如密碼、名稱和電子郵件
diff --git a/kdepasswd/kcm/kcm_useraccount.kcfg b/kdepasswd/kcm/kcm_useraccount.kcfg
new file mode 100644
index 000000000..7f52bff9a
--- /dev/null
+++ b/kdepasswd/kcm/kcm_useraccount.kcfg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+ <include>kglobal.h</include>
+ <include>kstandarddirs.h</include>
+ <kcfgfile name="kdm/kdmrc"/>
+ <group name="X-*-Greeter">
+ <entry name="faceDir" type="Path">
+ <default code="true">
+ KGlobal::dirs()->resourceDirs("data").last() + "kdm/faces" + '/'
+ </default>
+ </entry>
+ <entry name="UserFaceDir" type="Path">
+ <default>$HOME/.faces/</default>
+ </entry>
+ <entry name="FaceSource" type="String">
+ <default>PreferAdmin</default>
+ </entry>
+ <!-- These entries doesn't "exist" or is used in kdmrc
+ but this is a nifty way of handling default values ;-) -->
+ <entry name = "FaceSize" type="Int">
+ <label>The size of login images</label>
+ <default>64</default>
+ </entry>
+ <entry name = "DefaultFile" type="Path">
+ <label>The default image file</label>
+ <default>.default.face.icon</default>
+ </entry>
+ <entry name="CustomFaceFile" type="Path">
+ <label>The filename of the user's custom image file</label>
+ <default>Custom.png</default>
+ </entry>
+ <entry name="FaceFile" type="Path">
+ <label>The user's login image</label>
+ <default>$HOME/.face.icon</default>
+ </entry>
+ <entry name="CustomKey" type="String">
+ <label>Sort key for KIconViewItems</label>
+ <default>Zz_custom</default>
+ </entry>
+ </group>
+</kcfg>
diff --git a/kdepasswd/kcm/kcm_useraccount_pass.kcfg b/kdepasswd/kcm/kcm_useraccount_pass.kcfg
new file mode 100644
index 000000000..c76e4a657
--- /dev/null
+++ b/kdepasswd/kcm/kcm_useraccount_pass.kcfg
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+ <kcfgfile name="kdeglobals"/>
+ <group name="Passwords">
+ <entry name="EchoMode" type="Enum">
+ <label>Password echo type</label>
+ <choices>
+ <choice name="OneStar"/>
+ <choice name="ThreeStars"/>
+ <choice name="NoEcho"/>
+ <!-- TODO: We need a ShowPassword and implement it.
+ We need to prompt for password before
+ enabling it..-->
+ </choices>
+ <default>OneStar</default>
+ </entry>
+ </group>
+</kcfg>
diff --git a/kdepasswd/kcm/main.cpp b/kdepasswd/kcm/main.cpp
new file mode 100644
index 000000000..d49304484
--- /dev/null
+++ b/kdepasswd/kcm/main.cpp
@@ -0,0 +1,344 @@
+
+/**
+ * Copyright (C) 2004 Frans Englich <frans.englich@telia.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ *
+ *
+ * Please see the README
+ *
+ */
+
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qbuttongroup.h>
+#include <qevent.h>
+#include <qpixmap.h>
+#include <qcstring.h>
+#include <qstringlist.h>
+#include <qlayout.h>
+
+#include <kpushbutton.h>
+#include <kguiitem.h>
+#include <kemailsettings.h>
+#include <kpassdlg.h>
+#include <kuser.h>
+#include <kdialog.h>
+#include <kimageio.h>
+#include <kstandarddirs.h>
+#include <kaboutdata.h>
+#include <kgenericfactory.h>
+#include <kmessagebox.h>
+#include <kprocess.h>
+#include <kio/netaccess.h>
+#include <kurl.h>
+#include <kurldrag.h>
+
+#include "settings.h"
+#include "pass.h"
+#include "chfnprocess.h"
+#include "chfacedlg.h"
+#include "main.h"
+
+typedef KGenericFactory<KCMUserAccount, QWidget> Factory;
+K_EXPORT_COMPONENT_FACTORY( kcm_useraccount, Factory("useraccount") )
+
+KCMUserAccount::KCMUserAccount( QWidget *parent, const char *name,
+ const QStringList &)
+ : KCModule( parent, name)
+{
+ QVBoxLayout *topLayout = new QVBoxLayout(this);
+ _mw = new MainWidget(this);
+ topLayout->addWidget( _mw );
+
+ connect( _mw->btnChangeFace, SIGNAL(clicked()), SLOT(slotFaceButtonClicked()));
+ connect( _mw->btnChangePassword, SIGNAL(clicked()), SLOT(slotChangePassword()));
+ _mw->btnChangePassword->setGuiItem( KGuiItem( i18n("Change &Password..."), "password" ));
+
+ connect( _mw->leRealname, SIGNAL(textChanged(const QString&)), SLOT(changed()));
+ connect( _mw->leOrganization, SIGNAL(textChanged(const QString&)), SLOT(changed()));
+ connect( _mw->leEmail, SIGNAL(textChanged(const QString&)), SLOT(changed()));
+ connect( _mw->leSMTP, SIGNAL(textChanged(const QString&)), SLOT(changed()));
+
+ _ku = new KUser();
+ _kes = new KEMailSettings();
+
+ _mw->lblUsername->setText( _ku->loginName() );
+ _mw->lblUID->setText( QString().number(_ku->uid()) );
+
+ KAboutData *about = new KAboutData(I18N_NOOP("kcm_useraccount"),
+ I18N_NOOP("Password & User Information"), 0, 0,
+ KAboutData::License_GPL,
+ I18N_NOOP("(C) 2002, Braden MacDonald, "
+ "(C) 2004 Ravikiran Rajagopal"));
+
+ about->addAuthor("Frans Englich", I18N_NOOP("Maintainer"), "frans.englich@telia.com");
+ about->addAuthor("Ravikiran Rajagopal", 0, "ravi@kde.org");
+ about->addAuthor("Michael H\303\244ckel", "haeckel@kde.org" );
+
+ about->addAuthor("Braden MacDonald", I18N_NOOP("Face editor"), "bradenm_k@shaw.ca");
+ about->addAuthor("Geert Jansen", I18N_NOOP("Password changer"), "jansen@kde.org",
+ "http://www.stack.nl/~geertj/");
+ about->addAuthor("Daniel Molkentin");
+ about->addAuthor("Alex Zepeda");
+ about->addAuthor("Hans Karlsson", I18N_NOOP("Icons"), "karlsson.h@home.se");
+ about->addAuthor("Hermann Thomas", I18N_NOOP("Icons"), "h.thomas@gmx.de");
+ setAboutData(about);
+
+ setQuickHelp( i18n("<qt>Here you can change your personal information, which "
+ "will be used in mail programs and word processors, for example. You can "
+ "change your login password by clicking <em>Change Password</em>.</qt>") );
+
+ addConfig( KCFGPassword::self(), this );
+ load();
+}
+
+void KCMUserAccount::slotChangePassword()
+{
+ KProcess *proc = new KProcess;
+ QString bin = KGlobal::dirs()->findExe("kdepasswd");
+ if ( !bin )
+ {
+ kdDebug() << "kcm_useraccount: kdepasswd was not found." << endl;
+ KMessageBox::sorry ( this, i18n( "A program error occurred: the internal "
+ "program 'kdepasswd' could not be found. You will "
+ "not be able to change your password."));
+
+ _mw->btnChangePassword->setEnabled(false);
+ delete proc;
+ return;
+ }
+
+ *proc << bin << _ku->loginName() ;
+ proc->start(KProcess::DontCare);
+
+ delete proc;
+
+}
+
+
+KCMUserAccount::~KCMUserAccount()
+{
+ delete _ku;
+ delete _kes;
+}
+
+void KCMUserAccount::load()
+{
+ _mw->lblUsername->setText(_ku->loginName());
+
+ _kes->setProfile(_kes->defaultProfileName());
+
+ _mw->leRealname->setText( _kes->getSetting( KEMailSettings::RealName ));
+ _mw->leEmail->setText( _kes->getSetting( KEMailSettings::EmailAddress ));
+ _mw->leOrganization->setText( _kes->getSetting( KEMailSettings::Organization ));
+ _mw->leSMTP->setText( _kes->getSetting( KEMailSettings::OutServer ));
+
+ QString _userPicsDir = KCFGUserAccount::faceDir() +
+ KGlobal::dirs()->resourceDirs("data").last() + "kdm/faces/";
+
+ QString fs = KCFGUserAccount::faceSource();
+ if (fs == QString::fromLatin1("UserOnly"))
+ _facePerm = userOnly;
+ else if (fs == QString::fromLatin1("PreferUser"))
+ _facePerm = userFirst;
+ else if (fs == QString::fromLatin1("PreferAdmin"))
+ _facePerm = adminFirst;
+ else
+ _facePerm = adminOnly; // Admin Only
+
+ if ( _facePerm == adminFirst )
+ { // If the administrator's choice takes preference
+ _facePixmap = QPixmap( _userPicsDir + _ku->loginName() + ".face.icon" );
+
+ if ( _facePixmap.isNull() )
+ _facePerm = userFirst;
+ else
+ _mw->btnChangeFace->setPixmap( _facePixmap );
+ }
+
+ if ( _facePerm >= userFirst )
+ {
+ // If the user's choice takes preference
+ _facePixmap = QPixmap( KCFGUserAccount::faceFile() );
+
+ // The user has no face, should we check for the admin's setting?
+ if ( _facePixmap.isNull() && _facePerm == userFirst )
+ _facePixmap = QPixmap( _userPicsDir + _ku->loginName() + ".face.icon" );
+
+ if ( _facePixmap.isNull() )
+ _facePixmap = QPixmap( _userPicsDir + KCFGUserAccount::defaultFile() );
+
+ _mw->btnChangeFace->setPixmap( _facePixmap );
+ }
+ else if ( _facePerm <= adminOnly )
+ {
+ // Admin only
+ _facePixmap = QPixmap( _userPicsDir + _ku->loginName() + ".face.icon" );
+ if ( _facePixmap.isNull() )
+ _facePixmap = QPixmap( _userPicsDir + KCFGUserAccount::defaultFile() );
+ _mw->btnChangeFace->setPixmap( _facePixmap );
+ }
+
+ KCModule::load(); /* KConfigXT */
+
+}
+
+void KCMUserAccount::save()
+{
+ KCModule::save(); /* KConfigXT */
+
+ /* Save KDE's homebrewn settings */
+ _kes->setSetting( KEMailSettings::RealName, _mw->leRealname->text() );
+ _kes->setSetting( KEMailSettings::EmailAddress, _mw->leEmail->text() );
+ _kes->setSetting( KEMailSettings::Organization, _mw->leOrganization->text() );
+ _kes->setSetting( KEMailSettings::OutServer, _mw->leSMTP->text() );
+
+ /* Save realname to /etc/passwd */
+ if ( _mw->leRealname->isModified() )
+ {
+ QCString password;
+ int ret = KPasswordDialog::getPassword( password, i18n("Please enter "
+ "your password in order to save your settings:"));
+
+ if ( !ret )
+ {
+ KMessageBox::sorry( this, i18n("You must enter "
+ "your password in order to change your information."));
+ return;
+ }
+
+ ChfnProcess *proc = new ChfnProcess();
+ ret = proc->exec(password, _mw->leRealname->text().ascii() );
+ if ( ret )
+ {
+ if ( ret == ChfnProcess::PasswordError )
+ KMessageBox::sorry( this, i18n("You must enter a correct password."));
+
+ else
+ {
+ KMessageBox::sorry( this, i18n("An error occurred and your password has "
+ "probably not been changed. The error "
+ "message was:\n%1").arg(proc->error()));
+ kdDebug() << "ChfnProcess->exec() failed. Error code: " << ret
+ << "\nOutput:" << proc->error() << endl;
+ }
+ }
+
+ delete proc;
+ }
+
+ /* Save the image */
+ if( !_facePixmap.save( KCFGUserAccount::faceFile(), "PNG" ))
+ KMessageBox::error( this, i18n("There was an error saving the image: %1" ).arg(
+ KCFGUserAccount::faceFile()) );
+
+}
+
+void KCMUserAccount::changeFace(const QPixmap &pix)
+{
+ if ( _facePerm < userFirst )
+ return; // If the user isn't allowed to change their face, don't!
+
+ if ( pix.isNull() ) {
+ KMessageBox::sorry( this, i18n("There was an error loading the image.") );
+ return;
+ }
+
+ _facePixmap = pix;
+ _mw->btnChangeFace->setPixmap( _facePixmap );
+ emit changed( true );
+}
+
+void KCMUserAccount::slotFaceButtonClicked()
+{
+ if ( _facePerm < userFirst )
+ {
+ KMessageBox::sorry( this, i18n("Your administrator has disallowed changing your image.") );
+ return;
+ }
+
+ ChFaceDlg* pDlg = new ChFaceDlg( KGlobal::dirs()->resourceDirs("data").last() +
+ "/kdm/pics/users/" );
+
+ if ( pDlg->exec() == QDialog::Accepted && !pDlg->getFaceImage().isNull() )
+ changeFace( pDlg->getFaceImage() );
+
+ delete pDlg;
+}
+
+/**
+ * I merged faceButtonDropEvent into this /Frans
+ * The function was called after checking event type and
+ * the code is now below that if statement
+ */
+bool KCMUserAccount::eventFilter(QObject *, QEvent *e)
+{
+ if (e->type() == QEvent::DragEnter)
+ {
+ QDragEnterEvent *ee = (QDragEnterEvent *) e;
+ ee->accept( KURLDrag::canDecode(ee) );
+ return true;
+ }
+
+ if (e->type() == QEvent::Drop)
+ {
+ if ( _facePerm < userFirst )
+ {
+ KMessageBox::sorry( this, i18n("Your administrator "
+ "has disallowed changing your image.") );
+ return true;
+ }
+
+ KURL *url = decodeImgDrop( (QDropEvent *) e, this);
+ if (url)
+ {
+ QString pixPath;
+ KIO::NetAccess::download(*url, pixPath, this);
+ changeFace( QPixmap( pixPath ) );
+ KIO::NetAccess::removeTempFile(pixPath);
+ delete url;
+ }
+ return true;
+ }
+ return false;
+}
+
+inline KURL *KCMUserAccount::decodeImgDrop(QDropEvent *e, QWidget *wdg)
+{
+ KURL::List uris;
+
+ if (KURLDrag::decode(e, uris) && (uris.count() > 0))
+ {
+ KURL *url = new KURL(uris.first());
+
+ KImageIO::registerFormats();
+ if( KImageIO::canRead(KImageIO::type(url->fileName())) )
+ return url;
+
+ QStringList qs = QStringList::split('\n', KImageIO::pattern());
+ qs.remove(qs.begin());
+
+ QString msg = i18n( "%1 does not appear to be an image file.\n"
+ "Please use files with these extensions:\n"
+ "%2").arg(url->fileName()).arg(qs.join("\n"));
+ KMessageBox::sorry( wdg, msg);
+ delete url;
+ }
+ return 0;
+}
+
+#include "main.moc"
+
diff --git a/kdepasswd/kcm/main.h b/kdepasswd/kcm/main.h
new file mode 100644
index 000000000..2ee475bc9
--- /dev/null
+++ b/kdepasswd/kcm/main.h
@@ -0,0 +1,79 @@
+
+/**
+ * Copyright (C) 2004 Frans Englich <frans.englich@telia.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ */
+
+#ifndef MAIN_H
+#define MAIN_H
+
+#include <kcmodule.h>
+
+#include "main_widget.h"
+
+class KAboutData;
+class KUser;
+class KEmailSettings;
+class QEvent;
+class QObject;
+class KURL;
+class Config;
+
+/**
+ * Please see the README
+ */
+class KCMUserAccount : public KCModule
+{
+ Q_OBJECT
+
+public:
+ KCMUserAccount(QWidget* parent, const char* name = "KCMUserAccount",
+ const QStringList& list=QStringList());
+ ~KCMUserAccount();
+
+ /**
+ * The user data is loaded from chfn(/etc/password) and then
+ * written back as well as to KDE's own(KEmailSettings).
+ * The user won't notice this(assuming they change the KDE settings via
+ * this KCM) and will make KDE play nice with enviroments which uses
+ * /etc/password.
+ */
+ void load();
+
+ void save();
+
+ /**
+ * For the face button
+ */
+ bool eventFilter(QObject *, QEvent *e);
+
+private slots:
+ void slotChangePassword();
+ //void configChanged() { emit changed(true); };
+ void slotFaceButtonClicked();
+
+private:
+ void changeFace(const QPixmap& pix);
+ inline KURL* decodeImgDrop(QDropEvent *e, QWidget *wdg);
+
+ KEMailSettings *_kes;
+ KUser *_ku;
+ MainWidget *_mw;
+ FacePerm _facePerm;
+ QPixmap _facePixmap;
+
+};
+
+#endif // MAIN_H
diff --git a/kdepasswd/kcm/main_widget.ui b/kdepasswd/kcm/main_widget.ui
new file mode 100644
index 000000000..29adb0835
--- /dev/null
+++ b/kdepasswd/kcm/main_widget.ui
@@ -0,0 +1,294 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>MainWidget</class>
+<author>Frans Englich &lt;frans.englich@telia.com&gt;</author>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>MainWidget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>518</width>
+ <height>561</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>KCMUserAccount</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KPushButton" row="0" column="0">
+ <property name="name">
+ <cstring>btnChangeFace</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>74</width>
+ <height>74</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>74</width>
+ <height>74</height>
+ </size>
+ </property>
+ <property name="acceptDrops">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QGroupBox" row="1" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>grpUserInformation</cstring>
+ </property>
+ <property name="title">
+ <string>User Information</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>lblOrganisation</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Organization:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leOrganization</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="1">
+ <property name="name">
+ <cstring>leRealname</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>lblRealName</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Name:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leRealname</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>leOrganization</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>lblEmail</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Email address:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leEmail</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="2" column="1">
+ <property name="name">
+ <cstring>leEmail</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;SMTP server:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>leSMTP</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="3" column="1">
+ <property name="name">
+ <cstring>leSMTP</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="5" column="0">
+ <property name="name">
+ <cstring>lblUIDTell</cstring>
+ </property>
+ <property name="text">
+ <string>User ID:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="5" column="1">
+ <property name="name">
+ <cstring>lblUID</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer row="4" column="2">
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="0" column="1" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>lblUsername</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <family>Bitstream Charter</family>
+ <pointsize>14</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>lblClickButtonInfo</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;i&gt;(Click the button to change your image)&lt;/i&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter</set>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="KPushButton" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>btnChangePassword</cstring>
+ </property>
+ <property name="text">
+ <string>Change Password...</string>
+ </property>
+ </widget>
+ <spacer row="3" column="3">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>111</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QButtonGroup" row="2" column="0" rowspan="1" colspan="4">
+ <property name="name">
+ <cstring>kcfg_EchoMode</cstring>
+ </property>
+ <property name="title">
+ <string>At Password Prompt</string>
+ </property>
+ <property name="flat">
+ <bool>false</bool>
+ </property>
+ <property name="checkable">
+ <bool>false</bool>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ <property name="selectedId" stdset="0">
+ <number>0</number>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton" row="0" column="0">
+ <property name="name">
+ <cstring>rdbOneStar</cstring>
+ </property>
+ <property name="text">
+ <string>Show one star for each letter</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="1" column="0">
+ <property name="name">
+ <cstring>rdbThreeStars</cstring>
+ </property>
+ <property name="text">
+ <string>Show three stars for each letter</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="2" column="0">
+ <property name="name">
+ <cstring>rdbShowPassword</cstring>
+ </property>
+ <property name="text">
+ <string>Show nothing</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<tabstops>
+ <tabstop>btnChangeFace</tabstop>
+ <tabstop>leRealname</tabstop>
+ <tabstop>leOrganization</tabstop>
+ <tabstop>leEmail</tabstop>
+ <tabstop>leSMTP</tabstop>
+ <tabstop>rdbOneStar</tabstop>
+ <tabstop>rdbThreeStars</tabstop>
+ <tabstop>rdbShowPassword</tabstop>
+ <tabstop>btnChangePassword</tabstop>
+</tabstops>
+<includes>
+ <include location="local" impldecl="in implementation">kdialog.h</include>
+</includes>
+<layoutdefaults spacing="6" margin="11"/>
+<layoutfunctions spacing="KDialog::spacingHint" margin="KDialog::marginHint"/>
+</UI>
diff --git a/kdepasswd/kcm/pass.kcfgc b/kdepasswd/kcm/pass.kcfgc
new file mode 100644
index 000000000..21b4bb781
--- /dev/null
+++ b/kdepasswd/kcm/pass.kcfgc
@@ -0,0 +1,5 @@
+File=kcm_useraccount_pass.kcfg
+ClassName=KCFGPassword
+Singleton=true
+Mutators=true
+
diff --git a/kdepasswd/kcm/pics/Apple.png b/kdepasswd/kcm/pics/Apple.png
new file mode 100644
index 000000000..b383578bb
--- /dev/null
+++ b/kdepasswd/kcm/pics/Apple.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/BeachBall.png b/kdepasswd/kcm/pics/BeachBall.png
new file mode 100644
index 000000000..e8c748332
--- /dev/null
+++ b/kdepasswd/kcm/pics/BeachBall.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Blowfish.png b/kdepasswd/kcm/pics/Blowfish.png
new file mode 100644
index 000000000..51cb16013
--- /dev/null
+++ b/kdepasswd/kcm/pics/Blowfish.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Bug.png b/kdepasswd/kcm/pics/Bug.png
new file mode 100644
index 000000000..b431cc138
--- /dev/null
+++ b/kdepasswd/kcm/pics/Bug.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Butterfly.png b/kdepasswd/kcm/pics/Butterfly.png
new file mode 100644
index 000000000..88012a7ed
--- /dev/null
+++ b/kdepasswd/kcm/pics/Butterfly.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/CREDITS b/kdepasswd/kcm/pics/CREDITS
new file mode 100644
index 000000000..ccd9126b4
--- /dev/null
+++ b/kdepasswd/kcm/pics/CREDITS
@@ -0,0 +1,21 @@
+Butterfly.png, Konqui.png:
+ KDE Graphics Team
+
+BeachBall.png BlueMarble1.png Flower.png Night.png Star2.png Star3.png
+Star4.png Star.png Stars2.png Stars.png:
+ Braden MacDonald
+
+Apple.png Cheese.png Ghost.png Pearl.png Skull.png Blowfish.png Cow.png
+Guitar.png Penguin.png Smiley.png Bug.png Daemon.png Lion.png Pig.png
+Splash.png Burger.png Dog.png Man.png Scream.png Turtle.png Car.png
+Elephant.png Monkey.png Shark.png Watch.png Astronaut.png Heart.png
+Ring.png Rabbit.png Speakers.png UFO.png :
+ Hans Karlsson <karlsson.h@home.se>
+License: free for commercial and noncommercial usage, distribution and
+modification
+
+Arch.png BeachBall2.png Butterfly2.png Cactus.png Car2.png Clock.png
+Dice.png Dog2.png Dragon.png Fish.png Flower2.png Flower3.png Frog.png
+Kiwi.png Lava.png Pineapple.png Teddybear.png Tiger.png Tukan.png
+Wind.png :
+ Hermann Thomas <h.thomas@gmx.de>
diff --git a/kdepasswd/kcm/pics/Car.png b/kdepasswd/kcm/pics/Car.png
new file mode 100644
index 000000000..95ec0278f
--- /dev/null
+++ b/kdepasswd/kcm/pics/Car.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Cow.png b/kdepasswd/kcm/pics/Cow.png
new file mode 100644
index 000000000..2f0ced863
--- /dev/null
+++ b/kdepasswd/kcm/pics/Cow.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Daemon.png b/kdepasswd/kcm/pics/Daemon.png
new file mode 100644
index 000000000..4bbc42a55
--- /dev/null
+++ b/kdepasswd/kcm/pics/Daemon.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Dog.png b/kdepasswd/kcm/pics/Dog.png
new file mode 100644
index 000000000..78de93340
--- /dev/null
+++ b/kdepasswd/kcm/pics/Dog.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Elephant.png b/kdepasswd/kcm/pics/Elephant.png
new file mode 100644
index 000000000..8f4b2d2aa
--- /dev/null
+++ b/kdepasswd/kcm/pics/Elephant.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Flower.png b/kdepasswd/kcm/pics/Flower.png
new file mode 100644
index 000000000..d414e736c
--- /dev/null
+++ b/kdepasswd/kcm/pics/Flower.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Frog.png b/kdepasswd/kcm/pics/Frog.png
new file mode 100644
index 000000000..2186975a9
--- /dev/null
+++ b/kdepasswd/kcm/pics/Frog.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Ghost.png b/kdepasswd/kcm/pics/Ghost.png
new file mode 100644
index 000000000..bf95150da
--- /dev/null
+++ b/kdepasswd/kcm/pics/Ghost.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Guitar.png b/kdepasswd/kcm/pics/Guitar.png
new file mode 100644
index 000000000..6a315b0c7
--- /dev/null
+++ b/kdepasswd/kcm/pics/Guitar.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Heart.png b/kdepasswd/kcm/pics/Heart.png
new file mode 100644
index 000000000..b41a027e3
--- /dev/null
+++ b/kdepasswd/kcm/pics/Heart.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Konqui.png b/kdepasswd/kcm/pics/Konqui.png
new file mode 100644
index 000000000..4db7ae5e3
--- /dev/null
+++ b/kdepasswd/kcm/pics/Konqui.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Lion.png b/kdepasswd/kcm/pics/Lion.png
new file mode 100644
index 000000000..373b3f8c8
--- /dev/null
+++ b/kdepasswd/kcm/pics/Lion.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Makefile.am b/kdepasswd/kcm/pics/Makefile.am
new file mode 100644
index 000000000..5c1e95f75
--- /dev/null
+++ b/kdepasswd/kcm/pics/Makefile.am
@@ -0,0 +1,10 @@
+picsdir = $(kde_datadir)/kdm/pics/users
+pics_DATA = Apple.png BeachBall.png Blowfish.png Bug.png \
+ Butterfly.png Car.png Cow.png Daemon.png Dog.png Elephant.png \
+ Flower.png Frog.png Ghost.png Guitar.png Heart.png Konqui.png \
+ Lion.png Monkey.png Penguin.png Pig.png Rabbit.png \
+ Ring.png Scream.png Shark.png Splash.png Star.png Teddybear.png \
+ Turtle.png
+
+EXTRA_DIST = $(pics_DATA)
+
diff --git a/kdepasswd/kcm/pics/Monkey.png b/kdepasswd/kcm/pics/Monkey.png
new file mode 100644
index 000000000..72a241006
--- /dev/null
+++ b/kdepasswd/kcm/pics/Monkey.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Penguin.png b/kdepasswd/kcm/pics/Penguin.png
new file mode 100644
index 000000000..33ed3619a
--- /dev/null
+++ b/kdepasswd/kcm/pics/Penguin.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Pig.png b/kdepasswd/kcm/pics/Pig.png
new file mode 100644
index 000000000..c10a34c7f
--- /dev/null
+++ b/kdepasswd/kcm/pics/Pig.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Rabbit.png b/kdepasswd/kcm/pics/Rabbit.png
new file mode 100644
index 000000000..a7c5f3f10
--- /dev/null
+++ b/kdepasswd/kcm/pics/Rabbit.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Ring.png b/kdepasswd/kcm/pics/Ring.png
new file mode 100644
index 000000000..29daf4c63
--- /dev/null
+++ b/kdepasswd/kcm/pics/Ring.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Scream.png b/kdepasswd/kcm/pics/Scream.png
new file mode 100644
index 000000000..46abbd2f8
--- /dev/null
+++ b/kdepasswd/kcm/pics/Scream.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Shark.png b/kdepasswd/kcm/pics/Shark.png
new file mode 100644
index 000000000..a11a352cb
--- /dev/null
+++ b/kdepasswd/kcm/pics/Shark.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Splash.png b/kdepasswd/kcm/pics/Splash.png
new file mode 100644
index 000000000..ec8e68a18
--- /dev/null
+++ b/kdepasswd/kcm/pics/Splash.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Star.png b/kdepasswd/kcm/pics/Star.png
new file mode 100644
index 000000000..2b3988860
--- /dev/null
+++ b/kdepasswd/kcm/pics/Star.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Teddybear.png b/kdepasswd/kcm/pics/Teddybear.png
new file mode 100644
index 000000000..823adb56d
--- /dev/null
+++ b/kdepasswd/kcm/pics/Teddybear.png
Binary files differ
diff --git a/kdepasswd/kcm/pics/Turtle.png b/kdepasswd/kcm/pics/Turtle.png
new file mode 100644
index 000000000..1eee29591
--- /dev/null
+++ b/kdepasswd/kcm/pics/Turtle.png
Binary files differ
diff --git a/kdepasswd/kcm/settings.kcfgc b/kdepasswd/kcm/settings.kcfgc
new file mode 100644
index 000000000..772c87a6b
--- /dev/null
+++ b/kdepasswd/kcm/settings.kcfgc
@@ -0,0 +1,5 @@
+File=kcm_useraccount.kcfg
+ClassName=KCFGUserAccount
+Singleton=true
+Mutators=false
+
diff --git a/kdepasswd/kdepasswd.cpp b/kdepasswd/kdepasswd.cpp
new file mode 100644
index 000000000..c76169508
--- /dev/null
+++ b/kdepasswd/kdepasswd.cpp
@@ -0,0 +1,79 @@
+/* vi: ts=8 sts=4 sw=4
+ *
+ * $Id$
+ *
+ * This file is part of the KDE project, module kdesu.
+ * Copyright (C) 2000 Geert Jansen <jansen@kde.org>
+ */
+
+#include <config.h>
+
+#include <kuniqueapplication.h>
+#include <klocale.h>
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <kmessagebox.h>
+#include <kuser.h>
+#include <kdebug.h>
+
+#include "passwd.h"
+#include "passwddlg.h"
+
+static KCmdLineOptions options[] =
+{
+ { "+[user]", I18N_NOOP("Change password of this user"), 0 },
+ KCmdLineLastOption
+};
+
+
+int main(int argc, char **argv)
+{
+ KAboutData aboutData("kdepasswd", I18N_NOOP("KDE passwd"),
+ VERSION, I18N_NOOP("Changes a UNIX password."),
+ KAboutData::License_Artistic, "Copyright (c) 2000 Geert Jansen");
+ aboutData.addAuthor("Geert Jansen", I18N_NOOP("Maintainer"),
+ "jansen@kde.org", "http://www.stack.nl/~geertj/");
+
+ KCmdLineArgs::init(argc, argv, &aboutData);
+ KCmdLineArgs::addCmdLineOptions(options);
+ KUniqueApplication::addCmdLineOptions();
+
+
+ if (!KUniqueApplication::start()) {
+ kdDebug() << "kdepasswd is already running" << endl;
+ return 0;
+ }
+
+ KUniqueApplication app;
+
+ KUser ku;
+ QCString user;
+ bool bRoot = ku.isSuperUser();
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ if (args->count())
+ user = args->arg(0);
+
+ /* You must be able to run "kdepasswd loginName" */
+ if ( !user.isEmpty() && user!=KUser().loginName().utf8() && !bRoot)
+ {
+ KMessageBox::sorry(0, i18n("You need to be root to change the password of other users."));
+ return 0;
+ }
+
+ QCString oldpass;
+ if (!bRoot)
+ {
+ int result = KDEpasswd1Dialog::getPassword(oldpass);
+ if (result != KDEpasswd1Dialog::Accepted)
+ return 0;
+ }
+
+ KDEpasswd2Dialog *dlg = new KDEpasswd2Dialog(oldpass, user);
+
+
+ dlg->exec();
+
+ return 0;
+}
+
diff --git a/kdepasswd/kdepasswd.desktop b/kdepasswd/kdepasswd.desktop
new file mode 100644
index 000000000..b84e05374
--- /dev/null
+++ b/kdepasswd/kdepasswd.desktop
@@ -0,0 +1,80 @@
+[Desktop Entry]
+Exec=kdepasswd
+Icon=password
+Type=Application
+Categories=Qt;KDE;Settings;
+NoDisplay=true
+X-DCOP-ServiceType=Unique
+Name=Change Password
+Name[af]=Verander Wagwoord
+Name[ar]=غيير كلمة المرور
+Name[be]=Змяніць пароль
+Name[bg]=Промяна на парола
+Name[bn]=পাসওয়ার্ড পরিবর্তন
+Name[br]=Kemmañ an Tremenger
+Name[bs]=Promijenite šifru
+Name[ca]=Canvia contrasenya
+Name[cs]=Změna hesla
+Name[csb]=Zmieni parolã
+Name[cy]=Newid Cyfrinair
+Name[da]=Ændr kodeord
+Name[de]=Passwort ändern
+Name[el]=Αλλαγή κωδικού πρόσβασης
+Name[eo]=Ŝanĝi pasvorton
+Name[es]=Cambiar la contraseña
+Name[et]=Parooli muutmine
+Name[eu]=Aldatu pasahitza
+Name[fa]=تغییر اسم رمز
+Name[fi]=Vaihda salasanaa
+Name[fr]=Modifier le mot de passe
+Name[fy]=Wachtwurd wizigje
+Name[ga]=Athraigh Focal Faire
+Name[gl]=Trocar Contrasinal
+Name[he]=שנה ססמאות
+Name[hi]=पासवर्ड बदलें
+Name[hr]=Promjena lozinke
+Name[hu]=Jelszóváltoztatás
+Name[is]=Breyta lykilorði
+Name[it]=Cambia password
+Name[ja]=パスワードを変更
+Name[ka]=პაროლის შეცვლა
+Name[kk]=Парольді өзгерту
+Name[km]=ផ្លាស់ប្ដូរ​ពាក្យ​សម្ងាត់
+Name[ko]=비밀번호 변경
+Name[lo]=เปลี่ยนรหัสผ่าน
+Name[lt]=Pakeiskite slaptažodį
+Name[lv]=Mainīt paroli
+Name[mk]=Измени лозинка
+Name[ms]=Ubah Kata Laluan
+Name[mt]=Ibdel Password
+Name[nb]=Endre passord
+Name[nds]=Passwoort ännern
+Name[ne]=पासवर्ड परिवर्तन गर्नुहोस्
+Name[nl]=Wachtwoord wijzigen
+Name[nn]=Endra passord
+Name[pa]=ਗੁਪਤ-ਕੋਡ ਤਬਦੀਲ
+Name[pl]=Zmień hasło
+Name[pt]=Mudar a Senha
+Name[pt_BR]=Modificar Senha
+Name[ro]=Schimbare parolă
+Name[ru]=Изменить пароль
+Name[rw]=Guhindura Ijambobanga
+Name[se]=Rievdat beassansáni
+Name[sk]=Zmena heslahesla
+Name[sl]=Spremeni geslo
+Name[sr]=Промени лозинку
+Name[sr@Latn]=Promeni lozinku
+Name[sv]=Ändra lösenord
+Name[ta]=கடவுச்சொல்லை மாற்று
+Name[te]=పాస్ వర్డు మార్చండి
+Name[tg]=Гузарвожаҳо
+Name[th]=เปลี่ยนรหัสผ่าน
+Name[tr]=Parola Değiştir
+Name[tt]=Sersüz Üzgärtü
+Name[uk]=Зміна пароля
+Name[uz]=Maxfiy soʻzni oʻzgartirish
+Name[uz@cyrillic]=Махфий сўзни ўзгартириш
+Name[vi]=Thay đổi Mật khẩu
+Name[wa]=Candjî d' sicret
+Name[zh_CN]=更改密码
+Name[zh_TW]=改變密碼
diff --git a/kdepasswd/passwd.cpp b/kdepasswd/passwd.cpp
new file mode 100644
index 000000000..903b2830f
--- /dev/null
+++ b/kdepasswd/passwd.cpp
@@ -0,0 +1,284 @@
+/* vi: ts=8 sts=4 sw=4
+ *
+ * $Id$
+ *
+ * This file is part of the KDE project, module kdesu.
+ * Copyright (C) 1999,2000 Geert Jansen <jansen@kde.org>
+ *
+ * passwd.cpp: Change a user's password.
+ */
+
+#include <config.h> // setenv
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <ctype.h>
+#include <pwd.h>
+#include <signal.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <qcstring.h>
+
+#include <kdebug.h>
+#include <kstandarddirs.h>
+
+#include <kdesu/process.h>
+#include "passwd.h"
+
+
+PasswdProcess::PasswdProcess(QCString user)
+{
+ struct passwd *pw;
+
+ if (user.isEmpty())
+ {
+ pw = getpwuid(getuid());
+ if (pw == 0L)
+ {
+ kdDebug(1512) << "You don't exist!\n";
+ return;
+ }
+ m_User = pw->pw_name;
+ } else
+ {
+ pw = getpwnam(user);
+ if (pw == 0L)
+ {
+ kdDebug(1512) << k_lineinfo << "User " << user << "does not exist.\n";
+ return;
+ }
+ m_User = user;
+ }
+ bOtherUser = (pw->pw_uid != getuid());
+}
+
+
+PasswdProcess::~PasswdProcess()
+{
+}
+
+
+int PasswdProcess::checkCurrent(const char *oldpass)
+{
+ return exec(oldpass, 0L, 1);
+}
+
+
+int PasswdProcess::exec(const char *oldpass, const char *newpass,
+ int check)
+{
+ if (m_User.isEmpty())
+ return -1;
+// if (check)
+// setTerminal(true);
+
+ // Try to set the default locale to make the parsing of the output
+ // of `passwd' easier.
+ setenv("LANG","C", true /* override */);
+
+ QCStringList args;
+ if(bOtherUser)
+ args += m_User;
+ int ret = PtyProcess::exec("passwd", args);
+ if (ret < 0)
+ {
+ kdDebug(1512) << k_lineinfo << "Passwd not found!\n";
+ return PasswdNotFound;
+ }
+
+ ret = ConversePasswd(oldpass, newpass, check);
+ if (ret < 0)
+ kdDebug(1512) << k_lineinfo << "Conversation with passwd failed. pid = " << pid() << endl;
+
+ if ((waitForChild() != 0) && !check)
+ return PasswordNotGood;
+
+ return ret;
+}
+
+
+/*
+ * The tricky thing is to make this work with a lot of different passwd
+ * implementations. We _don't_ want implementation specific routines.
+ * Return values: -1 = unknown error, 0 = ok, >0 = error code.
+ */
+
+int PasswdProcess::ConversePasswd(const char *oldpass, const char *newpass,
+ int check)
+{
+ QCString line, errline;
+ int state = 0;
+
+ while (state != 7)
+ {
+ line = readLine();
+ if (line.isNull())
+ {
+ return -1;
+ }
+
+ if (state == 0 && isPrompt(line, "new"))
+ // If root is changing a user's password,
+ // passwd can't prompt for the original password.
+ // Therefore, we have to start at state=2.
+ state=2;
+
+ switch (state)
+ {
+ case 0:
+ // Eat garbage, wait for prompt
+ m_Error += line+"\n";
+ if (isPrompt(line, "password"))
+ {
+ WaitSlave();
+ write(m_Fd, oldpass, strlen(oldpass));
+ write(m_Fd, "\n", 1);
+ state++;
+ break;
+ }
+ if (m_bTerminal)
+ fputs(line, stdout);
+ break;
+
+ case 1: case 3: case 6:
+ // Wait for \n
+ if (line.isEmpty())
+ {
+ state++;
+ break;
+ }
+ // error
+ return -1;
+
+ case 2:
+ m_Error = "";
+ if( line.contains("again"))
+ {
+ m_Error = line;
+ kill(m_Pid, SIGKILL);
+ waitForChild();
+ return PasswordIncorrect;
+ }
+ // Wait for second prompt.
+ errline = line; // use first line for error message
+ while (!isPrompt(line, "new"))
+ {
+ line = readLine();
+ if (line.isNull())
+ {
+ // We didn't get the new prompt so assume incorrect password.
+ if (m_bTerminal)
+ fputs(errline, stdout);
+ m_Error = errline;
+ return PasswordIncorrect;
+ }
+ }
+
+ // we have the new prompt
+ if (check)
+ {
+ kill(m_Pid, SIGKILL);
+ waitForChild();
+ return 0;
+ }
+ WaitSlave();
+ write(m_Fd, newpass, strlen(newpass));
+ write(m_Fd, "\n", 1);
+ state++;
+ break;
+
+ case 4:
+ // Wait for third prompt
+ if (isPrompt(line, "re"))
+ {
+ WaitSlave();
+ write(m_Fd, newpass, strlen(newpass));
+ write(m_Fd, "\n", 1);
+ state += 2;
+ break;
+ }
+ // Warning or error about the new password
+ if (m_bTerminal)
+ fputs(line, stdout);
+ m_Error = line + "\n";
+ state++;
+ break;
+
+ case 5:
+ // Wait for either a "Reenter password" or a "Enter password" prompt
+ if (isPrompt(line, "re"))
+ {
+ WaitSlave();
+ write(m_Fd, newpass, strlen(newpass));
+ write(m_Fd, "\n", 1);
+ state++;
+ break;
+ }
+ else if (isPrompt(line, "password"))
+ {
+ kill(m_Pid, SIGKILL);
+ waitForChild();
+ return PasswordNotGood;
+ }
+ if (m_bTerminal)
+ fputs(line, stdout);
+ m_Error += line + "\n";
+ break;
+ }
+ }
+
+ // Are we ok or do we still get an error thrown at us?
+ m_Error = "";
+ state = 0;
+ while (state != 1)
+ {
+ line = readLine();
+ if (line.isNull())
+ {
+ // No more input... OK
+ return 0;
+ }
+ if (isPrompt(line, "password"))
+ {
+ // Uh oh, another prompt. Not good!
+ kill(m_Pid, SIGKILL);
+ waitForChild();
+ return PasswordNotGood;
+ }
+ m_Error += line + "\n"; // Collect error message
+ }
+
+ kdDebug(1512) << k_lineinfo << "Conversation ended successfully.\n";
+ return 0;
+}
+
+
+bool PasswdProcess::isPrompt(QCString line, const char *word)
+{
+ unsigned i, j, colon;
+ unsigned int lineLength(line.length());
+ for (i=0,j=0,colon=0; i<lineLength; i++)
+ {
+ if (line[i] == ':')
+ {
+ j = i; colon++;
+ continue;
+ }
+ if (!isspace(line[i]))
+ j++;
+ }
+
+ if ((colon != 1) || (line[j] != ':'))
+ return false;
+ if (word == 0L)
+ return true;
+ return line.contains(word, false);
+}
+
+
diff --git a/kdepasswd/passwd.h b/kdepasswd/passwd.h
new file mode 100644
index 000000000..a0c27a5a9
--- /dev/null
+++ b/kdepasswd/passwd.h
@@ -0,0 +1,43 @@
+/* vi: ts=8 sts=4 sw=4
+ *
+ * $Id$
+ *
+ * This file is part of the KDE project, module kdesu.
+ * Copyright (C) 2000 Geert Jansen <jansen@kde.org>
+ */
+
+#ifndef __Passwd_h_Included__
+#define __Passwd_h_Included__
+
+#include <qcstring.h>
+#include <kdesu/process.h>
+
+/**
+ * A C++ API to passwd.
+ */
+
+class PasswdProcess
+ : public PtyProcess
+{
+public:
+ PasswdProcess(QCString user=0);
+ ~PasswdProcess();
+
+ enum Errors { PasswdNotFound=1, PasswordIncorrect, PasswordNotGood };
+
+ int checkCurrent(const char *oldpass);
+ int exec(const char *oldpass, const char *newpass, int check=0);
+
+ QCString error() { return m_Error; }
+
+private:
+ bool isPrompt(QCString line, const char *word=0L);
+ int ConversePasswd(const char *oldpass, const char *newpass,
+ int check);
+
+ QCString m_User, m_Error;
+ bool bOtherUser;
+};
+
+
+#endif // __Passwd_h_Included__
diff --git a/kdepasswd/passwddlg.cpp b/kdepasswd/passwddlg.cpp
new file mode 100644
index 000000000..5a3b48917
--- /dev/null
+++ b/kdepasswd/passwddlg.cpp
@@ -0,0 +1,169 @@
+/* vi: ts=8 sts=4 sw=4
+ *
+ * $Id$
+ *
+ * This file is part of the KDE project, module kdesu.
+ * Copyright (C) 2000 Geert Jansen <jansen@kde.org>
+ */
+
+#include <klocale.h>
+#include <kmessagebox.h>
+
+#include "passwd.h"
+#include "passwddlg.h"
+
+
+KDEpasswd1Dialog::KDEpasswd1Dialog()
+ : KPasswordDialog(Password, false, 0)
+{
+ setCaption(i18n("Change Password"));
+ setPrompt(i18n("Please enter your current password:"));
+}
+
+
+KDEpasswd1Dialog::~KDEpasswd1Dialog()
+{
+}
+
+
+bool KDEpasswd1Dialog::checkPassword(const char *password)
+{
+ PasswdProcess proc(0);
+
+ int ret = proc.checkCurrent(password);
+ switch (ret)
+ {
+ case -1:
+ {
+ QString msg = QString::fromLocal8Bit(proc.error());
+ if (!msg.isEmpty())
+ msg = "<p>\"<i>" + msg + "</i>\"";
+ msg = "<qt>" + i18n("Conversation with 'passwd' failed.") + msg;
+ KMessageBox::error(this, msg);
+ done(Rejected);
+ return false;
+ }
+
+ case 0:
+ return true;
+
+ case PasswdProcess::PasswdNotFound:
+ KMessageBox::error(this, i18n("Could not find the program 'passwd'."));
+ done(Rejected);
+ return false;
+
+ case PasswdProcess::PasswordIncorrect:
+ KMessageBox::sorry(this, i18n("Incorrect password. Please try again."));
+ return false;
+
+ default:
+ KMessageBox::error(this, i18n("Internal error: illegal return value "
+ "from PasswdProcess::checkCurrent."));
+ done(Rejected);
+ return false;
+ }
+}
+
+
+// static
+int KDEpasswd1Dialog::getPassword(QCString &password)
+{
+ KDEpasswd1Dialog *dlg = new KDEpasswd1Dialog();
+ int res = dlg->exec();
+ if (res == Accepted)
+ password = dlg->password();
+ delete dlg;
+ return res;
+}
+
+
+
+KDEpasswd2Dialog::KDEpasswd2Dialog(const char *oldpass, QCString user)
+ : KPasswordDialog(NewPassword, false, 0)
+{
+ m_Pass = oldpass;
+ m_User = user;
+
+ setCaption(i18n("Change Password"));
+ if (m_User.isEmpty())
+ setPrompt(i18n("Please enter your new password:"));
+ else
+ setPrompt(i18n("Please enter the new password for user <b>%1</b>:").arg(m_User));
+}
+
+
+KDEpasswd2Dialog::~KDEpasswd2Dialog()
+{
+}
+
+
+bool KDEpasswd2Dialog::checkPassword(const char *password)
+{
+ PasswdProcess proc(m_User);
+
+ if (strlen(password) > 8)
+ {
+ switch(KMessageBox::warningYesNoCancel(this,
+ m_User.isEmpty() ?
+ i18n("Your password is longer than 8 characters. On some "
+ "systems, this can cause problems. You can truncate "
+ "the password to 8 characters, or leave it as it is.") :
+ i18n("The password is longer than 8 characters. On some "
+ "systems, this can cause problems. You can truncate "
+ "the password to 8 characters, or leave it as it is.")
+ ,
+ i18n("Password Too Long"),
+ i18n("Truncate"),
+ i18n("Use as Is"),
+ "truncatePassword"))
+ {
+ case KMessageBox::Yes :
+ const_cast<char *>(password)[8] = '\000';
+ break;
+ case KMessageBox::No :
+ break;
+ default : return false;
+ }
+ }
+
+ int ret = proc.exec(m_Pass, password);
+ switch (ret)
+ {
+ case 0:
+ {
+ hide();
+ QString msg = QString::fromLocal8Bit(proc.error());
+ if (!msg.isEmpty())
+ msg = "<p>\"<i>" + msg + "</i>\"";
+ msg = "<qt>" + i18n("Your password has been changed.") + msg;
+ KMessageBox::information(0L, msg);
+ return true;
+ }
+
+ case PasswdProcess::PasswordNotGood:
+ {
+ QString msg = QString::fromLocal8Bit(proc.error());
+ if (!msg.isEmpty())
+ msg = "<p>\"<i>" + msg + "</i>\"";
+ msg = "<qt>" + i18n("Your password has not been changed.") + msg;
+
+ // The pw change did not succeed. Print the error.
+ KMessageBox::sorry(this, msg);
+ return false;
+ }
+
+ default:
+ QString msg = QString::fromLocal8Bit(proc.error());
+ if (!msg.isEmpty())
+ msg = "<p>\"<i>" + msg + "</i>\"";
+ msg = "<qt>" + i18n("Conversation with 'passwd' failed.") + msg;
+ KMessageBox::sorry(this, msg);
+ done(Rejected);
+ return true;
+ }
+
+ return true;
+}
+
+
+#include "passwddlg.moc"
diff --git a/kdepasswd/passwddlg.h b/kdepasswd/passwddlg.h
new file mode 100644
index 000000000..78ce4297a
--- /dev/null
+++ b/kdepasswd/passwddlg.h
@@ -0,0 +1,49 @@
+/* vi: ts=8 sts=4 sw=4
+ *
+ * $Id$
+ *
+ * This file is part of the KDE project, module kdesu.
+ * Copyright (C) 2000 Geert Jansen <jansen@kde.org>
+ */
+
+#ifndef __PasswdDlg_h_Incluced__
+#define __PasswdDlg_h_Incluced__
+
+#include <kpassdlg.h>
+
+class KDEpasswd1Dialog
+ : public KPasswordDialog
+{
+ Q_OBJECT
+
+public:
+ KDEpasswd1Dialog();
+ ~KDEpasswd1Dialog();
+
+ static int getPassword(QCString &password);
+
+protected:
+ bool checkPassword(const char *password);
+};
+
+
+class KDEpasswd2Dialog
+ : public KPasswordDialog
+{
+ Q_OBJECT
+
+public:
+ KDEpasswd2Dialog(const char *oldpass, QCString user);
+ ~KDEpasswd2Dialog();
+
+protected:
+ bool checkPassword(const char *password);
+
+private:
+ const char *m_Pass;
+ QCString m_User;
+};
+
+
+
+#endif // __PasswdDlg_h_Incluced__