Commit 78261b6b authored by intrigeri's avatar intrigeri

Remove Windows camouflage code and documentation.

Refs: #8064
parent 1a06a192
# This script sets up the live user's Gnome theme to something that
# resembles Microsoft Windows 8.
# Set claws-mail icon
# Create claws-mail theme
cp /usr/share/icons/Windows8/apps/claws-mail.png "$CLAWSTHEMEDIR/claws_mail_icon.png"
echo > "$CLAWSTHEMEDIR/.claws_themeinfo" <<EOF
Tails Windows 8
Tails Developers
# Apply claws-mail theme
# XXX: this will disable any user-defined theme stored in persistence
# and the change will be permanent, even though it has no effect if the theme
# doesn't exist, which should be the case if camouflage has not been enabled.
if [ -d "$HOME/.claws-mail" ]; then
if grep "$CLAWSCONFLABEL" "$HOME/.claws-mail/clawsrc"; then
sed -e "s;$CLAWSCONFLABEL=.*$;$CLAWSCONFLABEL=$CLAWSTHEMEDIR;" -i "$HOME/.claws-mail/clawsrc"
# Tor Browser
# Copy the file containing toolbars configurations
for browser in tor-browser unsafe-browser i2p-browser; do
if [ -d "${profile}" ]; then
cp /usr/share/tails/tor-browser-win8-theme/localstore.rdf \
mkdir -p "${profile}"/preferences
cp /usr/share/tails/tor-browser-win8-theme/theme.js \
mkdir -p "${profile}"/chrome
cp /usr/share/tails/tor-browser-win8-theme/userChrome.css \
# Remove Tails-specific desktop icons
rm --interactive=never -f ${HOME}/Desktop/*.desktop 2> /dev/null || true
# The part below is based on the XpGnome installation script, written
# by PhrankDaChicken, available from
# Icon theme
gsettings set org.gnome.desktop.interface icon-theme Windows8
# Cursor theme
gsettings set org.gnome.desktop.interface cursor-theme Windows8
# GTK theme
gsettings set org.gnome.desktop.interface gtk-theme Windows8
# Metacity theme
gsettings set org.gnome.desktop.wm.preferences theme Windows8
# Toolbars - Icons Only
gsettings set org.gnome.desktop.interface toolbar-style icons
# Desktop Icons
gsettings set org.gnome.nautilus.desktop computer-icon-visible false
gsettings set org.gnome.nautilus.desktop home-icon-visible false
gsettings set org.gnome.nautilus.desktop network-icon-visible false
gsettings set org.gnome.nautilus.desktop trash-icon-visible true
gsettings set org.gnome.nautilus.desktop volumes-visible true
# FIXME: Localization needed below
gsettings set org.gnome.nautilus.desktop trash-icon-name "Recycle Bin"
# Background
gsettings set org.gnome.desktop.background picture-uri file:///usr/share/pixmaps/backgrounds/Windows8.jpg
gsettings set org.gnome.desktop.background picture-options stretched
# Only one workspace
gsettings set org.gnome.desktop.wm.preferences num-workspaces 1
# Panel
gsettings set org.gnome.gnome-panel.layout object-id-list "['menu-button', 'tor-browser-launcher', 'claws-launcher', 'pidgin-launcher', 'keepassx-launcher', 'gnome-terminal-launcher', 'window-list', 'notification-area', 'clock']"
gsettings set org.gnome.gnome-panel.layout toplevel-id-list "['bottom-panel']"
gsettings set org.gnome.desktop.lockdown disable-log-out true
# Window picker config
gsettings set org.gnome.window-picker-applet expand-task-list true
# Panel objects - there is no schema so we can't use gsettings
dconf write /org/gnome/gnome-panel/layout/objects/menu-button/object-iid '"PanelInternalFactory::MenuButton"'
dconf write /org/gnome/gnome-panel/layout/objects/menu-button/pack-index '0'
dconf write /org/gnome/gnome-panel/layout/objects/menu-button/pack-type '"start"'
dconf write /org/gnome/gnome-panel/layout/objects/menu-button/toplevel-id '"bottom-panel"'
dconf write /org/gnome/gnome-panel/layout/objects/window-list/object-iid '"WindowPickerFactory::WindowPicker"'
dconf write /org/gnome/gnome-panel/layout/objects/window-list/pack-index '1'
dconf write /org/gnome/gnome-panel/layout/objects/window-list/pack-type '"start"'
dconf write /org/gnome/gnome-panel/layout/objects/window-list/toplevel-id '"bottom-panel"'
dconf write /org/gnome/gnome-panel/layout/objects/notification-area/pack-index '2'
dconf write /org/gnome/gnome-panel/layout/objects/notification-area/pack-type '"end"'
dconf write /org/gnome/gnome-panel/layout/objects/notification-area/toplevel-id '"bottom-panel"'
dconf write /org/gnome/gnome-panel/layout/objects/clock/pack-index '0'
dconf write /org/gnome/gnome-panel/layout/objects/clock/toplevel-id '"bottom-panel"'
dconf write /org/gnome/gnome-panel/layout/objects/clock/pack-type '"end"'
# Panel toplevels - there is no schema so we can't use gsettings.
# Note that the height must be set after adding the object to the
# panel since some of them, like window-picket-applet, seem to reset
# it.
dconf write /org/gnome/gnome-panel/layout/toplevels/bottom-panel/size '48'
# XXX Ugly restart hacks because this script runs too late
# Restart the panel
pkill gnome-panel
# Restart florence to make it use the right icon
pkill florence && florence &/usr/share/pixmaps/gpgApplet/48x48-grey/gpgApplet
# Mute and unmute volume to fix its icon
amixer set Master toggle
sleep 0.1
amixer set Master toggle
......@@ -11,9 +11,6 @@ fi
# configure_xulrunner_app_locale().
. /usr/local/lib/tails-shell-library/
# Import windows_camouflage_is_enabled()
. /usr/local/lib/tails-shell-library/
# Import try_for().
. /usr/local/lib/tails-shell-library/
......@@ -147,22 +144,10 @@ configure_chroot_browser_profile () {
# Remove all bookmarks
rm "${chroot}/${TBB_PROFILE}/bookmarks.html"
# Set an appropriate theme, except if we're using Windows
# camouflage.
if ! windows_camouflage_is_enabled; then
cat "/usr/share/tails/${browser_name}/theme.js" >> "${browser_prefs}"
# The tails-activate-win8-theme script requires that the
# browser profile is writable by the user running the script.
set_chroot_browser_permissions "${chroot}" "${browser_name}" "${browser_user}"
# The camouflage activation script requires a dbus server for
# properly configuring GNOME, so we start one in the chroot
chroot "${chroot}" sudo -H -u "${browser_user}" sh -c 'eval `dbus-launch --auto-syntax`; tails-activate-win8-theme' || :
# Set an appropriate theme
cat "/usr/share/tails/${browser_name}/theme.js" >> "${browser_prefs}"
# Customize the GUI. This must be done after (potentially)
# applying the camouflage theme since we in that case will be
# appending to the camouflage config.
# Customize the GUI.
local browser_chrome="${browser_profile}/chrome/userChrome.css"
mkdir -p "$(dirname "${browser_chrome}")"
cat "/usr/share/tails/${browser_name}/userChrome.css" >> "${browser_chrome}"
......@@ -29,10 +29,6 @@ mac_spoof_is_enabled() {
[ "$(_get_tg_setting "${PHYSICAL_SECURITY_SETTINGS}" TAILS_MACSPOOF_ENABLED)" != false ]
windows_camouflage_is_enabled() {
[ -e /var/lib/gdm3/tails.camouflage ]
tails_netconf() {
......@@ -5,9 +5,6 @@ set -e
# Import the TBB_EXT variable, and guess_best_tor_browser_locale().
. /usr/local/lib/tails-shell-library/
# Import windows_camouflage_is_enabled()
. /usr/local/lib/tails-shell-library/
# Import try_cleanup_browser_chroot(), setup_browser_chroot(),
# configure_chroot_dns_servers(), configure_chroot_browser(),
# configure_chroot_browser(), set_chroot_browser_locale()
......@@ -11,9 +11,6 @@ set -e
# Get LANG
. /etc/default/locale
# Get windows_camouflage_is_enabled
. /usr/local/lib/tails-shell-library/
for i in $(seq 10); do
killall -SIGKILL vidalia || :
sleep 1
......@@ -22,9 +19,6 @@ for i in $(seq 10); do
# We don't want to start Vidalia if Windows Camouflage is enabled (ticket #7400)
windows_camouflage_is_enabled && exit 0
until pgrep -u "${LIVE_USERNAME}" "^ibus-daemon" >/dev/null ; do
sleep 5
# This script runs the few steps required for windows 8 camouflage that cannot
# be run as the desktop user. It consists mainly of ugly workarounds. Running this
# script will change the system until next reboot.
# Import the TBB_INSTALL variable
. /usr/local/lib/tails-shell-library/
# Activate the camouflage for the next session
install -m 0644 \
/usr/share/applications/tails-activate-win8-theme.desktop \
# Setup pidgin application icon (show in the windows list)
# The path to /usr/share/icons/hicolor is hardcoded in pidgin.
for icon in /usr/share/icons/hicolor/*/apps/pidgin.png; do
rm "$icon"
ln -s "/usr/share/icons/Windows8/apps/pidgin.png" "$icon"
# Set Tor Browser application icon
for icon in "${TBB_INSTALL}"/browser/chrome/icons/default/*.png \
"${TBB_INSTALL}"/browser/icons/*.png; do
rm "$icon"
ln -s "/usr/share/icons/Windows8/apps/iceweasel.png" "$icon"
# Set florence virtual keyboard tray icon
ln -s "/usr/share/icons/Windows8/devices/input-keyboard-symbolic.png" \
# Set gpgApplet tray icon
rm "/usr/share/pixmaps/gpgApplet/scalable" -r
ln -s "/usr/share/pixmaps/gpgApplet/scalable-grey" "/usr/share/pixmaps/gpgApplet/scalable"
rm "/usr/share/pixmaps/gpgApplet/48x48/" -r
ln -s "/usr/share/pixmaps/gpgApplet/48x48-grey" "/usr/share/pixmaps/gpgApplet/48x48"
# Early set some gsettings
# Only setting all of them in this script fails
# Icon theme
sudo -u "$LIVE_USERNAME" gsettings set org.gnome.desktop.interface icon-theme Windows8
[Desktop Entry]
GenericName=Activates Windows 8 theme
Comment=Activates Windows 8 theme
<?xml version="1.0"?>
<RDF:RDF xmlns:NC=""
<RDF:Description RDF:about="chrome://browser/content/browser.xul#addon-bar"
iconsize="small" />
<RDF:Description RDF:about="about:config#valueCol"
ordinal="7" />
<RDF:Description RDF:about="chrome://browser/content/browser.xul">
<NC:persist RDF:resource="chrome://browser/content/browser.xul#addon-bar"/>
<NC:persist RDF:resource="chrome://browser/content/browser.xul#nav-bar"/>
<NC:persist RDF:resource="chrome://browser/content/browser.xul#navigator-toolbox"/>
<NC:persist RDF:resource="chrome://browser/content/browser.xul#toolbar-menubar"/>
<NC:persist RDF:resource="chrome://browser/content/browser.xul#PersonalToolbar"/>
<NC:persist RDF:resource="chrome://browser/content/browser.xul#TabsToolbar"/>
<NC:persist RDF:resource="chrome://browser/content/browser.xul#sidebar-box"/>
<NC:persist RDF:resource="chrome://browser/content/browser.xul#sidebar-title"/>
<NC:persist RDF:resource="chrome://browser/content/browser.xul#main-window"/>
<RDF:Description RDF:about="chrome://browser/content/browser.xul#toolbar-menubar"
currentset="menubar-items" />
<RDF:Description RDF:about="chrome://browser/content/browser.xul#navigator-toolbox"
abp-iconposition="hidden,addon-bar,addonbar-closebutton" />
pref("lightweightThemes.isThemeSelected", true);
pref("lightweightThemes.usedThemes", "[{\"id\":\"1\",\"name\":\"Internet Explorer\",\"headerURL\":\"file:///usr/share/pixmaps/blue_dot.png\",\"footerURL\":\"file:///usr/share/pixmaps/blue_dot.png\",\"textcolor\":\"#FFFFFF\",\"accentcolor\":\"#3399FF\",\"updateDate\":0,\"installDate\":0}]");
/* Camouflage */
.tab-close-button { list-style-image: url("moz-icon://stock/gtk-close-grey?size=menu") !important; }
#navigator-toolbox { background-color: #6badf6 !important; }
......@@ -377,10 +377,6 @@ python-nautilus
### Windows8 theme ###
### Needed by virtualbox-guest-utils
......@@ -58,26 +58,24 @@ end
# This helper requires that the notification image is the one shown in
# the notification applet's list, not the notification pop-up.
def robust_notification_wait(notification_image, time_to_wait)
theme_prefix = @theme.capitalize
error_msg = "Didn't not manage to open the notification applet"
wait_start =
try_for(time_to_wait, :delay => 0, :msg => error_msg) do
@screen.wait("#{theme_prefix}NotificationAppletOpened.png", 10)"GnomeNotificationApplet.png")
@screen.wait("GnomeNotificationAppletOpened.png", 10)
error_msg = "Didn't not see notification '#{notification_image}'"
time_to_wait -= ( - wait_start).ceil
try_for(time_to_wait, :delay => 0, :msg => error_msg) do
found = false
entries = @screen.findAll("#{theme_prefix}NotificationEntry.png")
entries = @screen.findAll("GnomeNotificationEntry.png")
while(entries.hasNext) do
entry =
close_entry = @screen.wait("#{theme_prefix}NotificationEntryClose.png", 10)
close_entry = @screen.wait("GnomeNotificationEntryClose.png", 10)
if @screen.exists(notification_image)
found = true
......@@ -91,7 +89,7 @@ def robust_notification_wait(notification_image, time_to_wait)
# Click anywhere to close the notification applet
......@@ -328,16 +326,11 @@ Given /^Tails Greeter has dealt with the sudo password$/ do
Given /^the Tails desktop is ready$/ do
case @theme
when "windows"
desktop_started_picture = 'WindowsStartButton.png'
desktop_started_picture = "GnomeApplicationsMenu#{@language}.png"
# We wait for the Florence icon to be displayed to ensure reliable systray icon clicking.
# By this point the only icon left is Vidalia and it will not cause the other systray
# icons to shift positions.
@screen.wait("GnomeSystrayFlorence.png", 180)
desktop_started_picture = "GnomeApplicationsMenu#{@language}.png"
# We wait for the Florence icon to be displayed to ensure reliable systray icon clicking.
# By this point the only icon left is Vidalia and it will not cause the other systray
# icons to shift positions.
@screen.wait("GnomeSystrayFlorence.png", 180)
@screen.wait(desktop_started_picture, 180)
# Disable screen blanking since we sometimes need to wait long
# enough for it to activate, which can mess with Sikuli wait():ing
......@@ -380,13 +373,7 @@ Given /^available upgrades have been checked$/ do
Given /^the Tor Browser has started$/ do
case @theme
when "windows"
tor_browser_picture = "WindowsTorBrowserWindow.png"
tor_browser_picture = "TorBrowserWindow.png"
tor_browser_picture = "TorBrowserWindow.png"
@screen.wait(tor_browser_picture, 60)
......@@ -422,24 +409,23 @@ Given /^the Tor Browser has a bookmark to$/ do
Given /^all notifications have disappeared$/ do
theme_prefix = @theme.capitalize
next if not(@screen.exists("#{theme_prefix}NotificationApplet.png"))"#{theme_prefix}NotificationApplet.png")
@screen.wait("#{theme_prefix}NotificationAppletOpened.png", 10)
next if not(@screen.exists("GnomeNotificationApplet.png"))"GnomeNotificationApplet.png")
@screen.wait("GnomeNotificationAppletOpened.png", 10)
entries = @screen.findAll("#{theme_prefix}NotificationEntry.png")
entries = @screen.findAll("GnomeNotificationEntry.png")
while(entries.hasNext) do
entry =
@screen.wait_and_click("#{theme_prefix}NotificationEntryClose.png", 10)
@screen.wait_and_click("GnomeNotificationEntryClose.png", 10)
rescue FindFailed
# No notifications, so we're good to go.
# Click anywhere to close the notification applet"#{theme_prefix}ApplicationsMenu.png")"GnomeApplicationsMenu.png")
......@@ -561,14 +547,8 @@ end
When /^I start the Tor Browser in offline mode$/ do
step "I start the Tor Browser"
case @theme
when "windows"
@screen.wait_and_click("WindowsTorBrowserOfflinePrompt.png", 10)"WindowsTorBrowserOfflinePromptStart.png")
@screen.wait_and_click("TorBrowserOfflinePrompt.png", 10)"TorBrowserOfflinePromptStart.png")
@screen.wait_and_click("TorBrowserOfflinePrompt.png", 10)"TorBrowserOfflinePromptStart.png")
Given /^I add a wired DHCP NetworkManager connection called "([^"]+)"$/ do |con_name|
......@@ -680,15 +660,9 @@ def gnome_app_menu_click_helper(click_me, verify_me = nil)
Given /^I start "([^"]+)" via the GNOME "([^"]+)" applications menu$/ do |app, submenu|
case @theme
when "windows"
prefix = 'Windows'
prefix = 'Gnome'
menu_button = prefix + "ApplicationsMenu.png"
sub_menu_entry = prefix + "Applications" + submenu + ".png"
application_entry = prefix + "Applications" + app + ".png"
menu_button = "GnomeApplicationsMenu.png"
sub_menu_entry = "GnomeApplications" + submenu + ".png"
application_entry = "GnomeApplications" + app + ".png"
try_for(120) do
gnome_app_menu_click_helper(menu_button, sub_menu_entry)
......@@ -704,16 +678,10 @@ Given /^I start "([^"]+)" via the GNOME "([^"]+)" applications menu$/ do |app, s
Given /^I start "([^"]+)" via the GNOME "([^"]+)"\/"([^"]+)" applications menu$/ do |app, submenu, subsubmenu|
case @theme
when "windows"
prefix = 'Windows'
prefix = 'Gnome'
menu_button = prefix + "ApplicationsMenu.png"
sub_menu_entry = prefix + "Applications" + submenu + ".png"
sub_sub_menu_entry = prefix + "Applications" + subsubmenu + ".png"
application_entry = prefix + "Applications" + app + ".png"
menu_button = "GnomeApplicationsMenu.png"
sub_menu_entry = "GnomeApplications" + submenu + ".png"
sub_sub_menu_entry = "GnomeApplications" + subsubmenu + ".png"
application_entry = "GnomeApplications" + app + ".png"
try_for(120) do
gnome_app_menu_click_helper(menu_button, sub_menu_entry)
......@@ -908,7 +876,6 @@ end
def force_new_tor_circuit(with_vidalia=nil)
debug_log("Forcing new Tor circuit...")
if with_vidalia
assert_equal('gnome', @theme, "Vidalia is not available in the #{@theme} theme.")
step 'process "vidalia" is running'
rescue Test::Unit::AssertionFailedError
......@@ -161,7 +161,6 @@ Before('@product') do |scenario|
@video_capture_pid =
@screen =
@theme = "gnome"
# English will be assumed if this is not overridden
@language = ""
@os_loader = "MBR"
......@@ -55,7 +55,3 @@ Code
* [[!tails_gitweb config/chroot_local-includes/usr/local/lib/tails-shell-library/]]
* [[!tails_gitweb config/chroot_local-includes/usr/share/applications/]]
* [[!tails_gitweb config/chroot_local-includes/lib/live/config/2080-install-i2p]]
* [[!tails_gitweb config/chroot_local-includes/usr/local/bin/tails-activate-win8-theme]]
* [[!tails_gitweb config/chroot_local-includes/usr/share/tails/tor-browser-win8-theme/userChrome.css]]
* [[!tails_gitweb config/chroot_local-includes/usr/share/tails/tor-browser-win8-theme/theme.js]]
* [[!tails_gitweb config/chroot_local-includes/usr/share/tails/tor-browser-win8-theme/localstore.rdf]]
......@@ -43,10 +43,7 @@ when started:
explaining that the Unsafe Browser won't be anonymous.
0. "No" is the default answer, but if "Yes", we start a separate
browser instance.
0. The browser is configured to use a theme with scary colors (red). To
not raise suspicion the scary theme is not used when Windows
camouflage is activated, but instead the normal Internet Explorer
theme is used.
0. The browser is configured to use a theme with scary colors (red).
0. Its start page (locally stored) makes it clear that this is the Unsafe
Browser and explains the issues involved with the Unsafe Browser
and how to proceed from now on.
......@@ -86,7 +83,3 @@ Code
* [[!tails_gitweb config/chroot_local-includes/usr/local/lib/tails-shell-library/]]
* [[!tails_gitweb config/chroot_local-includes/usr/share/applications/]]
* [[!tails_gitweb config/chroot_local-includes/etc/sudoers.d/zzz_unsafe-browser]]
* [[!tails_gitweb config/chroot_local-includes/usr/local/bin/tails-activate-win8-theme]]
* [[!tails_gitweb config/chroot_local-includes/usr/share/tails/tor-browser-win8-theme/userChrome.css]]
* [[!tails_gitweb config/chroot_local-includes/usr/share/tails/tor-browser-win8-theme/theme.js]]
* [[!tails_gitweb config/chroot_local-includes/usr/share/tails/tor-browser-win8-theme/localstore.rdf]]
......@@ -36,7 +36,6 @@
......@@ -246,16 +246,6 @@ security critical bugs were fixed.
tails-upgrade-frontend-wrapper --override-baseurl \
# Windows Camouflage
Enable I2P in the boot loader menu, and enable Windows camouflage via
the Tails Greeter checkbox, and then:
* Tails OpenPGP Applet's context menu should look readable (automate: [[!tails_ticket 10255]])
* The Tor Browser, Unsafe Browser and I2P Browser should all use the
Internet Explorer theme. (automate: [[!tails_ticket 10258]])
* Vidalia should not start. (automate: [[!tails_ticket 10256]])
# Unsafe Web Browser
* Browsing (by IP) a FTP server on the LAN should be possible. (automate: [[!tails_ticket 10252]])
......@@ -214,7 +214,7 @@ This step:
And I enable more Tails Greeter options
This is required for steps enabling Tails Greeter options, like the
next one, or the `I enable Microsoft Windows XP camouflage` step.
next one.
Note that the "I set sudo password ..." step has to be run before the
other Tails Greeter option steps as it relies on keyboard navigation.
......@@ -39,11 +39,3 @@ Security recommendations:
* Do not run this browser at the same time as the anonymous
[[<span class="application">Tor Browser</span>|Tor_Browser]]. This makes it easy to not mistake one browser for the
other, which could have catastrophic consequences.
* When using [[doc/first_steps/startup_options/windows_camouflage]]
the red theme is disabled in order to raise less suspicion. It is
still possible to quietly identify the <span class="application">Unsafe
Browser</span> since it has
English Wikipedia as its default (and only) search engine in the
navigation toolbar. The lack of the onion icon
is another such visual reminder.
......@@ -13,7 +13,6 @@
- [[!traillink Start_Tails|first_steps/start_tails]]
- [[!traillink Startup_options|first_steps/startup_options]]
- [[!traillink Administration_password|first_steps/startup_options/administration_password]]
- [[!traillink Windows_camouflage|first_steps/startup_options/windows_camouflage]]
- [[!traillink MAC_address_spoofing|first_steps/startup_options/mac_spoofing]]
- [[!traillink Network_configuration|first_steps/startup_options/network_configuration]]
- [[!traillink Tor_bridge_mode|first_steps/startup_options/bridge_mode]]