2424
2525@PluginManager .acceptPlugins
2626class UiWebsocket (object ):
27- admin_commands = set ([
28- "sitePause" , "siteResume" , "siteDelete" , "siteList" , "siteSetLimit" , "siteAdd" , "siteListModifiedFiles" , "siteSetSettingsValue" ,
29- "channelJoinAllsite" , "serverUpdate" , "serverPortcheck" , "serverShutdown" , "serverShowdirectory" , "serverGetWrapperNonce" ,
30- "certSet" , "certList" , "configSet" , "permissionAdd" , "permissionRemove" , "announcerStats" , "userSetGlobalSettings"
31- ])
32- async_commands = set (["fileGet" , "fileList" , "dirList" , "fileNeed" , "serverPortcheck" , "siteListModifiedFiles" ])
33-
3427 def __init__ (self , ws , site , server , user , request ):
3528 self .ws = ws
3629 self .site = site
@@ -376,6 +369,7 @@ def actionServerInfo(self, to):
376369 self .response (to , back )
377370
378371 # Create a new wrapper nonce that allows to load html file
372+ @flag .admin
379373 def actionServerGetWrapperNonce (self , to ):
380374 wrapper_nonce = self .request .getWrapperNonce ()
381375 self .response (to , wrapper_nonce )
@@ -384,6 +378,7 @@ def actionAnnouncerInfo(self, to):
384378 back = self .formatAnnouncerInfo (self .site )
385379 self .response (to , back )
386380
381+ @flag .admin
387382 def actionAnnouncerStats (self , to ):
388383 back = {}
389384 trackers = self .site .announcer .getTrackers ()
@@ -646,6 +641,7 @@ def actionFileQuery(self, to, dir_inner_path, query=None):
646641 return self .response (to , rows )
647642
648643 # List files in directory
644+ @flag .async_run
649645 def actionFileList (self , to , inner_path ):
650646 try :
651647 return list (self .site .storage .walk (inner_path ))
@@ -654,6 +650,7 @@ def actionFileList(self, to, inner_path):
654650 return {"error" : Debug .formatExceptionMessage (err )}
655651
656652 # List directories in a directory
653+ @flag .async_run
657654 def actionDirList (self , to , inner_path ):
658655 try :
659656 return list (self .site .storage .list (inner_path ))
@@ -679,6 +676,7 @@ def actionDbQuery(self, to, query, params=None, wait_for=None):
679676 return self .response (to , rows )
680677
681678 # Return file content
679+ @flag .async_run
682680 def actionFileGet (self , to , inner_path , required = True , format = "text" , timeout = 300 ):
683681 try :
684682 if required or inner_path in self .site .bad_files :
@@ -698,6 +696,7 @@ def actionFileGet(self, to, inner_path, required=True, format="text", timeout=30
698696 body = body .decode ()
699697 self .response (to , body )
700698
699+ @flag .async_run
701700 def actionFileNeed (self , to , inner_path , timeout = 300 ):
702701 try :
703702 with gevent .Timeout (timeout ):
@@ -824,19 +823,22 @@ def actionCertSelect(self, to, accepted_domains=[], accept_any=False, accepted_p
824823
825824 # - Admin actions -
826825
826+ @flag .admin
827827 def actionPermissionAdd (self , to , permission ):
828828 if permission not in self .site .settings ["permissions" ]:
829829 self .site .settings ["permissions" ].append (permission )
830830 self .site .saveSettings ()
831831 self .site .updateWebsocket (permission_added = permission )
832832 self .response (to , "ok" )
833833
834+ @flag .admin
834835 def actionPermissionRemove (self , to , permission ):
835836 self .site .settings ["permissions" ].remove (permission )
836837 self .site .saveSettings ()
837838 self .site .updateWebsocket (permission_removed = permission )
838839 self .response (to , "ok" )
839840
841+ @flag .admin
840842 def actionPermissionDetails (self , to , permission ):
841843 if permission == "ADMIN" :
842844 self .response (to , _ ["Modify your client's configuration and access all site" ] + " <span style='color: red'>" + _ ["(Dangerous!)" ] + "</span>" )
@@ -848,12 +850,14 @@ def actionPermissionDetails(self, to, permission):
848850 self .response (to , "" )
849851
850852 # Set certificate that used for authenticate user for site
853+ @flag .admin
851854 def actionCertSet (self , to , domain ):
852855 self .user .setCert (self .site .address , domain )
853856 self .site .updateWebsocket (cert_changed = domain )
854857 self .response (to , "ok" )
855858
856859 # List user's certificates
860+ @flag .admin
857861 def actionCertList (self , to ):
858862 back = []
859863 auth_address = self .user .getAuthAddress (self .site .address )
@@ -868,6 +872,7 @@ def actionCertList(self, to):
868872 return back
869873
870874 # List all site info
875+ @flag .admin
871876 def actionSiteList (self , to , connecting_sites = False ):
872877 ret = []
873878 SiteManager .site_manager .load () # Reload sites
@@ -878,6 +883,7 @@ def actionSiteList(self, to, connecting_sites=False):
878883 self .response (to , ret )
879884
880885 # Join to an event channel on all sites
886+ @flag .admin
881887 def actionChannelJoinAllsite (self , to , channel ):
882888 if channel not in self .channels : # Add channel to channels
883889 self .channels .append (channel )
@@ -905,6 +911,7 @@ def updateThread():
905911 self .response (to , {"error" : "Unknown site: %s" % address })
906912
907913 # Pause site serving
914+ @flag .admin
908915 def actionSitePause (self , to , address ):
909916 site = self .server .sites .get (address )
910917 if site :
@@ -917,6 +924,7 @@ def actionSitePause(self, to, address):
917924 self .response (to , {"error" : "Unknown site: %s" % address })
918925
919926 # Resume site serving
927+ @flag .admin
920928 def actionSiteResume (self , to , address ):
921929 site = self .server .sites .get (address )
922930 if site :
@@ -929,6 +937,8 @@ def actionSiteResume(self, to, address):
929937 else :
930938 self .response (to , {"error" : "Unknown site: %s" % address })
931939
940+ @flag .admin
941+ @flag .no_multiuser
932942 def actionSiteDelete (self , to , address ):
933943 site = self .server .sites .get (address )
934944 if site :
@@ -965,6 +975,7 @@ def cbSiteClone(self, to, address, root_inner_path="", target_address=None, redi
965975 self .response (to , response )
966976 return "ok"
967977
978+ @flag .no_multiuser
968979 def actionSiteClone (self , to , address , root_inner_path = "" , target_address = None , redirect = True ):
969980 if not SiteManager .site_manager .isAddress (address ):
970981 self .response (to , {"error" : "Not a site: %s" % address })
@@ -991,13 +1002,16 @@ def actionSiteClone(self, to, address, root_inner_path="", target_address=None,
9911002 lambda res : self .cbSiteClone (to , address , root_inner_path , target_address , redirect )
9921003 )
9931004
1005+ @flag .admin
1006+ @flag .no_multiuser
9941007 def actionSiteSetLimit (self , to , size_limit ):
9951008 self .site .settings ["size_limit" ] = int (size_limit )
9961009 self .site .saveSettings ()
9971010 self .response (to , "ok" )
9981011 self .site .updateWebsocket ()
9991012 self .site .download (blind_includes = True )
10001013
1014+ @flag .admin
10011015 def actionSiteAdd (self , to , address ):
10021016 site_manager = SiteManager .site_manager
10031017 if address in site_manager .sites :
@@ -1008,6 +1022,8 @@ def actionSiteAdd(self, to, address):
10081022 else :
10091023 return {"error" : "Invalid address" }
10101024
1025+ @flag .admin
1026+ @flag .async_run
10111027 def actionSiteListModifiedFiles (self , to , content_inner_path = "content.json" ):
10121028 content = self .site .content_manager .contents [content_inner_path ]
10131029 min_mtime = content .get ("modified" , 0 )
@@ -1058,6 +1074,7 @@ def actionSiteListModifiedFiles(self, to, content_inner_path="content.json"):
10581074 self .site .settings ["cache" ]["modified_files" ] = modified_files
10591075 return {"modified_files" : modified_files }
10601076
1077+ @flag .admin
10611078 def actionSiteSetSettingsValue (self , to , key , value ):
10621079 if key not in ["modified_files_notification" ]:
10631080 return {"error" : "Can't change this key" }
@@ -1078,11 +1095,14 @@ def actionUserGetGlobalSettings(self, to):
10781095 settings = self .user .settings
10791096 self .response (to , settings )
10801097
1098+ @flag .admin
10811099 def actionUserSetGlobalSettings (self , to , settings ):
10821100 self .user .settings = settings
10831101 self .user .save ()
10841102 self .response (to , "ok" )
10851103
1104+ @flag .admin
1105+ @flag .no_multiuser
10861106 def actionServerUpdate (self , to ):
10871107 def cbServerUpdate (res ):
10881108 self .response (to , res )
@@ -1107,19 +1127,26 @@ def cbServerUpdate(res):
11071127 cbServerUpdate
11081128 )
11091129
1130+ @flag .admin
1131+ @flag .async_run
1132+ @flag .no_multiuser
11101133 def actionServerPortcheck (self , to ):
11111134 import main
11121135 file_server = main .file_server
11131136 file_server .portCheck ()
11141137 self .response (to , file_server .port_opened )
11151138
1139+ @flag .admin
1140+ @flag .no_multiuser
11161141 def actionServerShutdown (self , to , restart = False ):
11171142 import main
11181143 if restart :
11191144 main .restart_after_shutdown = True
11201145 main .file_server .stop ()
11211146 main .ui_server .stop ()
11221147
1148+ @flag .admin
1149+ @flag .no_multiuser
11231150 def actionServerShowdirectory (self , to , directory = "backup" , inner_path = "" ):
11241151 if self .request .env ["REMOTE_ADDR" ] != "127.0.0.1" :
11251152 return self .response (to , {"error" : "Only clients from 127.0.0.1 allowed to run this command" })
@@ -1139,6 +1166,8 @@ def actionServerShowdirectory(self, to, directory="backup", inner_path=""):
11391166 else :
11401167 return self .response (to , {"error" : "Not a directory" })
11411168
1169+ @flag .admin
1170+ @flag .no_multiuser
11421171 def actionConfigSet (self , to , key , value ):
11431172 import main
11441173 if key not in config .keys_api_change_allowed :
0 commit comments