# Copyright 2014 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from dbus.mainloop.glib import DBusGMainLoop

from autotest_lib.client.bin import test
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros import cryptohome, pkcs11


class platform_CryptohomeMigrateChapsTokenClient(test.test):
    """ This is a helper to platform_CryptohomeMigrateChapsToken
        It logs a test user in and either generates a chaps signing
        key or checks if a signing key was generated
    """
    version = 1


    def initialize(self):
        super(platform_CryptohomeMigrateChapsTokenClient, self).initialize()
        bus_loop = DBusGMainLoop(set_as_default=True)
        self._cryptohome_proxy = cryptohome.CryptohomeProxy(
            bus_loop, self.autodir, self.job)

    def run_once(self, generate_key=False):

        user = "user@test.com"
        password = "test_password"
        if generate_key:
            # Make sure that the tpm is owned.
            status = cryptohome.get_tpm_status()
            if not status['Owned']:
                cryptohome.take_tpm_ownership()

            # We generate a chaps key tied to |user|.
            self._cryptohome_proxy.ensure_clean_cryptohome_for(user, password)
            result = pkcs11.generate_user_key()
            if not result:
                raise error.TestFail('Unable to generate key for ' + user)
        else:
            # Check if the chaps key previously generated is still present.
            # If the key is present, migration was successful, and chaps keys
            # weren't destroyed.
            result = self._cryptohome_proxy.mount(user, password)
            if not result:
                raise error.TestFail('Unable to remount users cryptohome')
            result = pkcs11.test_and_cleanup_key()
            if not result:
                raise error.TestFail('No Generated keys present for ' + user)
            self._cryptohome_proxy.remove(user)

