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)