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