12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import os
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.core.chrome import crx_id
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExtensionPathNonExistentException(Exception):
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pass
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MissingPublicKeyException(Exception):
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pass
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExtensionToLoad(object):
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  def __init__(self, path, browser_type, is_component=False):
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if not os.path.isdir(path):
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      raise ExtensionPathNonExistentException(
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          'Extension path not a directory %s' % path)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self._path = path
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self._local_path = path
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self._is_component = is_component
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if is_component and not crx_id.HasPublicKey(path):
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      raise MissingPublicKeyException(
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         'Component extension %s must have a public key' % path)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    # It is possible that we are running telemetry on Windows targeting
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    # a remote CrOS or Android device. In this case, we need the
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    # browser_type argument to determine how we should encode
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    # the extension path.
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    self._is_win = (os.name == 'nt'
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        and not (browser_type.startswith('android')
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 or browser_type.startswith('cros')))
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  @property
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def extension_id(self):
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Unique extension id of this extension."""
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if crx_id.HasPublicKey(self._path):
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      # Calculate extension id from the public key.
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return crx_id.GetCRXAppID(os.path.realpath(self._path))
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else:
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      # Calculate extension id based on the path on the device.
42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return crx_id.GetCRXAppID(
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          os.path.realpath(self._local_path),
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          from_file_path=True,
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          is_win_path=self._is_win)
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  @property
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def path(self):
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Path to extension source directory."""
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return self._path
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  @property
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def local_path(self):
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Path to extension destination directory, for remote instances of
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome"""
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return self._local_path
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  @local_path.setter
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def local_path(self, local_path):
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self._local_path = local_path
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  @property
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def is_component(self):
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Whether this extension should be loaded as a component extension."""
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return self._is_component
66