1c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
29933ab84a71a3bab32cf8e06fbf99b2abef36922Chris Masone# Use of this source code is governed by a BSD-style license that can be
39933ab84a71a3bab32cf8e06fbf99b2abef36922Chris Masone# found in the LICENSE file.
49933ab84a71a3bab32cf8e06fbf99b2abef36922Chris Masone
53d68fe8213ef86684d7911f889d56d1345bf3272Chris Masoneimport gobject, os, sys
664170f8e7053f92f4bbad501c61a352fdabf6d82Chris Masonefrom dbus.mainloop.glib import DBusGMainLoop
7c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone
8c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masonefrom autotest_lib.client.bin import test, utils
99933ab84a71a3bab32cf8e06fbf99b2abef36922Chris Masonefrom autotest_lib.client.common_lib import error
10e0b08e6170b57f90262726eb7f04e059cb47419cHsinyu Chaofrom autotest_lib.client.common_lib.cros import chrome, session_manager
11e0b08e6170b57f90262726eb7f04e059cb47419cHsinyu Chaofrom autotest_lib.client.cros import constants, ownership
1243fd3caa723f9ce37a559c9683dc1948e6e5a396Chris Masone
139933ab84a71a3bab32cf8e06fbf99b2abef36922Chris Masone
14c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masoneclass login_OwnershipTaken(test.test):
155d010aa50a0694d498e8317fd8044e56474ce7edChris Masone    """Sign in and ensure that ownership of the device is taken."""
169933ab84a71a3bab32cf8e06fbf99b2abef36922Chris Masone    version = 1
179933ab84a71a3bab32cf8e06fbf99b2abef36922Chris Masone
18c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone
1943fd3caa723f9ce37a559c9683dc1948e6e5a396Chris Masone    def setup(self):
2043fd3caa723f9ce37a559c9683dc1948e6e5a396Chris Masone        os.chdir(self.srcdir)
2143fd3caa723f9ce37a559c9683dc1948e6e5a396Chris Masone        utils.make('OUT_DIR=.')
2243fd3caa723f9ce37a559c9683dc1948e6e5a396Chris Masone
2343fd3caa723f9ce37a559c9683dc1948e6e5a396Chris Masone
24c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone    def initialize(self):
253d68fe8213ef86684d7911f889d56d1345bf3272Chris Masone        super(login_OwnershipTaken, self).initialize()
26a2b32851e8716f188dde273c73f4c76058bbd289Chris Masone        ownership.restart_ui_to_clear_ownership_files()
27a2b32851e8716f188dde273c73f4c76058bbd289Chris Masone        if (os.access(constants.OWNER_KEY_FILE, os.F_OK) or
28a2b32851e8716f188dde273c73f4c76058bbd289Chris Masone            os.access(constants.SIGNED_POLICY_FILE, os.F_OK)):
29c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone            raise error.TestError('Ownership already taken!')
30c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone
31c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone
32c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone    def _validate_policy(self, retrieved_policy, username):
33c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone        # Pull in protobuf definitions.
34c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone        sys.path.append(self.srcdir)
35c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone        from chrome_device_policy_pb2 import ChromeDeviceSettingsProto
36c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone        from chrome_device_policy_pb2 import UserWhitelistProto
37c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone        from device_management_backend_pb2 import PolicyData
38c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone        from device_management_backend_pb2 import PolicyFetchResponse
39c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone
40c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone        response_proto = PolicyFetchResponse()
41c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone        response_proto.ParseFromString(retrieved_policy)
42c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone        ownership.assert_has_policy_data(response_proto)
43c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone
44c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone        poldata = PolicyData()
45c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone        poldata.ParseFromString(response_proto.policy_data)
46c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone        ownership.assert_has_device_settings(poldata)
47c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone        ownership.assert_username(poldata, username)
48c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone
49c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone        polval = ChromeDeviceSettingsProto()
50c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone        polval.ParseFromString(poldata.policy_value)
51c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone        ownership.assert_new_users(polval, True)
52c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone        ownership.assert_users_on_whitelist(polval, (username,))
539933ab84a71a3bab32cf8e06fbf99b2abef36922Chris Masone
5443fd3caa723f9ce37a559c9683dc1948e6e5a396Chris Masone
559933ab84a71a3bab32cf8e06fbf99b2abef36922Chris Masone    def run_once(self):
5664170f8e7053f92f4bbad501c61a352fdabf6d82Chris Masone        bus_loop = DBusGMainLoop(set_as_default=True)
573d68fe8213ef86684d7911f889d56d1345bf3272Chris Masone        listener = session_manager.OwnershipSignalListener(gobject.MainLoop())
583d68fe8213ef86684d7911f889d56d1345bf3272Chris Masone        listener.listen_for_new_key_and_policy()
59c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone        with chrome.Chrome() as cr:
603d68fe8213ef86684d7911f889d56d1345bf3272Chris Masone            listener.wait_for_signals(desc='Owner settings written to disk.')
61c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone
6264170f8e7053f92f4bbad501c61a352fdabf6d82Chris Masone            sm = session_manager.connect(bus_loop)
63c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone            retrieved_policy = sm.RetrievePolicy(byte_arrays=True)
64c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone            if retrieved_policy is None:
65c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone                raise error.TestFail('Policy not found.')
66c25b8ee227b0194da2bab175bcb67e23b1b41254Chris Masone            self._validate_policy(retrieved_policy, cr.username)
67