Source Code (Use browser search to find items of interest.)

Class Index

kuser'KUser (./kdeadmin/kuser/kuser.h:21)

class KUser {
public:
  KUser();
  KUser(const KUser *user);
  ~KUser();

  void copy(const KUser *user);

  const QString &getName() const;
  const QString &getPwd() const;
  const QString &getHomeDir() const;
  const QString &getShell() const;
  const QString &getFullName() const;

  uid_t getUID() const;
  uid_t getGID() const;

#ifdef __FreeBSD__
  const QString &getOffice() const;
  const QString &getWorkPhone() const;
  const QString &getHomePhone() const;
  const QString &getClass() const;
  time_t getLastChange() const;
  time_t getExpire() const;
#else
  const QString &getOffice1() const;
  const QString &getOffice2() const;
  const QString &getAddress() const;

#endif

#ifdef _KU_SHADOW
  const QString &getSPwd() const;
  long getLastChange() const;
  int getMin() const;
  int getMax() const;
  int getWarn() const;
  int getInactive() const;
  int getExpire() const;
  int getFlag() const;
#endif

  void setName(const QString &data);
  void setPwd(const QString &data);
  void setHomeDir(const QString &data);
  void setShell(const QString &data);
  void setFullName(const QString &data);

  void setUID(uid_t data);
  void setGID(uid_t data);

#ifdef __FreeBSD__
  void setOffice(const QString &data);
  void setWorkPhone(const QString &data);
  void setHomePhone(const QString &data);
  void setClass(const QString &data);
  void setExpire(time_t data);
  void setLastChange(time_t data);
#else
  void setOffice1(const QString &data);
  void setOffice2(const QString &data);
  void setAddress(const QString &data);
#endif

#ifdef _KU_SHADOW
  void setSPwd(const QString &data);
  void setLastChange(long data);
  void setMin(int data);
  void setMax(int data);
  void setWarn(int data);
  void setInactive(int data);
  void setExpire(int data);
  void setFlag(int data);
#endif

  int getCreateHome();
  int getCreateMailBox();
  int getCopySkel();

  void setCreateHome(int data);
  void setCreateMailBox(int data);
  void setCopySkel(int data);

protected:
  friend KUsers;

  void createHome();
  int createMailBox();
  int copySkel();

  int removeHome();
  int removeCrontabs();
  int removeMailBox();
  int removeProcesses();

  void copyDir(const QString &srcPath, const QString &dstPath);

  QString
    p_name,                        // parsed pw information
    p_pwd,
    p_dir,
    p_shell,
    p_fname,                        // parsed comment information
#ifdef __FreeBSD__
    p_office,
    p_ophone,
    p_hphone,
    p_class;
  time_t
    p_change,
    p_expire;
#else
    p_office1,
    p_office2,
    p_address;
#endif
  uid_t p_uid;
  gid_t p_gid;

#ifdef _KU_SHADOW
  QString
    s_pwd;                         // parsed shadow information
  long
    s_lstchg;                      // last password change
  signed int
    s_min,                         // days until pwchange allowed.
    s_max,                         // days before change required 
    s_warn,                        // days warning for expiration 
    s_inact,                       // days before  account  inactive
    s_expire,                      // date when account expires 
    s_flag;                        // reserved for future use
#endif
  int
    isCreateHome,              // create homedir
    isCreateMailBox,           // create mailbox
    isCopySkel;                // copy skeleton
};


kuser'KUser::KUser() (./kdeadmin/kuser/kuser.cpp:52)

KUser::KUser() : p_pwd("*") {
#ifdef __FreeBSD__
  p_change = 0;
  p_expire = 0;
#endif
  p_uid     = 0;
  p_gid     = 100;

#ifdef _KU_SHADOW   
  s_lstchg  = 0;
  s_min     = 0;
  s_max     = -1;
  s_warn    = 7;
  s_inact   = -1;
  s_expire  = 99999;
  s_flag    = 0;
#endif

  isCreateHome = 0;
  isCreateMailBox = 0;
  isCopySkel = 0;
}
  

kuser'KUser::KUser() (./kdeadmin/kuser/kuser.cpp:75)

KUser::KUser(const KUser *user) {
  copy(user);
}


kuser'KUser::copy() (./kdeadmin/kuser/kuser.cpp:79)

