#!/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=$? }