Репозиторий ALT Linux backports/2.4
Последнее обновление: 9 июля 2008 | Пакетов: 497 | Посещений: 1493874
 поиск   регистрация   авторизация 
 
Группа :: Графические оболочки/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();
 }
 
design & coding: Vladimir Lettiev aka crux © 2004-2005