void KUser::copy(const KUser *user) {
  p_name = user->p_name;
  p_pwd = user->p_pwd;
  p_dir = user->p_dir;
  p_shell = user->p_shell;
  p_fname = user->p_fname;
#ifdef __FreeBSD__
  p_office = user->p_office;
  p_ophone = user->p_ophone;
  p_hphone = user->p_hphone;
  p_class = user->p_class;
  p_change = user->p_change;
  p_expire = user->p_expire;
#else
  p_office1 = user->p_office1;
  p_office2 = user->p_office2;
  p_address = user->p_address;
#endif
  p_uid     = user->p_uid;
  p_gid     = user->p_gid;

#ifdef _KU_SHADOW   
  s_pwd = user->s_pwd;
  s_lstchg  = user->s_lstchg;
  s_min     = user->s_min;
  s_max     = user->s_max;
  s_warn    = user->s_warn;
  s_inact   = user->s_inact;
  s_expire  = user->s_expire;
  s_flag    = user->s_flag;
#endif

  isCreateHome = user->isCreateHome;
  isCreateMailBox = user->isCreateMailBox;
  isCopySkel = user->isCopySkel;
}
  

kuser'KUser::~KUser() (./kdeadmin/kuser/kuser.cpp:116)

KUser::~KUser() {
}


kuser'KUser::getCreateHome() (./kdeadmin/kuser/kuser.cpp:119)

int KUser::getCreateHome() {
  return isCreateHome;
}


kuser'KUser::getCreateMailBox() (./kdeadmin/kuser/kuser.cpp:123)

int KUser::getCreateMailBox() {
  return isCreateMailBox;
}


kuser'KUser::getCopySkel() (./kdeadmin/kuser/kuser.cpp:127)

int KUser::getCopySkel() {
  return isCopySkel;
}


kuser'KUser::getName() (./kdeadmin/kuser/kuser.cpp:131)

const QString &KUser::getName() const {
  return p_name;
}


kuser'KUser::getPwd() (./kdeadmin/kuser/kuser.cpp:135)

const QString &KUser::getPwd() const {
  return p_pwd;
}


kuser'KUser::getHomeDir() (./kdeadmin/kuser/kuser.cpp:139)

const QString &KUser::getHomeDir() const {
  return p_dir;
}


kuser'KUser::getShell() (./kdeadmin/kuser/kuser.cpp:143)

const QString &KUser::getShell() const {
  return p_shell;
}


kuser'KUser::getFullName() (./kdeadmin/kuser/kuser.cpp:147)

const QString &KUser::getFullName() const {
  return p_fname;
}

#ifdef __FreeBSD__
// FreeBSD apparently uses the GECOS fields differently than other Unices.
// Create some better named functions to make the FreeBSD code clear

kuser'KUser::getOffice() (./kdeadmin/kuser/kuser.cpp:154)

const QString &KUser::getOffice() const {
  return p_office;
}


kuser'KUser::getWorkPhone() (./kdeadmin/kuser/kuser.cpp:158)

const QString &KUser::getWorkPhone() const {
  return p_ophone;
}


kuser'KUser::getHomePhone() (./kdeadmin/kuser/kuser.cpp:162)

const QString &KUser::getHomePhone() const {
  return p_hphone;
}

// New fields needed for the FreeBSD /etc/master.passwd file

kuser'KUser::getClass() (./kdeadmin/kuser/kuser.cpp:167)

const QString &KUser::getClass() const {
  return p_class;
}


kuser'KUser::getLastChange() (./kdeadmin/kuser/kuser.cpp:171)

time_t KUser::getLastChange() const {
  return p_change;
}


kuser'KUser::getExpire() (./kdeadmin/kuser/kuser.cpp:175)

time_t KUser::getExpire() const {
  return p_expire;
}

kuser'KUser::getOffice1() (./kdeadmin/kuser/kuser.cpp:181)

const QString &KUser::getOffice1() const {
  return p_office1;
}


kuser'KUser::getOffice2() (./kdeadmin/kuser/kuser.cpp:185)

const QString &KUser::getOffice2() const {
  return p_office2;
}


kuser'KUser::getAddress() (./kdeadmin/kuser/kuser.cpp:189)

const QString &KUser::getAddress() const {
  return p_address;
}

kuser'KUser::getUID() (./kdeadmin/kuser/kuser.cpp:195)

uid_t KUser::getUID() const {
  return p_uid;
}


kuser'KUser::getGID() (./kdeadmin/kuser/kuser.cpp:199)

gid_t KUser::getGID() const {
  return p_gid;
}

