Commit afde51a8 authored by Max Timkovich's avatar Max Timkovich Committed by Commit Bot

Set Extension Policy Settings through policy_path

Read extension policy settings from the `policy_path` as a fallback
in the case where the data directory does not have any extension policy
information.

This allows setting extension policies through client-side autotests.

Bug: 900238
Change-Id: I49204ae22df6633e65ec30bbba9b0e2e40216580
Reviewed-on: https://chromium-review.googlesource.com/c/1307450Reviewed-by: default avatarDenis Kuznetsov <antrim@chromium.org>
Reviewed-by: default avatarPavol Marko <pmarko@chromium.org>
Commit-Queue: Max Timkovich <timkovich@chromium.org>
Cr-Commit-Position: refs/heads/master@{#605439}
parent bb012a94
...@@ -375,7 +375,9 @@ class PolicyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): ...@@ -375,7 +375,9 @@ class PolicyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
settings.download_url = urlparse.urljoin( settings.download_url = urlparse.urljoin(
self.server.GetBaseURL(), 'externalpolicydata?key=%s' % policy_key) self.server.GetBaseURL(), 'externalpolicydata?key=%s' % policy_key)
settings.secure_hash = hashlib.sha256(data).digest() settings.secure_hash = hashlib.sha256(data).digest()
return settings.SerializeToString() return settings.SerializeToString()
else:
return None
def CheckGoogleLogin(self): def CheckGoogleLogin(self):
"""Extracts the auth token from the request and returns it. The token may """Extracts the auth token from the request and returns it. The token may
...@@ -855,14 +857,17 @@ class PolicyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): ...@@ -855,14 +857,17 @@ class PolicyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
if field.type == field.TYPE_BOOL: if field.type == field.TYPE_BOOL:
assert type(field_value) == bool assert type(field_value) == bool
elif field.type == field.TYPE_STRING: elif field.type == field.TYPE_STRING:
assert type(field_value) == str or type(field_value) == unicode assert type(field_value) in [str, unicode]
elif field.type == field.TYPE_BYTES:
assert type(field_value) in [str, unicode]
field_value = field_value.decode('hex')
elif (field.type == field.TYPE_INT64 or elif (field.type == field.TYPE_INT64 or
field.type == field.TYPE_INT32 or field.type == field.TYPE_INT32 or
field.type == field.TYPE_ENUM): field.type == field.TYPE_ENUM):
assert type(field_value) == int assert type(field_value) == int
else: else:
return False return False
group_message.__setattr__(field.name, field_value) setattr(group_message, field.name, field_value)
return True return True
def SetProtobufMessageField(self, group_message, field, field_value): def SetProtobufMessageField(self, group_message, field, field_value):
...@@ -881,6 +886,25 @@ class PolicyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): ...@@ -881,6 +886,25 @@ class PolicyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
elif not self.SetProtoField(group_message, field, field_value): elif not self.SetProtoField(group_message, field, field_value):
raise Exception('Unknown field type %s' % field.type) raise Exception('Unknown field type %s' % field.type)
def GatherExtensionPolicySettings(self, settings, policies):
"""Copies all the policies from a dictionary into a protobuf of type
ExternalPolicyData.
Args:
settings: The destination: a ExternalPolicyData protobuf.
policies: The source: a dictionary containing the extension policies.
"""
for field in settings.DESCRIPTOR.fields:
# |field| is the entry for a specific policy in the top-level
# ExternalPolicyData proto.
field_value = policies.get(field.name)
if field_value is None:
continue
field_descriptor = settings.DESCRIPTOR.fields_by_name[field.name]
self.SetProtobufMessageField(settings, field_descriptor,
field_value)
def GatherDevicePolicySettings(self, settings, policies): def GatherDevicePolicySettings(self, settings, policies):
"""Copies all the policies from a dictionary into a protobuf of type """Copies all the policies from a dictionary into a protobuf of type
CloudDeviceSettingsProto. CloudDeviceSettingsProto.
...@@ -953,6 +977,12 @@ class PolicyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): ...@@ -953,6 +977,12 @@ class PolicyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
# Send one PolicyFetchResponse for each extension that has # Send one PolicyFetchResponse for each extension that has
# configuration data at the server. # configuration data at the server.
ids = self.server.ListMatchingComponents(request.policy_type) ids = self.server.ListMatchingComponents(request.policy_type)
if not ids:
# Fetch the ids from the policy JSON, if none in the config directory.
policy = self.server.GetPolicies()
ext_policies = policy.get(request.policy_type, {})
ids = ext_policies.keys()
for settings_entity_id in ids: for settings_entity_id in ids:
# Reuse the extension policy request, to trigger the same signature # Reuse the extension policy request, to trigger the same signature
# type in the response. # type in the response.
...@@ -1009,6 +1039,11 @@ class PolicyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): ...@@ -1009,6 +1039,11 @@ class PolicyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
payload = self.server.ReadPolicyFromDataDir(policy_key, settings) payload = self.server.ReadPolicyFromDataDir(policy_key, settings)
if payload is None: if payload is None:
payload = self.CreatePolicyForExternalPolicyData(policy_key) payload = self.CreatePolicyForExternalPolicyData(policy_key)
if payload is None:
ext_policies = policy.get(msg.policy_type, {})
policies = ext_policies.get(msg.settings_entity_id, {})
self.GatherExtensionPolicySettings(settings, policies)
payload = settings.SerializeToString()
else: else:
response.error_code = 400 response.error_code = 400
response.error_message = 'Invalid policy type' response.error_message = 'Invalid policy type'
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment