Use flags instead of permission list

This commit is contained in:
shortcutme 2019-08-26 03:09:48 +02:00
parent c414e6caa2
commit 376fd0d439
No known key found for this signature in database
GPG key ID: 5B63BAE6CB9613AE

View file

@ -24,13 +24,6 @@ from Content.ContentManager import VerifyError, SignError
@PluginManager.acceptPlugins @PluginManager.acceptPlugins
class UiWebsocket(object): class UiWebsocket(object):
admin_commands = set([
"sitePause", "siteResume", "siteDelete", "siteList", "siteSetLimit", "siteAdd", "siteListModifiedFiles", "siteSetSettingsValue",
"channelJoinAllsite", "serverUpdate", "serverPortcheck", "serverShutdown", "serverShowdirectory", "serverGetWrapperNonce",
"certSet", "certList", "configSet", "permissionAdd", "permissionRemove", "announcerStats", "userSetGlobalSettings"
])
async_commands = set(["fileGet", "fileList", "dirList", "fileNeed", "serverPortcheck", "siteListModifiedFiles"])
def __init__(self, ws, site, server, user, request): def __init__(self, ws, site, server, user, request):
self.ws = ws self.ws = ws
self.site = site self.site = site
@ -376,6 +369,7 @@ class UiWebsocket(object):
self.response(to, back) self.response(to, back)
# Create a new wrapper nonce that allows to load html file # Create a new wrapper nonce that allows to load html file
@flag.admin
def actionServerGetWrapperNonce(self, to): def actionServerGetWrapperNonce(self, to):
wrapper_nonce = self.request.getWrapperNonce() wrapper_nonce = self.request.getWrapperNonce()
self.response(to, wrapper_nonce) self.response(to, wrapper_nonce)
@ -384,6 +378,7 @@ class UiWebsocket(object):
back = self.formatAnnouncerInfo(self.site) back = self.formatAnnouncerInfo(self.site)
self.response(to, back) self.response(to, back)
@flag.admin
def actionAnnouncerStats(self, to): def actionAnnouncerStats(self, to):
back = {} back = {}
trackers = self.site.announcer.getTrackers() trackers = self.site.announcer.getTrackers()
@ -646,6 +641,7 @@ class UiWebsocket(object):
return self.response(to, rows) return self.response(to, rows)
# List files in directory # List files in directory
@flag.async_run
def actionFileList(self, to, inner_path): def actionFileList(self, to, inner_path):
try: try:
return list(self.site.storage.walk(inner_path)) return list(self.site.storage.walk(inner_path))
@ -654,6 +650,7 @@ class UiWebsocket(object):
return {"error": Debug.formatExceptionMessage(err)} return {"error": Debug.formatExceptionMessage(err)}
# List directories in a directory # List directories in a directory
@flag.async_run
def actionDirList(self, to, inner_path): def actionDirList(self, to, inner_path):
try: try:
return list(self.site.storage.list(inner_path)) return list(self.site.storage.list(inner_path))
@ -679,6 +676,7 @@ class UiWebsocket(object):
return self.response(to, rows) return self.response(to, rows)
# Return file content # Return file content
@flag.async_run
def actionFileGet(self, to, inner_path, required=True, format="text", timeout=300): def actionFileGet(self, to, inner_path, required=True, format="text", timeout=300):
try: try:
if required or inner_path in self.site.bad_files: if required or inner_path in self.site.bad_files:
@ -698,6 +696,7 @@ class UiWebsocket(object):
body = body.decode() body = body.decode()
self.response(to, body) self.response(to, body)
@flag.async_run
def actionFileNeed(self, to, inner_path, timeout=300): def actionFileNeed(self, to, inner_path, timeout=300):
try: try:
with gevent.Timeout(timeout): with gevent.Timeout(timeout):
@ -824,6 +823,7 @@ class UiWebsocket(object):
# - Admin actions - # - Admin actions -
@flag.admin
def actionPermissionAdd(self, to, permission): def actionPermissionAdd(self, to, permission):
if permission not in self.site.settings["permissions"]: if permission not in self.site.settings["permissions"]:
self.site.settings["permissions"].append(permission) self.site.settings["permissions"].append(permission)
@ -831,12 +831,14 @@ class UiWebsocket(object):
self.site.updateWebsocket(permission_added=permission) self.site.updateWebsocket(permission_added=permission)
self.response(to, "ok") self.response(to, "ok")
@flag.admin
def actionPermissionRemove(self, to, permission): def actionPermissionRemove(self, to, permission):
self.site.settings["permissions"].remove(permission) self.site.settings["permissions"].remove(permission)
self.site.saveSettings() self.site.saveSettings()
self.site.updateWebsocket(permission_removed=permission) self.site.updateWebsocket(permission_removed=permission)
self.response(to, "ok") self.response(to, "ok")
@flag.admin
def actionPermissionDetails(self, to, permission): def actionPermissionDetails(self, to, permission):
if permission == "ADMIN": if permission == "ADMIN":
self.response(to, _["Modify your client's configuration and access all site"] + " <span style='color: red'>" + _["(Dangerous!)"] + "</span>") self.response(to, _["Modify your client's configuration and access all site"] + " <span style='color: red'>" + _["(Dangerous!)"] + "</span>")
@ -848,12 +850,14 @@ class UiWebsocket(object):
self.response(to, "") self.response(to, "")
# Set certificate that used for authenticate user for site # Set certificate that used for authenticate user for site
@flag.admin
def actionCertSet(self, to, domain): def actionCertSet(self, to, domain):
self.user.setCert(self.site.address, domain) self.user.setCert(self.site.address, domain)
self.site.updateWebsocket(cert_changed=domain) self.site.updateWebsocket(cert_changed=domain)
self.response(to, "ok") self.response(to, "ok")
# List user's certificates # List user's certificates
@flag.admin
def actionCertList(self, to): def actionCertList(self, to):
back = [] back = []
auth_address = self.user.getAuthAddress(self.site.address) auth_address = self.user.getAuthAddress(self.site.address)
@ -868,6 +872,7 @@ class UiWebsocket(object):
return back return back
# List all site info # List all site info
@flag.admin
def actionSiteList(self, to, connecting_sites=False): def actionSiteList(self, to, connecting_sites=False):
ret = [] ret = []
SiteManager.site_manager.load() # Reload sites SiteManager.site_manager.load() # Reload sites
@ -878,6 +883,7 @@ class UiWebsocket(object):
self.response(to, ret) self.response(to, ret)
# Join to an event channel on all sites # Join to an event channel on all sites
@flag.admin
def actionChannelJoinAllsite(self, to, channel): def actionChannelJoinAllsite(self, to, channel):
if channel not in self.channels: # Add channel to channels if channel not in self.channels: # Add channel to channels
self.channels.append(channel) self.channels.append(channel)
@ -905,6 +911,7 @@ class UiWebsocket(object):
self.response(to, {"error": "Unknown site: %s" % address}) self.response(to, {"error": "Unknown site: %s" % address})
# Pause site serving # Pause site serving
@flag.admin
def actionSitePause(self, to, address): def actionSitePause(self, to, address):
site = self.server.sites.get(address) site = self.server.sites.get(address)
if site: if site:
@ -917,6 +924,7 @@ class UiWebsocket(object):
self.response(to, {"error": "Unknown site: %s" % address}) self.response(to, {"error": "Unknown site: %s" % address})
# Resume site serving # Resume site serving
@flag.admin
def actionSiteResume(self, to, address): def actionSiteResume(self, to, address):
site = self.server.sites.get(address) site = self.server.sites.get(address)
if site: if site:
@ -929,6 +937,8 @@ class UiWebsocket(object):
else: else:
self.response(to, {"error": "Unknown site: %s" % address}) self.response(to, {"error": "Unknown site: %s" % address})
@flag.admin
@flag.no_multiuser
def actionSiteDelete(self, to, address): def actionSiteDelete(self, to, address):
site = self.server.sites.get(address) site = self.server.sites.get(address)
if site: if site:
@ -965,6 +975,7 @@ class UiWebsocket(object):
self.response(to, response) self.response(to, response)
return "ok" return "ok"
@flag.no_multiuser
def actionSiteClone(self, to, address, root_inner_path="", target_address=None, redirect=True): def actionSiteClone(self, to, address, root_inner_path="", target_address=None, redirect=True):
if not SiteManager.site_manager.isAddress(address): if not SiteManager.site_manager.isAddress(address):
self.response(to, {"error": "Not a site: %s" % address}) self.response(to, {"error": "Not a site: %s" % address})
@ -991,6 +1002,8 @@ class UiWebsocket(object):
lambda res: self.cbSiteClone(to, address, root_inner_path, target_address, redirect) lambda res: self.cbSiteClone(to, address, root_inner_path, target_address, redirect)
) )
@flag.admin
@flag.no_multiuser
def actionSiteSetLimit(self, to, size_limit): def actionSiteSetLimit(self, to, size_limit):
self.site.settings["size_limit"] = int(size_limit) self.site.settings["size_limit"] = int(size_limit)
self.site.saveSettings() self.site.saveSettings()
@ -998,6 +1011,7 @@ class UiWebsocket(object):
self.site.updateWebsocket() self.site.updateWebsocket()
self.site.download(blind_includes=True) self.site.download(blind_includes=True)
@flag.admin
def actionSiteAdd(self, to, address): def actionSiteAdd(self, to, address):
site_manager = SiteManager.site_manager site_manager = SiteManager.site_manager
if address in site_manager.sites: if address in site_manager.sites:
@ -1008,6 +1022,8 @@ class UiWebsocket(object):
else: else:
return {"error": "Invalid address"} return {"error": "Invalid address"}
@flag.admin
@flag.async_run
def actionSiteListModifiedFiles(self, to, content_inner_path="content.json"): def actionSiteListModifiedFiles(self, to, content_inner_path="content.json"):
content = self.site.content_manager.contents[content_inner_path] content = self.site.content_manager.contents[content_inner_path]
min_mtime = content.get("modified", 0) min_mtime = content.get("modified", 0)
@ -1058,6 +1074,7 @@ class UiWebsocket(object):
self.site.settings["cache"]["modified_files"] = modified_files self.site.settings["cache"]["modified_files"] = modified_files
return {"modified_files": modified_files} return {"modified_files": modified_files}
@flag.admin
def actionSiteSetSettingsValue(self, to, key, value): def actionSiteSetSettingsValue(self, to, key, value):
if key not in ["modified_files_notification"]: if key not in ["modified_files_notification"]:
return {"error": "Can't change this key"} return {"error": "Can't change this key"}
@ -1078,11 +1095,14 @@ class UiWebsocket(object):
settings = self.user.settings settings = self.user.settings
self.response(to, settings) self.response(to, settings)
@flag.admin
def actionUserSetGlobalSettings(self, to, settings): def actionUserSetGlobalSettings(self, to, settings):
self.user.settings = settings self.user.settings = settings
self.user.save() self.user.save()
self.response(to, "ok") self.response(to, "ok")
@flag.admin
@flag.no_multiuser
def actionServerUpdate(self, to): def actionServerUpdate(self, to):
def cbServerUpdate(res): def cbServerUpdate(res):
self.response(to, res) self.response(to, res)
@ -1107,12 +1127,17 @@ class UiWebsocket(object):
cbServerUpdate cbServerUpdate
) )
@flag.admin
@flag.async_run
@flag.no_multiuser
def actionServerPortcheck(self, to): def actionServerPortcheck(self, to):
import main import main
file_server = main.file_server file_server = main.file_server
file_server.portCheck() file_server.portCheck()
self.response(to, file_server.port_opened) self.response(to, file_server.port_opened)
@flag.admin
@flag.no_multiuser
def actionServerShutdown(self, to, restart=False): def actionServerShutdown(self, to, restart=False):
import main import main
if restart: if restart:
@ -1120,6 +1145,8 @@ class UiWebsocket(object):
main.file_server.stop() main.file_server.stop()
main.ui_server.stop() main.ui_server.stop()
@flag.admin
@flag.no_multiuser
def actionServerShowdirectory(self, to, directory="backup", inner_path=""): def actionServerShowdirectory(self, to, directory="backup", inner_path=""):
if self.request.env["REMOTE_ADDR"] != "127.0.0.1": if self.request.env["REMOTE_ADDR"] != "127.0.0.1":
return self.response(to, {"error": "Only clients from 127.0.0.1 allowed to run this command"}) return self.response(to, {"error": "Only clients from 127.0.0.1 allowed to run this command"})
@ -1139,6 +1166,8 @@ class UiWebsocket(object):
else: else:
return self.response(to, {"error": "Not a directory"}) return self.response(to, {"error": "Not a directory"})
@flag.admin
@flag.no_multiuser
def actionConfigSet(self, to, key, value): def actionConfigSet(self, to, key, value):
import main import main
if key not in config.keys_api_change_allowed: if key not in config.keys_api_change_allowed: