KDECore
kuser_unix.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <kuser.h>
00023
00024 #include <QtCore/QMutableStringListIterator>
00025 #include <QtCore/QDir>
00026
00027 #include <pwd.h>
00028 #include <unistd.h>
00029 #include <stdlib.h>
00030 #include <grp.h>
00031
00032 class KUser::Private : public KShared
00033 {
00034 public:
00035 uid_t uid;
00036 gid_t gid;
00037 QString loginName;
00038 QString homeDir, shell;
00039 QMap<UserProperty, QVariant> properties;
00040
00041 Private() : uid(uid_t(-1)), gid(gid_t(-1)) {}
00042 Private(const char *name) : uid(uid_t(-1)), gid(gid_t(-1))
00043 {
00044 fillPasswd(name ? ::getpwnam( name ) : 0);
00045 }
00046 Private(const passwd *p) : uid(uid_t(-1)), gid(gid_t(-1))
00047 {
00048 fillPasswd(p);
00049 }
00050
00051 void fillPasswd(const passwd *p)
00052 {
00053 if (p) {
00054 QString gecos = QString::fromLocal8Bit(p->pw_gecos);
00055 QStringList gecosList = gecos.split(QLatin1Char(','));
00056
00057 while (gecosList.size() < 4)
00058 gecosList << QString();
00059
00060 uid = p->pw_uid;
00061 gid = p->pw_gid;
00062 loginName = QString::fromLocal8Bit(p->pw_name);
00063 properties[KUser::FullName] = QVariant(gecosList[0]);
00064 properties[KUser::RoomNumber] = QVariant(gecosList[1]);
00065 properties[KUser::WorkPhone] = QVariant(gecosList[2]);
00066 properties[KUser::HomePhone] = QVariant(gecosList[3]);
00067 homeDir = QString::fromLocal8Bit(p->pw_dir);
00068 shell = QString::fromLocal8Bit(p->pw_shell);
00069 }
00070 }
00071 };
00072
00073
00074 KUser::KUser(UIDMode mode)
00075 {
00076 uid_t _uid = ::getuid(), _euid;
00077 if (mode == UseEffectiveUID && (_euid = ::geteuid()) != _uid )
00078 d = new Private( ::getpwuid( _euid ) );
00079 else {
00080 d = new Private( qgetenv( "LOGNAME" ) );
00081 if (uid() != _uid) {
00082 d = new Private( qgetenv( "USER" ) );
00083 if (uid() != _uid)
00084 d = new Private( ::getpwuid( _uid ) );
00085 }
00086 }
00087 }
00088
00089 KUser::KUser(K_UID _uid)
00090 : d(new Private( ::getpwuid( _uid ) ))
00091 {
00092 }
00093
00094 KUser::KUser(const QString& name)
00095 : d(new Private( name.toLocal8Bit().data() ))
00096 {
00097 }
00098
00099 KUser::KUser(const char *name)
00100 : d(new Private( name ))
00101 {
00102 }
00103
00104 KUser::KUser(const passwd *p)
00105 : d(new Private( p ))
00106 {
00107 }
00108
00109 KUser::KUser(const KUser & user)
00110 : d(user.d)
00111 {
00112 }
00113
00114 KUser& KUser::operator =(const KUser& user)
00115 {
00116 d = user.d;
00117 return *this;
00118 }
00119
00120 bool KUser::operator ==(const KUser& user) const {
00121 return (uid() == user.uid()) && (uid() != uid_t(-1));
00122 }
00123
00124 bool KUser::operator !=(const KUser& user) const {
00125 return (uid() != user.uid()) || (uid() == uid_t(-1));
00126 }
00127
00128 bool KUser::isValid() const {
00129 return uid() != uid_t(-1);
00130 }
00131
00132 K_UID KUser::uid() const {
00133 return d->uid;
00134 }
00135
00136 K_GID KUser::gid() const {
00137 return d->gid;
00138 }
00139
00140 bool KUser::isSuperUser() const {
00141 return uid() == 0;
00142 }
00143
00144 QString KUser::loginName() const {
00145 return d->loginName;
00146 }
00147
00148 QString KUser::fullName() const {
00149 return d->properties[FullName].toString();
00150 }
00151
00152 QString KUser::homeDir() const {
00153 return d->homeDir;
00154 }
00155
00156 QString KUser::faceIconPath() const
00157 {
00158 QString pathToFaceIcon(homeDir() + QDir::separator() + ".face.icon");
00159
00160 if (QFile::exists(pathToFaceIcon)) {
00161 return pathToFaceIcon;
00162 }
00163
00164 return QString();
00165 }
00166
00167 QString KUser::shell() const {
00168 return d->shell;
00169 }
00170
00171 QList<KUserGroup> KUser::groups() const {
00172 QList<KUserGroup> result;
00173 const QList<KUserGroup> allGroups = KUserGroup::allGroups();
00174 QList<KUserGroup>::const_iterator it;
00175 for ( it = allGroups.begin(); it != allGroups.end(); ++it ) {
00176 QList<KUser> users = (*it).users();
00177 if ( users.contains(*this) ) {
00178 result.append(*it);
00179 }
00180 }
00181 return result;
00182 }
00183
00184 QStringList KUser::groupNames() const {
00185 QStringList result;
00186 const QList<KUserGroup> allGroups = KUserGroup::allGroups();
00187 QList<KUserGroup>::const_iterator it;
00188 for ( it = allGroups.begin(); it != allGroups.end(); ++it ) {
00189 QList<KUser> users = (*it).users();
00190 if ( users.contains(*this) ) {
00191 result.append((*it).name());
00192 }
00193 }
00194 return result;
00195 }
00196
00197 QVariant KUser::property(UserProperty which) const
00198 {
00199 return d->properties.value(which);
00200 }
00201
00202 QList<KUser> KUser::allUsers() {
00203 QList<KUser> result;
00204
00205 passwd* p;
00206
00207 while ((p = getpwent())) {
00208 result.append(KUser(p));
00209 }
00210
00211 endpwent();
00212
00213 return result;
00214 }
00215
00216 QStringList KUser::allUserNames() {
00217 QStringList result;
00218
00219 passwd* p;
00220
00221 while ((p = getpwent())) {
00222 result.append(QString::fromLocal8Bit(p->pw_name));
00223 }
00224
00225 endpwent();
00226 return result;
00227 }
00228
00229 KUser::~KUser() {
00230 }
00231
00232 class KUserGroup::Private : public KShared
00233 {
00234 public:
00235 gid_t gid;
00236 QString name;
00237 QList<KUser> users;
00238
00239 Private() : gid(gid_t(-1)) {}
00240 Private(const char *_name) : gid(gid_t(-1))
00241 {
00242 fillGroup(_name ? ::getgrnam( _name ) : 0);
00243 }
00244 Private(const ::group *p) : gid(gid_t(-1))
00245 {
00246 fillGroup(p);
00247 }
00248
00249 void fillGroup(const ::group *p) {
00250 if (p) {
00251 gid = p->gr_gid;
00252 name = QString::fromLocal8Bit(p->gr_name);
00253 for (char **user = p->gr_mem; *user; user++)
00254 users.append(KUser(*user));
00255 }
00256 }
00257 };
00258
00259 KUserGroup::KUserGroup(KUser::UIDMode mode)
00260 {
00261 d = new Private(getgrgid(KUser(mode).gid()));
00262 }
00263
00264 KUserGroup::KUserGroup(K_GID _gid)
00265 : d(new Private(getgrgid(_gid)))
00266 {
00267 }
00268
00269 KUserGroup::KUserGroup(const QString& _name)
00270 : d(new Private(_name.toLocal8Bit().data()))
00271 {
00272 }
00273
00274 KUserGroup::KUserGroup(const char *_name)
00275 : d(new Private(_name))
00276 {
00277 }
00278
00279 KUserGroup::KUserGroup(const ::group *g)
00280 : d(new Private(g))
00281 {
00282 }
00283
00284 KUserGroup::KUserGroup(const KUserGroup & group)
00285 : d(group.d)
00286 {
00287 }
00288
00289 KUserGroup& KUserGroup::operator =(const KUserGroup& group) {
00290 d = group.d;
00291 return *this;
00292 }
00293
00294 bool KUserGroup::operator ==(const KUserGroup& group) const {
00295 return (gid() == group.gid()) && (gid() != gid_t(-1));
00296 }
00297
00298 bool KUserGroup::operator !=(const KUserGroup& user) const {
00299 return (gid() != user.gid()) || (gid() == gid_t(-1));
00300 }
00301
00302 bool KUserGroup::isValid() const {
00303 return gid() != gid_t(-1);
00304 }
00305
00306 K_GID KUserGroup::gid() const {
00307 return d->gid;
00308 }
00309
00310 QString KUserGroup::name() const {
00311 return d->name;
00312 }
00313
00314 QList<KUser> KUserGroup::users() const {
00315 return d->users;
00316 }
00317
00318 QStringList KUserGroup::userNames() const {
00319 QStringList result;
00320 QList<KUser>::const_iterator it;
00321 for ( it = d->users.begin(); it != d->users.end(); ++it ) {
00322 result.append((*it).loginName());
00323 }
00324 return result;
00325 }
00326
00327 QList<KUserGroup> KUserGroup::allGroups() {
00328 QList<KUserGroup> result;
00329
00330 ::group* g;
00331 while ((g = getgrent())) {
00332 result.append(KUserGroup(g));
00333 }
00334
00335 endgrent();
00336
00337 return result;
00338 }
00339
00340 QStringList KUserGroup::allGroupNames() {
00341 QStringList result;
00342
00343 ::group* g;
00344 while ((g = getgrent())) {
00345 result.append(QString::fromLocal8Bit(g->gr_name));
00346 }
00347
00348 endgrent();
00349
00350 return result;
00351 }
00352
00353 KUserGroup::~KUserGroup() {
00354 }