From 65a6ceddca840dec484e4c304b43744053934527 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Tue, 16 Aug 2022 13:02:58 +0200 Subject: [PATCH] tests: Add accounts_service mock service This is a shrunk copy of the accounts_service.py service previously found in upstream python-dbusmock. It also adds parental control properties to make GNOME Shell happy. Part-of: --- tests/dbusmock-templates/accounts_service.py | 136 +++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 tests/dbusmock-templates/accounts_service.py diff --git a/tests/dbusmock-templates/accounts_service.py b/tests/dbusmock-templates/accounts_service.py new file mode 100644 index 000000000..2a501c407 --- /dev/null +++ b/tests/dbusmock-templates/accounts_service.py @@ -0,0 +1,136 @@ +'''Accounts Service D-Bus mock template''' + +# This program 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 3 of the License, or (at your option) any +# later version. See http://www.gnu.org/copyleft/lgpl.html for the full text +# of the license. + +__author__ = 'Marco Trevisan' +__email__ = 'marco.trevisan@canonical.com' +__copyright__ = '(c) 2021 Canonical Ltd.' +__license__ = 'LGPL 3+' + +import sys +import time + +import dbus +import dbusmock +from dbusmock import MOCK_IFACE, mockobject + +BUS_NAME = 'org.freedesktop.Accounts' +MAIN_OBJ = '/org/freedesktop/Accounts' +MAIN_IFACE = 'org.freedesktop.Accounts' +USER_IFACE = MAIN_IFACE + '.User' +SYSTEM_BUS = True + +DEFAULT_USER_PASSWORD = 'Pa$$wo0rd' + + +def get_user_path(uid): + return f'/org/freedesktop/Accounts/User{uid}' + + +def load(mock, parameters=None): + parameters = parameters if parameters else {} + mock.mock_users = {} + mock.users_auto_uids = 2000 + + mock.AddProperties(MAIN_IFACE, { + 'HasNoUsers': dbus.Boolean(True), + 'HasMultipleUsers': dbus.Boolean(False), + }) + + for uid, name in parameters.get('users', {}): + mock.AddUser(uid, name, '', {}) + + +@dbus.service.method(MOCK_IFACE, in_signature='xssa{sv}', + out_signature='o') +def AddUser(self, uid, username, password, overrides): + '''Add user via uid and username and optionally overriding properties + + Returns the new object path. + ''' + path = get_user_path(uid) + default_props = { + 'Uid': dbus.UInt64(uid), + 'UserName': username, + 'RealName': username[0].upper() + username[1:] + ' Fake', + 'AccountType': dbus.Int32(1), + 'AutomaticLogin': False, + 'BackgroundFile': '', + 'Email': f'{username}@python-dbusmock.org', + 'FormatsLocale': 'C', + 'HomeDirectory': f'/nonexisting/mock-home/{username}', + 'IconFile': '', + 'InputSources': dbus.Array([], signature='a{ss}'), + 'Language': 'C', + 'LocalAccount': True, + 'Location': '', + 'Locked': False, + 'LoginFrequency': dbus.UInt64(0), + 'LoginHistory': dbus.Array([], signature='(xxa{sv})'), + 'LoginTime': dbus.Int64(0), + 'PasswordHint': 'Remember it, come on!', + 'PasswordMode': 0, + 'Session': 'mock-session', + 'SessionType': 'wayland', + 'Shell': '/usr/bin/zsh', + 'SystemAccount': False, + 'XHasMessages': False, + 'XKeyboardLayouts': dbus.Array([], signature='s'), + 'XSession': 'mock-xsession', + } + default_props.update(overrides if overrides else {}) + self.AddObject(path, USER_IFACE, default_props, []) + user_object = mockobject.objects[path] + + user_object.AddProperty( + 'com.endlessm.ParentalControls.AppFilter', + 'AppFilter', dbus.Struct([ + False, dbus.Array(signature='s') + ], variant_level=1), + ) + + user = mockobject.objects[path] + user.password = password + user.properties = default_props + self.mock_users[uid] = default_props + + self.EmitSignal(MAIN_IFACE, 'UserAdded', 'o', [path]) + + self.UpdateProperties(MAIN_IFACE, { + 'HasNoUsers': dbus.Boolean(len(self.mock_users) == 0), + 'HasMultipleUsers': dbus.Boolean(len(self.mock_users) > 1), + }) + + return path + + +@dbus.service.method(MOCK_IFACE, in_signature='', out_signature='ao') +def ListMockUsers(self): + """ List the mock users that have been created """ + return [get_user_path(uid) for uid in self.mock_users.keys()] + + +@dbus.service.method(MAIN_IFACE, in_signature='x', out_signature='o') +def FindUserById(_self, uid): + """ Finds an user by its user id """ + user = mockobject.objects.get(get_user_path(uid), None) + if not user: + raise dbus.exceptions.DBusException( + 'No such user exists', + name='org.freedesktop.Accounts.Error.Failed') + return get_user_path(uid) + + +@dbus.service.method(MAIN_IFACE, in_signature='s', out_signature='o') +def FindUserByName(self, username): + """ Finds an user form its name """ + try: + [user_id] = [uid for uid, props in self.mock_users.items() + if props['UserName'] == username] + except ValueError as e: + raise dbus.exceptions.DBusException(f'No such user exists: {e}', name='org.freedesktop.Accounts.Error.Failed') + return get_user_path(user_id)