kuser'KUser::getSPwd() (./kdeadmin/kuser/kuser.cpp:204)

const QString &KUser::getSPwd() const {
  return s_pwd;
}


kuser'KUser::getLastChange() (./kdeadmin/kuser/kuser.cpp:208)

long KUser::getLastChange() const {
  return s_lstchg;
}


kuser'KUser::getMin() (./kdeadmin/kuser/kuser.cpp:212)

int KUser::getMin() const {
  return s_min;
}


kuser'KUser::getMax() (./kdeadmin/kuser/kuser.cpp:216)

int KUser::getMax() const {
  return s_max;
}


kuser'KUser::getWarn() (./kdeadmin/kuser/kuser.cpp:220)

int KUser::getWarn() const {
  return s_warn;
}


kuser'KUser::getInactive() (./kdeadmin/kuser/kuser.cpp:224)

int KUser::getInactive() const {
  return s_inact;
}


kuser'KUser::getExpire() (./kdeadmin/kuser/kuser.cpp:228)

int KUser::getExpire() const {
  return s_expire;
}


kuser'KUser::getFlag() (./kdeadmin/kuser/kuser.cpp:232)

int KUser::getFlag() const {
  return s_flag;
}

kuser'KUser::setName() (./kdeadmin/kuser/kuser.cpp:237)

void KUser::setName(const QString &data) {
  p_name = data;
}


kuser'KUser::setPwd() (./kdeadmin/kuser/kuser.cpp:241)

void KUser::setPwd(const QString &data) {
  p_pwd = data;
}


kuser'KUser::setHomeDir() (./kdeadmin/kuser/kuser.cpp:245)

void KUser::setHomeDir(const QString &data) {
  p_dir = data;
}


kuser'KUser::setShell() (./kdeadmin/kuser/kuser.cpp:249)

void KUser::setShell(const QString &data) {
  p_shell = data;
}


kuser'KUser::setFullName() (./kdeadmin/kuser/kuser.cpp:253)

void KUser::setFullName(const QString &data) {
  p_fname = data;
}

#ifdef __FreeBSD__
// FreeBSD apparently uses the GECOS fields differently than other Unices.
// Create some better named functions to make the FreeBSD code clear

kuser'KUser::setOffice() (./kdeadmin/kuser/kuser.cpp:260)

void KUser::setOffice(const QString &data) {
  p_office = data;
}


kuser'KUser::setWorkPhone() (./kdeadmin/kuser/kuser.cpp:264)

void KUser::setWorkPhone(const QString &data) {
  p_ophone = data;
}


kuser'KUser::setHomePhone() (./kdeadmin/kuser/kuser.cpp:268)

void KUser::setHomePhone(const QString &data) {
  p_hphone = data;
}

// New fields needed for the FreeBSD /etc/master.passwd file

kuser'KUser::setClass() (./kdeadmin/kuser/kuser.cpp:273)

void KUser::setClass(const QString &data) {
  p_class = data;
}


kuser'KUser::setLastChange() (./kdeadmin/kuser/kuser.cpp:277)

void KUser::setLastChange(time_t data) {
  p_change = data;
}


kuser'KUser::setExpire() (./kdeadmin/kuser/kuser.cpp:281)

void KUser::setExpire(time_t data) {
  p_expire = data;
}

kuser'KUser::setOffice1() (./kdeadmin/kuser/kuser.cpp:287)

void KUser::setOffice1(const QString &data) {
  p_office1 = data;
}


kuser'KUser::setOffice2() (./kdeadmin/kuser/kuser.cpp:291)

void KUser::setOffice2(const QString &data) {
  p_office2 = data;
}


kuser'KUser::setAddress() (./kdeadmin/kuser/kuser.cpp:295)

void KUser::setAddress(const QString &data) {
  p_address = data;
}

kuser'KUser::setUID() (./kdeadmin/kuser/kuser.cpp:301)

void KUser::setUID(uid_t data) {
  p_uid = data;
}


kuser'KUser::setGID() (./kdeadmin/kuser/kuser.cpp:305)

void KUser::setGID(gid_t data) {
  p_gid = data;
}

kuser'KUser::setSPwd() (./kdeadmin/kuser/kuser.cpp:310)

void KUser::setSPwd(const QString &data) {
  s_pwd = data;
}


kuser'KUser::setLastChange() (./kdeadmin/kuser/kuser.cpp:314)

void KUser::setLastChange(long data) {
  s_lstchg = data;
}


