blob: 307741b906ad2e9a273f7fe48f71b60b7caa35f7 [file] [log] [blame]
#!/usr/bin/env python
# Copyright 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 blocklist into the format
expected by ContentBrowserClient#GetWebBluetoothBlocklist.
Usage: <gatt_blocklist.txt>
import collections
import string
import sys
UUID_BASE_POSTFIX = '-0000-1000-8000-00805f9b34fb'
class BadLineException(Exception):
class InvalidUUIDException(Exception):
class DuplicateUUIDException(Exception):
class InvalidExclusionException(Exception):
def ValidUUID(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
if uuid[i] not in string.hexdigits:
return False
return True
def ShortenUUID(uuid):
"""Shorten a UUUD that use Bluetooth base UUID.
Note: this function shortens all UUIDs that use the Bluetooth base
UUID even though the specification states that only an assigned UUID
can be shortened. In this case it works fine, since the constructor in also works the same way.
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, blocklist):
line = line.strip().lower()
if not line or line.startswith('#'):
fields = line.split()
if len(fields) not in [1, 2]:
raise BadLineException('Badly formatted line: %s' % line)
uuid = fields[0]
if not ValidUUID(uuid):
raise InvalidUUIDException('Invalid UUID: %s' % line)
uuid = ShortenUUID(uuid)
if uuid in blocklist:
raise DuplicateUUIDException('Duplicate UUID: %s' % line)
if len(fields) == 1:
blocklist[uuid] = 'e'
elif fields[1] == 'exclude-writes':
blocklist[uuid] = 'w'
elif fields[1] == 'exclude-reads':
blocklist[uuid] = 'r'
raise InvalidExclusionException('Invalid exclusion value: %s' % line)
def main():
if len(sys.argv) != 2:
print('Usage: %s <gatt_blocklist.txt>' % sys.argv[0])
return 1
blocklist = collections.OrderedDict()
with open(sys.argv[1]) as f:
for line in f:
Process(line, blocklist)
print(','.join('%s:%s' % (uuid, blocklist[uuid]) for uuid in blocklist))
return 0
except Exception as e:
print('Failed to compact blocklist. %s' % e)
return 1
if __name__ == '__main__':