File indexing completed on 2024-05-19 05:35:37
0001 # SPDX-License-Identifier: GPL-3.0-or-later 0002 # SPDX-FileCopyrightText: 2021 Anupam Basak <anupam.basak27@gmail.com> 0003 0004 import os 0005 import subprocess 0006 import sys 0007 0008 from PySide2.QtCore import QUrl, Slot, Signal, QProcess, QByteArray, Property 0009 from PySide2.QtQml import qmlRegisterType 0010 0011 from PicoWizard.module import Module 0012 from PicoWizard.utils.config import Config 0013 from PicoWizard.utils.logger import Logger 0014 0015 0016 class User(Module): 0017 log = Logger.getLogger(__name__) 0018 0019 def __init__(self, parent=None): 0020 super().__init__(__file__, parent) 0021 0022 self._passwordType = Config.getPasswordType() 0023 self.passwordTypeChanged.emit() 0024 0025 @staticmethod 0026 def registerTypes() -> None: 0027 qmlRegisterType(User, 'PicoWizard', 1, 0, 'UserModule') 0028 0029 @staticmethod 0030 def qmlPath() -> QUrl: 0031 return QUrl(os.path.join(os.path.dirname(os.path.realpath(__file__)), "User.qml")) 0032 0033 @Slot(None, result=str) 0034 def moduleName(self) -> str: 0035 return self.tr("User Configuration") 0036 0037 @Slot(str, str, str, result=None) 0038 def createUser(self, fullname, username, password): 0039 process = QProcess(self) 0040 args = [ 0041 '/usr/bin/useradd', 0042 '--create-home', 0043 '--comment', 0044 fullname, 0045 username 0046 ] 0047 process.start('/usr/bin/pkexec', args) 0048 0049 process.finished.connect(lambda exitCode, exitStatus: self.createUserCmdSuccess(exitCode, username, password)) 0050 process.error.connect(lambda err: self.createUserCmdFailed(err)) 0051 0052 def createUserCmdSuccess(self, exitCode, username, password): 0053 if exitCode != 0: 0054 self.log.error('Failed to create user') 0055 self.errorOccurred.emit("Failed to create user") 0056 self.createUserFailed.emit() 0057 else: 0058 self.log.info('User successfully created') 0059 Module.__ENV__.insert('PICOWIZARD_USERNAME', username) 0060 0061 process = QProcess(self) 0062 args = [ 0063 '/usr/bin/passwd', 0064 username 0065 ] 0066 process.start('/usr/bin/pkexec', args) 0067 0068 inputPassword = QByteArray(f"{password}\n{password}\n".encode()) 0069 process.write(inputPassword) 0070 0071 process.finished.connect(lambda exitCode, exitStatus: self.passwordCmdSuccess(exitCode, exitStatus)) 0072 process.error.connect(lambda err: self.passwordCmdFailed(err)) 0073 0074 def createUserCmdFailed(self, err): 0075 self.log.error('Failed to create user') 0076 self.log.error(err) 0077 self.errorOccurred.emit("Failed to create user") 0078 self.createUserFailed.emit() 0079 0080 def passwordCmdSuccess(self, exitCode, exitStatus): 0081 if exitCode != 0: 0082 self.log.error('Failed to set password') 0083 self.errorOccurred.emit("Failed to set password") 0084 self.createUserFailed.emit() 0085 else: 0086 self.log.info('Password successfully set') 0087 self.createUserSuccess.emit() 0088 0089 def passwordCmdFailed(self, err): 0090 self.log.error('Failed to set password') 0091 self.errorOccurred.emit("Failed to set password") 0092 self.log.error(err) 0093 self.createUserFailed.emit() 0094 0095 @Signal 0096 def createUserSuccess(self): 0097 pass 0098 0099 @Signal 0100 def createUserFailed(self): 0101 pass 0102 0103 def getPasswordType(self): 0104 return self._passwordType 0105 0106 @Signal 0107 def passwordTypeChanged(self): 0108 pass 0109 0110 passwordType = Property(str, getPasswordType, notify=passwordTypeChanged)