Allow sites to request several CORS permissions at once (#2631)

* Allow sites to request several CORS permissions at once

* Fix typo

* Don't wait for CORS site download
This commit is contained in:
Ivanq 2020-10-12 14:00:40 +03:00 committed by GitHub
parent 288050e5b4
commit 352da6bf62
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -2,6 +2,7 @@ import re
import html import html
import copy import copy
import os import os
import gevent
from Plugin import PluginManager from Plugin import PluginManager
from Translate import Translate from Translate import Translate
@ -74,28 +75,53 @@ class UiWebsocketPlugin(object):
return self.corsFuncWrapper("actionOptionalFileInfo", to, inner_path, *args, **kwargs) return self.corsFuncWrapper("actionOptionalFileInfo", to, inner_path, *args, **kwargs)
def actionCorsPermission(self, to, address): def actionCorsPermission(self, to, address):
site = self.server.sites.get(address) if isinstance(address, list):
if site: addresses = address
site_name = site.content_manager.contents.get("content.json", {}).get("title", address)
button_title = _["Grant"]
else: else:
site_name = address addresses = [address]
button_title = _["Grant & Add"]
if site and "Cors:" + address in self.permissions: button_title = _["Grant"]
site_names = []
site_addresses = []
for address in addresses:
site = self.server.sites.get(address)
if site:
site_name = site.content_manager.contents.get("content.json", {}).get("title", address)
else:
site_name = address
# If at least one site is not downloaded yet, show "Grant & Add" instead
button_title = _["Grant & Add"]
if not (site and "Cors:" + address in self.permissions):
# No site or no permission
site_names.append(site_name)
site_addresses.append(address)
if len(site_names) == 0:
return "ignored" return "ignored"
self.cmd( self.cmd(
"confirm", "confirm",
[_["This site requests <b>read</b> permission to: <b>%s</b>"] % html.escape(site_name), button_title], [_["This site requests <b>read</b> permission to: <b>%s</b>"] % ", ".join(map(html.escape, site_names)), button_title],
lambda res: self.cbCorsPermission(to, address) lambda res: self.cbCorsPermission(to, site_addresses)
) )
def cbCorsPermission(self, to, address): def cbCorsPermission(self, to, addresses):
self.actionPermissionAdd(to, "Cors:" + address) # Add permissions
site = self.server.sites.get(address) for address in addresses:
if not site: permission = "Cors:" + address
self.server.site_manager.need(address) if permission not in self.site.settings["permissions"]:
self.site.settings["permissions"].append(permission)
self.site.saveSettings()
self.site.updateWebsocket(permission_added=permission)
self.response(to, "ok")
for address in addresses:
site = self.server.sites.get(address)
if not site:
gevent.spawn(self.server.site_manager.need, address)
@PluginManager.registerTo("UiRequest") @PluginManager.registerTo("UiRequest")