123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386 |
- #!/usr/bin/env bash
- #
- # GNU/Linux does not really require something like RelativeLink.c
- # However, we do want to have the same look and feel with similar features.
- #
- # Copyright 2017 The Tor Project. See LICENSE for licensing information.
- complain_dialog_title="[% c('var/Project_Name') %]"
- # Make sure this script wasn't started as 'sh start-[% c('var/project-name') %]' or similar.
- if [ "x$BASH" = "x" ]; then
- echo "$complain_dialog_title should be started as './start-[% c('var/project-name') %]'"
- echo "Exiting." >&2
- exit 1;
- fi
- # Do not (try to) connect to the session manager
- unset SESSION_MANAGER
- # Complain about an error, by any means necessary.
- # Usage: complain message
- # message must not begin with a dash.
- complain () {
- # Trim leading newlines, to avoid breaking formatting in some dialogs.
- complain_message="`echo "$1" | sed '/./,$!d'`"
- # If we're being run in debug/verbose mode, complain to stderr.
- if [ "$show_output" -eq 1 ]; then
- echo "$complain_message" >&2
- return
- fi
- # Otherwise, we're being run by a GUI program of some sort;
- # try to pop up a message in the GUI in the nicest way
- # possible.
- #
- # In mksh, non-existent commands return 127; I'll assume all
- # other shells set the same exit code if they can't run a
- # command. (xmessage returns 1 if the user clicks the WM
- # close button, so we do need to look at the exact exit code,
- # not just assume the command failed to display a message if
- # it returns non-zero.)
- # First, try zenity.
- zenity --error \
- --title="$complain_dialog_title" \
- --text="$complain_message"
- if [ "$?" -ne 127 ]; then
- return
- fi
- # Try kdialog.
- kdialog --title "$complain_dialog_title" \
- --error "$complain_message"
- if [ "$?" -ne 127 ]; then
- return
- fi
- # Try xmessage.
- xmessage -title "$complain_dialog_title" \
- -center \
- -buttons OK \
- -default OK \
- -xrm '*message.scrollVertical: Never' \
- "$complain_message"
- if [ "$?" -ne 127 ]; then
- return
- fi
- # Try gxmessage. This one isn't installed by default on
- # Debian with the default GNOME installation, so it seems to
- # be the least likely program to have available, but it might
- # be used by one of the 'lightweight' Gtk-based desktop
- # environments.
- gxmessage -title "$complain_dialog_title" \
- -center \
- -buttons GTK_STOCK_OK \
- -default OK \
- "$complain_message"
- if [ "$?" -ne 127 ]; then
- return
- fi
- }
- if [ "`id -u`" -eq 0 ]; then
- complain "The [% c('var/Project_Name') %] should not be run as root. Exiting."
- exit 1
- fi
- if uname -m | grep -q -e "x86_64" -e "amd64" -e "i[456]86" ; then
- if test -r /proc/cpuinfo && ! grep -q '^flags\s*:.* sse2' /proc/cpuinfo; then
- complain "[% c('var/Project_Name') %] requires a CPU with SSE2 support. Exiting."
- exit 1
- fi
- fi
- tbb_usage () {
- printf "\n[% c('var/Project_Name') %] Script Options\n"
- printf " --verbose Display Tor and Firefox output in the terminal\n"
- printf " --log [file] Record Tor and Firefox output in file (default: [% c('var/project-name') %].log)\n"
- printf " --detach Detach from terminal and run [% c('var/Project_Name') %] in the background.\n"
- printf " --register-app Register [% c('var/Project_Name') %] as a desktop app for this user\n"
- printf " --unregister-app Unregister [% c('var/Project_Name') %] as a desktop app for this user\n"
- }
- log_output=0
- show_output=0
- detach=0
- show_usage=0
- register_desktop_app=0
- logfile=/dev/null
- while :
- do
- case "$1" in
- --detach)
- detach=1
- shift
- ;;
- -v | --verbose | -d | --debug)
- show_output=1
- verbose_arg="$2"
- shift
- ;;
- -h | "-?" | --help | -help)
- show_usage=1
- show_output=1
- shift
- ;;
- -l | --log)
- if [ -z "$2" -o "${2:0:1}" == "-" ]; then
- printf "Logging [% c('var/Project_Name') %] debug information to [% c('var/project-name') %].log\n"
- logfile="../[% c('var/project-name') %].log"
- elif [ "${2:0:1}" == "/" -o "${2:0:1}" == "~" ]; then
- printf "Logging [% c('var/Project_Name') %] debug information to %s\n" "$2"
- logfile="$2"
- shift
- else
- printf "Logging [% c('var/Project_Name') %] debug information to %s\n" "$2"
- logfile="../$2"
- shift
- fi
- log_output=1
- shift
- ;;
- --register-app)
- register_desktop_app=1
- show_output=1
- shift
- ;;
- --unregister-app)
- register_desktop_app=-1
- show_output=1
- shift
- ;;
- *) # No more options
- break
- ;;
- esac
- done
- # We can't detach and show output at the same time..
- if [ "$show_output" -eq 1 -a "$detach" -eq 1 ]; then
- detach=0
- fi
- if [ "$show_output" -eq 0 ]; then
- # If the user hasn't requested 'debug mode' or --help, close stdout and stderr,
- # to keep Firefox and the stuff loaded by/for it (including the
- # system's shared-library loader) from printing messages to
- # $HOME/.xsession-errors or other files. (Users wouldn't have seen
- # messages there anyway.)
- exec > "$logfile"
- exec 2> "$logfile"
- fi
- # If XAUTHORITY is unset, set it to its default value of $HOME/.Xauthority
- # before we change HOME below. (See xauth(1) and #1945.) XDM and KDM rely
- # on applications using this default value.
- if [ -z "$XAUTHORITY" ]; then
- XAUTHORITY=~/.Xauthority
- export XAUTHORITY
- fi
- # If this script is being run through a symlink, we need to know where
- # in the filesystem the script itself is, not where the symlink is.
- myname="$0"
- if [ -L "$myname" ]; then
- # XXX readlink is not POSIX, but is present in GNU coreutils
- # and on FreeBSD. Unfortunately, the -f option (which follows
- # a whole chain of symlinks until it reaches a non-symlink
- # path name) is a GNUism, so we have to have a fallback for
- # FreeBSD. Fortunately, FreeBSD has realpath instead;
- # unfortunately, that's also non-POSIX and is not present in
- # GNU coreutils.
- #
- # If this launcher were a C program, we could just use the
- # realpath function, which *is* POSIX. Too bad POSIX didn't
- # make that function accessible to shell scripts.
- # If realpath is available, use it; it Does The Right Thing.
- possibly_my_real_name="`realpath "$myname" 2>/dev/null`"
- if [ "$?" -eq 0 ]; then
- myname="$possibly_my_real_name"
- else
- # realpath is not available; hopefully readlink -f works.
- myname="`readlink -f "$myname" 2>/dev/null`"
- if [ "$?" -ne 0 ]; then
- # Ugh.
- complain "start-[% c('var/project-name') %] cannot be run using a symlink on this operating system."
- fi
- fi
- fi
- # Try to be agnostic to where we're being started from, chdir to where
- # the script is.
- mydir="`dirname "$myname"`"
- test -d "$mydir" && cd "$mydir"
- # If ${PWD} results in a zero length string, we can try something else...
- if [ ! "${PWD}" ]; then
- # "hacking around some braindamage"
- PWD="`pwd`"
- surveysays="This system has a messed up shell.\n"
- fi
- # This is a fix for an ibus issue on some Linux systems. See #9353 for more
- # details. The symlink needs to be created before we change HOME.
- if [ ! -d ".config/ibus" ]; then
- mkdir -p .config/ibus
- ln -nsf ~/.config/ibus/bus .config/ibus
- fi
- # Fix up .desktop Icon and Exec Paths, and update the .desktop file from the
- # canonical version if it was changed by the updater.
- cp start-[% c('var/project-name') %].desktop ../
- sed -i -e "s,^Name=.*,Name=[% c('var/Project_Name') %],g" ../start-[% c('var/project-name') %].desktop
- sed -i -e "s,^Icon=.*,Icon=$PWD/browser/chrome/icons/default/default128.png,g" ../start-[% c('var/project-name') %].desktop
- sed -i -e "s,^Icon=.*,Icon=$PWD/browser/chrome/icons/default/default128.png,g" start-[% c('var/project-name') %].desktop
- sed -i -e "s,^Exec=.*,Exec=sh -c '\"$PWD/start-[% c('var/project-name') %]\" --detach || ([ ! -x \"$PWD/start-[% c('var/project-name') %]\" ] \&\& \"\$(dirname \"\$*\")\"/Browser/start-[% c('var/project-name') %] --detach)' dummy %k,g" ../start-[% c('var/project-name') %].desktop
- if [ "$register_desktop_app" -eq 1 ]; then
- mkdir -p "$HOME/.local/share/applications/"
- cp ../start-[% c('var/project-name') %].desktop "$HOME/.local/share/applications/"
- update-desktop-database "$HOME/.local/share/applications/"
- printf "[% c('var/Project_Name') %] has been registered as a desktop app for this user in ~/.local/share/applications/\n"
- exit 0
- fi
- if [ "$register_desktop_app" -eq -1 ]; then
- if [ -e "$HOME/.local/share/applications/start-[% c('var/project-name') %].desktop" ]; then
- rm -f "$HOME/.local/share/applications/start-[% c('var/project-name') %].desktop"
- update-desktop-database "$HOME/.local/share/applications/"
- printf "[% c('var/Project_Name') %] has been removed as a user desktop app (from ~/.local/share/applications/)\n"
- else
- printf "[% c('var/Project_Name') %] does not appear to be a desktop app (not present in ~/.local/share/applications/)\n"
- fi
- exit 0
- fi
- HOME="${PWD}"
- export HOME
- [% IF c("var/tor-browser") -%]
- SYSARCHITECTURE=$(getconf LONG_BIT)
- TORARCHITECTURE=$(expr "$(file TorBrowser/Tor/tor)" : '.*ELF \([[:digit:]]*\)')
- if [ $SYSARCHITECTURE -ne $TORARCHITECTURE ]; then
- complain "Wrong architecture? 32-bit vs. 64-bit."
- exit 1
- fi
- [% END -%]
- [% IF c("var/asan") -%]
- # We need to disable LSan which is enabled by default now. Otherwise we'll get
- # a crash during shutdown: https://bugs.torproject.org/10599#comment:59
- ASAN_OPTIONS="detect_leaks=0"
- export ASAN_OPTIONS
- [% END -%]
- [% IF c("var/tor-browser") -%]
- function setControlPortPasswd() {
- local ctrlPasswd=$1
- if test -z "$ctrlPasswd" -o "$ctrlPasswd" = $'\"secret\"' ; then
- unset TOR_CONTROL_PASSWD
- return
- fi
- if test "${ctrlPasswd:0:1}" = $'\"'; then # First 2 chars were '"
- printf "Using system Tor process.\n"
- export TOR_CONTROL_PASSWD
- else
- complain "There seems to have been a quoting problem with your \
- TOR_CONTROL_PASSWD environment variable."
- echo "The Tor ControlPort password should be given inside double"
- echo "quotes, inside single quotes. That is, if the ControlPort"
- echo 'password is “secret” (without curly quotes) then we must'
- echo "start this script after setting the environment variable"
- echo "exactly like this:"
- echo
- echo " \$ TOR_CONTROL_PASSWD='\"secret\"' $myname"
- fi
- }
- # Using a system-installed Tor process with Tor Browser:
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # The Tor ControlPort password should be given inside double quotes, inside
- # single quotes, i.e. if the ControlPort password is “secret” (without
- # curly quotes) then we must set the environment variable *exactly* like
- # this:
- #
- # TOR_CONTROL_PASSWD='"secret"'
- #
- # Yes, the variable MUST be double-quoted, then single-quoted, exactly as
- # shown. This is used by TorButton and Tor Launcher to authenticate to Tor's
- # ControlPort, and is necessary for using TB with a system-installed Tor.
- #
- # Additionally, if using a system-installed Tor, the following about:config
- # options should be set (values in <> mean they are the value taken from your
- # torrc):
- #
- # SETTING NAME VALUE
- # network.proxy.socks 127.0.0.1
- # network.proxy.socks_port <SocksPort>
- # extensions.torbutton.inserted_button true
- # extensions.torbutton.launch_warning false
- # extensions.torbutton.loglevel 2
- # extensions.torbutton.logmethod 0
- # extensions.torlauncher.control_port <ControlPort>
- # extensions.torlauncher.loglevel 2
- # extensions.torlauncher.logmethod 0
- # extensions.torlauncher.prompt_at_startup false
- # extensions.torlauncher.start_tor false
- #
- # where the '[...]' in the banned_ports option means "leave anything that was
- # already in the preference alone, just append the things specified after it".
- # Either set `TOR_CONTROL_PASSWD` before running ./start-tor-browser, or put
- # your password in the following line where the word “secret” is:
- setControlPortPasswd ${TOR_CONTROL_PASSWD:='"secret"'}
- [% END -%]
- # Set up custom bundled fonts. See fonts-conf(5).
- export FONTCONFIG_PATH="${HOME}/[% c('var/ProjectName') %]/Data/fontconfig"
- export FONTCONFIG_FILE="fonts.conf"
- # Avoid overwriting user's dconf values. Fixes #27903.
- export GSETTINGS_BACKEND=memory
- cd "${HOME}"
- # We pass all additional command-line arguments we get to Firefox.
- #
- # The --class parameter was added to fix bug trac#11102 (X11).
- # The --name parameter was added to fix bug tor-browser-build#40517 (Wayland).
- # --class and --name parameters are used to make sure WM_CLASS is set
- # up correctly, to identify itself from plain Firefox windows (and
- # prevent from mixing up with them).
- if [ "$show_usage" -eq 1 ]; then
- # Display Firefox help, then our help
- [% IF c("var/tor-browser") %]TOR_CONTROL_PASSWD=${TOR_CONTROL_PASSWD}[% END %] ./firefox \
- --class "[% c('var/Project_Name') %]" --name "[% c('var/Project_Name') %]" \
- -profile [% c('var/ProjectName') %]/Data/Browser/profile.default --help 2>/dev/null
- tbb_usage
- elif [ "$detach" -eq 1 ] ; then
- [% IF c("var/tor-browser") %]TOR_CONTROL_PASSWD=${TOR_CONTROL_PASSWD}[% END %] ./firefox \
- --class "[% c('var/Project_Name') %]" --name "[% c('var/Project_Name') %]" \
- -profile [% c('var/ProjectName') %]/Data/Browser/profile.default "${@}" > "$logfile" 2>&1 </dev/null &
- disown "$!"
- elif [ "$log_output" -eq 1 -a "$show_output" -eq 1 ]; then
- [% IF c("var/tor-browser") %]TOR_CONTROL_PASSWD=${TOR_CONTROL_PASSWD}[% END %] ./firefox \
- --class "[% c('var/Project_Name') %]" --name "[% c('var/Project_Name') %]" \
- -profile [% c('var/ProjectName') %]/Data/Browser/profile.default "${@}" 2>&1 </dev/null | \
- tee "$logfile"
- elif [ "$show_output" -eq 1 ]; then
- [% IF c("var/tor-browser") %]TOR_CONTROL_PASSWD=${TOR_CONTROL_PASSWD}[% END %] ./firefox \
- --class "[% c('var/Project_Name') %]" --name "[% c('var/Project_Name') %]" \
- -profile [% c('var/ProjectName') %]/Data/Browser/profile.default "${@}" < /dev/null
- else
- [% IF c("var/tor-browser") %]TOR_CONTROL_PASSWD=${TOR_CONTROL_PASSWD}[% END %] ./firefox \
- --class "[% c('var/Project_Name') %]" --name "[% c('var/Project_Name') %]" \
- -profile [% c('var/ProjectName') %]/Data/Browser/profile.default "${@}" > "$logfile" 2>&1 </dev/null
- fi
- exit $?
|