1 /* PCDM Login Manager:
2 *  Written by Ken Moore (ken@pcbsd.org) 2012/2013
3 *  Copyright(c) 2013 by the PC-BSD Project
4 *  Available under the 3-clause BSD license
5 */
6 
7 #ifndef PCDM_BACKEND_H
8 #define PCDM_BACKEND_H
9 
10 #include <QDebug>
11 #include <QDir>
12 #include <QFile>
13 #include <QFileSystemWatcher>
14 #include <QProcess>
15 #include <QString>
16 #include <QStringList>
17 #include <QTextStream>
18 #include <QTimer>
19 #include <QHash>
20 
21 #include "pcdm-config.h"
22 //#include "pcbsd-utils.h"
23 
24 #define PCSYSINSTALL    QString("/usr/sbin/pc-sysinstall")
25 #define DBDIR QString("/var/db/pcdm/")
26 
27 class Process : public QProcess {
28 public:
Process(const QStringList & args)29     Process(const QStringList &args) {
30         setReadChannel(QProcess::StandardOutput);
31         start(PCSYSINSTALL, args);
32     }
33 };
34 
35 //Class for reading/listing the available users/info for the system
36 class UserList : public QObject{
37 	Q_OBJECT
38 public:
39 	UserList(QObject *parent = 0);
40 	~UserList();
41 
42 	//Environment setting functions
43 	void allowUnder1K(bool allow); //flag to allow/show UID's under 1000 if other data checks out
44 	void allowRootUser(bool allow); //flag to permit login with the system "root" user (uid 0)
45 	void excludeUsers(QStringList exclude); //particular users which should always be excluded if their UID < 1000
46 
47 	//Main start function (returns almost instantly)
48 	void updateList(); //results will be ready when signals are send out
49 	void stopUpdates(); //stop the periodic updates/checks
50 
51 	//Get usernames
52 	QStringList users();
53 	QString findUser(QString displayname);
54 	//Return info for a username
55 	QString homedir(QString user);
56 	QString displayname(QString user);
57 	QString shell(QString user);
58 	QString status(QString user);
59 	bool isReady(QString user); //always true unless a personacrypt user
60 
61 private:
62 	QProcess *syncProc, *userProc;
63 	QTimer *syncTimer, *userTimer;
64 	QHash<QString,QString> HASH;
65 
66 	//Special flags for running user scans
67 	bool allowunder1kUID, allowroot;
68 	QStringList excludedUsers;
69 
70 	bool parseUserLine(QString line, QStringList *oldusers, const QStringList *allPC, const QStringList *activePC); //returns true if data changed, and removes itself from oldusers as needed
71 
72 private slots:
73 	void userProcFinished();
74 	void syncProcFinished();
75 
76 	void startSyncProc(); //start probe for personacrypt user status
77 	void startUserProc(); //start probe for users
78 
79 signals:
80 	void UsersChanged();
81 	void UserStatusChanged(QString, QString); //[user, status] emitted when a user status changes for personacrypt/syncthing
82 };
83 
84 class Backend {
85 public:
86     static QStringList getAvailableDesktops();
87     static QString getDesktopComment(QString);
88     static QString getNLDesktopName(QString);
89     static QString getDesktopIcon(QString);
90     static QString getDesktopBinary(QString);
91     //static void allowUidUnder1K(bool allow, QStringList excludes = QStringList() );
92     //static QStringList getSystemUsers(bool realnames = true);
93     //static QString getUsernameFromDisplayname(QString);
94     //static QString getDisplayNameFromUsername(QString);
95     static QStringList keyModels();
96     static QStringList keyLayouts();
97     static QStringList keyVariants(const QString &layout, QStringList &savedKeyVariants);
98     static bool changeKbMap(QString model, QString layout, QString variant);
99     static QString resetKbdCmd(); //read the default settings, and return the command to run to re-set those settings
100     static QStringList languages();
101     static void openLogFile(QString);
102     static void log(QString);
103     //static QString getUserHomeDir(QString);
104     //static QString getUserShell(QString);
105     static void checkLocalDirs();
106     static QStringList runShellCommand(QString);
107 
108     //Auto-login usage
109     static QString getALUsername();
110     static QString getALDesktopCmd();
111     static QString getALPassword();
112 
113     //Saved/Prior Settings
114     static QString getLastUser();
115     static QString getLastDE(QString, QString);
116     static void saveLoginInfo(QString, QString, QString);
117     static void loadDPIpreference();
118     static void setDPIpreference(QString);
119     static void readDefaultSysEnvironment(QString &lang, QString &keymodel, QString &keylayout, QString &keyvariant);
120     static void saveDefaultSysEnvironment(QString lang, QString keymodel, QString keylayout, QString keyvariant);
121 
122     //Personacrypt usage
123     static QStringList getRegisteredPersonaCryptUsers();
124     static QStringList getAvailablePersonaCryptUsers();
125     static bool MountPersonaCryptUser(QString user, QString pass);
126     static bool UnmountPersonaCryptUser(QString user);
127 
128     static bool writeFile(QString fileName, QStringList contents);
129 
130 private:
131     static void loadXSessionsData();
132     static QStringList readXSessionsFile(QString, QString);
133     //static void readSystemUsers(bool directfile = false);
134     static void readSystemLastLogin();
135     static void writeSystemLastLogin(QString, QString);
136     static QString readUserLastDesktop(QString);
137     static void writeUserLastDesktop(QString, QString);
138 };
139 
140 
141 #endif // PCDM_BACKEND_H
142