163 lines
7.7 KiB
Python
163 lines
7.7 KiB
Python
import datetime
|
|
import json
|
|
from uuid import uuid4, UUID
|
|
from xmlrpc.server import SimpleXMLRPCServer
|
|
from xmlrpc.client import ServerProxy
|
|
import logging
|
|
import os
|
|
import os.path
|
|
import requests
|
|
from reqs.graphql import get_catalog, get_object
|
|
from pygost import gost34112012256
|
|
import xml.etree.ElementTree as ET
|
|
from reqs.request_xml_service import RequestXmlService
|
|
import zipfile
|
|
|
|
PASSWORD = 'gost_2012$a742ec53198ec2a5027086fba8814a89982a57112d1a72d02260161108f39b50'
|
|
|
|
|
|
# Expose a function
|
|
def list_contents(dir_name):
|
|
logging.debug('list_contents(%s)', dir_name)
|
|
return os.listdir(dir_name)
|
|
|
|
|
|
def aud_add(message):
|
|
logging.debug(message)
|
|
return 'OK'
|
|
|
|
|
|
def auth_response(challenge, server_id, is_server):
|
|
# logging.debug(f'Challenge: {challenge}, Server: {server_id}, IsServer: {is_server}')
|
|
msg = '%s%s%s' % (challenge, server_id, PASSWORD)
|
|
response = gost34112012256.new(msg.encode('utf-8')[::-1]).digest()[::-1].hex()
|
|
return {'error': False, 'response': response}
|
|
|
|
|
|
def auth_challenge():
|
|
# logging.debug('get challenge')
|
|
return uuid4().hex
|
|
|
|
|
|
def restore_uuid(oid):
|
|
uuid = UUID(oid)
|
|
return str(uuid)
|
|
|
|
|
|
def get_catalog(params, files, url):
|
|
date = datetime.datetime.now()
|
|
rxmls = RequestXmlService()
|
|
req = ET.fromstring(params['query_data'])
|
|
req_id = rxmls.get_request_uuid(req)
|
|
res_id = uuid4().hex
|
|
res = rxmls.get_request_document(res_id, req_id)
|
|
rxmls.set_result(res, 0, '')
|
|
response_params = {
|
|
'from': params['to'],
|
|
'to': params['from'],
|
|
'ts_added': date.timestamp(),
|
|
'user_id': '1',
|
|
'user_id_to': params['user_id'],
|
|
'query_type': 1004,
|
|
'query_data': ET.tostring(res, encoding='unicode', xml_declaration=True)
|
|
}
|
|
catalog = get_catalog()
|
|
filename = uuid4().hex
|
|
filepath = '/tmp/' + filename
|
|
zipf = zipfile.ZipFile(filepath, "w")
|
|
zipf.writestr('WF.CLL', catalog)
|
|
zipf.close()
|
|
response_files = [{'name': filename, 'url': filepath, 'size': os.path.getsize(filepath)}]
|
|
proxy = ServerProxy(url)
|
|
proxy.send(response_params, response_files, 'http://10.10.8.27:9000/')
|
|
|
|
|
|
def get_objects(params, files, url):
|
|
date = datetime.datetime.now()
|
|
rxmls = RequestXmlService()
|
|
req = ET.fromstring(params['query_data'])
|
|
req_id = rxmls.get_request_uuid(req)
|
|
res_id = uuid4().hex
|
|
res = rxmls.get_request_document(res_id, req_id)
|
|
rxmls.set_result(res, 0, '')
|
|
objs = req.find('objects')
|
|
uids = [restore_uuid(x.get('object_id')) for x in objs.findall('object')]
|
|
|
|
rxmls.set_result(res, 0, '')
|
|
response_params = {
|
|
'from': params['to'],
|
|
'to': params['from'],
|
|
'ts_added': date.timestamp(),
|
|
'user_id': '1',
|
|
'user_id_to': params['user_id'],
|
|
'query_type': 1001,
|
|
'query_data': ET.tostring(res, encoding='unicode', xml_declaration=True)
|
|
}
|
|
filename = uuid4().hex
|
|
filepath = '/tmp/' + filename
|
|
zipf = zipfile.ZipFile(filepath, "w")
|
|
main_filename = None
|
|
for uid in uids:
|
|
obj = json.loads(get_object(uid))
|
|
print(type(obj))
|
|
for file in obj['properties'].get('c1000', []):
|
|
if not main_filename:
|
|
main_filename = file['fileName']
|
|
res = requests.get(f'https://gql.ivazh.ru/item/{file["key"]}')
|
|
zipf.writestr(f'{main_filename}/{file["fileName"]}', res.content)
|
|
zipf.close()
|
|
response_files = [{'name': filename, 'url': filepath, 'size': os.path.getsize(filepath)}]
|
|
print(response_files)
|
|
# proxy = ServerProxy(url)
|
|
# proxy.send(response_params, response_files, 'http://10.10.8.27:9000/')
|
|
|
|
|
|
def get_metadata(params, files, url):
|
|
pass
|
|
|
|
|
|
def accept(params, files, url):
|
|
print(params, files, url)
|
|
print('Accept')
|
|
if params['query_type'] == 4:
|
|
get_catalog(params, files, url)
|
|
if params['query_type'] == 1:
|
|
get_objects(params, files, url)
|
|
if params['query_type'] == 24:
|
|
get_metadata(params, files, url)
|
|
return True
|
|
|
|
|
|
def onSent(params, files, callback_url):
|
|
print('onSent')
|
|
|
|
|
|
def main():
|
|
print('Use Control-C to exit')
|
|
logging.basicConfig(level=logging.DEBUG)
|
|
server = SimpleXMLRPCServer(('0.0.0.0', 9000), logRequests=True, allow_none=True)
|
|
server.register_function(list_contents)
|
|
server.register_function(aud_add)
|
|
server.register_function(auth_response)
|
|
server.register_function(auth_challenge)
|
|
server.register_function(accept)
|
|
server.register_function(onSent)
|
|
|
|
try:
|
|
server.serve_forever()
|
|
except KeyboardInterrupt:
|
|
print('Exiting')
|
|
|
|
|
|
def test():
|
|
params = {"from": "tcp://kptsp_vb", "query_data": "<?xml version=\"1.0\" encoding=\"utf-8\"?><request><header parcel_id=\"990715ba919544a98f22cc7d3b0d9e8d\"/><objects><object object_id=\"fc44343bd1654ee7b03ac1731567bbfd\"/><object object_id=\"13526ac78c574036879e1ec31bb78779\"/><object object_id=\"06b8a23c9a894bc5a5f9e6baa3540f87\"/><object object_id=\"6b02b39791064054852d5e165ff1dfc0\"/><object object_id=\"b81e42e704fe4054986956b2b920661d\"/><object object_id=\"c002a570f05745a2943a78686f3f17c0\"/><object object_id=\"2b15bf0f25e842b6a3b5d9762f2334a7\"/><object object_id=\"294ac9e83d3f4cf380cb0b99f592452b\"/><object object_id=\"a8901d5e642a410c909701e015644f69\"/><object object_id=\"1989b9dc8e114aaca0508cb9241afc5b\"/><object object_id=\"cf2df49a4e9143ffacf490b3138d26bd\"/><object object_id=\"c9861cfc30c641619ae9691f8c7d9c4d\"/><object object_id=\"87ebaff5ab2c411b97626b634d709f38\"/><object object_id=\"735e00c4211344bdaca2ac2332323613\"/><object object_id=\"05cff3bd9f6f4c36a51877c13fda1909\"/><object object_id=\"2178a4d06b6b407db826733c496a596d\"/><object object_id=\"8892c660d75747deaee6bab6163fde04\"/><object object_id=\"3be29dac7e6f45908910492967e3cb08\"/><object object_id=\"53667890f4f84e38a9cd7ab9a63a6193\"/><object object_id=\"69a3a5978f1e449f9729d5d47e0690ad\"/><object object_id=\"9405cc3528c345b1ad200714bb0fec32\"/><object object_id=\"068ab6d165004f9fb6d778a9e2593fd2\"/><object object_id=\"e90b6799c3a2418fa65f6e2f91c53f64\"/><object object_id=\"b209864a514a4d4eae7038a9585e9306\"/><object object_id=\"5f2287cdfeb54eddaa42cc80b21ec081\"/><object object_id=\"a87271f9a4e74b82bc9191cdc36c2783\"/><object object_id=\"bea81cc3b3e842e997594c6e95526456\"/><object object_id=\"13c6fc2edb544a2d98a4f3f10af4fdd1\"/><object object_id=\"9edb7a886d2847fbae83eba272cd3940\"/><object object_id=\"989e0d92955c4adfa3bfe045c6f11d82\"/><object object_id=\"0ebec61db2204477b4b49a20592c818a\"/><object object_id=\"d198d63bc9ed4dfb8f84c3fc5a4146c5\"/><object object_id=\"389482afd85147b2ac397a644f72e3dc\"/><object object_id=\"0e997a62f9c4421b93a284dad938faf4\"/><object object_id=\"dc29afc0ca53472d88e8b58e460ed614\"/><object object_id=\"ded736abc1954413b17e6d283c686b04\"/><object object_id=\"5de7020a497d4e119de0e6f5b869aba3\"/><object object_id=\"d3cfdc9e51fc489cac8a8a9e6285f292\"/><object object_id=\"b812ed1698e2454dbf84595a2addff8f\"/><object object_id=\"fa28d2774a054542a6b7c437ee68f148\"/><object object_id=\"b7fab9c8285f47b699cb5bb6259b7b03\"/><object object_id=\"f8f867f7aa964785ab1e0e84428070c2\"/><object object_id=\"d1cb0bb2c21e4e99b06fcda8f627c720\"/><object object_id=\"41f6531a611143f3a64d3e55f347ed06\"/><object object_id=\"6fb3b57ec8df48e4bfe6f19bef387a61\"/><object object_id=\"97598f541b494606a437a9b5ee5433aa\"/><object object_id=\"d5289e3969cc47a7b50a01ed6f4b41fd\"/><object object_id=\"22ba8c4cf4154874ac98ec42cd053d72\"/><object object_id=\"7ec173a9d51e4babbc0feae70d754c99\"/><object object_id=\"343cd1ee95ce4a3e9d51336a2d0291e9\"/></objects></request>", "query_type": 1, "to": "tcp://bnd127", "user_id": "3302", "ts_added": 1679825320.653038}
|
|
files = []
|
|
url = 'http://127.0.0.1:7000/xmlrpc'
|
|
# accept(params, files, url)
|
|
get_objects(params, files, url)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
# main()
|
|
test()
|