Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(785)

Unified Diff: chrome/tools/build/generate_policy_source.py

Issue 19462006: Implement fetching, caching and retrieval of external policy data (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased. Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/chrome_tests_unit.gypi ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/tools/build/generate_policy_source.py
diff --git a/chrome/tools/build/generate_policy_source.py b/chrome/tools/build/generate_policy_source.py
index 09c8791abce0fb2d8a53afa1d9a3a6ad66e73454..89987001f5a4281a4016c3473bab997606f3fe5d 100755
--- a/chrome/tools/build/generate_policy_source.py
+++ b/chrome/tools/build/generate_policy_source.py
@@ -25,13 +25,15 @@ class PolicyDetails:
"""Parses a policy template and caches all its details."""
# Maps policy types to a tuple with 3 other types:
- # - the equivalent base::Value::Type
+ # - the equivalent base::Value::Type or 'TYPE_EXTERNAL' if the policy
+ # references external data
# - the equivalent Protobuf field type
# - the name of one of the protobufs for shared policy types
# TODO(joaodasilva): refactor the 'dict' type into a more generic 'json' type
# that can also be used to represent lists of other JSON objects.
TYPE_MAP = {
'dict': ('TYPE_DICTIONARY', 'string', 'String'),
+ 'external': ('TYPE_EXTERNAL', 'string', 'String'),
'int': ('TYPE_INTEGER', 'int64', 'Integer'),
'int-enum': ('TYPE_INTEGER', 'int64', 'Integer'),
'list': ('TYPE_LIST', 'StringList', 'StringList'),
@@ -70,13 +72,14 @@ class PolicyDetails:
if not PolicyDetails.TYPE_MAP.has_key(policy['type']):
raise NotImplementedError('Unknown policy type for %s: %s' %
(policy['name'], policy['type']))
- self.value_type, self.protobuf_type, self.policy_protobuf_type = \
+ self.policy_type, self.protobuf_type, self.policy_protobuf_type = \
PolicyDetails.TYPE_MAP[policy['type']]
self.desc = '\n'.join(
map(str.strip,
PolicyDetails._RemovePlaceholders(policy['desc']).splitlines()))
self.caption = PolicyDetails._RemovePlaceholders(policy['caption'])
+ self.max_size = policy.get('max_size', 0)
items = policy.get('items')
if items is None:
@@ -202,6 +205,7 @@ def _WritePolicyConstantHeader(policies, os, f):
'\n'
'#include <string>\n'
'\n'
+ '#include "base/basictypes.h"\n'
'#include "base/values.h"\n'
'\n'
'namespace policy {\n\n')
@@ -211,14 +215,16 @@ def _WritePolicyConstantHeader(policies, os, f):
'configuration resides.\n'
'extern const wchar_t kRegistryChromePolicyKey[];\n')
- f.write('// Lists policy types mapped to their names and expected types.\n'
- '// Used to initialize ConfigurationPolicyProviders.\n'
+ f.write('// Lists metadata such as name, expected type and id for all\n'
+ '// policies. Used to initialize ConfigurationPolicyProviders and\n'
+ '// CloudExternalDataManagers.\n'
'struct PolicyDefinitionList {\n'
' struct Entry {\n'
' const char* name;\n'
' base::Value::Type value_type;\n'
' bool device_policy;\n'
' int id;\n'
+ ' size_t max_external_data_size;\n'
' };\n'
'\n'
' const Entry* begin;\n'
@@ -245,6 +251,10 @@ def _WritePolicyConstantHeader(policies, os, f):
#------------------ policy constants source ------------------------#
+def _GetValueType(policy_type):
+ return policy_type if policy_type != 'TYPE_EXTERNAL' else 'TYPE_DICTIONARY'
+
+
def _WritePolicyConstantSource(policies, os, f):
f.write('#include "base/basictypes.h"\n'
'#include "base/logging.h"\n'
@@ -257,9 +267,10 @@ def _WritePolicyConstantSource(policies, os, f):
f.write('const PolicyDefinitionList::Entry kEntries[] = {\n')
for policy in policies:
if policy.is_supported:
- f.write(' { key::k%s, base::Value::%s, %s, %s },\n' %
- (policy.name, policy.value_type,
- 'true' if policy.is_device_only else 'false', policy.id))
+ f.write(' { key::k%s, base::Value::%s, %s, %s, %s },\n' %
+ (policy.name, _GetValueType(policy.policy_type),
+ 'true' if policy.is_device_only else 'false', policy.id,
+ policy.max_size))
f.write('};\n\n')
f.write('const PolicyDefinitionList kChromePolicyList = {\n'
@@ -434,7 +445,9 @@ CPP_HEAD = '''
#include "base/json/json_reader.h"
#include "base/logging.h"
#include "base/memory/scoped_ptr.h"
+#include "base/memory/weak_ptr.h"
#include "base/values.h"
+#include "chrome/browser/policy/cloud/cloud_external_data_manager.h"
#include "chrome/browser/policy/external_data_fetcher.h"
#include "chrome/browser/policy/policy_map.h"
#include "policy/policy_constants.h"
@@ -479,7 +492,9 @@ base::Value* DecodeJson(const std::string& json) {
return root.release();
}
-void DecodePolicy(const em::CloudPolicySettings& policy, PolicyMap* map) {
+void DecodePolicy(const em::CloudPolicySettings& policy,
+ base::WeakPtr<CloudExternalDataManager> external_data_manager,
+ PolicyMap* map) {
'''
@@ -498,12 +513,18 @@ def _CreateValue(type, arg):
return 'base::Value::CreateStringValue(%s)' % arg
elif type == 'TYPE_LIST':
return 'DecodeStringList(%s)' % arg
- elif type == 'TYPE_DICTIONARY':
+ elif type == 'TYPE_DICTIONARY' or type == 'TYPE_EXTERNAL':
return 'DecodeJson(%s)' % arg
else:
raise NotImplementedError('Unknown type %s' % type)
+def _CreateExternalDataFetcher(type, name):
+ if type == 'TYPE_EXTERNAL':
+ return 'new ExternalDataFetcher(external_data_manager, key::k%s)' % name
+ return 'NULL'
+
+
def _WritePolicyCode(f, policy):
membername = policy.name.lower()
proto_type = '%sPolicyProto' % policy.policy_protobuf_type
@@ -530,10 +551,12 @@ def _WritePolicyCode(f, policy):
' }\n'
' if (do_set) {\n')
f.write(' base::Value* value = %s;\n' %
- (_CreateValue(policy.value_type, 'policy_proto.value()')))
+ (_CreateValue(policy.policy_type, 'policy_proto.value()')))
+ f.write(' ExternalDataFetcher* external_data_fetcher = %s;\n' %
+ _CreateExternalDataFetcher(policy.policy_type, policy.name))
f.write(' map->Set(key::k%s, level, POLICY_SCOPE_USER,\n' %
policy.name)
- f.write(' value, NULL);\n')
+ f.write(' value, external_data_fetcher);\n')
f.write(' }\n'
' }\n'
' }\n')
« no previous file with comments | « chrome/chrome_tests_unit.gypi ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698