| # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import json |
| import logging |
| import urlparse |
| from sdk_update_common import Error |
| |
| SOURCE_WHITELIST = [ |
| 'http://localhost/', # For testing. |
| 'https://storage.googleapis.com/nativeclient-mirror/nacl/nacl_sdk', |
| ] |
| |
| def IsSourceValid(url): |
| # E1101: Instance of 'ParseResult' has no 'scheme' member |
| # pylint: disable=E1101 |
| |
| given = urlparse.urlparse(url) |
| for allowed_url in SOURCE_WHITELIST: |
| allowed = urlparse.urlparse(allowed_url) |
| if (given.scheme == allowed.scheme and |
| given.hostname == allowed.hostname and |
| given.path.startswith(allowed.path)): |
| return True |
| return False |
| |
| |
| class Config(dict): |
| def __init__(self, data=None): |
| dict.__init__(self) |
| if data: |
| self.update(data) |
| else: |
| self.sources = [] |
| |
| def LoadJson(self, json_data): |
| try: |
| self.update(json.loads(json_data)) |
| except Exception as e: |
| raise Error('Error reading json config:\n%s' % str(e)) |
| |
| def ToJson(self): |
| try: |
| return json.dumps(self, sort_keys=False, indent=2) |
| except Exception as e: |
| raise Error('Json encoding error writing config:\n%s' % e) |
| |
| def __getattr__(self, name): |
| if name in self: |
| return self[name] |
| else: |
| raise AttributeError('Config does not contain: %s' % name) |
| |
| def __setattr__(self, name, value): |
| self[name] = value |
| |
| def AddSource(self, source): |
| if not IsSourceValid(source): |
| logging.warn('Only whitelisted sources are allowed. Ignoring \"%s\".' % ( |
| source,)) |
| return |
| |
| if source in self.sources: |
| logging.info('Source \"%s\" already in Config.' % (source,)) |
| return |
| self.sources.append(source) |
| |
| def RemoveSource(self, source): |
| if source not in self.sources: |
| logging.warn('Source \"%s\" not in Config.' % (source,)) |
| return |
| self.sources.remove(source) |
| |
| def RemoveAllSources(self): |
| if not self.sources: |
| logging.info('No sources to remove.') |
| return |
| self.sources = [] |