%PDF- <> %âãÏÓ endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 28 0 R 29 0 R] /MediaBox[ 0 0 595.5 842.25] /Contents 4 0 R/Group<>/Tabs/S>> endobj ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµùÕ5sLOšuY>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<> endobj 2 0 obj<>endobj 2 0 obj<>es 3 0 R>> endobj 2 0 obj<> ox[ 0.000000 0.000000 609.600000 935.600000]/Fi endobj 3 0 obj<> endobj 7 1 obj<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/Subtype/Form>> stream
# Copyright (C) 2023 Canonical Ltd. # Author: Benjamin Drung <benjamin.drung@canonical.com> # SPDX-License-Identifier: GPL-2.0-or-later """Functions around users and groups.""" import os class UserGroupID: """Pair of user and group ID.""" def __init__(self, uid, gid): self.uid = uid self.gid = gid def is_root(self): """Check if the user or group ID is root.""" return self.uid == 0 or self.gid == 0 def get_process_user_and_group(): """Return the current process's real user and group.""" return UserGroupID(os.getuid(), os.getgid())