kuser'KUser::setMin() (./kdeadmin/kuser/kuser.cpp:318)

void KUser::setMin(int data) {
  s_min = data;
}


kuser'KUser::setMax() (./kdeadmin/kuser/kuser.cpp:322)

void KUser::setMax(int data) {
  s_max = data;
}


kuser'KUser::setWarn() (./kdeadmin/kuser/kuser.cpp:326)

void KUser::setWarn(int data) {
  s_warn = data;
}


kuser'KUser::setInactive() (./kdeadmin/kuser/kuser.cpp:330)

void KUser::setInactive(int data) {
  s_inact = data;
}


kuser'KUser::setExpire() (./kdeadmin/kuser/kuser.cpp:334)

void KUser::setExpire(int data) {
  s_expire = data;
}


kuser'KUser::setFlag() (./kdeadmin/kuser/kuser.cpp:338)

void KUser::setFlag(int data) {
  s_flag = data;
}

kuser'KUser::setCreateHome() (./kdeadmin/kuser/kuser.cpp:344)

void KUser::setCreateHome(int data) {
  isCreateHome = data;
}


kuser'KUser::setCreateMailBox() (./kdeadmin/kuser/kuser.cpp:348)

void KUser::setCreateMailBox(int data) {
  isCreateMailBox = data;
}


kuser'KUser::setCopySkel() (./kdeadmin/kuser/kuser.cpp:352)

void KUser::setCopySkel(int data) {
  isCopySkel = data;
}


kuser'KUser::createHome() (./kdeadmin/kuser/kuser.cpp:783)

void KUser::createHome() {
  QDir d = QDir::root();

  if (d.cd(p_dir)) {
    err->addMsg(i18n("Directory %1 already exists").arg(p_dir));
    err->display();
  }

  if (mkdir((const char *)p_dir, 0700) != 0) {
    err->addMsg(i18n("Cannot create home directory\nError: %1").arg(strerror(errno)));
    err->display();
  }

  if (chown((const char *)p_dir, p_uid, p_gid) != 0) {
    err->addMsg(i18n("Cannot change owner of home directory\nError: %1").arg(strerror(errno)));
    err->display();
  }

  if (chmod((const char *)p_dir, KU_HOMEDIR_PERM) != 0) {
    err->addMsg(i18n("Cannot change permissions on home directory\nError: %1").arg(strerror(errno)));
    err->display();
  }
}


kuser'KUser::createMailBox() (./kdeadmin/kuser/kuser.cpp:807)

int KUser::createMailBox() {
  QString mailboxpath;
  int fd;
  mailboxpath = QString("%1/%2").arg(MAIL_SPOOL_DIR).arg(p_name);
  if((fd = open((const char *)mailboxpath, O_CREAT|O_EXCL|O_WRONLY,
                S_IRUSR|S_IWUSR)) < 0) {
    err->addMsg(i18n("Cannot create %1: %2")
                .arg(mailboxpath)
                .arg(strerror(errno)));
    err->display();
    return -1;
  }

  close(fd);

  if (chown((const char *)mailboxpath, p_uid, KU_MAILBOX_GID) != 0) {
    err->addMsg(i18n("Cannot change owner on mailbox: %1\nError: %2")
                .arg(mailboxpath).arg(strerror(errno)));
    err->display();
    return -1;
  }

  if (chmod((const char *)mailboxpath, KU_MAILBOX_PERM) != 0) {
    err->addMsg(i18n("Cannot change permissions on mailbox: %1\nError: %2")
                .arg(mailboxpath).arg(strerror(errno)));
    err->display();
  }

  return 0;
}


kuser'KUser::copyDir() (./kdeadmin/kuser/kuser.cpp:838)

