browser.rb 7.98 KB
Newer Older
1
# coding: utf-8
anonym's avatar
anonym committed
2
When /^I start the Unsafe Browser(?: through the GNOME menu)?$/ do
anonym's avatar
anonym committed
3
  step "I start \"Unsafe Browser\" via GNOME Activities Overview"
kytv's avatar
kytv committed
4
5
end

anonym's avatar
anonym committed
6
7
8
When /^I successfully start the Unsafe Browser$/ do
  step "I start the Unsafe Browser"
  step "I see and accept the Unsafe Browser start verification"
9
  step "I see the \"Starting the Unsafe Browser...\" notification after at most 60 seconds"
anonym's avatar
anonym committed
10
  step "the Unsafe Browser has started"
kytv's avatar
kytv committed
11
12
end

13
When /^I close the (?:Tor|Unsafe) Browser$/ do
kytv's avatar
kytv committed
14
15
16
17
18
19
20
  @screen.type("q", Sikuli::KeyModifier.CTRL)
end

def xul_application_info(application)
  binary = $vm.execute_successfully(
    'echo ${TBB_INSTALL}/firefox', :libs => 'tor-browser'
  ).stdout.chomp
anonym's avatar
anonym committed
21
  address_bar_image = "BrowserAddressBar.png"
22
  unused_tbb_libs = ['libnssdbm3.so', "libmozavcodec.so", "libmozavutil.so"]
kytv's avatar
kytv committed
23
24
25
26
27
28
29
30
31
32
33
34
35
  case application
  when "Tor Browser"
    user = LIVE_USER
    cmd_regex = "#{binary} .* -profile /home/#{user}/\.tor-browser/profile\.default"
    chroot = ""
    new_tab_button_image = "TorBrowserNewTabButton.png"
  when "Unsafe Browser"
    user = "clearnet"
    cmd_regex = "#{binary} .* -profile /home/#{user}/\.unsafe-browser/profile\.default"
    chroot = "/var/lib/unsafe-browser/chroot"
    new_tab_button_image = "UnsafeBrowserNewTabButton.png"
  when "Tor Launcher"
    user = "tor-launcher"
36
37
38
39
40
41
    # We do not enable AppArmor confinement for the Tor Launcher.
    binary = "#{binary}-unconfined"
    tor_launcher_install = $vm.execute_successfully(
      'echo ${TOR_LAUNCHER_INSTALL}', :libs => 'tor-browser'
    ).stdout.chomp
    cmd_regex = "#{binary}\s+-app #{tor_launcher_install}/application\.ini.*"
kytv's avatar
kytv committed
42
43
44
    chroot = ""
    new_tab_button_image = nil
    address_bar_image = nil
45
46
    # The standalone Tor Launcher uses fewer libs than the full
    # browser.
47
    unused_tbb_libs.concat(["libfreebl3.so", "libfreeblpriv3.so", "libnssckbi.so", "libsoftokn3.so"])
kytv's avatar
kytv committed
48
49
50
51
52
53
54
55
56
  else
    raise "Invalid browser or XUL application: #{application}"
  end
  return {
    :user => user,
    :cmd_regex => cmd_regex,
    :chroot => chroot,
    :new_tab_button_image => new_tab_button_image,
    :address_bar_image => address_bar_image,
57
    :unused_tbb_libs => unused_tbb_libs,
kytv's avatar
kytv committed
58
59
60
61
62
63
64
65
66
67
68
69
70
71
  }
end

When /^I open a new tab in the (.*)$/ do |browser|
  info = xul_application_info(browser)
  @screen.click(info[:new_tab_button_image])
  @screen.wait(info[:address_bar_image], 10)
end

When /^I open the address "([^"]*)" in the (.*)$/ do |address, browser|
  step "I open a new tab in the #{browser}"
  info = xul_application_info(browser)
  open_address = Proc.new do
    @screen.click(info[:address_bar_image])
72
73
    # This static here since we have no reliable visual indicators
    # that we can watch to know when typing is "safe".
74
    sleep 5
75
    # The browser sometimes loses keypresses when suggestions are
intrigeri's avatar
intrigeri committed
76
    # shown, which we work around by pasting the address from the
77
78
79
80
    # clipboard, in one go.
    $vm.set_clipboard(address)
    @screen.type('v', Sikuli::KeyModifier.CTRL)
    @screen.type(Sikuli::Key.ENTER)
kytv's avatar
kytv committed
81
  end
82
83
84
85
86
  recovery_on_failure = Proc.new do
    @screen.type(Sikuli::Key.ESC)
    @screen.waitVanish('BrowserReloadButton.png', 3)
    open_address.call
  end
kytv's avatar
kytv committed
87
  if browser == "Tor Browser"
88
89
90
91
92
93
94
    retry_method = method(:retry_tor)
  else
    retry_method = Proc.new { |p, &b| retry_action(10, recovery_proc: p, &b) }
  end
  open_address.call
  retry_method.call(recovery_on_failure) do
    @screen.wait('BrowserReloadButton.png', 120)
kytv's avatar
kytv committed
95
96
97
  end
end

98
99
# This step is limited to the Tor Browser due to #7502 since dogtail
# uses the same interface.
anonym's avatar
anonym committed
100
Then /^"([^"]+)" has loaded in the Tor Browser$/ do |title|
101
102
  if @language == 'German'
    browser_name = 'Tor-Browser'
103
    reload_action = 'Neu laden'
104
105
  else
    browser_name = 'Tor Browser'
