extension_to_load.py revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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):
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def __init__(self, path, 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)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  @property
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def extension_id(self):
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Unique extension id of this extension."""
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if crx_id.HasPublicKey(self._path):
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      # Calculate extension id from the public key.
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return crx_id.GetCRXAppID(os.path.realpath(self._path))
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else:
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      # Calculate extension id based on the path on the device.
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return crx_id.GetCRXAppID(os.path.realpath(self._local_path),
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                from_file_path=True)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  @property
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def path(self):
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Path to extension source directory."""
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return self._path
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  @property
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def local_path(self):
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Path to extension destination directory, for remote instances of
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome"""
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return self._local_path
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  @local_path.setter
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def local_path(self, local_path):
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self._local_path = local_path
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  @property
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def is_component(self):
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    """Whether this extension should be loaded as a component extension."""
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return self._is_component
56