Chromium Code Reviews| Index: chrome/browser/policy/test/policy_testserver.py |
| diff --git a/chrome/browser/policy/test/policy_testserver.py b/chrome/browser/policy/test/policy_testserver.py |
| index 13b98f97ae27f54106f1726095a26aa721874be8..7139452c9de34fe18ba6611a5f1e44ceef105b60 100644 |
| --- a/chrome/browser/policy/test/policy_testserver.py |
| +++ b/chrome/browser/policy/test/policy_testserver.py |
| @@ -57,6 +57,7 @@ Example: |
| import base64 |
| import BaseHTTPServer |
| import cgi |
| +import glob |
| import google.protobuf.text_format |
| import hashlib |
| import logging |
| @@ -277,8 +278,7 @@ class PolicyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
| # device_management_backend.proto. |
| if (self.GetUniqueParam('devicetype') != '2' or |
| self.GetUniqueParam('apptype') != 'Chrome' or |
| - (request_type != 'ping' and |
| - len(self.GetUniqueParam('deviceid')) >= 64) or |
| + len(self.GetUniqueParam('deviceid')) >= 64 or |
| len(self.GetUniqueParam('agent')) >= 64): |
| return (400, 'Invalid request parameter') |
| if request_type == 'register': |
| @@ -287,7 +287,7 @@ class PolicyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
| response = self.ProcessApiAuthorization(rmsg.service_api_access_request) |
| elif request_type == 'unregister': |
| response = self.ProcessUnregister(rmsg.unregister_request) |
| - elif request_type == 'policy' or request_type == 'ping': |
| + elif request_type == 'policy': |
| response = self.ProcessPolicy(rmsg, request_type) |
| elif request_type == 'enterprise_check': |
| response = self.ProcessAutoEnrollment(rmsg.auto_enrollment_request) |
| @@ -445,20 +445,18 @@ class PolicyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
| response = dm.DeviceManagementResponse() |
| for request in msg.policy_request.request: |
| - fetch_response = response.policy_response.response.add() |
| if (request.policy_type in |
| ('google/android/user', |
| - 'google/chrome/extension', |
| 'google/chromeos/device', |
| 'google/chromeos/publicaccount', |
| 'google/chromeos/user', |
| 'google/chrome/user', |
| 'google/ios/user')): |
| - if request_type != 'policy': |
| - fetch_response.error_code = 400 |
| - fetch_response.error_message = 'Invalid request type' |
| - else: |
| - self.ProcessCloudPolicy(request, token_info, fetch_response) |
| + fetch_response = response.policy_response.response.add() |
| + self.ProcessCloudPolicy(request, token_info, fetch_response) |
| + elif request.policy_type == 'google/chrome/extension': |
| + self.ProcessCloudPolicyForExtensions( |
| + request, response.policy_response, token_info) |
| else: |
| fetch_response.error_code = 400 |
| fetch_response.error_message = 'Invalid policy_type' |
| @@ -532,14 +530,14 @@ class PolicyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
| return (200, response) |
| def SetProtobufMessageField(self, group_message, field, field_value): |
| - '''Sets a field in a protobuf message. |
| + """Sets a field in a protobuf message. |
| Args: |
| group_message: The protobuf message. |
| field: The field of the message to set, it should be a member of |
| group_message.DESCRIPTOR.fields. |
| field_value: The value to set. |
| - ''' |
| + """ |
| if field.label == field.LABEL_REPEATED: |
| assert type(field_value) == list |
| entries = group_message.__getattribute__(field.name) |
| @@ -577,13 +575,13 @@ class PolicyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
| group_message.__setattr__(field.name, field_value) |
| 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. |
| Args: |
| settings: The destination ChromeDeviceSettingsProto protobuf. |
| policies: The source dictionary containing policies in JSON format. |
| - ''' |
| + """ |
| for group in settings.DESCRIPTOR.fields: |
| # Create protobuf message for group. |
| group_message = eval('dp.' + group.message_type.name + '()') |
| @@ -601,14 +599,14 @@ class PolicyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
| settings.__getattribute__(group.name).CopyFrom(group_message) |
| def GatherUserPolicySettings(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 |
| CloudPolicySettings. |
| Args: |
| settings: The destination: a CloudPolicySettings protobuf. |
| policies: The source: a dictionary containing policies under keys |
| 'recommended' and 'mandatory'. |
| - ''' |
| + """ |
| for field in settings.DESCRIPTOR.fields: |
| # |field| is the entry for a specific policy in the top-level |
| # CloudPolicySettings proto. |
| @@ -630,6 +628,33 @@ class PolicyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): |
| self.SetProtobufMessageField(policy_message, field_descriptor, value) |
| settings.__getattribute__(field.name).CopyFrom(policy_message) |
| + def ProcessCloudPolicyForExtensions(self, request, response, token_info): |
| + """Handles a request for policy for extensions. |
| + |
| + A request for policy for extensions is slightly different from the other |
| + cloud policy requests, because it can trigger 0, one or many |
| + PolicyFetchResponse messages in the response. |
| + |
| + Args: |
| + request: the PolicyFetchRequest that triggered this handler. |
|
Mattias Nissler (ping if slow)
2014/04/28 12:02:48
nit: Capitalized The after colon (also below)
Joao da Silva
2014/04/28 12:20:10
Done.
|
| + response: the DevicePolicyResponse message for the response. Multiple |
| + PolicyFetchResponses will be appened to this message. |
|
Mattias Nissler (ping if slow)
2014/04/28 12:02:48
appended
Joao da Silva
2014/04/28 12:20:10
Done.
|
| + token_info: the token extracted from the request. |
| + """ |
| + # Send one PolicyFetchResponse for each extension that has |
| + # configuration data at the server. |
| + ids = self.server.ListMatchingComponents('google/chrome/extension') |
| + for settings_entity_id in ids: |
| + # Reuse the extension policy request, to trigger the same signature |
| + # type in the response. |
| + request.settings_entity_id = settings_entity_id |
| + fetch_response = response.response.add() |
| + self.ProcessCloudPolicy(request, token_info, fetch_response) |
| + # Don't do key rotations for these messages. |
| + fetch_response.ClearField('new_public_key') |
| + fetch_response.ClearField('new_public_key_signature') |
| + fetch_response.ClearField('new_public_key_verification_signature') |
| + |
| def ProcessCloudPolicy(self, msg, token_info, response): |
| """Handles a cloud policy request. (New protocol for policy requests.) |
| @@ -1056,6 +1081,22 @@ class PolicyTestServer(testserver_base.BrokenPipeHandlerMixIn, |
| return os.path.join(self.data_dir or '', |
| 'policy_%s' % sanitized_policy_selector) |
| + def ListMatchingComponents(self, policy_type): |
| + """Returns a list of settings entity IDs that have a configuration file. |
| + |
| + Args: |
| + policy_type: the policy type to look for. Only settings entity IDs for |
| + file selectors that match this policy_type will be returned. |
| + |
| + Returns: |
| + A list of settings entity IDs for the given |policy_type| that have a |
| + configuration file in this server (either as a .bin, .txt or .data file). |
| + """ |
| + base_name = self.GetBaseFilename(policy_type) |
| + files = glob.glob('%s_*.*' % base_name) |
| + len_base_name = len(base_name) + 1 |
| + return [ file[len_base_name:file.rfind('.')] for file in files ] |
| + |
| def ReadPolicyFromDataDir(self, policy_selector, proto_message): |
| """Tries to read policy payload from a file in the data directory. |