void KUser::copyDir(const QString &srcPath, const QString &dstPath) {
  struct stat st;
  QDir s(srcPath);
  QDir d(dstPath);
  QString prefix(SKEL_FILE_PREFIX);
  int len = prefix.length();

  s.setFilter(QDir::Dirs);

  for (uint i=0; i<s.count(); i++) {
    QString name(s[i]);

    if (name == ".")
      continue;
    if (name == "..")
      continue;

    QString filename(s.filePath(name));
    QDir dir(filename);

    if (stat(filename, &st) != 0)
      printf("errno = %d, '%s'\n", errno, strerror(errno));

    if (name.left(len) == prefix)
      name = name.remove(0, len);

    d.mkdir(name, FALSE);
    if (chown(d.filePath(name), p_uid, p_gid) != 0) {
      err->addMsg(i18n("Cannot change owner of directory %1\nError: %2")
                  .arg(d.filePath(s[i])).arg(strerror(errno)));
      err->display();
    }

    if (chmod(d.filePath(name), st.st_mode & 07777) != 0) {
      err->addMsg(i18n("Cannot change permissions on directory %1\nError: %2")
                  .arg(d.filePath(s[i])).arg(strerror(errno)));
      err->display();
    }

    copyDir(s.filePath(name), d.filePath(name));
  }

  s.setFilter(QDir::Files | QDir::Hidden);

  for (uint i=0; i<s.count(); i++) {
    QString name(s[i]);

    QString filename(s.filePath(name));

    stat(filename, &st);

    if (name.left(len) == prefix)
      name = name.remove(0, len);

    if (copyFile(filename, d.filePath(name)) == -1) {
      err->display();
      continue;
    }

    if (chown(d.filePath(name), p_uid, p_gid) != 0) {
      err->addMsg(i18n("Cannot change owner of file %1\nError: %2")
                  .arg(d.filePath(s[i])).arg(strerror(errno)));
      err->display();
    }

    if (chmod(d.filePath(name), st.st_mode & 07777) != 0) {
      err->addMsg(i18n("Cannot change permissions on file %1\nError: %2")
                  .arg(d.filePath(s[i])).arg(strerror(errno)));
      err->display();
    }
  }
}


kuser'KUser::copySkel() (./kdeadmin/kuser/kuser.cpp:911)

int KUser::copySkel() {
  QDir s(SKELDIR);
  QDir d(p_dir);

  umask(0777);

  if (!s.exists()) {
    err->addMsg(i18n("Directory %1 does not exist").arg(s.dirName()));
    err->display();
    return (-1);
  }

  if (!d.exists()) {
    err->addMsg(i18n("Directory %1 does not exist").arg(d.dirName()));
    err->display();
    return (-1);
  }

  copyDir(s.absPath(), d.absPath());

  return 0;
}

// Temporarily use rm
//TODO: replace by our own procedure cause calling other programs
//      for things we are know how to do is not a good idea


kuser'KUser::removeHome() (./kdeadmin/kuser/kuser.cpp:938)

int KUser::removeHome() {
  struct stat sb;
  QString command;

  if (!stat((const char *)p_dir, &sb))
    if (S_ISDIR(sb.st_mode) && sb.st_uid == p_uid) {
#ifdef MINIX
      command = QString("/usr/bin/rm -rf -- %1").arg(p_dir);
#else
      command = QString("/bin/rm -rf -- %1").arg(p_dir);
#endif
    if (system((const char *)command) != 0) {
      err->addMsg(i18n("Cannot remove home directory %1\nError: %2")
                  .arg(command).arg(strerror(errno)));
      err->display();
     }
   }

  return 0;
}

//TODO: remove at jobs too.


kuser'KUser::removeCrontabs() (./kdeadmin/kuser/kuser.cpp:961)

int KUser::removeCrontabs() {
  QString file;
  QString command;

  file = QString("/var/cron/tabs/%1").arg(p_name);
  if (access((const char *)file, F_OK) == 0) {
    command = QString("crontab -u %1 -r").arg(p_name);
    if (system((const char *)command) != 0) {
      err->addMsg(i18n("Cannot remove crontab %1\nError: %2")
                  .arg(command).arg(strerror(errno)));
      err->display();
     }
  }

  return 0;
}


kuser'KUser::removeMailBox() (./kdeadmin/kuser/kuser.cpp:978)

int KUser::removeMailBox() {
  QString file;

  file = QString("%1/%2").arg(MAIL_SPOOL_DIR).arg(p_name);
  if (remove((const char *)file) != 0) {
    err->addMsg(i18n("Cannot remove mailbox %1\nError: %2")
                .arg(file).arg(strerror(errno)));
    err->display();
  }

  return 0;
}


kuser'KUser::removeProcesses() (./kdeadmin/kuser/kuser.cpp:991)

int KUser::removeProcesses() {
  // be paranoid -- kill all processes owned by that user, if not root.

  if (p_uid != 0)
    switch (fork()) {
      case 0:
        setuid(p_uid);
        kill(-1, 9);
        _exit(0);
        break;
      case -1:
        err->addMsg(i18n("Cannot fork()"));
        err->display();
        perror("fork");
        break;
    }

  return 0;
}