Skip to content

Commit 32d9b13

Browse files
committed
Allow plugin bundle uploads via websocket
Signed-off-by: falkTX <[email protected]>
1 parent 24d0798 commit 32d9b13

File tree

2 files changed

+52
-4
lines changed

2 files changed

+52
-4
lines changed

html/js/host.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ $('document').ready(function() {
4242
}
4343
}
4444

45-
ws.onclose = function (evt) {
45+
ws.onclose = function () {
4646
desktop && desktop.blockUI()
4747
}
4848

mod/webserver.py

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -791,6 +791,18 @@ def get(self):
791791
self.write(True)
792792

793793
class SDKEffectInstaller(EffectInstaller):
794+
def set_default_headers(self):
795+
if 'Origin' not in self.request.headers.keys():
796+
return
797+
origin = self.request.headers['Origin']
798+
match = re.match(r'^(\w+)://([^/]*)/?', origin)
799+
if match is None:
800+
return
801+
protocol, domain = match.groups()
802+
if protocol != "http" and not domain.endswith(":9000") and not domain.endswith(".mod.audio"):
803+
return
804+
self.set_header("Access-Control-Allow-Origin", origin)
805+
794806
@web.asynchronous
795807
@gen.engine
796808
def post(self):
@@ -816,7 +828,7 @@ def set_default_headers(self):
816828
if match is None:
817829
return
818830
protocol, domain = match.groups()
819-
if protocol != "http" or not domain.endswith(":9000"):
831+
if protocol != "http" and not domain.endswith(":9000") and not domain.endswith(".mod.audio"):
820832
return
821833
self.set_header("Access-Control-Allow-Origin", origin)
822834

@@ -1135,7 +1147,7 @@ def get(self, instance):
11351147
logging.exception(e)
11361148
self.write(ok)
11371149

1138-
class RemoteWebSocket(websocket.WebSocketHandler):
1150+
class RemotePedalboardWebSocket(websocket.WebSocketHandler):
11391151
def check_origin(self, origin):
11401152
match = re.match(r'^(\w+)://([^/]*)/?', origin)
11411153
if match is None:
@@ -1156,6 +1168,41 @@ def on_message(self, pedalboard_id):
11561168
self.write_message("true")
11571169
self.close()
11581170

1171+
class RemotePluginWebSocket(websocket.WebSocketHandler):
1172+
def check_origin(self, origin):
1173+
match = re.match(r'^(\w+)://([^/]*)/?', origin)
1174+
if match is None:
1175+
return False
1176+
protocol, domain = match.groups()
1177+
if protocol not in ("http", "https"):
1178+
return False
1179+
if domain != "mod.audio" and not domain.endswith(".mod.audio"):
1180+
return False
1181+
return True
1182+
1183+
@gen.coroutine
1184+
def on_message(self, package):
1185+
if not package:
1186+
hwdesc = get_hardware_descriptor()
1187+
self.write_message(json.dumps({
1188+
'bin-compat': hwdesc.get('bin-compat', "Unknown"),
1189+
'platform': hwdesc.get('platform', "Unknown"),
1190+
'version': IMAGE_VERSION,
1191+
}))
1192+
return
1193+
1194+
filename = os.path.join(DOWNLOAD_TMP_DIR, "remote.tar.gz")
1195+
1196+
with open(filename, 'wb') as fh:
1197+
fh.write(b64decode(package))
1198+
1199+
resp = yield gen.Task(install_package, filename)
1200+
1201+
if resp['ok']:
1202+
SESSION.msg_callback("rescan " + b64encode(json.dumps(resp).encode("utf-8")).decode("utf-8"))
1203+
1204+
self.write_message(json.dumps(resp))
1205+
11591206
class ServerWebSocket(websocket.WebSocketHandler):
11601207
@gen.coroutine
11611208
def open(self):
@@ -2368,7 +2415,8 @@ def get(self):
23682415
(r"/js/templates.js$", BulkTemplateLoader),
23692416

23702417
(r"/websocket/?$", ServerWebSocket),
2371-
(r"/rpbsocket/?$", RemoteWebSocket),
2418+
(r"/rpbsocket/?$", RemotePedalboardWebSocket),
2419+
(r"/rplsocket/?$", RemotePluginWebSocket),
23722420

23732421
(r"/(.*)", TimelessStaticFileHandler, {"path": HTML_DIR}),
23742422
],

0 commit comments

Comments
 (0)