diff --git a/main.py b/main.py index 68db801..afe7964 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,9 @@ +from uuid import uuid4 from xmlrpc.server import SimpleXMLRPCServer import logging import os +import requests.graphql +from pygost import gost34112012256 # Expose a function @@ -14,9 +17,18 @@ def aud_add(message): return 'OK' -def auth_response(message, id, client): - logging.debug(id) - return {'error': False} +def auth_response(challenge, server_id, is_server): + logging.debug(challenge) + logging.debug(server_id) + logging.debug(is_server) + msg = '%s%s%s' % (challenge, server_id, '12345678') + response = gost34112012256.new(msg.encode('utf-8')).digest().hex() + return {'error': False, 'response': response} + + +def auth_challenge(): + logging.debug('get challenge') + return uuid4().hex def main(): @@ -25,6 +37,7 @@ def main(): server.register_function(list_contents) server.register_function(aud_add) server.register_function(auth_response) + server.register_function(auth_challenge) try: print('Use Control-C to exit') server.serve_forever() @@ -32,5 +45,11 @@ def main(): print('Exiting') +def test(): + print(requests.graphql.get_classifier()) + # print(requests.graphql.get_catalog()) + + if __name__ == '__main__': main() + #test() diff --git a/requests/catalog.py b/requests/catalog.py new file mode 100644 index 0000000..9a19c1e --- /dev/null +++ b/requests/catalog.py @@ -0,0 +1,76 @@ +from datetime import datetime +import classifier +import graphql +import xml.etree.ElementTree as ET + + +class CatalogRequestInfo: + is_full = False + user_id = 0 + + +class Catalog: + CD_SERVER_COLLECTIONS_NAME = "CD-Server Collections Set" + CD_SERVER_COLLECTIONS_VERSION = "1.0" + CD_SERVER_COLLECTION_TYPE = "ISSUE" + COLLECTIONS_TAG_NAME = "COLLECTIONS" + NAME_ATTRIBUTE_NAME = "Name" + VERSION_ATTRIBUTE_NAME = "Version" + CREATED_ATTRIBUTE_NAME = "Created" + FULL_ATTRIBUTE_NAME = "Full" + COLLECTION_TAG_NAME = "COLLECTION" + TYPE_ATTRIBUTE_NAME = "Type" + CHARTS_TAG_NAME = "CHARTS" + CHART_TAG_NAME = "CHART" + METADATA_VERSION_ATTRIBUTE_NAME = "MetadataVersion" + ID_ATTRIBUTE_NAME = "ID" + DELETED_ATTRIBUTE_NAME = "Deleted" + CLOSED_ATTRIBUTE_NAME = "Closed" + FOLDERS_TAG_NAME = "FOLDERS" + FOLDER_TAG_NAME = "FOLDER" + REF_TAG_NAME = "REF" + CHART_ATTRIBUTE_NAME = "Chart" + + COLLECTION_NAME = 'CD-Server Collection' + + request_info: CatalogRequestInfo + + def write_catalog(self): + date = datetime.now() + + collections = ET.Element(self.COLLECTIONS_TAG_NAME, { + self.NAME_ATTRIBUTE_NAME: self.COLLECTION_NAME, + self.VERSION_ATTRIBUTE_NAME: self.CD_SERVER_COLLECTIONS_VERSION, + self.CREATED_ATTRIBUTE_NAME: self.date_to_string(date), + }) + if self.request_info.is_full: + collections.set(self.FULL_ATTRIBUTE_NAME, 'true') + if classifier.CLASSIFIER_VERSION: + collections.set(self.METADATA_VERSION_ATTRIBUTE_NAME, classifier.CLASSIFIER_VERSION) + + self.write_collections(collections, date) + + return ET.tostring(collections, encoding='unicode', xml_declaration=True) + + def date_to_string(self, date): + return '' + + def write_collections(self, collections, date): + collection = ET.SubElement(collections, self.COLLECTION_TAG_NAME, { + self.NAME_ATTRIBUTE_NAME: self.COLLECTION_NAME, + self.CREATED_ATTRIBUTE_NAME: self.date_to_string(date), + self.TYPE_ATTRIBUTE_NAME: self.CD_SERVER_COLLECTION_TYPE, + }) + self.write_charts(collection) + + def write_charts(self, collection): + charts = ET.SubElement(collection, self.CHARTS_TAG_NAME) + for c in []: + self.write_chart(charts, c) + + def write_chart(self, charts, chart): + ch = ET.SubElement(charts, self.CHART_TAG_NAME) + + + + \ No newline at end of file diff --git a/requests/classifier.py b/requests/classifier.py new file mode 100644 index 0000000..371e1a0 --- /dev/null +++ b/requests/classifier.py @@ -0,0 +1,7 @@ +import graphql + +CLASSIFIER_VERSION = '8.23' + +class Classifier: + def get_classifier(self): + diff --git a/requests/correcting_replication_service.py b/requests/correcting_replication_service.py index e0def4f..40cd5fb 100644 --- a/requests/correcting_replication_service.py +++ b/requests/correcting_replication_service.py @@ -2,6 +2,7 @@ from datetime import datetime, timedelta from enumerations import ReplicationPackageStatusEnum from models import CorrectingReplicationOutPackage, ReplicantInfo from typing import List +import xml.etree.ElementTree as ET class CorrectingReplicationService: @@ -58,4 +59,13 @@ class CorrectingReplicationService: pkg.replication_timeout_date = date + delta return pkg - def get_package_xml(self) -> str: \ No newline at end of file + def get_package_xml(self, pkg: CorrectingReplicationOutPackage, request_uuid: str) -> str: + request_xml: ET.Element = xml_service.get_common_request_xml(request_uuid) + element = ET.SubElement(request_xml, self.PACKAGE_TAG_NAME, { + self.PACKAGE_ID_ATTRIBUTE_NAME: pkg.package_id, + self.SERVER_VERSION_ATTRIBUTE_NAME: '1.0.0', + self.SERVER_ID_ATTRIBUTE_NAME: 'ipd-server', + self.CLASSIFIER_VERSION_ATTRIBUTE_NAME: classifier., + }) + xml_service.set_request_uuid(request_xml, request_uuid) + return ET.tostring(request_xml, encoding='unicode', xml_declaration=True) diff --git a/requests/graphql.py b/requests/graphql.py new file mode 100644 index 0000000..d744ee0 --- /dev/null +++ b/requests/graphql.py @@ -0,0 +1,30 @@ +from gql import gql, Client +from gql.transport.aiohttp import AIOHTTPTransport + +transport = AIOHTTPTransport(url="https://gql.ivazh.ru/graphql/") + + +def get_classifier(): + client = Client(transport=transport, fetch_schema_from_transport=True) + query = gql( + """ + query getClassifier { + getClassifier(name: "ood") + } + """ + ) + result = client.execute(query) + return result['getClassifier'] + + +def get_catalog(): + client = Client(transport=transport, fetch_schema_from_transport=True) + query = gql( + """ + query getCatalog { + getCatalog(name: "ood") + } + """ + ) + result = client.execute(query) + return result['getClassifier'] diff --git a/requests/messages.py b/requests/messages.py index 478d06d..75d2ad4 100644 --- a/requests/messages.py +++ b/requests/messages.py @@ -1,5 +1,6 @@ from enum import Enum + class Messages(Enum): REQUEST_EXECUTED_PARTITIALY = 1 REQUEST_FAILED = 2 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..e25d023 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +gql~=3.4.0 +pygost~=5.11 \ No newline at end of file