hc
2024-03-22 a0752693d998599af469473b8dc239ef973a012f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
From 6c8022392713955c5ae0061e22b50a16a1c2252a Mon Sep 17 00:00:00 2001
From: Simon McVittie <smcv@collabora.com>
Date: Thu, 15 Jul 2021 12:36:05 +0000
Subject: [PATCH] Improve meson_post_install script
 
[Retrieved from:
https://gitlab.freedesktop.org/polkit/polkit/-/commit/6c8022392713955c5ae0061e22b50a16a1c2252a]
Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
---
 .gitlab-ci.yml        |  3 +--
 meson_post_install.py | 58 +++++++++++++++++++++++++++++++++++--------
 2 files changed, 49 insertions(+), 12 deletions(-)
 
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 8ac3e9f..6d0abb4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -26,8 +26,6 @@ build_stable:
   before_script:
     - dnf upgrade -y --nogpgcheck fedora-release fedora-repos*
     - dnf update -y && dnf install -y $DEPENDENCIES
-    - getent group polkitd >/dev/null || groupadd -r polkitd
-    - getent passwd polkitd >/dev/null || useradd -r -g polkitd -d / -s /sbin/nologin -c "User for polkitd" polkitd
 
   script:
     - meson setup 
@@ -43,6 +41,7 @@ build_stable:
     - meson compile -C builddir
     - meson test    -C builddir
     - meson install -C builddir
+    - DESTDIR=$(pwd)/DESTDIR meson install -C builddir
   artifacts:
     name: 'test logs'
     when: 'always'
diff --git a/meson_post_install.py b/meson_post_install.py
index 0a0fccf..0ab7469 100644
--- a/meson_post_install.py
+++ b/meson_post_install.py
@@ -1,20 +1,44 @@
 #!/usr/bin/env python3
 
-import getpass
 import os
 import pwd
 import sys
 
+destdir = os.environ.get('DESTDIR')
 prefix = os.environ['MESON_INSTALL_DESTDIR_PREFIX']
 
-bindir = os.path.join(prefix, sys.argv[1])
-pkgdatadir = os.path.join(prefix, sys.argv[2])
-pkglibdir = os.path.join(prefix, sys.argv[3])
-pkgsysconfdir = os.path.join(prefix, sys.argv[4])
+def destdir_path(p):
+    if os.path.isabs(p):
+        if destdir is None:
+            return p
+        else:
+            return os.path.join(destdir, os.path.relpath(p, '/'))
+    else:
+        return os.path.join(prefix, p)
 
-polkitd_uid = pwd.getpwnam(sys.argv[5]).pw_uid
+bindir = destdir_path(sys.argv[1])
+pkgdatadir = destdir_path(sys.argv[2])
+pkglibdir = destdir_path(sys.argv[3])
+pkgsysconfdir = destdir_path(sys.argv[4])
+polkitd_user = sys.argv[5]
 
-os.chmod(os.path.join(bindir, 'pkexec'), 0o4775)
+try:
+    polkitd_uid = pwd.getpwnam(polkitd_user).pw_uid
+except KeyError:
+    polkitd_uid = None
+
+dst = os.path.join(bindir, 'pkexec')
+
+if os.geteuid() == 0:
+    os.chmod(dst, 0o4755)
+    os.chown(dst, 0, -1)
+else:
+    print(
+        'Owner and mode of {} need to be setuid root (04755) after '
+        'installation'.format(
+            dst,
+        )
+    )
 
 dst_dirs = [
     os.path.join(pkgsysconfdir, 'rules.d'),
@@ -24,13 +48,27 @@ dst_dirs = [
 for dst in dst_dirs:
     if not os.path.exists(dst):
         os.makedirs(dst, mode=0o700)
-        if getpass.getuser() == "root":
+        if os.geteuid() == 0 and polkitd_uid is not None:
             os.chown(dst, polkitd_uid, -1)
+        else:
+            print(
+                'Owner of {} needs to be set to {} after installation'.format(
+                    dst, polkitd_user,
+                )
+            )
 
 # polkit-agent-helper-1 need to be setuid root because it's used to
 # authenticate not only the invoking user, but possibly also root
 # and/or other users.
 dst = os.path.join(pkglibdir, 'polkit-agent-helper-1')
-os.chmod(dst, 0o4755)
-if getpass.getuser() == "root":
+
+if os.geteuid() == 0:
+    os.chmod(dst, 0o4755)
     os.chown(dst, 0, -1)
+else:
+    print(
+        'Owner and mode of {} need to be setuid root (04755) after '
+        'installation'.format(
+            dst,
+        )
+    )
-- 
GitLab