From eb3c5e878c4a7d3439501d939c3010324d59e08c Mon Sep 17 00:00:00 2001 From: Andrew Cady Date: Fri, 19 Jun 2020 12:16:02 -0400 Subject: sideloader implementation begins --- firefox-sideloader/functions.sh | 107 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 firefox-sideloader/functions.sh diff --git a/firefox-sideloader/functions.sh b/firefox-sideloader/functions.sh new file mode 100644 index 0000000..7b144df --- /dev/null +++ b/firefox-sideloader/functions.sh @@ -0,0 +1,107 @@ +#!/bin/sh + +profiles_ini=~/.mozilla/firefox/profiles.ini + +get_default_firefox_profile_basename() +{ + < "$profiles_ini" \ + perl -ne 'BEGIN { $/ = "" } + /^Default=1$/m || next; + /^Path=(.+)$/m || die; + print "$1\n"; + $printed = 1; + last; + + END { die unless $printed }' +} + +get_default_firefox_profile_dir() +{ + local prof + prof=$(get_default_firefox_profile_basename) || return + printf '%s/%s\n' "${profiles_ini%/*}" "$prof" +} + +get_basename_from_profile_name() +{ + < "$profiles_ini" \ + ARG="$1" \ + perl -ne 'BEGIN { $/ = "" } + /^Name=(.+)$/m || next; + $1 eq $ENV{ARG} || next; + /^Path=(.+)$/m || next; + print "$1"; + $printed = 1; + last; + + END { die unless $printed }' +} +get_profile_dir_from_profile_name() +{ + local prof + prof=$(get_basename_from_profile_name "$1") || return + printf '%s/%s\n' "${profiles_ini%/*}" "$prof" +} + +get_profile_dir() +{ + if [ "$1" ] + then get_profile_dir_from_profile_name "$1" + else get_default_firefox_profile_dir + fi +} + +illustrate_leak() +{ + local prof + which jq >/dev/null || sudo apt-get install jq + prof=$(get_default_firefox_profile_dir) && jq . < "$prof"/extensions.json | grep "$HOME" +} + +copy_extensions_json() +{ + local new="$1" old="$2" f='extensions.json' filter_json + filter_json="s/${old//\//\\/}/${new//\//\\/}/g" + [ -d "$old" -a -d "$new" ] || return + sed -e "$filter_json" > "$new"/"$f" < "$old"/"$f" +} + +clone_profile_raw() +{ + local old_profile_dir="$1" new_profile_name="$2" + [ -d "$old_profile_dir" ] || return + [ -d "$old_profile_dir"/extensions ] || return + + firefox -createProfile "$new_profile_name" || return + new_profile_dir=$(get_profile_dir "$new_profile_name") || return + [ "$new_profile_dir" ] || return + [ "$new_profile_dir" != "$old_profile_dir" ] || return + + cp -r --preserve=mode,timestamps -t "$new_profile_dir" -- "$old_profile_dir"/extensions/ || return + + copy_extensions_json "$new_profile_dir" "$old_profile_dir" +} + +clone_profile() +{ + local old_profile_name="$1" old_profile_dir + shift + old_profile_dir=$(get_profile_dir "$old_profile_name") || return + clone_profile_raw "$old_profile_dir" "$@" +} + +clone_default_profile() +{ + new_name=$1 + [ "$new_name" ] || return + old_dir=$(get_default_firefox_profile_dir) || return + [ "$old_dir" ] || return + clone_profile_raw "$old_dir" "$new_name" +} + +runtest() +{ + . functions.sh + clone_default_profile "test.$(date -I)" + echo r=$? +} -- cgit v1.2.3