Группа :: Графические оболочки/KDE
Пакет: kdeadmin
Главная Изменения Спек Патчи Загрузить Bugs and FR
Патч: kdeadmin-3.2.3-alt_tcb.patch
diff -uNrp kdeadmin-3.2.3.old/kuser/addUser.cpp kdeadmin-3.2.3/kuser/addUser.cpp
--- kdeadmin-3.2.3.old/kuser/addUser.cpp 2004-06-07 11:41:47 +0400
+++ kdeadmin-3.2.3/kuser/addUser.cpp 2004-06-07 17:40:59 +0400
@@ -60,7 +60,8 @@ addUser::addUser(KUser *AUser, QWidget *
createhome->setChecked(true);
copyskel = new QCheckBox(i18n("Copy skeleton"), group);
usePrivateGroup = new QCheckBox(i18n("Use private group"), group);
- connect(createhome, SIGNAL(toggled(bool)), copyskel, SLOT(setEnabled(bool)));
+ copyskel->hide();
+ usePrivateGroup->hide();
frontlayout->addMultiCellWidget(group, frontrow, frontrow, 0, 2);
}
diff -uNrp kdeadmin-3.2.3.old/kuser/delUser.cpp kdeadmin-3.2.3/kuser/delUser.cpp
--- kdeadmin-3.2.3.old/kuser/delUser.cpp 2003-11-05 14:16:37 +0300
+++ kdeadmin-3.2.3/kuser/delUser.cpp 2004-06-07 17:40:59 +0400
@@ -35,6 +35,8 @@ delUser::delUser(KUser *AUser, QWidget *
QString mailboxpath = QString::fromLatin1("%1/%2").arg(QString::fromLatin1(MAIL_SPOOL_DIR)).arg(AUser->getName());
m_deleteMailBox = new QCheckBox(i18n("Delete &mailbox: %1").arg(mailboxpath), page);
setButtonText(Ok, i18n("&Delete"));
+ connect ( m_deleteHomeDir, SIGNAL(toggled(bool)), m_deleteMailBox, SLOT(setChecked(bool)) );
+ connect ( m_deleteMailBox, SIGNAL(toggled(bool)), m_deleteHomeDir, SLOT(setChecked(bool)) );
}
#include "delUser.moc"
diff -uNrp kdeadmin-3.2.3.old/kuser/kgroup.cpp kdeadmin-3.2.3/kuser/kgroup.cpp
--- kdeadmin-3.2.3.old/kuser/kgroup.cpp 2003-12-11 19:23:00 +0300
+++ kdeadmin-3.2.3/kuser/kgroup.cpp 2004-06-07 17:40:59 +0400
@@ -56,7 +56,7 @@
#define _KU_FIRST_GID 1001
#endif
-KGroup::KGroup() : pwd(QString::fromLatin1("*")) {
+KGroup::KGroup() : pwd(QString::fromLatin1("x")) {
gid = 0;
}
diff -uNrp kdeadmin-3.2.3.old/kuser/kuser.cpp kdeadmin-3.2.3/kuser/kuser.cpp
--- kdeadmin-3.2.3.old/kuser/kuser.cpp 2004-06-07 11:41:47 +0400
+++ kdeadmin-3.2.3/kuser/kuser.cpp 2004-06-07 17:40:59 +0400
@@ -51,6 +51,7 @@
#include <qstring.h>
#include <qdir.h>
+#include <qprocess.h>
#include "kglobal_.h"
#include "kuser.h"
@@ -58,6 +59,7 @@
#include <kstandarddirs.h>
#include <kmessagebox.h>
#include <kprocess.h>
+#include <kapplication.h>
#include "editDefaults.h"
#ifdef _KU_QUOTA
@@ -75,7 +77,7 @@
// class KUser
-KUser::KUser() : p_pwd(QString::fromLatin1("*")) {
+KUser::KUser() : p_pwd(QString::fromLatin1("x")) {
#if defined(__FreeBSD__) || defined(__bsdi__)
p_change = 0;
p_expire = 0;
@@ -93,6 +95,8 @@ KUser::KUser() : p_pwd(QString::fromLati
// s_flag = 0;
#endif
+ _typeFlag = Untouched;
+
isCreateHome = false;
isCreateMailBox = false;
isCopySkel = false;
@@ -621,9 +625,9 @@ bool KUsers::loadsdw() {
while ((spw = getspent())) { // read a shadow password structure
if ((up = lookup(QString::fromLocal8Bit(spw->sp_namp))) == NULL) {
- err->addMsg(i18n("No /etc/passwd entry for %1.\nEntry will be removed at the next `Save'-operation.")
- .arg(QString::fromLocal8Bit(spw->sp_namp)));
- err->display();
+// err->addMsg(i18n("No /etc/passwd entry for %1.\nEntry will be removed at the next `Save'-operation.")
+// .arg(QString::fromLocal8Bit(spw->sp_namp)));
+// err->display();
continue;
}
@@ -645,6 +649,9 @@ bool KUsers::loadsdw() {
}
bool KUsers::save() {
+ if (!doModify())
+ return FALSE;
+#if 0
if (!savepwd())
return FALSE;
@@ -656,11 +663,135 @@ bool KUsers::save() {
if (!doCreate())
return FALSE;
+#endif
+ return TRUE;
+}
+
+bool KUsers::doModify() {
+
+ for (unsigned int i=0; i<allUsers.count(); i++)
+ {
+ KUser *user = allUsers.at(i);
+
+ if ( user->type() == KUser::Untouched )
+ {
+ continue;
+ }
+
+ QString s1 = QString::fromLatin1("%1,%2,%3,%4")
+ .arg(user->getFullName())
+ .arg(user->getOffice1())
+ .arg(user->getOffice2())
+ .arg(user->getAddress());
+
+ for (int j=(s1.length()-1); j>=0; j--) {
+ if (s1[j] != ',')
+ break;
+ s1.truncate(j);
+ }
+
+ QDate expireDate(1970,1,1);
+ expireDate = expireDate.addDays(user->getExpire());
+
+ QProcess proc;
+ proc.clearArguments();
+ proc.readStderr();
+ proc.setCommunication(QProcess::Stderr);
+
+ switch(user->type())
+ {
+ case KUser::New:
+ case KUser::Modified:
+ if ( user->type() == KUser::New )
+ {
+ proc.addArgument( QString::fromLatin1("useradd") );
+ proc.addArgument( QString::fromLatin1("-g") + user->getName() );
+ if(user->getCreateHome())
+ proc.addArgument( QString::fromLatin1("-d") + user->getHomeDir() );
+ else
+ proc.addArgument( QString::fromLatin1("-M") );
+ }
+ else
+ {
+ proc.addArgument( QString::fromLatin1("usermod") );
+ proc.addArgument( QString::fromLatin1("-d") + user->getHomeDir() );
+ proc.addArgument( QString::fromLatin1("-m") );
+ }
+
+ proc.addArgument( QString::fromLatin1("").sprintf("-u%d", user->getUID()) );
+ proc.addArgument( QString::fromLatin1("-s") + user->getShell() );
+ if ( !user->getSPwd().isEmpty() )
+ proc.addArgument( QString::fromLatin1("-p") + user->getSPwd() );
+
+ if ( !s1.isEmpty() )
+ proc.addArgument( QString::fromLatin1("-c") + s1 );
+ if ( user->getExpire() > 0 )
+ proc.addArgument( QString::fromLatin1("-e") + expireDate.toString(QString::fromLatin1("yyyy-MM-dd")) );
+ break;
+
+ case KUser::Deleted:
+ user->removeCrontabs();
+ user->removeProcesses();
+ proc.addArgument( QString::fromLatin1("userdel") );
+
+ for (unsigned int i=0; i<usersToDelete.count(); i++)
+ {
+ KUser *duser = usersToDelete.at(i);
+ if ( duser->getName() == user->getName() )
+ {
+ if (duser->isDeleteHome)
+ {
+ proc.addArgument( QString::fromLatin1("-r") );
+ }
+ break;
+ }
+ }
+ break;
+
+ default:
+ continue;
+ }
+
+ proc.addArgument( user->getName() );
+
+ if ( user->type() == KUser::Deleted )
+ {
+ allUsers.remove(user);
+ usersToDelete.remove(user);
+ }
+ else
+ {
+ user->setType(KUser::Untouched);
+ }
+
+ fprintf(stderr, "start:\n%s\n", proc.arguments().join(QString::fromLatin1(" ")).latin1());
+
+ if ( !proc.start() ) {
+ KMessageBox::error( KApplication::activePopupWidget(), QString::fromLatin1("Could not start program:\n%1").arg(proc.arguments().first()) );
+ continue;
+ }
+
+ for(int i=0; proc.isRunning(); i++)
+ {
+ sleep(1);
+ }
+
+ if( proc.exitStatus() != 0 )
+ {
+ QString errout = QString(proc.readStderr());
+ QString text = (errout.isEmpty())?
+ QString::fromLatin1("Process %1 exited with status: %2").arg(proc.arguments().first().arg(proc.exitStatus()) )
+ :QString::fromLatin1("Process %1 return an error message:\n%2.").arg(proc.arguments().first()).arg(errout);
+ KMessageBox::error( KApplication::activePopupWidget(), text);
+ continue;
+ }
+ }
return TRUE;
}
bool KUsers::doCreate() {
+#if 0
QString h_dir;
@@ -692,10 +823,12 @@ bool KUsers::doCreate() {
}
}
+#endif
return TRUE;
}
bool KUsers::doDelete() {
+#if 0
uint ucnt = usersToDelete.count();
KUser *user;
@@ -711,12 +844,14 @@ bool KUsers::doDelete() {
usersToDelete.remove();
}
+#endif
return TRUE;
}
// Save password file
bool KUsers::savepwd() {
+#if 0
FILE *passwd_fd = NULL;
FILE *nispasswd_fd = NULL;
int minuid = 0;
@@ -890,12 +1025,14 @@ bool KUsers::savepwd() {
}
#endif
+#endif
return TRUE;
}
// Save shadow passwords file
bool KUsers::savesdw() {
+#if 0
#ifdef HAVE_SHADOW
QString tmp;
FILE *f;
@@ -951,6 +1088,7 @@ bool KUsers::savesdw() {
free(s.sp_namp);
free(s.sp_pwdp);
#endif // HAVE_SHADOW
+#endif
return TRUE;
}
@@ -1009,10 +1147,14 @@ void KUsers::del(KUser *au, bool deleteH
nu->isDeleteHome = deleteHome;
nu->isDeleteMailBox = deleteMailBox;
usersToDelete.append(nu);
- allUsers.remove(au);
+ if ( au->type() == KUser::New )
+ {
+ allUsers.remove(au);
+ }
}
int KUser::createHome() {
+#if 0
if(p_dir.isNull() || p_dir.isEmpty()) {
err->addMsg(i18n("Cannot create home folder for %1: it is null or empty\n").arg(p_name));
@@ -1039,10 +1181,12 @@ int KUser::createHome() {
err->display();
return(1);
}
+#endif
return(1);
}
int KUser::createKDE() {
+#if 0
QStringList levels;
QStringList types;
@@ -1093,11 +1237,13 @@ int KUser::createKDE() {
return(-1);
}
+#endif
return(0);
}
int KUser::tryCreate(const QString &dir) {
+#if 0
struct stat sb;
int rc = 0;
@@ -1157,9 +1303,11 @@ KMessageBox::Continue) {
return(-1);
}
}
+#endif
}
bool KUser::findKDE(const QString &dir) {
+#if 0
int kde_count = 0;
const QFileInfo *fi = NULL;
const QFileInfoList *list = NULL;
@@ -1183,9 +1331,12 @@ bool KUser::findKDE(const QString &dir)
return TRUE;
else
return FALSE;
+#endif
+ return TRUE;
}
int KUser::createMailBox() {
+#if 0
QString mailboxpath;
int fd;
mailboxpath = QString::fromLatin1("%1/%2").arg(QFile::decodeName(MAIL_SPOOL_DIR)).arg(p_name);
@@ -1217,10 +1368,12 @@ int KUser::createMailBox() {
return -1;
}
+#endif
return 0;
}
void KUser::copyDir(const QString &srcPath, const QString &dstPath) {
+#if 0
struct stat st;
QDir s(srcPath);
QDir d(dstPath);
@@ -1294,9 +1447,11 @@ void KUser::copyDir(const QString &srcPa
err->display();
}
}
+#endif
}
int KUser::copySkel() {
+#if 0
QDir s(QFile::decodeName(SKELDIR));
QDir d(p_dir);
@@ -1316,6 +1471,7 @@ int KUser::copySkel() {
copyDir(s.absPath(), d.absPath());
+#endif
return 0;
}
@@ -1324,6 +1480,7 @@ int KUser::copySkel() {
// for things we are know how to do is not a good idea
int KUser::removeHome() {
+#if 0
struct stat sb;
QString command;
@@ -1349,6 +1506,7 @@ int KUser::removeHome() {
err->display();
}
+#endif
return 0;
}
@@ -1358,7 +1516,7 @@ int KUser::removeCrontabs() {
QString file;
QString command;
- file = QString::fromLatin1("/var/cron/tabs/%1").arg(p_name);
+ file = QString::fromLatin1("/var/spool/cron/%1").arg(p_name);
if (access(QFile::encodeName(file), F_OK) == 0) {
command = QString::fromLatin1("crontab -u %1 -r").arg(KProcess::quote(p_name));
if (system(QFile::encodeName(command)) != 0) {
@@ -1367,11 +1525,11 @@ int KUser::removeCrontabs() {
err->display();
}
}
-
return 0;
}
int KUser::removeMailBox() {
+#if 0
QString file;
file = QString::fromLatin1("%1/%2").arg(QFile::decodeName(MAIL_SPOOL_DIR)).arg(p_name);
@@ -1381,6 +1539,7 @@ int KUser::removeMailBox() {
err->display();
}
+#endif
return 0;
}
diff -uNrp kdeadmin-3.2.3.old/kuser/kuser.h kdeadmin-3.2.3/kuser/kuser.h
--- kdeadmin-3.2.3.old/kuser/kuser.h 2003-12-11 19:23:00 +0300
+++ kdeadmin-3.2.3/kuser/kuser.h 2004-06-07 17:40:59 +0400
@@ -43,6 +43,22 @@ public:
KUser(const KUser *user);
~KUser();
+
+ enum TypeFlag
+ {
+ Untouched,
+ Modified,
+ New,
+ Deleted
+ };
+
+protected:
+ TypeFlag _typeFlag;
+public:
+
+ void setType(TypeFlag typeFlag) { _typeFlag = typeFlag; };
+ TypeFlag type() { return _typeFlag; };
+
void copy(const KUser *user);
QString getName() const;
@@ -233,6 +249,7 @@ protected:
QPtrList<KUser> allUsers;
QPtrList<KUser> usersToDelete;
+ bool doModify();
bool doCreate();
bool doDelete();
void fillGecos(KUser *user, const char *gecos);
diff -uNrp kdeadmin-3.2.3.old/kuser/mainView.cpp kdeadmin-3.2.3/kuser/mainView.cpp
--- kdeadmin-3.2.3.old/kuser/mainView.cpp 2004-06-07 11:41:47 +0400
+++ kdeadmin-3.2.3/kuser/mainView.cpp 2004-06-07 17:40:59 +0400
@@ -131,6 +131,7 @@ void mainView::userdel() {
if (!dlg.exec())
return;
+
#ifdef _KU_QUOTA
uint uid = user->getUID();
@@ -138,6 +139,11 @@ void mainView::userdel() {
kug->getQuotas().delQuota(uid);
#endif
+ if ( user->type() != KUser::New )
+ {
+ user->setType(KUser::Deleted);
+ }
+
kug->getUsers().del(user, dlg.getDeleteHomeDir(), dlg.getDeleteMailBox());
lbusers->removeItem(user);
@@ -272,6 +278,7 @@ void mainView::useradd() {
au.setUsePrivateGroup(config->readBoolEntry("userPrivateGroup", KU_USERPRIVATEGROUP));
if (au.exec() != 0) {
+ tk->setType(KUser::New);
if (au.getUsePrivateGroup()) {
KGroup *tg;
@@ -307,8 +314,8 @@ void mainView::save() {
if (!changed)
return;
- kug->getUsers().save();
kug->getGroups().save();
+ kug->getUsers().save();
#ifdef _KU_QUOTA
if (is_quota != 0)
kug->getQuotas().save();
@@ -422,6 +429,10 @@ void mainView::userSelected() {
if (editUser.exec() != 0) {
changed = true;
+ if( tmpKU->type() != KUser::New )
+ {
+ tmpKU->setType(KUser::Modified);
+ }
}
}
diff -uNrp kdeadmin-3.2.3.old/kuser/pwddlg.cpp kdeadmin-3.2.3/kuser/pwddlg.cpp
--- kdeadmin-3.2.3.old/kuser/pwddlg.cpp 2003-12-11 19:23:00 +0300
+++ kdeadmin-3.2.3/kuser/pwddlg.cpp 2004-06-07 17:40:59 +0400
@@ -76,6 +76,64 @@ pwddlg::~pwddlg() {
delete leusername2;
}
+// copy code from tcb-0.9.8.7
+#define IO_LOOP(LOOP_NAME, NAME, QUAL) \
+static int LOOP_NAME(int fd, QUAL char *buffer, int count) \
+{ \
+ int offset, block; \
+\
+ offset = 0; \
+ while (count > 0) { \
+ block = NAME(fd, &buffer[offset], count); \
+\
+ if (block < 0) { \
+ if (errno == EINTR) continue; \
+ return block; \
+ } \
+ if (!block) return offset; \
+\
+ offset += block; \
+ count -= block; \
+ } \
+\
+ return offset; \
+}
+//
+IO_LOOP(read_loop, read,)
+//
+char *do_crypt(const char *pass)
+{
+ char *salt;
+ void *data = NULL;
+ int size = 0;
+ char entropy[16];
+ int fd;
+
+ fd = open("/dev/urandom", O_RDONLY);
+ if (fd < 0) {
+ fprintf(stderr, "open urandom: %s", strerror(errno));
+ return NULL;
+ }
+ if (read_loop(fd, entropy, sizeof(entropy)) != sizeof(entropy)) {
+ fprintf(stderr, "read urandom: %s", strerror(errno));
+ close(fd);
+ return NULL;
+ }
+ close(fd);
+
+ salt = crypt_gensalt_ra("$2a$",
+ 8, entropy, sizeof(entropy));
+
+ memset(entropy, 0, sizeof(entropy));
+
+ if (!salt) {
+ fprintf(stderr, "crypt_gensalt_ra: %s", strerror(errno));
+ return NULL;
+ }
+
+ return crypt_ra(pass, salt, &data, &size);
+}
+
void pwddlg::slotOk() {
char salt[3];
char tmp[128];
@@ -94,7 +152,7 @@ void pwddlg::slotOk() {
salt[1] = set[kapp->random() % strlen(set)];
salt[2] = 0;
- strcpy(tmp, crypt(QFile::encodeName(leusername1->text()), salt));
+ strcpy(tmp, do_crypt(QFile::encodeName(leusername1->text())));
#ifdef HAVE_SHADOW
if (is_shadow != 0) {
diff -uNrp kdeadmin-3.2.3.old/kuser/userDefaultsPage.cpp kdeadmin-3.2.3/kuser/userDefaultsPage.cpp
--- kdeadmin-3.2.3.old/kuser/userDefaultsPage.cpp 2003-12-11 19:23:00 +0300
+++ kdeadmin-3.2.3/kuser/userDefaultsPage.cpp 2004-06-07 17:40:59 +0400
@@ -68,10 +68,12 @@ userDefaultsPage::userDefaultsPage(
copySkel = new QCheckBox(i18n("Copy skeleton to home folder"), this);
copySkel->setFixedSize(copySkel->sizeHint());
+ copySkel->hide();
tl->addWidget(copySkel, 0, AlignLeft);
userPrivateGroup = new QCheckBox(i18n("User private group"), this);
userPrivateGroup->setFixedSize(userPrivateGroup->sizeHint());
+ userPrivateGroup->hide();
tl->addWidget(userPrivateGroup, 0, AlignLeft);
tl->activate();
}