unsafe_browser.rb 7.68 KB
Newer Older
1
When /^I see and accept the Unsafe Browser start verification(?:| in the "([^"]+)" locale)$/ do |locale|
kytv's avatar
kytv committed
2
  @screen.wait('GnomeQuestionDialogIcon.png', 30)
3 4 5 6 7 8
  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
9 10
end

11
def supported_torbrowser_languages
12 13 14 15
  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(':')
16 17
    candidates = ["#{first}_#{second}.UTF-8", "#{first}_#{second}.utf8",
                  "#{first}.UTF-8", "#{first}.utf8",
18 19 20
                  "#{first}_#{second}", first]
    when_not_found = Proc.new { raise "Could not find a locale for '#{line}'" }
    candidates.find(when_not_found) do |candidate|
21
      $vm.directory_exist?("/usr/lib/locale/#{candidate}")
22
    end
23 24 25
  end
end

26
Then /^I start the Unsafe Browser in the "([^"]+)" locale$/ do |loc|
27
  step "I run \"LANG=#{loc} LC_ALL=#{loc} sudo unsafe-browser\" in GNOME Terminal"
28
  step "I see and accept the Unsafe Browser start verification in the \"#{loc}\" locale"
29 30
end

31
Then /^the Unsafe Browser works in all supported languages$/ do
32
  failed = Array.new
kytv's avatar
kytv committed
33
  supported_torbrowser_languages.each do |lang|
34
    step "I start the Unsafe Browser in the \"#{lang}\" locale"
35 36 37 38 39 40
    begin
      step "the Unsafe Browser has started"
    rescue RuntimeError
      failed << lang
      next
    end
41 42 43
    step "I close the Unsafe Browser"
    step "the Unsafe Browser chroot is torn down"
  end
44
  assert(failed.empty?, "Unsafe Browser failed to launch in the following locale(s): #{failed.join(', ')}")
45 46
end

47
Then /^the Unsafe Browser has no add-ons installed$/ do
48 49
  step "I open the address \"about:addons\" in the Unsafe Browser"
  step "I see \"UnsafeBrowserNoAddons.png\" after at most 30 seconds"
50 51
end

52 53 54 55 56 57 58 59 60 61
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"
62 63
  try_for(10) { $vm.file_exist?(chroot_path) }
  dump = JSON.load($vm.file_content(chroot_path))
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99

  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(3, places_uris_counter,
               "Unexpected number (#{places_uris_counter}) of places " \
               "bookmarks")
  @screen.type(Sikuli::Key.F4, Sikuli::KeyModifier.ALT)
end

100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
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

116 117 118
Then /^I cannot configure the Unsafe Browser to use any local proxies$/ do
  socks_proxy = 'c' # Alt+c for socks proxy
  no_proxy    = 'y' # Alt+y for no proxy
119 120
  proxies = [[no_proxy, nil, nil]]
  socksport_lines =
121
    $vm.execute_successfully('grep -w "^SocksPort" /etc/tor/torrc').stdout
122 123 124 125 126
  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|
127 128
    @screen.hide_cursor

129
    # Open proxy settings and select manual proxy configuration
130 131
    @screen.click('UnsafeBrowserMenuButton.png')
    @screen.wait_and_click('UnsafeBrowserPreferencesButton.png', 10)
132 133 134 135 136
    @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)
137
    @screen.wait_and_click('UnsafeBrowserProxySettingsWindow.png', 10)
138
    @screen.type("m", Sikuli::KeyModifier.ALT)
139 140

    # Configure the proxy
141
    @screen.type(proxy_type, Sikuli::KeyModifier.ALT)  # Select correct proxy type
142
    @screen.type(proxy_host + Sikuli::Key.TAB + proxy_port) if proxy_type != no_proxy
143

Tails developers's avatar
Tails developers committed
144
    # Close settings
145
    @screen.click('UnsafeBrowserProxySettingsOkButton.png')
anonym's avatar
anonym committed
146
    @screen.waitVanish('UnsafeBrowserProxySettingsWindow.png', 10)
147 148

    # Test that the proxy settings work as they should
149
    step 'I open Tails homepage in the Unsafe Browser'
150
    if proxy_type == no_proxy
151
      step 'Tails homepage loads in the Unsafe Browser'
152 153 154 155 156
    else
      @screen.wait('UnsafeBrowserProxyRefused.png', 60)
    end
  end
end
157

158 159 160
Then /^the Unsafe Browser has no proxy configured$/ do
  @screen.click('UnsafeBrowserMenuButton.png')
  @screen.wait_and_click('UnsafeBrowserPreferencesButton.png', 10)
161
  @screen.wait_and_click('UnsafeBrowserAdvancedSettingsButton.png', 10)
162
  @screen.wait_and_click('UnsafeBrowserNetworkTab.png', 10)
anonym's avatar
anonym committed
163
  @screen.wait_and_click('UnsafeBrowserNetworkTabSettingsButton.png', 10)
anonym's avatar
anonym committed
164
  @screen.wait('UnsafeBrowserProxySettingsWindow.png', 10)
165 166
  @screen.wait('UnsafeBrowserNoProxySelected.png', 10)
  @screen.type(Sikuli::Key.F4, Sikuli::KeyModifier.ALT)
167
  @screen.type("w", Sikuli::KeyModifier.CTRL)
168 169
end

170 171 172
Then /^the Unsafe Browser complains that no DNS server is configured$/ do
  @screen.wait("UnsafeBrowserDNSError.png", 30)
end
173 174

Then /^I configure the Unsafe Browser to check for updates more frequently$/ do
anonym's avatar
anonym committed
175
  prefs = '/usr/share/tails/chroot-browsers/unsafe-browser/prefs.js'
176 177 178
  $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);')
179
end
180 181

But /^checking for updates is disabled in the Unsafe Browser's configuration$/ do
anonym's avatar
anonym committed
182
  prefs = '/usr/share/tails/chroot-browsers/common/prefs.js'
183
  assert($vm.file_content(prefs).include?('pref("app.update.enabled", false)'))
184
end
185 186

Then /^the clearnet user has (|not )sent packets out to the Internet$/ do |sent|
187
  uid = $vm.execute_successfully("id -u clearnet").stdout.chomp.to_i
188
  pkts = ip4tables_packet_counter_sum(:tables => ['OUTPUT'], :uid => uid)
189 190 191 192 193 194 195
  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