You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lxqt-admin-packaging/lxqt-admin-user/usermanager.h

240 lines
5.2 KiB

/* BEGIN_COMMON_COPYRIGHT_HEADER
* (c)LGPL2+
*
* LXQt - a lightweight, Qt based, desktop toolset
* http://lxqt.org
*
* Copyright: 2016 LXQt team
* Authors:
* Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
*
* This program or library is free software; you can redistribute it
* and/or modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 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
* Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General
* Public License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA
*
* END_COMMON_COPYRIGHT_HEADER */
#ifndef USERMANAGER_H
#define USERMANAGER_H
#include <QObject>
#include <QStringList>
#include <sys/types.h>
#include <pwd.h>
#include <grp.h>
class QFileSystemWatcher;
class UserInfo
{
public:
explicit UserInfo():mUid(0), mGid(0) {
}
explicit UserInfo(struct passwd* pw):
mUid(pw->pw_uid),
mGid(pw->pw_gid),
mName(QString::fromLatin1(pw->pw_name)),
mFullName(QString::fromUtf8(pw->pw_gecos)),
mShell(QString::fromLocal8Bit(pw->pw_shell)),
mHomeDir(QString::fromLocal8Bit(pw->pw_dir))
{
}
uid_t uid()const {
return mUid;
}
void setUid(uid_t uid) {
mUid = uid;
}
gid_t gid() const {
return mGid;
}
void setGid(gid_t gid) {
mGid = gid;
}
QString name() const {
return mName;
}
void setName(const QString& name) {
mName = name;
}
QString fullName() const {
return mFullName;
}
void setFullName(const QString& fullName) {
mFullName = fullName;
}
QString shell() const {
return mShell;
}
void setShell(const QString& shell) {
mShell = shell;
}
QString homeDir() const {
return mHomeDir;
}
void setHomeDir(const QString& homeDir) {
mHomeDir = homeDir;
}
const QStringList& groups() const {
return mGroups;
}
void addGroup(const QString& group) {
mGroups.append(group);
}
void removeGroup(const QString& group) {
mGroups.removeOne(group);
}
void removeAllGroups() {
mGroups.clear();
}
bool hasGroup(const QString& group) {
return mGroups.contains(group);
}
private:
uid_t mUid;
gid_t mGid;
QString mName;
QString mFullName;
QString mShell;
QString mHomeDir;
QStringList mGroups;
};
class GroupInfo
{
public:
explicit GroupInfo(): mGid(0) {
}
explicit GroupInfo(struct group* grp):
mGid(grp->gr_gid),
mName(grp->gr_name)
{
}
gid_t gid() const {
return mGid;
}
void setGid(gid_t gid) {
mGid = gid;
}
QString name() const {
return mName;
}
void setName(const QString& name) {
mName = name;
}
const QStringList& members() const {
return mMembers;
}
void setMembers(const QStringList& members) {
mMembers = members;
}
void addMember(const QString& userName) {
mMembers.append(userName);
}
void removeMember(const QString& userName) {
mMembers.removeOne(userName);
}
void removeAllMemberss() {
mMembers.clear();
}
bool hasMember(const QString& userName) const {
return mMembers.contains(userName);
}
private:
gid_t mGid;
QString mName;
QStringList mMembers;
};
class UserManager : public QObject
{
Q_OBJECT
public:
explicit UserManager(QObject *parent = 0);
~UserManager();
const QList<UserInfo*>& users() const {
return mUsers;
}
const QList<GroupInfo*>& groups() const {
return mGroups;
}
const QStringList& availableShells();
bool addUser(UserInfo* user);
bool modifyUser(UserInfo* user, UserInfo* newSettings);
bool deleteUser(UserInfo* user);
bool changePassword(UserInfo* user, QByteArray newPasswd);
bool addGroup(GroupInfo* group);
bool modifyGroup(GroupInfo* group, GroupInfo* newSettings);
bool deleteGroup(GroupInfo* group);
bool changePassword(GroupInfo* group, QByteArray newPasswd);
// FIXME: add APIs to change group membership with "gpasswd"
UserInfo* findUserInfo(const char* name);
UserInfo* findUserInfo(QString name);
UserInfo* findUserInfo(uid_t uid);
GroupInfo* findGroupInfo(const char* name);
GroupInfo* findGroupInfo(QString name);
GroupInfo* findGroupInfo(gid_t gid);
private:
void loadUsersAndGroups();
void loadLoginDefs();
bool pkexec(const QStringList &command, const QByteArray &stdinData = QByteArray());
Q_SIGNALS:
void changed();
protected Q_SLOTS:
void onFileChanged(const QString &path);
void reload();
private:
QList<UserInfo*> mUsers;
QList<GroupInfo*> mGroups;
QFileSystemWatcher* mWatcher;
QStringList mAvailableShells;
};
#endif // USERMANAGER_H