# # DBus interface for the users module. # # Copyright (C) 2018 Red Hat, Inc. # # This copyrighted material is made available to anyone wishing to use, # modify, copy, or redistribute it subject to the terms and conditions of # the GNU General Public License v.2, or (at your option) any later version. # This program is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY expressed or implied, including the implied warranties of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General # Public License for more details. You should have received a copy of the # GNU General Public License along with this program; if not, write to the # Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. Any Red Hat trademarks that are incorporated in the # source code or documentation are not subject to the GNU General Public # License and may only be used or replicated with the express permission of # Red Hat, Inc. # from pyanaconda.modules.common.constants.services import USERS from dasbus.server.property import emits_properties_changed from dasbus.typing import * # pylint: disable=wildcard-import from pyanaconda.modules.common.base import KickstartModuleInterface from pyanaconda.modules.common.containers import TaskContainer from pyanaconda.modules.common.structures.user import UserData from pyanaconda.modules.common.structures.group import GroupData from pyanaconda.modules.common.structures.sshkey import SshKeyData from dasbus.server.interface import dbus_interface @dbus_interface(USERS.interface_name) class UsersInterface(KickstartModuleInterface): """DBus interface for Users module.""" def connect_signals(self): super().connect_signals() self.watch_property("Users", self.implementation.users_changed) self.watch_property("Groups", self.implementation.groups_changed) self.watch_property("SshKeys", self.implementation.ssh_keys_changed) self.watch_property("IsRootPasswordSet", self.implementation.root_password_is_set_changed) self.watch_property("IsRootAccountLocked", self.implementation.root_account_locked_changed) self.watch_property("RootPasswordSSHLoginAllowed", self.implementation.root_password_ssh_login_allowed_changed) self.watch_property("CanChangeRootPassword", self.implementation.can_change_root_password_changed) @property def CanChangeRootPassword(self) -> Bool: """Can the root password be changed ? :return: True, if the root password can the changed, False otherwise """ return self.implementation.can_change_root_password @property def RootPassword(self) -> Str: """Root password. NOTE: this property should be only temporary and should be dropped once the users module itself can configure the root password :return: root password (might be crypted) """ return self.implementation.root_password @property def IsRootPasswordCrypted(self) -> Bool: """Is the root password crypted ? NOTE: this property should be only temporary and should be dropped once the users module itself can configure the root password :return: True, if the root password is crypted, otherwise False """ return self.implementation.root_password_is_crypted @emits_properties_changed def SetCryptedRootPassword(self, crypted_root_password: Str): """Set the root password. The password is expected to be provided in already crypted. :param crypted_root_password: already crypted root password """ self.implementation.set_root_password(crypted_root_password, crypted=True) @emits_properties_changed def ClearRootPassword(self): """Clear any set root password.""" self.implementation.clear_root_password() @property def IsRootPasswordSet(self) -> Bool: """Is the root password set ? :return: True, if the root password is set, otherwise False """ return self.implementation.root_password_is_set @property def IsRootAccountLocked(self) -> Bool: """Is the root account locked ? :return: True, if the root account is locked, otherwise False """ return self.implementation.root_account_locked @IsRootAccountLocked.setter @emits_properties_changed def IsRootAccountLocked(self, root_account_locked: Bool): """Lock or unlock the root account.""" self.implementation.set_root_account_locked(root_account_locked) @property def RootPasswordSSHLoginAllowed(self) -> Bool: """Is logging in as root via SSH with password allowed ? :return: True if root SSH loggin with password is allowed, False otherwise """ return self.implementation.root_password_ssh_login_allowed @RootPasswordSSHLoginAllowed.setter @emits_properties_changed def RootPasswordSSHLoginAllowed(self, root_password_ssh_login_allowed: Bool): """Allow or disallow the root from logging in via SSH with password authetication.""" self.implementation.set_root_password_ssh_login_allowed(root_password_ssh_login_allowed) @property def Users(self) -> List[Structure]: """List of users, each describing a single user. :return: a list of user describing DBus Structures """ return UserData.to_structure_list(self.implementation.users) @Users.setter @emits_properties_changed def Users(self, users: List[Structure]): """Set a list of users, each corresponding to a single user. :param users: a list of user describing DBus structures """ self.implementation.set_users(UserData.from_structure_list(users)) @property def Groups(self) -> List[Structure]: """List of groups, each describing a single group. :return: a list of group describing DBus Structures """ return GroupData.to_structure_list(self.implementation.groups) @Groups.setter @emits_properties_changed def Groups(self, groups: List[Structure]): """Set a list of groups, each corresponding to a single group. :param groups: a list of group describing DBus structures """ self.implementation.set_groups(GroupData.from_structure_list(groups)) @property def SshKeys(self) -> List[Structure]: """List of SSH keys, each describing a single SSH key. :return: a list of SSH key describing DBus Structures """ return SshKeyData.to_structure_list(self.implementation.ssh_keys) @SshKeys.setter @emits_properties_changed def SshKeys(self, ssh_keys: List[Structure]): """Set a list of DBus structures, each corresponding to a single SSH key. :param ssh_keys: a list of SSH key describing DBus structures """ self.implementation.set_ssh_keys(SshKeyData.from_structure_list(ssh_keys)) def CheckAdminUserExists(self) -> Bool: """Reports if at least one admin user exists. - an unlocked root account is considered to be an admin user - an unlocked user account that is member of the group "wheel" is considered to be an admin user :return: if at least one admin user exists """ return self.implementation.check_admin_user_exists def ConfigureGroupsWithTask(self) -> ObjPath: """Configure user groups via a DBus task. :returns: DBus path of the task """ return TaskContainer.to_object_path( self.implementation.configure_groups_with_task() ) def ConfigureUsersWithTask(self) -> ObjPath: """Configure users via a DBus task. :returns: DBus path of the task """ return TaskContainer.to_object_path( self.implementation.configure_users_with_task() ) def SetRootPasswordWithTask(self) -> ObjPath: """Set root password via a DBus task. :returns: DBus path of the task """ return TaskContainer.to_object_path( self.implementation.set_root_password_with_task() )