xdg-open does not handle x-schemes with no URL correctly (suggested PATCH)
Submitted by aay..@..il.com
Assigned to Portland Bugs
Description
I want tp use xdg-open to open my default browser or email-client by doing e.g. xdg-open http: or xdg-open mailto: If I do that, (in the former case) it opens the browser an empty page with the http:// URL and the error 'Page not found' (of course) Here follows the fix, it needed some fixing on argument quoting (since of the arg is empty, it must not be quoted at all). I took the opportunity to fix bug 66670 and change the quoting around the user's argument to single rather than double (it also takes care of single quotes present in it). Also, first_word was defined twice (once in the beginning and once later one along with last_word) - moved definition of both to the beginning And lastly, binary_to_desktop_file handled the deprecated applnk location, but nowhere else in the script was this supported - added it to all the other functions
--- xdg-open 2014-11-16 12:14:06.587351388 +0200 +++ xdg-open.fix 2014-11-16 13:08:47.224959973 +0200 @@ -132,6 +132,12 @@ echo "$first" }
+last_word() +{
- read first rest
- echo "$rest" +}
#-------------------------------------------------------------
map a binary to a .desktop file
binary_to_desktop_file() @@ -172,14 +178,16 @@ IFS=: for dir in $search; do unset IFS
-
[ "$dir" ] && [ -d "$dir/applications" ] || continue
-
file="$dir/applications/$desktop"
-
[ -r "$file" ] || continue
-
# Remove any arguments (%F, %f, %U, %u, etc.).
-
command="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | first_word`"
-
command="`which "$command"`"
-
readlink -f "$command"
-
return
-
[ "$dir" ] || continue
-
[ -d "$dir/applications" ] || [ -d "$dir/applnk" ] || continue
-
for file in "$dir"/applications/*.desktop "$dir"/applications/*/*.desktop "$dir"/applnk/*.desktop "$dir"/applnk/*/*.desktop; do
-
[ -r "$file" ] || continue
-
# Remove any arguments (%F, %f, %U, %u, etc.).
-
command="`grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | first_word`"
-
command="`which "$command"`"
-
readlink -f "$command"
-
return
- done done }
@@ -454,19 +462,6 @@ return 0 }
-# This handles backslashes but not quote marks. -first_word() -{
- read first rest
- echo "$first" -}
-last_word() -{
- read first rest
- echo "$rest" -}
open_darwin()
{
open "$1"
@@ -572,10 +567,12 @@
command_exec=which $command 2>/dev/null
arguments="grep -E "^Exec(\[[^]=]*])?=" "$file" | cut -d= -f 2- | last_word
"
arg_one="echo "$arg" | sed 's/[&*\\]/\\\\&/g'
"
-
arguments_exec="`echo "$arguments" | sed -e 's*%[fFuU]*"'"$arg_one"'"*g'`"
-
arg_one="`echo "$arg" | sed \"s/'/'\\\"'\\\"'/g\"`"
-
[ -n "$arg_one" ] && arg_one="'$arg_one'"
-
arguments_exec="
echo "$arguments" | sed -e 's*%[fFuU]*'"$arg_one"'*g'
"if [ -x "$command_exec" ] ; then
-
if echo "$arguments" | grep -iq '%[fFuU]' ; then
-
if echo "$arguments" | grep -iq '%[fu]' ; then echo START "$command_exec" "$arguments_exec" eval "$command_exec" "$arguments_exec" else
@@ -600,15 +597,13 @@
filetype="$2"
default=xdg-mime query default "$filetype"
if [ -n "$default" ] ; then
-
xdg_user_dir="$XDG_DATA_HOME"
-
[ -n "$xdg_user_dir" ] || xdg_user_dir="$HOME/.local/share"
-
xdg_system_dirs="$XDG_DATA_DIRS"
-
[ -n "$xdg_system_dirs" ] || xdg_system_dirs=/usr/local/share/:/usr/share/
-
[ -n "$XDG_DATA_HOME" ] && xdg_user_dir="$XDG_DATA_HOME" || xdg_user_dir="$HOME/.local/share"
-
[ -n "$XDG_DATA_DIRS" ] && xdg_system_dirs="$XDG_DATA_DIRS" || xdg_system_dirs=/usr/local/share/:/usr/share/
DEBUG 3 "xdg_user_dir:
xdg_system_dirs"
for x in echo "$xdg_user_dir:$xdg_system_dirs" | sed 's/:/ /g'
; do
-
search_desktop_file "$default" "$x/applications/" "$1"
-
[ -d "$x/applications/" ] && search_desktop_file "$default" "$x/applications/" "$1"
-
[ -d "$x/applnk/" ] && search_desktop_file "$default" "$x/applnk/" "$1" done
echo $1 | sed -n 's/\(^[[:alnum:]+\.-]*\):.*$/\1/p'
" - uri="
echo $1 | sed -n 's/^[[:alnum:]+\.-]*:\/\{1,\}//p'
" if [ -n $scheme ]; then filetype="x-scheme-handler/$scheme"
-
open_generic_xdg_mime "$1" "$filetype"
-
[ -n "$uri" ] && open_generic_xdg_mime "$1" "$filetype"
-
open_generic_xdg_mime "" "$filetype"
Version: 1.1.0 rc2