10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#!/usr/bin/env python 20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch# Copyright 2014 The Chromium Authors. All rights reserved. 30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch# Use of this source code is governed by a BSD-style license that can be 40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch# found in the LICENSE file. 50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch"""Takes the JSON files in components/domain_reliability/baked_in_configs and 80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochencodes their contents as an array of C strings that gets compiled in to Chrome 90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochand loaded at runtime.""" 100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochimport json 130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochimport os 140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochimport sys 150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch# A whitelist of domains that the script will accept when baking configs in to 180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch# Chrome, to ensure incorrect ones are not added accidentally. Subdomains of 190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch# whitelist entries are also allowed (e.g. maps.google.com, ssl.gstatic.com). 20116680a4aac90f2aa7413d9095a592090648e557Ben MurdochDOMAIN_WHITELIST = ('2mdn.net', 'admob.com', 'doubleclick.net', 'ggpht.com', 2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 'google.cn', 'google.co.uk', 'google.com', 'google.com.au', 2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 'google.de', 'google.fr', 'google.it', 'google.jp', 2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 'google.org', 'google.ru', 'googleadservices.com', 2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 'googleapis.com', 'googlesyndication.com', 2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 'googleusercontent.com', 'googlevideo.com', 'gstatic.com', 2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 'gvt1.com', 'youtube.com', 'ytimg.com') 270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 290529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochCC_HEADER = """// Copyright (C) 2014 The Chromium Authors. All rights reserved. 300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// found in the LICENSE file. 320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// AUTOGENERATED FILE. DO NOT EDIT. 340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// 350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// (Update configs in components/domain_reliability/baked_in_configs and list 360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// configs in components/domain_reliability.gypi instead.) 370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/domain_reliability/baked_in_configs.h" 390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include <stdlib.h> 410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace domain_reliability { 430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst char* const kBakedInJsonConfigs[] = { 450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch""" 460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 480529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochCC_FOOTER = """ NULL 490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}; 500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} // namespace domain_reliability 520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch""" 530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochdef domain_is_whitelisted(domain): 560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return any(domain == e or domain.endswith('.' + e) for e in DOMAIN_WHITELIST) 570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochdef quote_and_wrap_text(text, width=79, prefix=' "', suffix='"'): 600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch max_length = width - len(prefix) - len(suffix) 610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch output = prefix 620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch line_length = 0 630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch for c in text: 640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if c == "\"": 650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch c = "\\\"" 660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch elif c == "\n": 670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch c = "\\n" 680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch elif c == "\\": 690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch c = "\\\\" 700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if line_length + len(c) > max_length: 710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch output += suffix + "\n" + prefix 720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch line_length = 0 730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch output += c 740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch line_length += len(c) 750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch output += suffix 760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return output 770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochdef main(): 800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if len(sys.argv) < 3: 810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch print >> sys.stderr, ('Usage: %s <JSON files...> <output C++ file>' % 820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch sys.argv[0]) 830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch print >> sys.stderr, sys.modules[__name__].__doc__ 840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return 1 850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch cpp_code = CC_HEADER 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch found_invalid_config = False 880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch for json_file in sys.argv[1:-1]: 890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch with open(json_file, 'r') as f: 900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch json_text = f.read() 910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch config = json.loads(json_text) 920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if 'monitored_domain' not in config: 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch print >> sys.stderr, ('%s: no monitored_domain found' % json_file) 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch found_invalid_config = True 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch continue 960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch domain = config['monitored_domain'] 970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if not domain_is_whitelisted(domain): 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch print >> sys.stderr, ('%s: monitored_domain "%s" not in whitelist' % 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch (json_file, domain)) 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch found_invalid_config = True 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch continue 1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch cpp_code += " // " + json_file + ":\n" 1030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch cpp_code += quote_and_wrap_text(json_text) + ",\n" 1040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch cpp_code += "\n" 1050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch cpp_code += CC_FOOTER 1060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if found_invalid_config: 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return 1 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1100de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) with open(sys.argv[-1], 'wb') as f: 1110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch f.write(cpp_code) 1120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return 0 1140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochif __name__ == '__main__': 1170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch sys.exit(main()) 118