diff --git a/confluent_server/confluent/httpapi.py b/confluent_server/confluent/httpapi.py
index 5a145a0c..a357d72a 100644
--- a/confluent_server/confluent/httpapi.py
+++ b/confluent_server/confluent/httpapi.py
@@ -55,6 +55,12 @@ except ModuleNotFoundError:
import urllib.parse as urlparse
import eventlet.websocket
import eventlet.wsgi
+
+#these modifications might need to be changed later now just proof of concept
+import os
+import cgi
+#from cgi import parse_qs, escape
+
#scgi = eventlet.import_patched('flup.server.scgi')
tlvdata = confluent.tlvdata
@@ -171,6 +177,7 @@ def _get_query_dict(env, reqbody, reqtype):
qdict = {}
try:
qstring = env['QUERY_STRING']
+
except KeyError:
qstring = None
if qstring:
@@ -288,16 +295,12 @@ def _authorize_request(env, operation, reqbody):
authdata = auth.authorize(name, element=element, operation=operation)
else:
element = None
- if not authdata:
- if 'HTTP_CONFLUENTSESSION' in env:
- sessionid = env['HTTP_CONFLUENTSESSION']
+ if (not authdata) and 'HTTP_COOKIE' in env:
+ cidx = (env['HTTP_COOKIE']).find('confluentsessionid=')
+ if cidx >= 0:
+ sessionid = env['HTTP_COOKIE'][cidx+19:cidx+51]
+ sessid = sessionid
sessid = sessionid
- elif 'HTTP_COOKIE' in env:
- cidx = (env['HTTP_COOKIE']).find('confluentsessionid=')
- if cidx >= 0:
- sessionid = env['HTTP_COOKIE'][cidx+19:cidx+51]
- sessid = sessionid
- if sessionid:
if sessionid in httpsessions:
if _csrf_valid(env, httpsessions[sessionid]):
if env['PATH_INFO'] == '/sessions/current/logout':
@@ -487,8 +490,6 @@ def wsock_handler(ws):
elif clientmsg[0] == '!':
msg = json.loads(clientmsg[1:])
action = msg.get('operation', None)
- if not action:
- action = msg.get('action', None)
targ = msg.get('target', None)
if targ:
authdata = auth.authorize(name, targ, operation=action)
@@ -526,13 +527,6 @@ def wsock_handler(ws):
datacallback=datacallback,
width=width, height=height)
myconsoles[clientsessid] = consession
- elif action == 'resize':
- clientsessid = '{0}'.format(msg['sessid'])
- myconsoles[clientsessid].resize(
- width=msg['width'], height=msg['height'])
- if action == 'break':
- clientsessid = '{0}'.format(msg['sessid'])
- myconsoles[clientsessid].send_break()
elif action == 'stop':
sessid = '{0}'.format(msg.get('sessid', None))
if sessid in myconsoles:
@@ -666,9 +660,13 @@ def resourcehandler_backend(env, start_response):
start_response('302 Found', headers)
yield ''
return
- if 'CONTENT_LENGTH' in env and int(env['CONTENT_LENGTH']) > 0:
- reqbody = env['wsgi.input'].read(int(env['CONTENT_LENGTH']))
+
+ if 'CONTENT_LENGTH' in env and int(env['CONTENT_LENGTH']) > 0:
+ reqbody = ''
+ # reqbody = env['wsgi.input'].read(int(env['CONTENT_LENGTH']))
reqtype = env['CONTENT_TYPE']
+ if 'application/json' in reqtype:
+ reqbody = env['wsgi.input'].read(int(env['CONTENT_LENGTH']))
operation = opmap[env['REQUEST_METHOD']]
querydict = _get_query_dict(env, reqbody, reqtype)
if operation != 'retrieve' and 'restexplorerop' in querydict:
@@ -887,6 +885,60 @@ def resourcehandler_backend(env, start_response):
start_response('200 OK', headers)
yield rsp
return
+ elif (operation == 'create' and ('/firmware/updates/active' in env['PATH_INFO'])):
+ #TODO figure out why content length shows data being there but data string is empty (TK)
+ # Solution the wsgi.iput stream can only be read once and it is being read at the top
+ if 'multipart/form-data' in reqtype:
+ field_storage = cgi.FieldStorage(fp=env['wsgi.input'], environ=env, keep_blank_values=True)
+ for item in field_storage.list:
+ if item.filename:
+ storage_file_path = '/var/lib/confluent/client_assets/' + item.filename
+ file_content = item.file.read()
+ with open(storage_file_path, 'wb') as file:
+ file.write(file_content)
+ yield json.dumps({'data': storage_file_path})
+ start_response('200 OK', headers)
+ return
+
+ url = env['PATH_INFO']
+ if 'application/json' in reqtype:
+ if not isinstance(reqbody, str):
+ reqbody = reqbody.decode('utf8')
+ pbody = json.loads(reqbody)
+ args = pbody['args']
+ args_dict = {'filename': args}
+ try:
+ args_dict.update({'bank': pbody['bank']})
+ except KeyError:
+ pass
+ noderrs = {}
+ nodeurls = {}
+ # start_response('202 Accepted', headers)
+ hdlr = pluginapi.handle_path(url, operation, cfgmgr, args_dict)
+ for res in hdlr:
+ if isinstance(res, confluent.messages.CreatedResource):
+ watchurl = res.kvpairs['created']
+ currnode = watchurl.split('/')[1]
+ nodeurls[currnode] = '/' + watchurl
+ yield json.dumps({'data': nodeurls})
+ start_response('200 OK', headers)
+ return
+
+ elif (operation == 'delete' and ('/firmware/updates/active' in env['PATH_INFO'])):
+ url = env['PATH_INFO']
+ if 'application/json' in reqtype:
+ if not isinstance(reqbody, str):
+ reqbody = reqbody.decode('utf8')
+ pbody = json.loads(reqbody)
+ args = pbody['args']
+ try:
+ os.remove(args)
+ start_response('200 OK', headers)
+ return
+ except Exception as e:
+ return e
+
+
else:
# normal request
url = env['PATH_INFO']
@@ -972,6 +1024,7 @@ def _assemble_html(responses, resource, querydict, url, extension):
else:
pendingrsp.append(rsp)
for rsp in pendingrsp:
+ print(rsp.html() + "
")
yield rsp.html() + "
"
if iscollection:
# localpath = url[:-2] (why was this here??)
@@ -1070,6 +1123,7 @@ def serve(bind_host, bind_port):
try:
sock = eventlet.listen(
(bind_host, bind_port, 0, 0), family=socket.AF_INET6)
+
except socket.error as e:
if e.errno != 98:
raise
@@ -1104,4 +1158,4 @@ class HttpApi(object):
self.server = eventlet.spawn(serve, self.bind_host, self.bind_port)
-_cleaner = eventlet.spawn(_sessioncleaner)
+_cleaner = eventlet.spawn(_sessioncleaner)
\ No newline at end of file