 Chromium Code Reviews
 Chromium Code Reviews Issue 2285663002:
  bluetooth: Added script for converting the Web Bluetooth blacklist.  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master
    
  
    Issue 2285663002:
  bluetooth: Added script for converting the Web Bluetooth blacklist.  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master| Index: tools/webbt/compact_blacklist.py | 
| diff --git a/tools/webbt/compact_blacklist.py b/tools/webbt/compact_blacklist.py | 
| new file mode 100755 | 
| index 0000000000000000000000000000000000000000..0f5bd5d04e97a355792734005354e87dc0841762 | 
| --- /dev/null | 
| +++ b/tools/webbt/compact_blacklist.py | 
| @@ -0,0 +1,105 @@ | 
| +#!/usr/bin/env python | 
| 
scheib
2016/08/29 01:14:47
Let's place this file in tools/web_bluetooth/
 | 
| +# Copyright (c) 2016 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. | 
| + | 
| +"""Script for converting the Web Bluetooth GATT blacklist into the format | 
| +expected by ContentBrowserClient#GetWebBluetoothBlacklist. | 
| + | 
| +See: | 
| +https://github.com/WebBluetoothCG/registries/blob/master/gatt_blacklist.txt | 
| +content/public/browser/content_browser_client.h | 
| + | 
| +Usage: | 
| + compact_blacklist.py <gatt_blacklist.txt> | 
| +""" | 
| + | 
| +import collections | 
| +import string | 
| +import sys | 
| + | 
| +blacklist = collections.OrderedDict() | 
| + | 
| +UUID_LENGTH = 36 | 
| +UUID_BASE_POSTFIX = '-0000-1000-8000-00805f9b34fb' | 
| + | 
| + | 
| +class BadLineException(Exception): | 
| + pass | 
| + | 
| + | 
| +class InvalidUUIDException(Exception): | 
| + pass | 
| + | 
| + | 
| +class DuplicateUUIDException(Exception): | 
| + pass | 
| + | 
| + | 
| +class InvalidExclusionException(Exception): | 
| + pass | 
| + | 
| + | 
| +def valid_uuid(uuid): | 
| + if len(uuid) != UUID_LENGTH: | 
| + return False | 
| + for i in range(UUID_LENGTH): | 
| + if i in [8, 13, 18, 23]: | 
| + if uuid[i] != '-': | 
| + return False | 
| + else: | 
| + if uuid[i] not in string.hexdigits: | 
| + return False | 
| + return True | 
| + | 
| + | 
| +# Note: this function shortens all UUIDs that uses the Bluetooth base | 
| 
scheib
2016/08/29 01:14:47
s/uses/use/
 | 
| +# UUID even thought the specification states that only an assigned | 
| +# UUID can be shortened. In this case it works fine, since the constructor in | 
| +# bluetooth_uuid.cc also works the same way. | 
| +def shorten_uuid(uuid): | 
| + if uuid[8:] == UUID_BASE_POSTFIX: | 
| + new_uuid = '%x' % int(uuid[:8], 16) | 
| + if len(new_uuid) in [4, 8]: | 
| + uuid = new_uuid | 
| + return uuid | 
| + | 
| + | 
| +def process(line): | 
| + line = line.strip().lower() | 
| + if not line or line.startswith('#'): | 
| + return | 
| + fields = line.split() | 
| + if len(fields) not in [1, 2]: | 
| + raise BadLineException('Badly formatted line: %s' % line) | 
| + uuid = fields[0] | 
| + if not valid_uuid(uuid): | 
| + raise InvalidUUIDException('Invalid UUID: %s' % line) | 
| + uuid = shorten_uuid(uuid) | 
| + if uuid in blacklist: | 
| + raise DuplicateUUIDException('Duplicate UUID: %s' % line) | 
| + if len(fields) == 1: | 
| + blacklist[uuid] = 'e' | 
| + elif fields[1] == 'exclude-writes': | 
| + blacklist[uuid] = 'w' | 
| + elif fields[1] == 'exclude-reads': | 
| + blacklist[uuid] = 'r' | 
| + else: | 
| + raise InvalidExclusionException('Invalid exclusion value: %s' % line) | 
| + | 
| + | 
| +def main(): | 
| + if len(sys.argv) != 2: | 
| + sys.exit('Usage: %s <gatt_blacklist.txt>' % sys.argv[0]) | 
| + | 
| + try: | 
| + with open(sys.argv[1]) as f: | 
| + for line in f: | 
| + process(line) | 
| + print(','.join('%s:%s' % (uuid, blacklist[uuid]) for uuid in blacklist)) | 
| + except Exception as e: | 
| + sys.exit('Failed to compact blacklist. %s' % e) | 
| + | 
| + | 
| +if __name__ == '__main__': | 
| + main() |