aboutsummarylogtreecommitdiffstats
path: root/cups-programme.sh
diff options
context:
space:
mode:
authorfelics2018-05-22 14:31:38 +0200
committerfelics2018-05-22 14:31:38 +0200
commit39f65f73a1699d9b8309ebe5c578e1d93640baa5 (patch)
tree9cd2b5f8ed61dd4990f73bf7c087b1bc8a421318 /cups-programme.sh
parent37f24c78b856b45f6cafa2ac200e0422c2bbe13a (diff)
downloadaur-cups-print-to-programme.tar.gz
Allowing only a whitelist of characters in $DEVICE_URI. Also, changed the API. Bug fixes.
Diffstat (limited to 'cups-programme.sh')
-rwxr-xr-xcups-programme.sh48
1 files changed, 26 insertions, 22 deletions
diff --git a/cups-programme.sh b/cups-programme.sh
index a59e0f0e1250..da76646a2770 100755
--- a/cups-programme.sh
+++ b/cups-programme.sh
@@ -43,22 +43,20 @@ conffile=/etc/cups/cups-programme.conf
# Timestamp
tstamp="$(date '+%Y-%m-%d_%T%z')"
-case "$1" in
- '-V'|'-version'|'--version')
- echo "${VERSION}"
- exit 0
- ;;
-esac
-
+# How to output text to stdout:
+stdout() {
+ # Don't use 'echo', since it might interpret leading '-e', '-E', '-n' and maybe others.
+ cat <<< "$@"
+}
# Write to stderr:
stderr() {
- echo "$@" 1>&2
+ stdout "$@" 1>&2
}
### Local logging:
log_local() {
- echo "$@" >> "${logfile}"
+ stdout "$@" >> "${logfile}"
}
### CUPS logging with corresponding loglevels:
@@ -109,6 +107,12 @@ emerg() {
log_cups "EMERG: ${firstarg}" "$@"
}
+case "$1" in
+ '-V'|'-version'|'--version')
+ stdout "${VERSION}"
+ exit 0
+ ;;
+esac
### Reading arguments passed from CUPS:
backend=${0}
@@ -134,7 +138,7 @@ outfile_prefix="/tmp/${backend_name}.${jobid}"
case ${#} in
0)
# This case is for "backend discovery mode."
- echo "direct ${backend_name} \"Unknown\" \"cups-programme: Print to file and open in programme. DeviceURI example: ${backend_name}:/usr/bin/gimp?u=<user>&DISPLAY=%C0.0&%s\". See documentation!"
+ stdout "direct ${backend_name} \"Unknown\" \"cups-programme: Print to file and open in programme. DeviceURI example: ${backend_name}:/usr/bin/gimp?u=<user>&DISPLAY=%C0.0&%s\". See documentation!"
exit 0
;;
5)
@@ -259,17 +263,17 @@ replace_strings() {
# Put the '-' last in order for grep not interpreting it special.
# Put the '^' not first in order for grep not interpreting it special.
_allowd_chars='][)(}{äÄöÖüÜß.:,;_@^°§%&/=?+*~a-zA-Z0-9-'
-if echo "${DEVICE_URI}" | grep -qE -e "[^${_allowd_chars}]"; then
- _rejected_chars="$(echo "${DEVICE_URI}" | grep -oE -e "[^${_allowd_chars}]" | sort | uniq | tr -d '\n')"
+if stdout "${DEVICE_URI}" | grep -qE -e "[^${_allowd_chars}]"; then
+ _rejected_chars="$(stdout "${DEVICE_URI}" | grep -oE -e "[^${_allowd_chars}]" | sort | uniq | tr -d '\n')"
error "$0: \$DEVICE_URI contains forbidden character(s) '${_rejected_chars}'. Allowed set: [${_allowd_chars}]. Aborting."
exit 5
fi
# Getting the command from $DEVICE_URI:
-cmd="$(echo "${DEVICE_URI}" | sed "s|^${backend_name}":'||g' | sed 's|?.*$||')"
+cmd="$(stdout "${DEVICE_URI}" | sed "s|^${backend_name}":'||g' | sed 's|?.*$||')"
# Getting the raw options, arguments, ... from $DEVICE_URI:
-argstr="$(echo "${DEVICE_URI}" | sed -n 's|^[^?]*?\(.*\)$|\1|p')"
+argstr="$(stdout "${DEVICE_URI}" | sed -n 's|^[^?]*?\(.*\)$|\1|p')"
# Taking the raw options, arguments, ... apart:
IFS='&' read -r -a argv <<< "${argstr}"
@@ -327,17 +331,17 @@ fi
outfile="${outfile_prefix}.${filetype}"
# Now, after $outfile is set, do the string replacements:
-if [ -v cmd ]; then cmd="$(echo "${cmd}" | replace_strings)"; fi
-if [ -v user ]; then user="$(echo "${user}" | replace_strings)"; fi
-if [ -v group ]; then group="$(echo "${group}" | replace_strings)"; fi
+if [ -v cmd ]; then cmd="$(replace_strings <<< "${cmd}" )"; fi
+if [ -v user ]; then user="$(replace_strings <<< "${user}" )"; fi
+if [ -v group ]; then group="$(replace_strings <<< "${group}" )"; fi
cmd_args_replaced=()
for _arg in "${cmd_args[@]}"; do
- cmd_args_replaced+=("$(echo "${_arg}" | replace_strings)")
+ cmd_args_replaced+=("$(replace_strings <<< "${_arg}")")
done
# Exporting environment variables after replacements.
for _env in "${env_vars[@]}"; do
- _var="$(echo "${_env%%=*}" | replace_strings)"
- _val="$(echo "${_env#?*=}" | replace_strings)"
+ _var="$(replace_strings <<< "${_env%%=*}" )"
+ _val="$(replace_strings <<< "${_env#?*=}" )"
log_local "Exporting environment variable '${_var}=${_val}'."
declare -g "${_var}=${_val}"
export "${_var}"
@@ -544,7 +548,7 @@ if [ -v user ] || [ -v group ]; then
if [ -v user ]; then
su_opts+=" -u ${user@Q}"
fi
- su_opts+=" -c ${cmd@Q} ${cmd_args_replaced[@]@Q}"
+ su_opts+=" -c \"${cmd@Q} ${cmd_args_replaced[@]@Q}\""
;;
'kdesudo')
su_cmd='kdesudo'
@@ -555,7 +559,7 @@ if [ -v user ] || [ -v group ]; then
if [ -v user ]; then
su_opts+=" -u ${user@Q}"
fi
- su_opts+=" -c ${cmd@Q} ${cmd_args_replaced[@]@Q}"
+ su_opts+=" -c \"${cmd@Q} ${cmd_args_replaced[@]@Q}\""
;;
*)
error "$0: Error: Unsupported su_variant '${su_variant}' provided. Aborting."