summaryrefslogtreecommitdiffstats
path: root/kdecore/kuser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kdecore/kuser.cpp')
-rw-r--r--kdecore/kuser.cpp425
1 files changed, 425 insertions, 0 deletions
diff --git a/kdecore/kuser.cpp b/kdecore/kuser.cpp
new file mode 100644
index 000000000..184cedadd
--- /dev/null
+++ b/kdecore/kuser.cpp
@@ -0,0 +1,425 @@
+/*
+ * KUser - represent a user/account
+ * Copyright (C) 2002 Tim Jansen <tim@tjansen.de>
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <kuser.h>
+
+#include "kstringhandler.h"
+#include <qvaluelist.h>
+#include <qstringlist.h>
+
+#include <sys/types.h>
+#include <pwd.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <grp.h>
+
+
+class KUserPrivate : public KShared
+{
+public:
+ bool valid;
+ long uid, gid;
+ QString loginName, fullName;
+ QString roomNumber, workPhone, homePhone;
+ QString homeDir, shell;
+
+ KUserPrivate() : valid(false) {}
+
+ KUserPrivate(long _uid,
+ long _gid,
+ const QString &_loginname,
+ const QString &_fullname,
+ const QString &_room,
+ const QString &_workPhone,
+ const QString &_homePhone,
+ const QString &_homedir,
+ const QString &_shell) :
+ valid(true),
+ uid(_uid),
+ gid(_gid),
+ loginName(_loginname),
+ fullName(_fullname),
+ roomNumber(_room),
+ workPhone(_workPhone),
+ homePhone(_homePhone),
+ homeDir(_homedir),
+ shell(_shell) {}
+};
+
+
+KUser::KUser(UIDMode mode) {
+ long _uid = ::getuid(), _euid;
+ if (mode == UseEffectiveUID && (_euid = ::geteuid()) != _uid )
+ fillPasswd( ::getpwuid( _euid ) );
+ else {
+ fillName( ::getenv( "LOGNAME" ) );
+ if (uid() != _uid) {
+ fillName( ::getenv( "USER" ) );
+ if (uid() != _uid)
+ fillPasswd( ::getpwuid( _uid ) );
+ }
+ }
+}
+
+KUser::KUser(long uid) {
+ fillPasswd( ::getpwuid( uid ) );
+}
+
+KUser::KUser(const QString& name) {
+ fillName( name.local8Bit().data() );
+}
+
+KUser::KUser(const char *name) {
+ fillName( name );
+}
+
+KUser::KUser(struct passwd *p) {
+ fillPasswd(p);
+}
+
+KUser::KUser(const KUser & user)
+ : d(user.d)
+{
+}
+
+KUser& KUser::operator =(const KUser& user)
+{
+ d = user.d;
+ return *this;
+}
+
+bool KUser::operator ==(const KUser& user) const {
+ if (isValid() != user.isValid())
+ return false;
+ if (isValid())
+ return uid() == user.uid();
+ else
+ return true;
+}
+
+bool KUser::operator !=(const KUser& user) const {
+ return !operator ==(user);
+}
+
+void KUser::fillName(const char *name) {
+ fillPasswd(name ? ::getpwnam( name ) : 0);
+}
+
+void KUser::fillPasswd(struct passwd *p) {
+ if (p) {
+ QString gecos = KStringHandler::from8Bit(p->pw_gecos);
+ QStringList gecosList = QStringList::split(',', gecos, true);
+
+ d = new KUserPrivate(p->pw_uid,
+ p->pw_gid,
+ QString::fromLocal8Bit(p->pw_name),
+ (gecosList.size() > 0) ? gecosList[0] : QString::null,
+ (gecosList.size() > 1) ? gecosList[1] : QString::null,
+ (gecosList.size() > 2) ? gecosList[2] : QString::null,
+ (gecosList.size() > 3) ? gecosList[3] : QString::null,
+ QString::fromLocal8Bit(p->pw_dir),
+ QString::fromLocal8Bit(p->pw_shell));
+ }
+ else
+ d = new KUserPrivate();
+}
+
+bool KUser::isValid() const {
+ return d->valid;
+}
+
+long KUser::uid() const {
+ if (d->valid)
+ return d->uid;
+ else
+ return -1;
+}
+
+long KUser::gid() const {
+ if (d->valid)
+ return d->gid;
+ else
+ return -1;
+}
+
+bool KUser::isSuperUser() const {
+ return uid() == 0;
+}
+
+QString KUser::loginName() const {
+ if (d->valid)
+ return d->loginName;
+ else
+ return QString::null;
+}
+
+QString KUser::fullName() const {
+ if (d->valid)
+ return d->fullName;
+ else
+ return QString::null;
+}
+
+QString KUser::roomNumber() const {
+ if (d->valid)
+ return d->roomNumber;
+ else
+ return QString::null;
+}
+
+QString KUser::workPhone() const {
+ if (d->valid)
+ return d->workPhone;
+ else
+ return QString::null;
+}
+
+QString KUser::homePhone() const {
+ if (d->valid)
+ return d->homePhone;
+ else
+ return QString::null;
+}
+
+QString KUser::homeDir() const {
+ if (d->valid)
+ return d->homeDir;
+ else
+ return QString::null;
+}
+
+QString KUser::shell() const {
+ if (d->valid)
+ return d->shell;
+ else
+ return QString::null;
+}
+
+QValueList<KUserGroup> KUser::groups() const {
+ QValueList<KUserGroup> result;
+ QValueList<KUserGroup> allGroups = KUserGroup::allGroups();
+ QValueList<KUserGroup>::const_iterator it;
+ for ( it = allGroups.begin(); it != allGroups.end(); ++it ) {
+ QValueList<KUser> users = (*it).users();
+ if ( users.find( *this ) != users.end()) {
+ result.append(*it);
+ }
+ }
+ return result;
+}
+
+QStringList KUser::groupNames() const {
+ QStringList result;
+ QValueList<KUserGroup> allGroups = KUserGroup::allGroups();
+ QValueList<KUserGroup>::const_iterator it;
+ for ( it = allGroups.begin(); it != allGroups.end(); ++it ) {
+ QValueList<KUser> users = (*it).users();
+ if ( users.find( *this ) != users.end()) {
+ result.append((*it).name());
+ }
+ }
+ return result;
+}
+
+
+QValueList<KUser> KUser::allUsers() {
+ QValueList<KUser> result;
+
+ struct passwd* p;
+
+ while ((p = getpwent())) {
+ result.append(KUser(p));
+ }
+
+ endpwent();
+
+ return result;
+}
+
+QStringList KUser::allUserNames() {
+ QStringList result;
+
+ struct passwd* p;
+
+ while ((p = getpwent())) {
+ result.append(QString::fromLocal8Bit(p->pw_name));
+ }
+
+ endpwent();
+ return result;
+}
+
+
+KUser::~KUser() {
+}
+
+class KUserGroupPrivate : public KShared
+{
+public:
+ bool valid;
+ long gid;
+ QString name;
+ QValueList<KUser> users;
+
+ KUserGroupPrivate() : valid(false) {}
+
+ KUserGroupPrivate(long _gid,
+ const QString & _name,
+ const QValueList<KUser> & _users):
+ valid(true),
+ gid(_gid),
+ name(_name),
+ users(_users) {}
+};
+
+KUserGroup::KUserGroup(KUser::UIDMode mode) {
+ KUser user(mode);
+ fillGroup(getgrgid(user.gid()));
+}
+
+KUserGroup::KUserGroup(long gid) {
+ fillGroup(getgrgid(gid));
+}
+
+KUserGroup::KUserGroup(const QString& name) {
+ fillName(name.local8Bit().data());
+}
+
+KUserGroup::KUserGroup(const char *name) {
+ fillName(name);
+}
+
+KUserGroup::KUserGroup(struct group *g) {
+ fillGroup(g);
+}
+
+
+KUserGroup::KUserGroup(const KUserGroup & group)
+ : d(group.d)
+{
+}
+
+KUserGroup& KUserGroup::operator =(const KUserGroup& group) {
+ d = group.d;
+ return *this;
+}
+
+bool KUserGroup::operator ==(const KUserGroup& group) const {
+ if (isValid() != group.isValid())
+ return false;
+ if (isValid())
+ return gid() == group.gid();
+ else
+ return true;
+}
+
+bool KUserGroup::operator !=(const KUserGroup& user) const {
+ return !operator ==(user);
+}
+
+void KUserGroup::fillName(const char *name) {
+ fillGroup(name ? ::getgrnam( name ) : 0);
+}
+
+void KUserGroup::fillGroup(struct group *p) {
+ if (!p) {
+ d = new KUserGroupPrivate();
+ return;
+ }
+
+ QString name = KStringHandler::from8Bit(p->gr_name);
+ QValueList<KUser> users;
+
+ char **user = p->gr_mem;
+ for ( ; *user; user++) {
+ KUser kUser(QString::fromLocal8Bit(*user));
+ users.append(kUser);
+ }
+
+ d = new KUserGroupPrivate(p->gr_gid,
+ QString::fromLocal8Bit(p->gr_name),
+ users);
+
+}
+
+bool KUserGroup::isValid() const {
+ return d->valid;
+}
+
+long KUserGroup::gid() const {
+ if (d->valid)
+ return d->gid;
+ else
+ return -1;
+}
+
+QString KUserGroup::name() const {
+ if (d->valid)
+ return d->name;
+ else
+ return QString::null;
+}
+
+const QValueList<KUser>& KUserGroup::users() const {
+ return d->users;
+}
+
+QStringList KUserGroup::userNames() const {
+ QStringList result;
+ QValueList<KUser>::const_iterator it;
+ for ( it = d->users.begin(); it != d->users.end(); ++it ) {
+ result.append((*it).loginName());
+ }
+ return result;
+}
+
+
+
+QValueList<KUserGroup> KUserGroup::allGroups() {
+ QValueList<KUserGroup> result;
+
+ struct group* g;
+ while ((g = getgrent())) {
+ result.append(KUserGroup(g));
+ }
+
+ endgrent();
+
+ return result;
+}
+
+QStringList KUserGroup::allGroupNames() {
+ QStringList result;
+
+ struct group* g;
+ while ((g = getgrent())) {
+ result.append(QString::fromLocal8Bit(g->gr_name));
+ }
+
+ endgrent();
+
+ return result;
+}
+
+
+KUserGroup::~KUserGroup() {
+}
+