106
    reload_action = 'Reload'
107
  end
108
  expected_title = "#{title} - #{browser_name}"
109
  try_for(60) { @torbrowser.child(expected_title, roleName: 'frame') }
110
111
  # The 'Reload' button (graphically shown as a looping arrow)
  # is only shown when a page has loaded, so once we see the
anonym's avatar
anonym committed
112
  # expected title *and* this button has appeared, then we can be sure
113
  # that the page has fully loaded.
114
  try_for(60) { @torbrowser.child(reload_action, roleName: 'push button') }
115
116
end

kytv's avatar
kytv committed
117
118
119
120
121
Then /^the (.*) has no plugins installed$/ do |browser|
  step "I open the address \"about:plugins\" in the #{browser}"
  step "I see \"TorBrowserNoPlugins.png\" after at most 30 seconds"
end

122
def xul_app_shared_lib_check(pid, chroot, expected_absent_tbb_libs = [])
kytv's avatar
kytv committed
123
124
  absent_tbb_libs = []
  unwanted_native_libs = []
125
126
127
  tbb_libs = $vm.execute_successfully("ls -1 #{chroot}${TBB_INSTALL}/*.so",
                                      :libs => 'tor-browser').stdout.split
  firefox_pmap_info = $vm.execute("pmap --show-path #{pid}").stdout
kytv's avatar
kytv committed
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
  for lib in tbb_libs do
    lib_name = File.basename lib
    if not /\W#{lib}$/.match firefox_pmap_info
      absent_tbb_libs << lib_name
    end
    native_libs = $vm.execute_successfully(
                       "find /usr/lib /lib -name \"#{lib_name}\""
                                           ).stdout.split
    for native_lib in native_libs do
      if /\W#{native_lib}$"/.match firefox_pmap_info
        unwanted_native_libs << lib_name
      end
    end
  end
  absent_tbb_libs -= expected_absent_tbb_libs
  assert(absent_tbb_libs.empty? && unwanted_native_libs.empty?,
         "The loaded shared libraries for the firefox process are not the " +
         "way we expect them.\n" +
         "Expected TBB libs that are absent: #{absent_tbb_libs}\n" +
         "Native libs that we don't want: #{unwanted_native_libs}")
end

Then /^the (.*) uses all expected TBB shared libraries$/ do |application|
  info = xul_application_info(application)
  pid = $vm.execute_successfully("pgrep --uid #{info[:user]} --full --exact '#{info[:cmd_regex]}'").stdout.chomp
  assert(/\A\d+\z/.match(pid), "It seems like #{application} is not running")
154
  xul_app_shared_lib_check(pid, info[:chroot], info[:unused_tbb_libs])
kytv's avatar
kytv committed
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
end

Then /^the (.*) chroot is torn down$/ do |browser|
  info = xul_application_info(browser)
  try_for(30, :msg => "The #{browser} chroot '#{info[:chroot]}' was " \
                      "not removed") do
    !$vm.execute("test -d '#{info[:chroot]}'").success?
  end
end

Then /^the (.*) runs as the expected user$/ do |browser|
  info = xul_application_info(browser)
  assert_vmcommand_success($vm.execute(
    "pgrep --full --exact '#{info[:cmd_regex]}'"),
    "The #{browser} is not running")
  assert_vmcommand_success($vm.execute(
    "pgrep --uid #{info[:user]} --full --exact '#{info[:cmd_regex]}'"),
    "The #{browser} is not running as the #{info[:user]} user")
end
174
175
176
177
178
179
180
181
182

When /^I download some file in the Tor Browser$/ do
  @some_file = 'tails-signing.key'
  some_url = "https://tails.boum.org/#{@some_file}"
  step "I open the address \"#{some_url}\" in the Tor Browser"
end

Then /^I get the browser download dialog$/ do
  @screen.wait('BrowserDownloadDialog.png', 60)
183
  @screen.wait('BrowserDownloadDialogSaveAsButton.png', 10)
184
185
186
187
188
189
190
191
192
193
194
195
196
end

When /^I save the file to the default Tor Browser download directory$/ do
  @screen.click('BrowserDownloadDialogSaveAsButton.png')
  @screen.wait('BrowserDownloadFileToDialog.png', 10)
  @screen.type(Sikuli::Key.ENTER)
end

Then /^the file is saved to the default Tor Browser download directory$/ do
  assert_not_nil(@some_file)
  expected_path = "/home/#{LIVE_USER}/Tor Browser/#{@some_file}"
  try_for(10) { $vm.file_exist?(expected_path) }
end
197

198
199
200
201
202
203
When /^I open Tails homepage in the (.+)$/ do |browser|
  step "I open the address \"https://tails.boum.org\" in the #{browser}"
end

Then /^Tails homepage loads in the Tor Browser$/ do
  title = 'Tails - Privacy for anyone anywhere'
anonym's avatar
anonym committed
204
  step "\"#{title}\" has loaded in the Tor Browser"
205
206
207
208
end

Then /^Tails homepage loads in the Unsafe Browser$/ do
  @screen.wait('TailsHomepage.png', 60)
209
end
anonym's avatar
anonym committed
210
211

Then /^the Tor Browser shows the "([^"]+)" error$/ do |error|
212
  page = @torbrowser.child("Problem loading page", roleName: "document frame")
anonym's avatar
anonym committed
213
214
215
216
  headers = page.children(roleName: "heading")
  found = headers.any? { |heading| heading.text == error }
  raise "Could not find the '#{error}' error in the Tor Browser" unless found
end