17f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
27f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar# Use of this source code is governed by a BSD-style license that can be
37f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar# found in the LICENSE file.
47f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar
5f6fcbb7405686dd0dc46884435a9ee3fa835f2abJorge Lucangeli Obesimport re
6132d1f71fbc53f15a50bb2e5b739614e05abf230Jorge Lucangeli Obes
7437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkarfrom autotest_lib.client.bin import test, utils
87f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkarfrom autotest_lib.client.common_lib import error
97f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkarfrom autotest_lib.client.common_lib.cros import chrome
107f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkarfrom telemetry.core import exceptions
117f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar
1240f2187948887ad8e782fa4f28fba98b83f7818cAchuith Bhandarkarclass security_SandboxStatus(test.test):
137f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar    """Verify sandbox status."""
147f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar    version = 1
157f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar
167f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar
17437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkar    def _EvaluateJavaScript(self, js):
18437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkar        '''Evaluates js, returns None if an exception was thrown.'''
19437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkar
20437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkar        try:
21437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkar            return self._tab.EvaluateJavaScript(js)
22437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkar        except exceptions.EvaluateException:
23437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkar            return None
24437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkar
25417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar    def _CheckSandboxPage(self, url, js):
26417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar        self._tab.Navigate(url)
27c59b652d3b5cd8793122c439964652fb04bb68aaJorge Lucangeli Obes
28417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar        return utils.poll_for_condition(
29417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar                lambda: self._EvaluateJavaScript(js),
30417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar                exception=error.TestError('Failed to evaluate in %s "%s"'
31417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar                                          % (url, js)),
32437b235360e63d2b94590e8bfb7ac0b4f29f4e4aAchuith Bhandarkar                timeout=30)
33132d1f71fbc53f15a50bb2e5b739614e05abf230Jorge Lucangeli Obes
34c59b652d3b5cd8793122c439964652fb04bb68aaJorge Lucangeli Obes
35417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar    def _CheckAdequatelySandboxed(self):
36417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar        '''Checks that chrome://sandbox shows "You are adequately sandboxed."'''
37417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar        url = 'chrome://sandbox'
38417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar        res = self._CheckSandboxPage(url,
39417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar                "document.getElementsByTagName('p')[0].textContent")
40417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar
41417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar        text = 'You are adequately sandboxed.'
42417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar        if not re.match(text, res):
43417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar            raise error.TestFail('Could not find "%s" in %s' % (text, url))
44417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar
45417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar
46417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar    def _CheckGPUSandboxed(self):
47417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar        '''
48417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar        Checks that chrome://gpu has "Sandboxed" row, and "Sandboxed" is True.
49417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar        '''
50417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar        url = 'chrome://gpu'
51417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar        res = self._CheckSandboxPage(url,
52417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar                                     "browserBridge.isSandboxedForTesting();")
53417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar        if res is not True:
54417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar            raise error.TestFail('"Sandboxed" not True in %s' % url)
557f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar
567f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar    def run_once(self):
57669393837af4367f7f655d0b5bbf70915a6e1152Ricky Zhou        '''Open various sandbox-related pages and test that we are sandboxed.'''
5857c75076df269ecd843ad246c7deb4f360db8532Achuith Bhandarkar        with chrome.Chrome() as cr:
597f2338c4c27f543d594d134aee7764cc49ccf88aAchuith Bhandarkar            self._tab = cr.browser.tabs[0]
60669393837af4367f7f655d0b5bbf70915a6e1152Ricky Zhou            self._CheckAdequatelySandboxed()
61417395925057cee65779f9663e261aaa22da35f4Achuith Bhandarkar            self._CheckGPUSandboxed()
62