diff --git a/protobufs/steammessages_contentsystem.proto b/protobufs/steammessages_contentsystem.proto index 3d6d000d..333c8bf0 100644 --- a/protobufs/steammessages_contentsystem.proto +++ b/protobufs/steammessages_contentsystem.proto @@ -68,6 +68,17 @@ message CContentServerDirectory_GetManifestRequestCode_Response { optional uint64 manifest_request_code = 1; } +message CContentServerDirectory_GetCDNAuthToken_Request { + optional uint32 depot_id = 1; + optional string host_name = 2; + optional uint32 app_id = 3; +} + +message CContentServerDirectory_GetCDNAuthToken_Response { + optional string token = 1; + optional uint32 expiration_time = 2; +} + service ContentServerDirectory { option (service_description) = "Content Server and CDN directory"; @@ -75,4 +86,5 @@ service ContentServerDirectory { rpc GetDepotPatchInfo (.CContentServerDirectory_GetDepotPatchInfo_Request) returns (.CContentServerDirectory_GetDepotPatchInfo_Response); rpc GetClientUpdateHosts (.CContentServerDirectory_GetClientUpdateHosts_Request) returns (.CContentServerDirectory_GetClientUpdateHosts_Response); rpc GetManifestRequestCode (.CContentServerDirectory_GetManifestRequestCode_Request) returns (.CContentServerDirectory_GetManifestRequestCode_Response); + rpc GetCDNAuthToken (.CContentServerDirectory_GetCDNAuthToken_Request) returns (.CContentServerDirectory_GetCDNAuthToken_Response); } diff --git a/steam/client/cdn.py b/steam/client/cdn.py index dbd09ab8..1fa628b4 100644 --- a/steam/client/cdn.py +++ b/steam/client/cdn.py @@ -466,6 +466,7 @@ def __init__(self, client): self.cell_id = self.steam.cell_id self.web = make_requests_session() + self.cdn_auth_tokens = {} #: CDN authentication token self.depot_keys = {} #: depot decryption keys self.manifests = {} #: CDNDepotManifest instances self.app_depots = {} #: app depot info @@ -530,6 +531,51 @@ def get_content_server(self, rotate=False): self.servers.rotate(-1) return self.servers[0] + def get_cdn_auth_token(self, app_id, depot_id, hostname): + """Get CDN authentication token + + :param app_id: app id + :type app_id: :class:`int` + :param depot_id: depot id + :type depot_id: :class:`int` + :param hostname: cdn hostname + :type hostname: :class:`str` + :return: CDN authentication token + :rtype: str + """ + def update_cdn_auth_tokens(): + resp = self.steam.send_um_and_wait('ContentServerDirectory.GetCDNAuthToken#1', { + 'app_id': app_id, + 'depot_id': depot_id, + 'host_name': hostname + }, timeout=10) + + if resp is None or resp.header.eresult != EResult.OK: + if resp.header.eresult == EResult.Fail: + # no need authtoken? + pass + else: + raise SteamError("Failed to get CDNAuthToken for %s, %s, %s" % (app_id, depot_id, hostname), + EResult.Timeout if resp is None else EResult(resp.header.eresult)) + + self.cdn_auth_tokens.update({app_id:{depot_id:{hostname: { + 'eresult': resp.header.eresult, + 'token': resp.body.token or '', + 'expiration_time': resp.body.expiration_time or 0 + }}}}) + + if app_id not in self.cdn_auth_tokens or \ + depot_id not in self.cdn_auth_tokens[app_id] or \ + hostname not in self.cdn_auth_tokens[app_id][depot_id]: + update_cdn_auth_tokens() + else: + if self.cdn_auth_tokens[app_id][depot_id][hostname]['eresult'] != EResult.OK: + pass + elif datetime.fromtimestamp(self.cdn_auth_tokens[app_id][depot_id][hostname]['expiration_time'] - 60) < datetime.now(): + update_cdn_auth_tokens() + + return self.cdn_auth_tokens[app_id][depot_id][hostname]['token'] + def get_depot_key(self, app_id, depot_id): """Get depot key, which is needed to decrypt files @@ -552,13 +598,17 @@ def get_depot_key(self, app_id, depot_id): return self.depot_keys[depot_id] - def cdn_cmd(self, command, args): + def cdn_cmd(self, command, args, app_id=None, depot_id=None): """Run CDN command request :param command: command name :type command: str :param args: args :type args: str + :param args: app_id: (optional) required for CDN authentication token + :type args: int + :param args: depot_id: (optional) required for CDN authentication token + :type args: int :returns: requests response :rtype: :class:`requests.Response` :raises SteamError: on error @@ -566,12 +616,13 @@ def cdn_cmd(self, command, args): server = self.get_content_server() while True: - url = "%s://%s:%s/%s/%s" % ( + url = "%s://%s:%s/%s/%s%s" % ( 'https' if server.https else 'http', server.host, server.port, command, args, + self.get_cdn_auth_token(app_id, depot_id, str(server.host)) ) try: @@ -602,7 +653,7 @@ def get_chunk(self, app_id, depot_id, chunk_id): :raises SteamError: error message """ if (depot_id, chunk_id) not in self._chunk_cache: - resp = self.cdn_cmd('depot', '%s/chunk/%s' % (depot_id, chunk_id)) + resp = self.cdn_cmd('depot', '%s/chunk/%s' % (depot_id, chunk_id), app_id, depot_id) data = symmetric_decrypt(resp.content, self.get_depot_key(app_id, depot_id)) @@ -688,9 +739,9 @@ def get_manifest(self, app_id, depot_id, manifest_gid, decrypt=True, manifest_re """ if (app_id, depot_id, manifest_gid) not in self.manifests: if manifest_request_code: - resp = self.cdn_cmd('depot', '%s/manifest/%s/5/%s' % (depot_id, manifest_gid, manifest_request_code)) + resp = self.cdn_cmd('depot', '%s/manifest/%s/5/%s' % (depot_id, manifest_gid, manifest_request_code), app_id, depot_id) else: - resp = self.cdn_cmd('depot', '%s/manifest/%s/5' % (depot_id, manifest_gid)) + resp = self.cdn_cmd('depot', '%s/manifest/%s/5' % (depot_id, manifest_gid), app_id, depot_id) if resp.ok: manifest = self.DepotManifestClass(self, app_id, resp.content) diff --git a/steam/protobufs/steammessages_contentsystem_pb2.py b/steam/protobufs/steammessages_contentsystem_pb2.py index 43c725d7..fe6a8d72 100644 --- a/steam/protobufs/steammessages_contentsystem_pb2.py +++ b/steam/protobufs/steammessages_contentsystem_pb2.py @@ -23,7 +23,7 @@ syntax='proto2', serialized_options=b'\220\001\001', create_key=_descriptor._internal_create_key, - serialized_pb=b'\n!steammessages_contentsystem.proto\x1a\x18steammessages_base.proto\x1a steammessages_unified_base.proto\"\xb5\x02\n6CContentServerDirectory_GetServersForSteamPipe_Request\x12#\n\x07\x63\x65ll_id\x18\x01 \x01(\rB\x12\x82\xb5\x18\x0e\x63lient Cell ID\x12\x39\n\x0bmax_servers\x18\x02 \x01(\r:\x02\x32\x30\x42 \x82\xb5\x18\x1cmax servers in response list\x12*\n\x0bip_override\x18\x03 \x01(\tB\x15\x82\xb5\x18\x11\x63lient IP address\x12+\n\rlauncher_type\x18\x04 \x01(\x05:\x01\x30\x42\x11\x82\xb5\x18\rlauncher type\x12\x42\n\x0bipv6_public\x18\x05 \x01(\tB-\x82\xb5\x18)client public ipv6 address if it knows it\"\xdb\x02\n\"CContentServerDirectory_ServerInfo\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x11\n\tsource_id\x18\x02 \x01(\x05\x12\x0f\n\x07\x63\x65ll_id\x18\x03 \x01(\x05\x12\x0c\n\x04load\x18\x04 \x01(\x05\x12\x15\n\rweighted_load\x18\x05 \x01(\x02\x12\"\n\x1anum_entries_in_client_list\x18\x06 \x01(\x05\x12\x18\n\x10steam_china_only\x18\x07 \x01(\x08\x12\x0c\n\x04host\x18\x08 \x01(\t\x12\r\n\x05vhost\x18\t \x01(\t\x12\x14\n\x0cuse_as_proxy\x18\n \x01(\x08\x12#\n\x1bproxy_request_path_template\x18\x0b \x01(\t\x12\x15\n\rhttps_support\x18\x0c \x01(\t\x12\x17\n\x0f\x61llowed_app_ids\x18\r \x03(\r\x12\x18\n\x10preferred_server\x18\x0e \x01(\x08\"o\n7CContentServerDirectory_GetServersForSteamPipe_Response\x12\x34\n\x07servers\x18\x01 \x03(\x0b\x32#.CContentServerDirectory_ServerInfo\"\x89\x01\n1CContentServerDirectory_GetDepotPatchInfo_Request\x12\r\n\x05\x61ppid\x18\x01 \x01(\r\x12\x0f\n\x07\x64\x65potid\x18\x02 \x01(\r\x12\x19\n\x11source_manifestid\x18\x03 \x01(\x04\x12\x19\n\x11target_manifestid\x18\x04 \x01(\x04\"{\n2CContentServerDirectory_GetDepotPatchInfo_Response\x12\x14\n\x0cis_available\x18\x01 \x01(\x08\x12\x12\n\npatch_size\x18\x02 \x01(\x04\x12\x1b\n\x13patched_chunks_size\x18\x03 \x01(\x04\"P\n4CContentServerDirectory_GetClientUpdateHosts_Request\x12\x18\n\x10\x63\x61\x63hed_signature\x18\x01 \x01(\t\"w\n5CContentServerDirectory_GetClientUpdateHosts_Response\x12\x10\n\x08hosts_kv\x18\x01 \x01(\t\x12\x18\n\x10valid_until_time\x18\x02 \x01(\x04\x12\x12\n\nip_country\x18\x03 \x01(\t\"\xa1\x01\n6CContentServerDirectory_GetManifestRequestCode_Request\x12\x0e\n\x06\x61pp_id\x18\x01 \x01(\r\x12\x10\n\x08\x64\x65pot_id\x18\x02 \x01(\r\x12\x13\n\x0bmanifest_id\x18\x03 \x01(\x04\x12\x12\n\napp_branch\x18\x04 \x01(\t\x12\x1c\n\x14\x62ranch_password_hash\x18\x05 \x01(\t\"X\n7CContentServerDirectory_GetManifestRequestCode_Response\x12\x1d\n\x15manifest_request_code\x18\x01 \x01(\x04\x32\xe0\x04\n\x16\x43ontentServerDirectory\x12\x8b\x01\n\x16GetServersForSteamPipe\x12\x37.CContentServerDirectory_GetServersForSteamPipe_Request\x1a\x38.CContentServerDirectory_GetServersForSteamPipe_Response\x12|\n\x11GetDepotPatchInfo\x12\x32.CContentServerDirectory_GetDepotPatchInfo_Request\x1a\x33.CContentServerDirectory_GetDepotPatchInfo_Response\x12\x85\x01\n\x14GetClientUpdateHosts\x12\x35.CContentServerDirectory_GetClientUpdateHosts_Request\x1a\x36.CContentServerDirectory_GetClientUpdateHosts_Response\x12\x8b\x01\n\x16GetManifestRequestCode\x12\x37.CContentServerDirectory_GetManifestRequestCode_Request\x1a\x38.CContentServerDirectory_GetManifestRequestCode_Response\x1a$\x82\xb5\x18 Content Server and CDN directoryB\x03\x90\x01\x01' + serialized_pb=b'\n!steammessages_contentsystem.proto\x1a\x18steammessages_base.proto\x1a steammessages_unified_base.proto\"\xb5\x02\n6CContentServerDirectory_GetServersForSteamPipe_Request\x12#\n\x07\x63\x65ll_id\x18\x01 \x01(\rB\x12\x82\xb5\x18\x0e\x63lient Cell ID\x12\x39\n\x0bmax_servers\x18\x02 \x01(\r:\x02\x32\x30\x42 \x82\xb5\x18\x1cmax servers in response list\x12*\n\x0bip_override\x18\x03 \x01(\tB\x15\x82\xb5\x18\x11\x63lient IP address\x12+\n\rlauncher_type\x18\x04 \x01(\x05:\x01\x30\x42\x11\x82\xb5\x18\rlauncher type\x12\x42\n\x0bipv6_public\x18\x05 \x01(\tB-\x82\xb5\x18)client public ipv6 address if it knows it\"\xdb\x02\n\"CContentServerDirectory_ServerInfo\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x11\n\tsource_id\x18\x02 \x01(\x05\x12\x0f\n\x07\x63\x65ll_id\x18\x03 \x01(\x05\x12\x0c\n\x04load\x18\x04 \x01(\x05\x12\x15\n\rweighted_load\x18\x05 \x01(\x02\x12\"\n\x1anum_entries_in_client_list\x18\x06 \x01(\x05\x12\x18\n\x10steam_china_only\x18\x07 \x01(\x08\x12\x0c\n\x04host\x18\x08 \x01(\t\x12\r\n\x05vhost\x18\t \x01(\t\x12\x14\n\x0cuse_as_proxy\x18\n \x01(\x08\x12#\n\x1bproxy_request_path_template\x18\x0b \x01(\t\x12\x15\n\rhttps_support\x18\x0c \x01(\t\x12\x17\n\x0f\x61llowed_app_ids\x18\r \x03(\r\x12\x18\n\x10preferred_server\x18\x0e \x01(\x08\"o\n7CContentServerDirectory_GetServersForSteamPipe_Response\x12\x34\n\x07servers\x18\x01 \x03(\x0b\x32#.CContentServerDirectory_ServerInfo\"\x89\x01\n1CContentServerDirectory_GetDepotPatchInfo_Request\x12\r\n\x05\x61ppid\x18\x01 \x01(\r\x12\x0f\n\x07\x64\x65potid\x18\x02 \x01(\r\x12\x19\n\x11source_manifestid\x18\x03 \x01(\x04\x12\x19\n\x11target_manifestid\x18\x04 \x01(\x04\"{\n2CContentServerDirectory_GetDepotPatchInfo_Response\x12\x14\n\x0cis_available\x18\x01 \x01(\x08\x12\x12\n\npatch_size\x18\x02 \x01(\x04\x12\x1b\n\x13patched_chunks_size\x18\x03 \x01(\x04\"P\n4CContentServerDirectory_GetClientUpdateHosts_Request\x12\x18\n\x10\x63\x61\x63hed_signature\x18\x01 \x01(\t\"w\n5CContentServerDirectory_GetClientUpdateHosts_Response\x12\x10\n\x08hosts_kv\x18\x01 \x01(\t\x12\x18\n\x10valid_until_time\x18\x02 \x01(\x04\x12\x12\n\nip_country\x18\x03 \x01(\t\"\xa1\x01\n6CContentServerDirectory_GetManifestRequestCode_Request\x12\x0e\n\x06\x61pp_id\x18\x01 \x01(\r\x12\x10\n\x08\x64\x65pot_id\x18\x02 \x01(\r\x12\x13\n\x0bmanifest_id\x18\x03 \x01(\x04\x12\x12\n\napp_branch\x18\x04 \x01(\t\x12\x1c\n\x14\x62ranch_password_hash\x18\x05 \x01(\t\"X\n7CContentServerDirectory_GetManifestRequestCode_Response\x12\x1d\n\x15manifest_request_code\x18\x01 \x01(\x04\"f\n/CContentServerDirectory_GetCDNAuthToken_Request\x12\x10\n\x08\x64\x65pot_id\x18\x01 \x01(\r\x12\x11\n\thost_name\x18\x02 \x01(\t\x12\x0e\n\x06\x61pp_id\x18\x03 \x01(\r\"Z\n0CContentServerDirectory_GetCDNAuthToken_Response\x12\r\n\x05token\x18\x01 \x01(\t\x12\x17\n\x0f\x65xpiration_time\x18\x02 \x01(\r2\xd8\x05\n\x16\x43ontentServerDirectory\x12\x8b\x01\n\x16GetServersForSteamPipe\x12\x37.CContentServerDirectory_GetServersForSteamPipe_Request\x1a\x38.CContentServerDirectory_GetServersForSteamPipe_Response\x12|\n\x11GetDepotPatchInfo\x12\x32.CContentServerDirectory_GetDepotPatchInfo_Request\x1a\x33.CContentServerDirectory_GetDepotPatchInfo_Response\x12\x85\x01\n\x14GetClientUpdateHosts\x12\x35.CContentServerDirectory_GetClientUpdateHosts_Request\x1a\x36.CContentServerDirectory_GetClientUpdateHosts_Response\x12\x8b\x01\n\x16GetManifestRequestCode\x12\x37.CContentServerDirectory_GetManifestRequestCode_Request\x1a\x38.CContentServerDirectory_GetManifestRequestCode_Response\x12v\n\x0fGetCDNAuthToken\x12\x30.CContentServerDirectory_GetCDNAuthToken_Request\x1a\x31.CContentServerDirectory_GetCDNAuthToken_Response\x1a$\x82\xb5\x18 Content Server and CDN directoryB\x03\x90\x01\x01' , dependencies=[steammessages__base__pb2.DESCRIPTOR,steammessages__unified__base__pb2.DESCRIPTOR,]) @@ -513,6 +513,91 @@ serialized_end=1592, ) + +_CCONTENTSERVERDIRECTORY_GETCDNAUTHTOKEN_REQUEST = _descriptor.Descriptor( + name='CContentServerDirectory_GetCDNAuthToken_Request', + full_name='CContentServerDirectory_GetCDNAuthToken_Request', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='depot_id', full_name='CContentServerDirectory_GetCDNAuthToken_Request.depot_id', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='host_name', full_name='CContentServerDirectory_GetCDNAuthToken_Request.host_name', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='app_id', full_name='CContentServerDirectory_GetCDNAuthToken_Request.app_id', index=2, + number=3, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1594, + serialized_end=1696, +) + + +_CCONTENTSERVERDIRECTORY_GETCDNAUTHTOKEN_RESPONSE = _descriptor.Descriptor( + name='CContentServerDirectory_GetCDNAuthToken_Response', + full_name='CContentServerDirectory_GetCDNAuthToken_Response', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='token', full_name='CContentServerDirectory_GetCDNAuthToken_Response.token', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='expiration_time', full_name='CContentServerDirectory_GetCDNAuthToken_Response.expiration_time', index=1, + number=2, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1698, + serialized_end=1788, +) + _CCONTENTSERVERDIRECTORY_GETSERVERSFORSTEAMPIPE_RESPONSE.fields_by_name['servers'].message_type = _CCONTENTSERVERDIRECTORY_SERVERINFO DESCRIPTOR.message_types_by_name['CContentServerDirectory_GetServersForSteamPipe_Request'] = _CCONTENTSERVERDIRECTORY_GETSERVERSFORSTEAMPIPE_REQUEST DESCRIPTOR.message_types_by_name['CContentServerDirectory_ServerInfo'] = _CCONTENTSERVERDIRECTORY_SERVERINFO @@ -523,6 +608,8 @@ DESCRIPTOR.message_types_by_name['CContentServerDirectory_GetClientUpdateHosts_Response'] = _CCONTENTSERVERDIRECTORY_GETCLIENTUPDATEHOSTS_RESPONSE DESCRIPTOR.message_types_by_name['CContentServerDirectory_GetManifestRequestCode_Request'] = _CCONTENTSERVERDIRECTORY_GETMANIFESTREQUESTCODE_REQUEST DESCRIPTOR.message_types_by_name['CContentServerDirectory_GetManifestRequestCode_Response'] = _CCONTENTSERVERDIRECTORY_GETMANIFESTREQUESTCODE_RESPONSE +DESCRIPTOR.message_types_by_name['CContentServerDirectory_GetCDNAuthToken_Request'] = _CCONTENTSERVERDIRECTORY_GETCDNAUTHTOKEN_REQUEST +DESCRIPTOR.message_types_by_name['CContentServerDirectory_GetCDNAuthToken_Response'] = _CCONTENTSERVERDIRECTORY_GETCDNAUTHTOKEN_RESPONSE _sym_db.RegisterFileDescriptor(DESCRIPTOR) CContentServerDirectory_GetServersForSteamPipe_Request = _reflection.GeneratedProtocolMessageType('CContentServerDirectory_GetServersForSteamPipe_Request', (_message.Message,), { @@ -588,6 +675,20 @@ }) _sym_db.RegisterMessage(CContentServerDirectory_GetManifestRequestCode_Response) +CContentServerDirectory_GetCDNAuthToken_Request = _reflection.GeneratedProtocolMessageType('CContentServerDirectory_GetCDNAuthToken_Request', (_message.Message,), { + 'DESCRIPTOR' : _CCONTENTSERVERDIRECTORY_GETCDNAUTHTOKEN_REQUEST, + '__module__' : 'steammessages_contentsystem_pb2' + # @@protoc_insertion_point(class_scope:CContentServerDirectory_GetCDNAuthToken_Request) + }) +_sym_db.RegisterMessage(CContentServerDirectory_GetCDNAuthToken_Request) + +CContentServerDirectory_GetCDNAuthToken_Response = _reflection.GeneratedProtocolMessageType('CContentServerDirectory_GetCDNAuthToken_Response', (_message.Message,), { + 'DESCRIPTOR' : _CCONTENTSERVERDIRECTORY_GETCDNAUTHTOKEN_RESPONSE, + '__module__' : 'steammessages_contentsystem_pb2' + # @@protoc_insertion_point(class_scope:CContentServerDirectory_GetCDNAuthToken_Response) + }) +_sym_db.RegisterMessage(CContentServerDirectory_GetCDNAuthToken_Response) + DESCRIPTOR._options = None _CCONTENTSERVERDIRECTORY_GETSERVERSFORSTEAMPIPE_REQUEST.fields_by_name['cell_id']._options = None @@ -603,8 +704,8 @@ index=0, serialized_options=b'\202\265\030 Content Server and CDN directory', create_key=_descriptor._internal_create_key, - serialized_start=1595, - serialized_end=2203, + serialized_start=1791, + serialized_end=2519, methods=[ _descriptor.MethodDescriptor( name='GetServersForSteamPipe', @@ -646,6 +747,16 @@ serialized_options=None, create_key=_descriptor._internal_create_key, ), + _descriptor.MethodDescriptor( + name='GetCDNAuthToken', + full_name='ContentServerDirectory.GetCDNAuthToken', + index=4, + containing_service=None, + input_type=_CCONTENTSERVERDIRECTORY_GETCDNAUTHTOKEN_REQUEST, + output_type=_CCONTENTSERVERDIRECTORY_GETCDNAUTHTOKEN_RESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), ]) _sym_db.RegisterServiceDescriptor(_CONTENTSERVERDIRECTORY)