unsafe_browser.rb 7.62 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 16 17 18 19
  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}.utf8", "#{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|
20
      $vm.directory_exist?("/usr/lib/locale/#{candidate}")
21
    end
22 23 24
  end
end

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

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

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

51 52 53 54 55 56 57 58 59 60
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"
61 62
  try_for(10) { $vm.file_exist?(chroot_path) }
  dump = JSON.load($vm.file_content(chroot_path))
63 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

  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

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

115 116 117
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
118 119
  proxies = [[no_proxy, nil, nil]]
  socksport_lines =
120
    $vm.execute_successfully('grep -w "^SocksPort" /etc/tor/torrc').stdout
121 122 123 124 125
  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|
126 127
    @screen.hide_cursor

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

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

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

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

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

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

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

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

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