When /^I see and accept the Unsafe Browser start verification(?:| in the "([^"]+)" locale)$/ do |locale| @screen.wait('GnomeQuestionDialogIcon.png', 30) if ['ar_EG.utf8', 'fa_IR'].include?(locale) # Take into account button ordering in RTL languages @screen.type(Sikuli::Key.LEFT + Sikuli::Key.ENTER) else @screen.type(Sikuli::Key.RIGHT + Sikuli::Key.ENTER) end end def supported_torbrowser_languages localization_descriptions = "#{Dir.pwd}/config/chroot_local-includes/usr/share/tails/browser-localization/descriptions" File.read(localization_descriptions).split("\n").map do |line| # The line will be of the form "xx:YY:..." or "xx-YY:YY:..." first, second = line.sub('-', '_').split(':') candidates = ["#{first}_#{second}.UTF-8", "#{first}_#{second}.utf8", "#{first}.UTF-8", "#{first}.utf8", "#{first}_#{second}", first] when_not_found = Proc.new { raise "Could not find a locale for '#{line}'" } candidates.find(when_not_found) do |candidate| $vm.directory_exist?("/usr/lib/locale/#{candidate}") end end end Then /^I start the Unsafe Browser in the "([^"]+)" locale$/ do |loc| step "I run \"LANG=#{loc} LC_ALL=#{loc} sudo unsafe-browser\" in GNOME Terminal" step "I see and accept the Unsafe Browser start verification in the \"#{loc}\" locale" end Then /^the Unsafe Browser works in all supported languages$/ do failed = Array.new supported_torbrowser_languages.sample(3).each do |lang| step "I start the Unsafe Browser in the \"#{lang}\" locale" begin step "the Unsafe Browser has started" rescue RuntimeError failed << lang next end step "I close the Unsafe Browser" step "the Unsafe Browser chroot is torn down" end assert(failed.empty?, "Unsafe Browser failed to launch in the following locale(s): #{failed.join(', ')}") end Then /^the Unsafe Browser has no add-ons installed$/ do step "I open the address \"about:addons\" in the Unsafe Browser" step "I see \"UnsafeBrowserNoAddons.png\" after at most 30 seconds" end Then /^the Unsafe Browser has only Firefox's default bookmarks configured$/ do info = xul_application_info("Unsafe Browser") # "Show all bookmarks" @screen.type("o", Sikuli::KeyModifier.SHIFT + Sikuli::KeyModifier.CTRL) @screen.wait_and_click("UnsafeBrowserExportBookmarksButton.png", 20) @screen.wait_and_click("UnsafeBrowserExportBookmarksMenuEntry.png", 20) @screen.wait("UnsafeBrowserExportBookmarksSavePrompt.png", 20) path = "/home/#{info[:user]}/bookmarks" @screen.type(path + Sikuli::Key.ENTER) chroot_path = "#{info[:chroot]}/#{path}.json" try_for(10) { $vm.file_exist?(chroot_path) } dump = JSON.load($vm.file_content(chroot_path)) def check_bookmarks_helper(a) mozilla_uris_counter = 0 places_uris_counter = 0 a.each do |h| h.each_pair do |k, v| if k == "children" m, p = check_bookmarks_helper(v) mozilla_uris_counter += m places_uris_counter += p elsif k == "uri" uri = v if uri.match("^https://www\.mozilla\.org/") mozilla_uris_counter += 1 elsif uri.match("^place:(sort|folder|type)=") places_uris_counter += 1 else raise "Unexpected Unsafe Browser bookmark for '#{uri}'" end end end end return [mozilla_uris_counter, places_uris_counter] end mozilla_uris_counter, places_uris_counter = check_bookmarks_helper(dump["children"]) assert_equal(5, mozilla_uris_counter, "Unexpected number (#{mozilla_uris_counter}) of mozilla " \ "bookmarks") assert_equal(2, places_uris_counter, "Unexpected number (#{places_uris_counter}) of places " \ "bookmarks") @screen.type(Sikuli::Key.F4, Sikuli::KeyModifier.ALT) end Then /^the Unsafe Browser has a red theme$/ do @screen.wait("UnsafeBrowserRedTheme.png", 10) end Then /^the Unsafe Browser shows a warning as its start page$/ do @screen.wait("UnsafeBrowserStartPage.png", 10) end Then /^I see a warning about another instance already running$/ do @screen.wait('UnsafeBrowserWarnAlreadyRunning.png', 10) end Then /^I can start the Unsafe Browser again$/ do step "I start the Unsafe Browser" end Then /^I cannot configure the Unsafe Browser to use any local proxies$/ do socks_proxy = 'C' # Alt+Shift+c for socks proxy no_proxy = 'y' # Alt+y for no proxy proxies = [[no_proxy, nil, nil]] socksport_lines = $vm.execute_successfully('grep -w "^SocksPort" /etc/tor/torrc').stdout assert(socksport_lines.size >= 4, "We got fewer than four Tor SocksPorts") socksports = socksport_lines.scan(/^SocksPort\s([^:]+):(\d+)/) proxies += socksports.map { |host, port| [socks_proxy, host, port] } proxies.each do |proxy_type, proxy_host, proxy_port| @screen.hide_cursor # Open proxy settings @screen.click('UnsafeBrowserMenuButton.png') @screen.wait_and_click('UnsafeBrowserPreferencesButton.png', 10) @screen.wait_and_click('UnsafeBrowserAdvancedSettingsButton.png', 10) hit, _ = @screen.waitAny(['UnsafeBrowserNetworkTabAlreadySelected.png', 'UnsafeBrowserNetworkTab.png'], 10) @screen.click(hit) if hit == 'UnsafeBrowserNetworkTab.png' @screen.wait_and_click('UnsafeBrowserNetworkTabSettingsButton.png', 10) @screen.wait_and_click('UnsafeBrowserProxySettingsWindow.png', 10) # Ensure the desired proxy configuration if proxy_type == no_proxy @screen.type(proxy_type, Sikuli::KeyModifier.ALT) @screen.wait('UnsafeBrowserNoProxySelected.png', 10) else @screen.type("M", Sikuli::KeyModifier.ALT) @screen.type(proxy_type, Sikuli::KeyModifier.ALT) @screen.type(proxy_host + Sikuli::Key.TAB + proxy_port) end # Close settings @screen.click('UnsafeBrowserProxySettingsOkButton.png') @screen.waitVanish('UnsafeBrowserProxySettingsWindow.png', 10) # Test that the proxy settings work as they should step 'I open Tails homepage in the Unsafe Browser' if proxy_type == no_proxy step 'Tails homepage loads in the Unsafe Browser' else @screen.wait('UnsafeBrowserProxyRefused.png', 60) end end end Then /^the Unsafe Browser has no proxy configured$/ do @screen.click('UnsafeBrowserMenuButton.png') @screen.wait_and_click('UnsafeBrowserPreferencesButton.png', 10) @screen.wait_and_click('UnsafeBrowserAdvancedSettingsButton.png', 10) @screen.wait_and_click('UnsafeBrowserNetworkTab.png', 10) @screen.wait_and_click('UnsafeBrowserNetworkTabSettingsButton.png', 10) @screen.wait('UnsafeBrowserProxySettingsWindow.png', 10) @screen.wait('UnsafeBrowserNoProxySelected.png', 10) @screen.type(Sikuli::Key.F4, Sikuli::KeyModifier.ALT) @screen.type("w", Sikuli::KeyModifier.CTRL) end Then /^the Unsafe Browser complains that no DNS server is configured$/ do assert_not_nil( Dogtail::Application.new('zenity') .child(roleName: 'label') .text['No DNS server was obtained'] ) end Then /^I configure the Unsafe Browser to check for updates more frequently$/ do prefs = '/usr/share/tails/chroot-browsers/unsafe-browser/prefs.js' $vm.file_append(prefs, 'pref("app.update.idletime", 1);') $vm.file_append(prefs, 'pref("app.update.promptWaitTime", 1);') $vm.file_append(prefs, 'pref("app.update.interval", 5);') end But /^checking for updates is disabled in the Unsafe Browser's configuration$/ do prefs = '/usr/share/tails/chroot-browsers/common/prefs.js' assert($vm.file_content(prefs).include?('pref("app.update.enabled", false)')) end Then /^the clearnet user has (|not )sent packets out to the Internet$/ do |sent| uid = $vm.execute_successfully("id -u clearnet").stdout.chomp.to_i pkts = ip4tables_packet_counter_sum(:tables => ['OUTPUT'], :uid => uid) case sent when '' assert(pkts > 0, "Packets have not gone out to the internet.") when 'not' assert_equal(pkts, 0, "Packets have gone out to the internet.") end end