Blame


1 97695aca 2020-06-29 xhr #!/bin/sh
2 97695aca 2020-06-29 xhr
3 97695aca 2020-06-29 xhr main() {
4 76920906 2020-09-07 xhr if [ -z "$1" ]; then
5 97695aca 2020-06-29 xhr echo "Missing arguments" >&2
6 97695aca 2020-06-29 xhr display_usage >&2
7 97695aca 2020-06-29 xhr return 1
8 76920906 2020-09-07 xhr elif [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
9 97695aca 2020-06-29 xhr display_usage
10 76920906 2020-09-07 xhr elif [ "$1" = "--setup" ]; then
11 97695aca 2020-06-29 xhr shift
12 76920906 2020-09-07 xhr setup "$@"
13 97695aca 2020-06-29 xhr else
14 76920906 2020-09-07 xhr execute "$@"
15 97695aca 2020-06-29 xhr fi
16 97695aca 2020-06-29 xhr }
17 97695aca 2020-06-29 xhr
18 97695aca 2020-06-29 xhr execute() {
19 76920906 2020-09-07 xhr command=""
20 76920906 2020-09-07 xhr asuser=""
21 97695aca 2020-06-29 xhr
22 76920906 2020-09-07 xhr while [ -n "$1" ]; do
23 76920906 2020-09-07 xhr if [ "$1" = "--as" ]; then
24 76920906 2020-09-07 xhr if [ -z "$2" ]; then
25 76920906 2020-09-07 xhr echo "--as user not specified" >&2
26 76920906 2020-09-07 xhr display_usage >&2
27 76920906 2020-09-07 xhr return 1
28 76920906 2020-09-07 xhr elif [ -n "$asuser" ]; then
29 76920906 2020-09-07 xhr echo "--as user specified twice" >&2
30 76920906 2020-09-07 xhr display_usage >&2
31 76920906 2020-09-07 xhr return 1
32 76920906 2020-09-07 xhr fi
33 97695aca 2020-06-29 xhr
34 76920906 2020-09-07 xhr asuser="$2"
35 76920906 2020-09-07 xhr shift
36 76920906 2020-09-07 xhr shift
37 76920906 2020-09-07 xhr elif [ -z "$command" ]; then
38 76920906 2020-09-07 xhr command="$1"
39 76920906 2020-09-07 xhr shift
40 76920906 2020-09-07 xhr elif [ "$1" = "--" ]; then
41 76920906 2020-09-07 xhr shift
42 76920906 2020-09-07 xhr break
43 76920906 2020-09-07 xhr else
44 76920906 2020-09-07 xhr break
45 97695aca 2020-06-29 xhr fi
46 76920906 2020-09-07 xhr done
47 97695aca 2020-06-29 xhr
48 76920906 2020-09-07 xhr if [ -z "$command" ]; then
49 76920906 2020-09-07 xhr echo "Command not specified" >&2
50 97695aca 2020-06-29 xhr return 1
51 97695aca 2020-06-29 xhr fi
52 97695aca 2020-06-29 xhr
53 76920906 2020-09-07 xhr cmdfullpath="`which -- $command`"
54 76920906 2020-09-07 xhr if [ -z "$cmdfullpath" ]; then
55 76920906 2020-09-07 xhr echo "Command not found: $command" >&2
56 76920906 2020-09-07 xhr return 1
57 76920906 2020-09-07 xhr fi
58 97695aca 2020-06-29 xhr
59 76920906 2020-09-07 xhr if [ -z "$asuser" ]; then
60 76920906 2020-09-07 xhr basename="`basename $cmdfullpath`"
61 76920906 2020-09-07 xhr asuser="$USER-$basename"
62 76920906 2020-09-07 xhr fi
63 76920906 2020-09-07 xhr
64 76920906 2020-09-07 xhr otherhome="`grep ^$asuser: /etc/passwd | head -n1 | cut -d: -f6`"
65 76920906 2020-09-07 xhr if [ -z "$otherhome" ]; then
66 76920906 2020-09-07 xhr echo "Could not find home of $asuser" >&2
67 76920906 2020-09-07 xhr return 1
68 76920906 2020-09-07 xhr fi
69 76920906 2020-09-07 xhr
70 76920906 2020-09-07 xhr authfile="$otherhome/.Xauthority"
71 76920906 2020-09-07 xhr
72 76920906 2020-09-07 xhr set -e
73 97695aca 2020-06-29 xhr touch $authfile
74 97695aca 2020-06-29 xhr xauth -f $authfile generate $DISPLAY . trusted
75 97695aca 2020-06-29 xhr chgrp $asuser $authfile
76 97695aca 2020-06-29 xhr chmod g+r $authfile
77 97695aca 2020-06-29 xhr
78 97695aca 2020-06-29 xhr cd $otherhome
79 76920906 2020-09-07 xhr
80 76920906 2020-09-07 xhr # Closes IO handlers to avoid tty manipulation
81 76920906 2020-09-07 xhr # See: https://github.com/garotosopa/xodo/issues/1
82 76920906 2020-09-07 xhr
83 76920906 2020-09-07 xhr XAUTHORITY="$authfile" exec perl -e "
84 76920906 2020-09-07 xhr use strict;
85 76920906 2020-09-07 xhr use warnings;
86 76920906 2020-09-07 xhr use POSIX qw(setsid uname);
87 76920906 2020-09-07 xhr my (\$sysname) = uname();
88 76920906 2020-09-07 xhr close STDIN; close STDOUT; close STDERR;
89 76920906 2020-09-07 xhr fork and exit;
90 76920906 2020-09-07 xhr setsid;
91 76920906 2020-09-07 xhr if (\$sysname eq \"OpenBSD\") {
92 76920906 2020-09-07 xhr exec 'doas', '-u', \$ARGV[0], \$ARGV[1], @ARGV[2 .. @ARGV-1];
93 76920906 2020-09-07 xhr } else {
94 76920906 2020-09-07 xhr exec 'sudo', '-u', \$ARGV[0], \$ARGV[1], (defined \$ARGV[2] ? @ARGV[2 .. @ARGV-1] : ());
95 76920906 2020-09-07 xhr }
96 76920906 2020-09-07 xhr " -- "$asuser" "$cmdfullpath" "$@"
97 97695aca 2020-06-29 xhr }
98 97695aca 2020-06-29 xhr
99 97695aca 2020-06-29 xhr setup() {
100 76920906 2020-09-07 xhr if [ -z "$1" ]; then
101 97695aca 2020-06-29 xhr echo "Command not specified" >&2
102 97695aca 2020-06-29 xhr display_usage >&2
103 97695aca 2020-06-29 xhr return 1
104 97695aca 2020-06-29 xhr fi
105 97695aca 2020-06-29 xhr
106 76920906 2020-09-07 xhr command="`which -- $1`"
107 97695aca 2020-06-29 xhr
108 76920906 2020-09-07 xhr if [ -z "$command" ]; then
109 76920906 2020-09-07 xhr echo "Command not found: $command" >&2
110 76920906 2020-09-07 xhr return 1
111 76920906 2020-09-07 xhr fi
112 76920906 2020-09-07 xhr
113 76920906 2020-09-07 xhr basename="`basename $command`"
114 76920906 2020-09-07 xhr
115 97695aca 2020-06-29 xhr shift
116 97695aca 2020-06-29 xhr
117 76920906 2020-09-07 xhr while [ -n "$1" ]; do
118 76920906 2020-09-07 xhr if [ "$1" = "--as" ]; then
119 76920906 2020-09-07 xhr if [ -z "$2" ]; then
120 97695aca 2020-06-29 xhr echo "--as user not specified" >&2
121 97695aca 2020-06-29 xhr display_usage >&2
122 97695aca 2020-06-29 xhr return 1
123 76920906 2020-09-07 xhr elif [ -n "$asuser" ]; then
124 97695aca 2020-06-29 xhr echo "--as user specified twice" >&2
125 97695aca 2020-06-29 xhr display_usage >&2
126 97695aca 2020-06-29 xhr return 1
127 97695aca 2020-06-29 xhr fi
128 97695aca 2020-06-29 xhr
129 76920906 2020-09-07 xhr asuser="$2"
130 97695aca 2020-06-29 xhr shift
131 97695aca 2020-06-29 xhr shift
132 76920906 2020-09-07 xhr elif [ "$1" = "--for" ]; then
133 76920906 2020-09-07 xhr if [ -z "$2" ]; then
134 97695aca 2020-06-29 xhr echo "--for user not specified" >&2
135 97695aca 2020-06-29 xhr display_usage >&2
136 97695aca 2020-06-29 xhr return 1
137 76920906 2020-09-07 xhr elif [ -n "$foruser" ]; then
138 97695aca 2020-06-29 xhr echo "--for user specified twice" >&2
139 97695aca 2020-06-29 xhr display_usage >&2
140 97695aca 2020-06-29 xhr return 1
141 97695aca 2020-06-29 xhr fi
142 97695aca 2020-06-29 xhr
143 76920906 2020-09-07 xhr foruser="$2"
144 97695aca 2020-06-29 xhr shift
145 97695aca 2020-06-29 xhr shift
146 97695aca 2020-06-29 xhr else
147 97695aca 2020-06-29 xhr echo "Invalid argument: $1" >&2
148 97695aca 2020-06-29 xhr display_usage
149 97695aca 2020-06-29 xhr return 1
150 97695aca 2020-06-29 xhr fi
151 97695aca 2020-06-29 xhr done
152 97695aca 2020-06-29 xhr
153 76920906 2020-09-07 xhr foruser="${foruser-$USER}"
154 76920906 2020-09-07 xhr asuser="${asuser-$foruser-$basename}"
155 97695aca 2020-06-29 xhr
156 76920906 2020-09-07 xhr case "`uname`" in
157 76920906 2020-09-07 xhr Linux)
158 76920906 2020-09-07 xhr setup_function=setup_linux
159 76920906 2020-09-07 xhr priv_file=/etc/sudoers.d/xodo
160 76920906 2020-09-07 xhr ;;
161 76920906 2020-09-07 xhr OpenBSD)
162 76920906 2020-09-07 xhr setup_function=setup_openbsd
163 76920906 2020-09-07 xhr priv_file=/etc/doas.conf
164 76920906 2020-09-07 xhr ;;
165 76920906 2020-09-07 xhr *)
166 76920906 2020-09-07 xhr echo "Unsupported platform: `uname`" >&2
167 76920906 2020-09-07 xhr return 1
168 76920906 2020-09-07 xhr ;;
169 76920906 2020-09-07 xhr esac
170 76920906 2020-09-07 xhr
171 76920906 2020-09-07 xhr echo "The following steps will be executed:"
172 76920906 2020-09-07 xhr echo " - add user $asuser if it doesn't exist;"
173 76920906 2020-09-07 xhr echo " - make $asuser's home readable and writable by its group;"
174 76920906 2020-09-07 xhr echo " - add group $asuser to user $foruser;"
175 76920906 2020-09-07 xhr echo " - add an entry to $priv_file"
176 76920906 2020-09-07 xhr echo " allowing existing user $foruser"
177 76920906 2020-09-07 xhr echo " to execute $command"
178 76920906 2020-09-07 xhr echo " as new user $asuser with no password."
179 76920906 2020-09-07 xhr
180 76920906 2020-09-07 xhr echo -n "Proceed? [y/n] "
181 76920906 2020-09-07 xhr read proceed
182 76920906 2020-09-07 xhr if [ "$proceed" != "y" ] && [ "$proceed" != "Y" ]; then
183 76920906 2020-09-07 xhr echo "Aborted."
184 76920906 2020-09-07 xhr return 1
185 76920906 2020-09-07 xhr fi
186 76920906 2020-09-07 xhr
187 76920906 2020-09-07 xhr set -e
188 76920906 2020-09-07 xhr
189 76920906 2020-09-07 xhr $setup_function "$command" "$asuser" "$foruser"
190 76920906 2020-09-07 xhr
191 76920906 2020-09-07 xhr echo "Done."
192 76920906 2020-09-07 xhr echo "If user $foruser is logged in, it must log out and in again before using xodo as $asuser, so that it gets added to the new group."
193 97695aca 2020-06-29 xhr }
194 97695aca 2020-06-29 xhr
195 76920906 2020-09-07 xhr setup_linux() {
196 76920906 2020-09-07 xhr command="$1"
197 76920906 2020-09-07 xhr asuser="$2"
198 76920906 2020-09-07 xhr foruser="$3"
199 76920906 2020-09-07 xhr
200 76920906 2020-09-07 xhr if [ -z "`grep "^$asuser:" /etc/passwd`" ]; then
201 76920906 2020-09-07 xhr useradd --create-home --skel /dev/null --user-group --key UMASK=002 "$asuser"
202 76920906 2020-09-07 xhr fi
203 76920906 2020-09-07 xhr
204 76920906 2020-09-07 xhr usermod -aG "$asuser" "$foruser"
205 76920906 2020-09-07 xhr echo "$foruser ALL = ($asuser) NOPASSWD: $command" >> /etc/sudoers.d/xodo
206 76920906 2020-09-07 xhr }
207 76920906 2020-09-07 xhr
208 76920906 2020-09-07 xhr setup_openbsd() {
209 76920906 2020-09-07 xhr command="$1"
210 76920906 2020-09-07 xhr asuser="$2"
211 76920906 2020-09-07 xhr foruser="$3"
212 76920906 2020-09-07 xhr
213 76920906 2020-09-07 xhr if [ -z "`grep "^$asuser:" /etc/passwd`" ]; then
214 76920906 2020-09-07 xhr useradd -m -k "" "$asuser"
215 76920906 2020-09-07 xhr fi
216 76920906 2020-09-07 xhr
217 76920906 2020-09-07 xhr usermod -G "$asuser" "$foruser"
218 76920906 2020-09-07 xhr
219 76920906 2020-09-07 xhr otherhome="`grep "^$asuser:" /etc/passwd | head -n1 | cut -d: -f6`"
220 76920906 2020-09-07 xhr if [ -z "$otherhome" ]; then
221 76920906 2020-09-07 xhr echo "Could not find home of $asuser" >&2
222 76920906 2020-09-07 xhr return 1
223 76920906 2020-09-07 xhr fi
224 76920906 2020-09-07 xhr
225 76920906 2020-09-07 xhr chmod g+rwX "$otherhome"
226 76920906 2020-09-07 xhr
227 76920906 2020-09-07 xhr echo "\npermit nopass setenv { DISPLAY HOME=$otherhome USER=$asuser } $foruser as $asuser cmd $command" >> /etc/doas.conf
228 76920906 2020-09-07 xhr }
229 76920906 2020-09-07 xhr
230 97695aca 2020-06-29 xhr display_usage() {
231 76920906 2020-09-07 xhr echo "usage: xodo <command> [--as <user>] [--] [args...]"
232 97695aca 2020-06-29 xhr echo " xodo --setup <command> [--as <user>] [--for <user>]"
233 97695aca 2020-06-29 xhr echo " xodo --help"
234 97695aca 2020-06-29 xhr }
235 97695aca 2020-06-29 xhr
236 76920906 2020-09-07 xhr main "$@"