unsafe_browser.rb 9.28 KB
Newer Older
1
When /^I see and accept the Unsafe Browser start verification$/ do
2
  next if @skip_steps_while_restoring_background
Tails developers's avatar
Tails developers committed
3
  @screen.wait("UnsafeBrowserStartVerification.png", 30)
4 5 6
  @screen.type(Sikuli::Key.ESC)
end

7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
def supported_torbrowser_languages
  langs = []
  exts = @vm.execute_successfully(
    "find /usr/local/share/tor-browser-extensions -maxdepth 1 -name 'langpack*.xpi' -printf \"%f\n\"").stdout
  supported_langs = exts.scan(/langpack-([a-zA-Z_-]+).*/)
  locales = @vm.execute_successfully(
    "find /usr/lib/locale -maxdepth 1 -name '*.utf8' -printf \"%f\n\"").stdout
  locales = locales.scan(/.+/)

  # Determine a valid locale for each language that we want to test.
  supported_langs.each do |lang|
    nomatch = proc { "#{lang[0]}_#{lang[0].upcase}.utf8" }
    langs << locales.find(nomatch) { |l| l.match(/^#{lang[0].gsub('-','_')}/) }
  end
  return langs
end

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

30 31 32 33 34 35
Then /^I see the Unsafe Browser start notification and wait for it to close$/ do
  next if @skip_steps_while_restoring_background
  @screen.wait("UnsafeBrowserStartNotification.png", 30)
  @screen.waitVanish("UnsafeBrowserStartNotification.png", 10)
end

36
Then /^the Unsafe Browser has started$/ do
37
  next if @skip_steps_while_restoring_background
38
  @screen.wait("UnsafeBrowserHomepage.png", 360)
39 40
end

41 42 43 44 45 46
Then /^the Unsafe Browser has no add-ons installed$/ do
  next if @skip_steps_while_restoring_background
  step "I open the address \"about:addons\" in the Unsafe Browser"
  step "I see \"UnsafeBrowserNoAddons.png\" after at most 30 seconds"
end

47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 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
Then /^the Unsafe Browser has only Firefox's default bookmarks configured$/ do
  next if @skip_steps_while_restoring_background
  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(3, places_uris_counter,
               "Unexpected number (#{places_uris_counter}) of places " \
               "bookmarks")
  @screen.type(Sikuli::Key.F4, Sikuli::KeyModifier.ALT)
end

96
Then /^the Unsafe Browser has a red theme$/ do
97
  next if @skip_steps_while_restoring_background
98 99 100 101
  @screen.wait("UnsafeBrowserRedTheme.png", 10)
end

Then /^the Unsafe Browser shows a warning as its start page$/ do
102
  next if @skip_steps_while_restoring_background
103 104 105 106
  @screen.wait("UnsafeBrowserStartPage.png", 10)
end

When /^I start the Unsafe Browser$/ do
107
  next if @skip_steps_while_restoring_background
108
  step 'I start "UnsafeBrowser" via the GNOME "Internet" applications menu'
109 110 111 112 113
end

When /^I successfully start the Unsafe Browser$/ do
  next if @skip_steps_while_restoring_background
  step "I start the Unsafe Browser"
114
  step "I see and accept the Unsafe Browser start verification"
115
  step "I see the Unsafe Browser start notification and wait for it to close"
116
  step "the Unsafe Browser has started"
117 118 119
end

Then /^I see a warning about another instance already running$/ do
120
  next if @skip_steps_while_restoring_background
121 122 123
  @screen.wait('UnsafeBrowserWarnAlreadyRunning.png', 10)
end

Tails developers's avatar
Tails developers committed
124
When /^I close the Unsafe Browser$/ do
125
  next if @skip_steps_while_restoring_background
126
  @screen.type("q", Sikuli::KeyModifier.CTRL)
127 128
end

129 130 131 132 133 134
Then /^I see the Unsafe Browser stop notification$/ do
  next if @skip_steps_while_restoring_background
  @screen.wait('UnsafeBrowserStopNotification.png', 20)
  @screen.waitVanish('UnsafeBrowserStopNotification.png', 10)
end

135
Then /^I can start the Unsafe Browser again$/ do
136
  next if @skip_steps_while_restoring_background
137 138 139
  step "I start the Unsafe Browser"
end

140
Then /^I cannot configure the Unsafe Browser to use any local proxies$/ do
141
  next if @skip_steps_while_restoring_background
142
  @screen.wait_and_click("UnsafeBrowserWindow.png", 10)
143 144
  # First we open the proxy settings page to prepare it with the
  # correct open tabs for the loop below.
145 146
  @screen.click('UnsafeBrowserMenuButton.png')
  @screen.wait_and_click('UnsafeBrowserPreferencesButton.png', 10)
147
  @screen.wait('UnsafeBrowserPreferencesWindow.png', 10)
148 149
  @screen.wait_and_click('UnsafeBrowserAdvancedSettings.png', 10)
  @screen.wait_and_click('UnsafeBrowserNetworkTab.png', 10)
150
  sleep 0.5
151
  @screen.type(Sikuli::Key.ESC)
152 153
#  @screen.waitVanish('UnsafeBrowserPreferences.png', 10)
  sleep 0.5
154 155 156 157 158 159 160

  socks_proxy = 'c' # Alt+c for socks proxy
  no_proxy    = 'y' # Alt+y for no proxy

  proxies = [[socks_proxy, 9050],
             [socks_proxy, 9061],
             [socks_proxy, 9062],
161
             [socks_proxy, 9150],
162 163 164 165 166 167
             [no_proxy,       0]]

  proxies.each do |proxy|
    proxy_type = proxy[0]
    proxy_port = proxy[1]

168 169
    @screen.hide_cursor

170
    # Open proxy settings and select manual proxy configuration
171 172
    @screen.click('UnsafeBrowserMenuButton.png')
    @screen.wait_and_click('UnsafeBrowserPreferencesButton.png', 10)
173
    @screen.wait('UnsafeBrowserPreferencesWindow.png', 10)
174
    @screen.type("e", Sikuli::KeyModifier.ALT)
175
    @screen.wait('UnsafeBrowserProxySettings.png', 10)
176
    @screen.type("m", Sikuli::KeyModifier.ALT)
177 178

    # Configure the proxy
179 180
    @screen.type(proxy_type, Sikuli::KeyModifier.ALT)  # Select correct proxy type
    @screen.type("127.0.0.1" + Sikuli::Key.TAB + "#{proxy_port}") if proxy_type != no_proxy
181

Tails developers's avatar
Tails developers committed
182
    # Close settings
183
    @screen.type(Sikuli::Key.ENTER)
184 185
#    @screen.waitVanish('UnsafeBrowserProxySettings.png', 10)
    sleep 0.5
186
    @screen.type(Sikuli::Key.ESC)
187 188
#    @screen.waitVanish('UnsafeBrowserPreferences.png', 10)
    sleep 0.5
189 190 191 192 193 194 195 196 197 198

    # Test that the proxy settings work as they should
    step "I open the address \"https://check.torproject.org\" in the Unsafe Browser"
    if proxy_type == no_proxy
      @screen.wait('UnsafeBrowserTorCheckFail.png', 60)
    else
      @screen.wait('UnsafeBrowserProxyRefused.png', 60)
    end
  end
end
199

200 201 202 203 204 205 206 207 208 209 210 211 212 213
Then /^the Unsafe Browser has no proxy configured$/ do
  next if @skip_steps_while_restoring_background
  @screen.click('UnsafeBrowserMenuButton.png')
  @screen.wait_and_click('UnsafeBrowserPreferencesButton.png', 10)
  @screen.wait('UnsafeBrowserPreferencesWindow.png', 10)
  @screen.wait_and_click('UnsafeBrowserAdvancedSettings.png', 10)
  @screen.wait_and_click('UnsafeBrowserNetworkTab.png', 10)
  @screen.type("e", Sikuli::KeyModifier.ALT)
  @screen.wait('UnsafeBrowserProxySettings.png', 10)
  @screen.wait('UnsafeBrowserNoProxySelected.png', 10)
  @screen.type(Sikuli::Key.F4, Sikuli::KeyModifier.ALT)
  @screen.type(Sikuli::Key.F4, Sikuli::KeyModifier.ALT)
end

214 215 216 217
Then /^the Unsafe Browser complains that no DNS server is configured$/ do
  next if @skip_steps_while_restoring_background
  @screen.wait("UnsafeBrowserDNSError.png", 30)
end
218 219 220 221 222 223 224 225

Then /^I configure the Unsafe Browser to check for updates more frequently$/ do
  next if @skip_steps_while_restoring_background
  prefs = '/usr/share/tails/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
226 227 228 229 230 231

But /^checking for updates is disabled in the Unsafe Browser's configuration$/ do
  next if @skip_steps_while_restoring_background
  prefs = '/usr/share/tails/unsafe-browser/prefs.js'
  assert(@vm.file_content(prefs).include?('pref("app.update.enabled", false)'))
end
232 233 234 235 236 237 238 239

Then /^the clearnet user has (|not )sent packets out to the Internet$/ do |sent|
  next if @skip_steps_while_restoring_background
  pkts = 0
  uid = @vm.execute_successfully("id -u clearnet").stdout.chomp.to_i
  iptables_output = @vm.execute_successfully("iptables -vnL").stdout.chomp
  output_chain = iptables_parse(iptables_output)["OUTPUT"]
  output_chain["rules"].each do |rule|
Tails developers's avatar
Tails developers committed
240
    if /owner UID match \b#{uid}\b/.match(rule["extra"])
241
      pkts += rule["pkts"]
242 243 244 245 246 247 248 249 250 251
    end
  end

  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