Source Code (Use browser search to find items of interest.)
Class Index
kuser'KUsers (./kdeadmin/kuser/kuser.h:159)
class KUsers {
public:
KUsers();
~KUsers();
KUser *lookup(const char *name);
KUser *lookup(uid_t uid);
uid_t first_free();
bool load();
bool save();
KUser *first();
KUser *next();
uint count() const;
KUser *operator[](uint num);
void add(KUser *ku);
void del(KUser *au);
protected:
bool p_backuped;
bool s_backuped;
mode_t pwd_mode;
mode_t sdw_mode;
uid_t pwd_uid;
gid_t pwd_gid;
uid_t sdw_uid;
gid_t sdw_gid;
QList<KUser> u;
QList<KUser> du;
bool doCreate();
bool doDelete();
void fillGecos(KUser *user, const char *gecos);
bool loadpwd();
bool loadsdw();
bool savepwd();
bool savesdw();
};
kuser'KUsers::KUsers() (./kdeadmin/kuser/kuser.cpp:356)
KUsers::KUsers() {
p_backuped = FALSE;
s_backuped = FALSE;
pwd_mode = 0644;
pwd_uid = 0;
pwd_gid = 0;
sdw_mode = 0600;
sdw_uid = 0;
sdw_gid = 0;
u.setAutoDelete(TRUE);
du.setAutoDelete(TRUE);
if (!load())
err->display();
}
kuser'KUsers::fillGecos() (./kdeadmin/kuser/kuser.cpp:375)
void KUsers::fillGecos(KUser *user, const char *gecos) {
int no = 0;
const char *s = gecos;
const char *pos = NULL;
// At least one part of the string exists
for(;;) {
pos = strchr(s, ',');
char val[200];
if(pos == NULL)
strcpy(val, s);
else {
strncpy(val, s, (int)(pos-s));
val[(int)(pos-s)] = 0;
}
switch(no) {
case 0: user->setFullName(val); break;
#ifdef __FreeBSD__
case 1: user->setOffice(val); break;
case 2: user->setWorkPhone(val); break;
case 3: user->setHomePhone(val); break;
#else
case 1: user->setOffice1(val); break;
case 2: user->setOffice2(val); break;
case 3: user->setAddress(val); break;
#endif
}
if(pos == NULL) break;
s = pos+1;
no++;
}
}
kuser'KUsers::load() (./kdeadmin/kuser/kuser.cpp:408)
bool KUsers::load() {
if (!loadpwd())
return FALSE;
if (!loadsdw())
return FALSE;
return TRUE;
}
// Load passwd file
kuser'KUsers::loadpwd() (./kdeadmin/kuser/kuser.cpp:420)
bool KUsers::loadpwd() {
passwd *p;
KUser *tmpKU = 0;
// Start reading passwd file
struct stat st;
stat(PASSWORD_FILE, &st);
pwd_mode = st.st_mode & 0666;
pwd_uid = st.st_uid;
pwd_gid = st.st_gid;
// We are reading our PASSWORD_FILE
QString tmp;
#ifdef HAVE_FGETPWENT
FILE *fpwd = fopen(PASSWORD_FILE, "r");
if(fpwd == NULL) {
err->addMsg(i18n("Error opening %1 for reading").arg(PASSWORD_FILE));
return FALSE;
}
while ((p = fgetpwent(fpwd)) != NULL) {
#else
while ((p = getpwent()) != NULL) {
#endif
#ifdef _KU_QUOTA
kug->getQuotas().addQuota(p->pw_uid);
#endif
tmpKU = new KUser();
tmpKU->setUID(p->pw_uid);
tmpKU->setGID(p->pw_gid);
tmpKU->setName(p->pw_name);
tmpKU->setPwd(p->pw_passwd);
tmpKU->setHomeDir(p->pw_dir);
tmpKU->setShell(p->pw_shell);
#ifdef __FreeBSD__
tmpKU->setClass(p->pw_class);
tmpKU->setLastChange(p->pw_change);
tmpKU->setExpire(p->pw_expire);
#endif
if ((p->pw_gecos != 0) && (p->pw_gecos[0] != 0))
fillGecos(tmpKU, p->pw_gecos);
u.append(tmpKU);
}
// End reading passwd file
#ifdef HAVE_FGETPWENT
fclose(fpwd);
#endif
return (TRUE);
}
// Load shadow passwords
kuser'KUsers::loadsdw() (./kdeadmin/kuser/kuser.cpp:479)
bool KUsers::loadsdw() {
#ifdef _KU_SHADOW
QString tmp;
struct spwd *spw;
KUser *up = NULL;
FILE *f;
struct stat st;
if (!is_shadow)
return TRUE;
stat(SHADOW_FILE, &st);
sdw_mode = st.st_mode & 0666;
sdw_uid = st.st_uid;
sdw_gid = st.st_gid;
if ((f = fopen(SHADOW_FILE, "r")) == NULL) {
is_shadow = 0;
printf("Shadow file missing detected\n");
return TRUE;
}
fclose(f);
setspent();
while ((spw = getspent())) { // read a shadow password structure
if ((up = lookup(spw->sp_namp)) == NULL) {
err->addMsg(i18n("No /etc/passwd entry for %1.\nEntry will be removed at the next `Save'-operation.")
.arg(spw->sp_namp));
err->display();
continue;
}
up->setSPwd(spw->sp_pwdp); // cp the encrypted pwd
up->setLastChange(spw->sp_lstchg);
up->setMin(spw->sp_min);
up->setMax(spw->sp_max);
#ifndef _SCO_DS
up->setWarn(spw->sp_warn);
up->setInactive(spw->sp_inact);
up->setExpire(spw->sp_expire);
up->setFlag(spw->sp_flag);
#endif
}
endspent();
#endif // _KU_SHADOW
return TRUE;
}
kuser'KUsers::save() (./kdeadmin/kuser/kuser.cpp:531)
bool KUsers::save() {
if (!savepwd())
return FALSE;
if (!savesdw())
return FALSE;
if (!doDelete())
return FALSE;
if (!doCreate())
return FALSE;
return TRUE;
}
kuser'KUsers::doCreate() (./kdeadmin/kuser/kuser.cpp:547)
bool KUsers::doCreate() {
for (unsigned int i=0; i<u.count(); i++) {
KUser *user = u.at(i);
if(user->getCreateMailBox()) {
user->createMailBox();
user->setCreateMailBox(0);
}
if(user->getCreateHome()) {
user->createHome();
user->setCreateHome(0);
}
if(user->getCopySkel()) {
user->copySkel();
user->setCopySkel(0);
}
}
return TRUE;
}
kuser'KUsers::doDelete() (./kdeadmin/kuser/kuser.cpp:570)
bool KUsers::doDelete() {
for (unsigned int i=0; i<du.count(); i++) {
KUser *user = du.at(i);
user->removeHome();
user->removeCrontabs();
user->removeMailBox();
user->removeProcesses();
du.remove(i);
}
return TRUE;
}
// Save password file
kuser'KUsers::savepwd() (./kdeadmin/kuser/kuser.cpp:587)
bool KUsers::savepwd() {
FILE *passwd;
QString s;
QString s1;
QString tmp;
if (!p_backuped) {
backup(PASSWORD_FILE);
p_backuped = TRUE;
}
umask(0077);
if ((passwd = fopen(PASSWORD_FILE,"w")) == NULL) {
err->addMsg(i18n("Error opening %1 for writing").arg(PASSWORD_FILE));
return FALSE;
}
for (unsigned int i=0; i<u.count(); i++) {
KUser *user = u.at(i);
#ifdef __FreeBSD__
s = QString("%1:%2:%3:%4:%5:%6:%7:")
.arg(user->getName())
.arg(user->getPwd())
.arg(user->getUID())
.arg(user->getGID())
.arg(user->getClass())
.arg(user->getLastChange())
.arg(user->getExpire());
s1 = QString("%1,%2,%3,%4")
.arg(user->getFullName())
.arg(user->getOffice())
.arg(user->getWorkPhone())
.arg(user->getHomePhone());
#else
s = QString("%1:%2:%3:%4:")
.arg(user->getName())
.arg(user->getPwd())
.arg(user->getUID())
.arg(user->getGID());
s1 = QString("%1,%2,%3,%4")
.arg(user->getFullName())
.arg(user->getOffice1())
.arg(user->getOffice2())
.arg(user->getAddress());
#endif
for (int j=(s1.length()-1); j>=0; j--) {
if (s1[j] != ',')
break;
s1.truncate(j);
}
s += s1+":"+user->getHomeDir()+":"+user->getShell()+"\n";
fputs((const char *)s, passwd);
}
fclose(passwd);
chmod(PASSWORD_FILE, pwd_mode);
chown(PASSWORD_FILE, pwd_uid, pwd_gid);
#ifdef PWMKDB
// need to run a utility program to build /etc/passwd, /etc/pwd.db
// and /etc/spwd.db from /etc/master.passwd
if (system(PWMKDB) != 0) {
err->addMsg(i18n("Unable to build password database"), STOP);
return FALSE;
}
#endif
return TRUE;
}
// Save shadow passwords file
kuser'KUsers::savesdw() (./kdeadmin/kuser/kuser.cpp:669)
bool KUsers::savesdw() {
#ifdef _KU_SHADOW
QString tmp;
FILE *f;
struct spwd *spwp;
struct spwd s;
KUser *up;
if (!is_shadow)
return TRUE;
if (!s_backuped) {
backup(SHADOW_FILE);
s_backuped = TRUE;
}
umask(0077);
if ((f = fopen(SHADOW_FILE, "w")) == NULL) {
err->addMsg(i18n("Error opening %1 for writing").arg(SHADOW_FILE));
return FALSE;
}
s.sp_namp = (char *)malloc(200);
s.sp_pwdp = (char *)malloc(200);
for (uint index = 0; index < u.count(); index++) {
up = u.at(index);
if (!(const char *)up->getSPwd()) {
err->addMsg(i18n("No shadow entry for %1.").arg(up->getName()));
continue;
}
strncpy(s.sp_namp, (const char *)up->getName(), 200);
strncpy(s.sp_pwdp, (const char *)up->getSPwd(), 200);
s.sp_lstchg = up->getLastChange();
s.sp_min = up->getMin();
s.sp_max = up->getMax();
#ifndef _SCO_DS
s.sp_warn = up->getWarn();
s.sp_inact = up->getInactive();
s.sp_expire = up->getExpire();
s.sp_flag = up->getFlag();
#endif
spwp = &s;
putspent(spwp, f);
}
fclose(f);
chmod(SHADOW_FILE, sdw_mode);
chown(SHADOW_FILE, sdw_uid, sdw_gid);
free(s.sp_namp);
free(s.sp_pwdp);
#endif // _KU_SHADOW
return TRUE;
}
kuser'KUsers::lookup() (./kdeadmin/kuser/kuser.cpp:727)
KUser *KUsers::lookup(const char *name) {
for (uint i = 0; i<u.count(); i++)
if (u.at(i)->getName() == name)
return (u.at(i));
return NULL;
}
kuser'KUsers::lookup() (./kdeadmin/kuser/kuser.cpp:734)
KUser *KUsers::lookup(uid_t uid) {
for (uint i = 0; i<u.count(); i++)
if (u.at(i)->getUID() == uid)
return (u.at(i));
return NULL;
}
kuser'KUsers::first_free() (./kdeadmin/kuser/kuser.cpp:741)
uid_t KUsers::first_free() {
uid_t t = _KU_FIRST_UID ;
for (t = _KU_FIRST_UID ; t<65534; t++)
if (lookup(t) == NULL)
return t;
err->addMsg(i18n("You have more than 65534 users!?!? You have ran out of uid space!"));
return (-1);
}
kuser'KUsers::~KUsers() (./kdeadmin/kuser/kuser.cpp:752)
KUsers::~KUsers() {
u.clear();
du.clear();
}
kuser'KUsers::count() (./kdeadmin/kuser/kuser.cpp:757)
uint KUsers::count() const {
return u.count();
}
kuser'KUsers::first() (./kdeadmin/kuser/kuser.cpp:765)
KUser *KUsers::first() {
return u.first();
}
kuser'KUsers::next() (./kdeadmin/kuser/kuser.cpp:769)
KUser *KUsers::next() {
return u.next();
}
kuser'KUsers::add() (./kdeadmin/kuser/kuser.cpp:773)
void KUsers::add(KUser *ku) {
u.append(ku);
}
kuser'KUsers::del() (./kdeadmin/kuser/kuser.cpp:777)
void KUsers::del(KUser *au) {
KUser *nu = new KUser(au);
du.append(nu);
u.remove(au);
}