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