2015-01-12 02:03:45 +01:00
import json , gevent , time , sys , hashlib
from Config import config
from Site import SiteManager
2015-01-17 18:50:56 +01:00
from Debug import Debug
version 0.2.0, new lib for bitcoin ecc, dont display or track notify errors, dont reload again within 1 sec, null peer ip fix, signingmoved to ContentManager, content.json include support, content.json multisig ready, content.json proper bitcoincore compatible signing, content.json include permissions, multithreaded publish, publish timeout 60s, no exception on invalid bitcoin address, testcase for new lib, bip32 based persite privatekey generation, multiuser ready, simple json database query command, websocket api fileGet, wrapper loading title stuck bugfix
2015-02-09 02:09:02 +01:00
from util import QueryJson
2015-01-12 02:03:45 +01:00
class UiWebsocket :
version 0.2.0, new lib for bitcoin ecc, dont display or track notify errors, dont reload again within 1 sec, null peer ip fix, signingmoved to ContentManager, content.json include support, content.json multisig ready, content.json proper bitcoincore compatible signing, content.json include permissions, multithreaded publish, publish timeout 60s, no exception on invalid bitcoin address, testcase for new lib, bip32 based persite privatekey generation, multiuser ready, simple json database query command, websocket api fileGet, wrapper loading title stuck bugfix
2015-02-09 02:09:02 +01:00
def __init__ ( self , ws , site , server , user ) :
2015-01-12 02:03:45 +01:00
self . ws = ws
self . site = site
version 0.2.0, new lib for bitcoin ecc, dont display or track notify errors, dont reload again within 1 sec, null peer ip fix, signingmoved to ContentManager, content.json include support, content.json multisig ready, content.json proper bitcoincore compatible signing, content.json include permissions, multithreaded publish, publish timeout 60s, no exception on invalid bitcoin address, testcase for new lib, bip32 based persite privatekey generation, multiuser ready, simple json database query command, websocket api fileGet, wrapper loading title stuck bugfix
2015-02-09 02:09:02 +01:00
self . user = user
2015-01-14 02:41:13 +01:00
self . log = site . log
2015-01-12 02:03:45 +01:00
self . server = server
self . next_message_id = 1
self . waiting_cb = { } # Waiting for callback. Key: message_id, Value: function pointer
self . channels = [ ] # Channels joined to
# Start listener loop
def start ( self ) :
ws = self . ws
if self . site . address == config . homepage and not self . site . page_requested : # Add open fileserver port message or closed port error to homepage at first request after start
if config . ip_external :
self . site . notifications . append ( [ " done " , " Congratulation, your port <b> " + str ( config . fileserver_port ) + " </b> is opened. <br>You are full member of ZeroNet network! " , 10000 ] )
elif config . ip_external == False :
self . site . notifications . append ( [ " error " , " Your network connection is restricted. Please, open <b> " + str ( config . fileserver_port ) + " </b> port <br>on your router to become full member of ZeroNet network. " , 0 ] )
self . site . page_requested = True # Dont add connection notification anymore
for notification in self . site . notifications : # Send pending notification messages
self . cmd ( " notification " , notification )
self . site . notifications = [ ]
while True :
try :
message = ws . receive ( )
if message :
self . handleRequest ( message )
except Exception , err :
if err . message != ' Connection is already closed ' :
if config . debug : # Allow websocket errors to appear on /Debug
import sys
sys . modules [ " src.main " ] . DebugHook . handleError ( )
2015-01-17 18:50:56 +01:00
self . log . error ( " WebSocket error: %s " % Debug . formatException ( err ) )
2015-01-12 02:03:45 +01:00
return " Bye. "
# Event in a channel
def event ( self , channel , * params ) :
if channel in self . channels : # We are joined to channel
if channel == " siteChanged " :
site = params [ 0 ] # Triggerer site
2015-01-18 22:52:19 +01:00
site_info = self . formatSiteInfo ( site )
2015-01-12 02:03:45 +01:00
if len ( params ) > 1 and params [ 1 ] : # Extra data
site_info . update ( params [ 1 ] )
self . cmd ( " setSiteInfo " , site_info )
# Send response to client (to = message.id)
def response ( self , to , result ) :
self . send ( { " cmd " : " response " , " to " : to , " result " : result } )
# Send a command
def cmd ( self , cmd , params = { } , cb = None ) :
self . send ( { " cmd " : cmd , " params " : params } , cb )
# Encode to json and send message
def send ( self , message , cb = None ) :
message [ " id " ] = self . next_message_id # Add message id to allow response
self . next_message_id + = 1
2015-01-14 02:41:13 +01:00
try :
self . ws . send ( json . dumps ( message ) )
if cb : # Callback after client responsed
self . waiting_cb [ message [ " id " ] ] = cb
except Exception , err :
2015-01-17 18:50:56 +01:00
self . log . debug ( " Websocket send error: %s " % Debug . formatException ( err ) )
2015-01-12 02:03:45 +01:00
# Handle incoming messages
def handleRequest ( self , data ) :
req = json . loads ( data )
2015-01-27 22:37:13 +01:00
cmd = req . get ( " cmd " )
params = req . get ( " params " )
2015-01-12 02:03:45 +01:00
permissions = self . site . settings [ " permissions " ]
2015-02-14 14:05:00 +01:00
if req [ " id " ] > = 1000000 : # Its a wrapper command, allow admin commands
permissions = permissions [ : ]
permissions . append ( " ADMIN " )
2015-01-27 22:37:13 +01:00
if cmd == " response " : # It's a response to a command
return self . actionResponse ( req [ " to " ] , req [ " result " ] )
2015-01-12 02:03:45 +01:00
elif cmd == " ping " :
2015-01-27 22:37:13 +01:00
func = self . actionPing
2015-01-12 02:03:45 +01:00
elif cmd == " channelJoin " :
2015-01-27 22:37:13 +01:00
func = self . actionChannelJoin
2015-01-12 02:03:45 +01:00
elif cmd == " siteInfo " :
2015-01-27 22:37:13 +01:00
func = self . actionSiteInfo
2015-01-12 02:03:45 +01:00
elif cmd == " serverInfo " :
2015-01-27 22:37:13 +01:00
func = self . actionServerInfo
2015-01-12 02:03:45 +01:00
elif cmd == " siteUpdate " :
2015-01-27 22:37:13 +01:00
func = self . actionSiteUpdate
2015-01-24 19:14:29 +01:00
elif cmd == " sitePublish " :
2015-01-27 22:37:13 +01:00
func = self . actionSitePublish
2015-01-24 19:14:29 +01:00
elif cmd == " fileWrite " :
2015-01-27 22:37:13 +01:00
func = self . actionFileWrite
version 0.2.0, new lib for bitcoin ecc, dont display or track notify errors, dont reload again within 1 sec, null peer ip fix, signingmoved to ContentManager, content.json include support, content.json multisig ready, content.json proper bitcoincore compatible signing, content.json include permissions, multithreaded publish, publish timeout 60s, no exception on invalid bitcoin address, testcase for new lib, bip32 based persite privatekey generation, multiuser ready, simple json database query command, websocket api fileGet, wrapper loading title stuck bugfix
2015-02-09 02:09:02 +01:00
elif cmd == " fileGet " :
func = self . actionFileGet
elif cmd == " fileQuery " :
func = self . actionFileQuery
2015-01-12 02:03:45 +01:00
# Admin commands
elif cmd == " sitePause " and " ADMIN " in permissions :
2015-01-27 22:37:13 +01:00
func = self . actionSitePause
2015-01-12 02:03:45 +01:00
elif cmd == " siteResume " and " ADMIN " in permissions :
2015-01-27 22:37:13 +01:00
func = self . actionSiteResume
2015-01-21 12:58:26 +01:00
elif cmd == " siteDelete " and " ADMIN " in permissions :
2015-01-27 22:37:13 +01:00
func = self . actionSiteDelete
2015-01-12 02:03:45 +01:00
elif cmd == " siteList " and " ADMIN " in permissions :
2015-01-27 22:37:13 +01:00
func = self . actionSiteList
2015-02-14 14:05:00 +01:00
elif cmd == " siteSetLimit " and " ADMIN " in permissions :
func = self . actionSiteSetLimit
2015-01-12 02:03:45 +01:00
elif cmd == " channelJoinAllsite " and " ADMIN " in permissions :
2015-01-27 22:37:13 +01:00
func = self . actionChannelJoinAllsite
2015-01-12 02:03:45 +01:00
# Unknown command
else :
self . response ( req [ " id " ] , " Unknown command: %s " % cmd )
2015-01-27 22:37:13 +01:00
return
# Support calling as named, unnamed paramters and raw first argument too
if type ( params ) is dict :
func ( req [ " id " ] , * * params )
elif type ( params ) is list :
func ( req [ " id " ] , * params )
else :
func ( req [ " id " ] , params )
2015-01-12 02:03:45 +01:00
# - Actions -
# Do callback on response {"cmd": "response", "to": message_id, "result": result}
2015-01-27 22:37:13 +01:00
def actionResponse ( self , to , result ) :
if to in self . waiting_cb :
self . waiting_cb ( result ) # Call callback function
2015-01-12 02:03:45 +01:00
else :
2015-01-27 22:37:13 +01:00
self . log . error ( " Websocket callback not found: %s , %s " % ( to , result ) )
2015-01-12 02:03:45 +01:00
# Send a simple pong answer
def actionPing ( self , to ) :
self . response ( to , " pong " )
# Format site info
2015-01-18 22:52:19 +01:00
def formatSiteInfo ( self , site ) :
version 0.2.0, new lib for bitcoin ecc, dont display or track notify errors, dont reload again within 1 sec, null peer ip fix, signingmoved to ContentManager, content.json include support, content.json multisig ready, content.json proper bitcoincore compatible signing, content.json include permissions, multithreaded publish, publish timeout 60s, no exception on invalid bitcoin address, testcase for new lib, bip32 based persite privatekey generation, multiuser ready, simple json database query command, websocket api fileGet, wrapper loading title stuck bugfix
2015-02-09 02:09:02 +01:00
content = site . content_manager . contents . get ( " content.json " )
if content : # Remove unnecessary data transfer
content = content . copy ( )
content [ " files " ] = len ( content . get ( " files " , { } ) )
content [ " includes " ] = len ( content . get ( " includes " , { } ) )
if " sign " in content : del ( content [ " sign " ] )
if " signs " in content : del ( content [ " signs " ] )
2015-01-18 22:52:19 +01:00
2015-02-14 14:05:00 +01:00
settings = site . settings . copy ( )
del settings [ " wrapper_key " ] # Dont expose wrapper key
2015-01-12 02:03:45 +01:00
ret = {
version 0.2.0, new lib for bitcoin ecc, dont display or track notify errors, dont reload again within 1 sec, null peer ip fix, signingmoved to ContentManager, content.json include support, content.json multisig ready, content.json proper bitcoincore compatible signing, content.json include permissions, multithreaded publish, publish timeout 60s, no exception on invalid bitcoin address, testcase for new lib, bip32 based persite privatekey generation, multiuser ready, simple json database query command, websocket api fileGet, wrapper loading title stuck bugfix
2015-02-09 02:09:02 +01:00
" auth_key " : self . site . settings [ " auth_key " ] , # Obsolete, will be removed
" auth_key_sha512 " : hashlib . sha512 ( self . site . settings [ " auth_key " ] ) . hexdigest ( ) [ 0 : 64 ] , # Obsolete, will be removed
" auth_address " : self . user . getAuthAddress ( site . address ) ,
2015-01-12 02:03:45 +01:00
" address " : site . address ,
2015-02-14 14:05:00 +01:00
" settings " : settings ,
2015-01-12 02:03:45 +01:00
" content_updated " : site . content_updated ,
2015-01-18 22:52:19 +01:00
" bad_files " : len ( site . bad_files ) ,
2015-02-14 14:05:00 +01:00
" size_limit " : site . getSizeLimit ( ) ,
" next_size_limit " : site . getNextSizeLimit ( ) ,
2015-01-18 22:52:19 +01:00
" last_downloads " : len ( site . last_downloads ) ,
2015-02-14 14:54:11 +01:00
" peers " : site . settings . get ( " peers " , len ( site . peers ) ) ,
2015-01-18 22:52:19 +01:00
" tasks " : len ( [ task [ " inner_path " ] for task in site . worker_manager . tasks ] ) ,
" content " : content
2015-01-12 02:03:45 +01:00
}
version 0.2.0, new lib for bitcoin ecc, dont display or track notify errors, dont reload again within 1 sec, null peer ip fix, signingmoved to ContentManager, content.json include support, content.json multisig ready, content.json proper bitcoincore compatible signing, content.json include permissions, multithreaded publish, publish timeout 60s, no exception on invalid bitcoin address, testcase for new lib, bip32 based persite privatekey generation, multiuser ready, simple json database query command, websocket api fileGet, wrapper loading title stuck bugfix
2015-02-09 02:09:02 +01:00
if site . settings [ " serving " ] and content : ret [ " peers " ] + = 1 # Add myself if serving
2015-01-12 02:03:45 +01:00
return ret
# Send site details
2015-01-27 22:37:13 +01:00
def actionSiteInfo ( self , to ) :
2015-01-18 22:52:19 +01:00
ret = self . formatSiteInfo ( self . site )
2015-01-12 02:03:45 +01:00
self . response ( to , ret )
# Join to an event channel
2015-01-27 22:37:13 +01:00
def actionChannelJoin ( self , to , channel ) :
if channel not in self . channels :
self . channels . append ( channel )
2015-01-12 02:03:45 +01:00
# Server variables
2015-01-27 22:37:13 +01:00
def actionServerInfo ( self , to ) :
2015-01-12 02:03:45 +01:00
ret = {
2015-01-17 18:50:56 +01:00
" ip_external " : bool ( config . ip_external ) ,
2015-01-12 02:03:45 +01:00
" platform " : sys . platform ,
" fileserver_ip " : config . fileserver_ip ,
" fileserver_port " : config . fileserver_port ,
" ui_ip " : config . ui_ip ,
" ui_port " : config . ui_port ,
2015-01-16 11:52:42 +01:00
" version " : config . version ,
2015-01-12 02:03:45 +01:00
" debug " : config . debug
}
self . response ( to , ret )
version 0.2.0, new lib for bitcoin ecc, dont display or track notify errors, dont reload again within 1 sec, null peer ip fix, signingmoved to ContentManager, content.json include support, content.json multisig ready, content.json proper bitcoincore compatible signing, content.json include permissions, multithreaded publish, publish timeout 60s, no exception on invalid bitcoin address, testcase for new lib, bip32 based persite privatekey generation, multiuser ready, simple json database query command, websocket api fileGet, wrapper loading title stuck bugfix
2015-02-09 02:09:02 +01:00
def actionSitePublish ( self , to , privatekey = None , inner_path = " content.json " ) :
2015-01-24 19:14:29 +01:00
site = self . site
version 0.2.0, new lib for bitcoin ecc, dont display or track notify errors, dont reload again within 1 sec, null peer ip fix, signingmoved to ContentManager, content.json include support, content.json multisig ready, content.json proper bitcoincore compatible signing, content.json include permissions, multithreaded publish, publish timeout 60s, no exception on invalid bitcoin address, testcase for new lib, bip32 based persite privatekey generation, multiuser ready, simple json database query command, websocket api fileGet, wrapper loading title stuck bugfix
2015-02-09 02:09:02 +01:00
if not inner_path . endswith ( " content.json " ) : # Find the content.json first
inner_path = site . content_manager . getFileInfo ( inner_path ) [ " content_inner_path " ]
if not site . settings [ " own " ] and self . user . getAuthAddress ( self . site . address ) not in self . site . content_manager . getValidSigners ( inner_path ) :
return self . response ( to , " Forbidden, you can only modify your own sites " )
if not privatekey : # Get privatekey from users.json
privatekey = self . user . getAuthPrivatekey ( self . site . address )
2015-01-24 19:14:29 +01:00
# Signing
version 0.2.0, new lib for bitcoin ecc, dont display or track notify errors, dont reload again within 1 sec, null peer ip fix, signingmoved to ContentManager, content.json include support, content.json multisig ready, content.json proper bitcoincore compatible signing, content.json include permissions, multithreaded publish, publish timeout 60s, no exception on invalid bitcoin address, testcase for new lib, bip32 based persite privatekey generation, multiuser ready, simple json database query command, websocket api fileGet, wrapper loading title stuck bugfix
2015-02-09 02:09:02 +01:00
site . content_manager . loadContent ( add_bad_files = False ) # Reload content.json, ignore errors to make it up-to-date
signed = site . content_manager . sign ( inner_path , privatekey ) # Sign using private key sent by user
2015-01-24 19:14:29 +01:00
if signed :
version 0.2.0, new lib for bitcoin ecc, dont display or track notify errors, dont reload again within 1 sec, null peer ip fix, signingmoved to ContentManager, content.json include support, content.json multisig ready, content.json proper bitcoincore compatible signing, content.json include permissions, multithreaded publish, publish timeout 60s, no exception on invalid bitcoin address, testcase for new lib, bip32 based persite privatekey generation, multiuser ready, simple json database query command, websocket api fileGet, wrapper loading title stuck bugfix
2015-02-09 02:09:02 +01:00
if inner_path == " content_json " : self . cmd ( " notification " , [ " done " , " Private key correct, content signed! " , 5000 ] ) # Display message for 5 sec
2015-01-24 19:14:29 +01:00
else :
version 0.2.0, new lib for bitcoin ecc, dont display or track notify errors, dont reload again within 1 sec, null peer ip fix, signingmoved to ContentManager, content.json include support, content.json multisig ready, content.json proper bitcoincore compatible signing, content.json include permissions, multithreaded publish, publish timeout 60s, no exception on invalid bitcoin address, testcase for new lib, bip32 based persite privatekey generation, multiuser ready, simple json database query command, websocket api fileGet, wrapper loading title stuck bugfix
2015-02-09 02:09:02 +01:00
self . cmd ( " notification " , [ " error " , " Content sign failed: invalid private key. " ] )
2015-01-24 19:14:29 +01:00
self . response ( to , " Site sign failed " )
return
version 0.2.0, new lib for bitcoin ecc, dont display or track notify errors, dont reload again within 1 sec, null peer ip fix, signingmoved to ContentManager, content.json include support, content.json multisig ready, content.json proper bitcoincore compatible signing, content.json include permissions, multithreaded publish, publish timeout 60s, no exception on invalid bitcoin address, testcase for new lib, bip32 based persite privatekey generation, multiuser ready, simple json database query command, websocket api fileGet, wrapper loading title stuck bugfix
2015-02-09 02:09:02 +01:00
site . content_manager . loadContent ( add_bad_files = False ) # Load new content.json, ignore errors
2015-01-24 19:14:29 +01:00
# Publishing
if not site . settings [ " serving " ] : # Enable site if paused
site . settings [ " serving " ] = True
site . saveSettings ( )
site . announce ( )
version 0.2.0, new lib for bitcoin ecc, dont display or track notify errors, dont reload again within 1 sec, null peer ip fix, signingmoved to ContentManager, content.json include support, content.json multisig ready, content.json proper bitcoincore compatible signing, content.json include permissions, multithreaded publish, publish timeout 60s, no exception on invalid bitcoin address, testcase for new lib, bip32 based persite privatekey generation, multiuser ready, simple json database query command, websocket api fileGet, wrapper loading title stuck bugfix
2015-02-09 02:09:02 +01:00
published = site . publish ( 5 , inner_path ) # Publish to 5 peer
2015-01-24 19:14:29 +01:00
if published > 0 : # Successfuly published
version 0.2.0, new lib for bitcoin ecc, dont display or track notify errors, dont reload again within 1 sec, null peer ip fix, signingmoved to ContentManager, content.json include support, content.json multisig ready, content.json proper bitcoincore compatible signing, content.json include permissions, multithreaded publish, publish timeout 60s, no exception on invalid bitcoin address, testcase for new lib, bip32 based persite privatekey generation, multiuser ready, simple json database query command, websocket api fileGet, wrapper loading title stuck bugfix
2015-02-09 02:09:02 +01:00
self . cmd ( " notification " , [ " done " , " Content published to %s peers. " % published , 5000 ] )
2015-01-24 19:14:29 +01:00
self . response ( to , " ok " )
site . updateWebsocket ( ) # Send updated site data to local websocket clients
else :
if len ( site . peers ) == 0 :
version 0.2.0, new lib for bitcoin ecc, dont display or track notify errors, dont reload again within 1 sec, null peer ip fix, signingmoved to ContentManager, content.json include support, content.json multisig ready, content.json proper bitcoincore compatible signing, content.json include permissions, multithreaded publish, publish timeout 60s, no exception on invalid bitcoin address, testcase for new lib, bip32 based persite privatekey generation, multiuser ready, simple json database query command, websocket api fileGet, wrapper loading title stuck bugfix
2015-02-09 02:09:02 +01:00
self . cmd ( " notification " , [ " info " , " No peers found, but your content is ready to access. " ] )
self . response ( to , " No peers found, but your content is ready to access. " )
2015-01-24 19:14:29 +01:00
else :
version 0.2.0, new lib for bitcoin ecc, dont display or track notify errors, dont reload again within 1 sec, null peer ip fix, signingmoved to ContentManager, content.json include support, content.json multisig ready, content.json proper bitcoincore compatible signing, content.json include permissions, multithreaded publish, publish timeout 60s, no exception on invalid bitcoin address, testcase for new lib, bip32 based persite privatekey generation, multiuser ready, simple json database query command, websocket api fileGet, wrapper loading title stuck bugfix
2015-02-09 02:09:02 +01:00
self . cmd ( " notification " , [ " error " , " Content publish failed. " ] )
self . response ( to , " Content publish failed. " )
2015-01-24 19:14:29 +01:00
# Write a file to disk
2015-01-27 22:37:13 +01:00
def actionFileWrite ( self , to , inner_path , content_base64 ) :
version 0.2.0, new lib for bitcoin ecc, dont display or track notify errors, dont reload again within 1 sec, null peer ip fix, signingmoved to ContentManager, content.json include support, content.json multisig ready, content.json proper bitcoincore compatible signing, content.json include permissions, multithreaded publish, publish timeout 60s, no exception on invalid bitcoin address, testcase for new lib, bip32 based persite privatekey generation, multiuser ready, simple json database query command, websocket api fileGet, wrapper loading title stuck bugfix
2015-02-09 02:09:02 +01:00
if not self . site . settings [ " own " ] and self . user . getAuthAddress ( self . site . address ) not in self . site . content_manager . getValidSigners ( inner_path ) :
return self . response ( to , " Forbidden, you can only modify your own files " )
2015-01-24 19:14:29 +01:00
try :
import base64
2015-01-27 22:37:13 +01:00
content = base64 . b64decode ( content_base64 )
open ( self . site . getPath ( inner_path ) , " wb " ) . write ( content )
2015-01-24 19:14:29 +01:00
except Exception , err :
return self . response ( to , " Write error: %s " % err )
version 0.2.0, new lib for bitcoin ecc, dont display or track notify errors, dont reload again within 1 sec, null peer ip fix, signingmoved to ContentManager, content.json include support, content.json multisig ready, content.json proper bitcoincore compatible signing, content.json include permissions, multithreaded publish, publish timeout 60s, no exception on invalid bitcoin address, testcase for new lib, bip32 based persite privatekey generation, multiuser ready, simple json database query command, websocket api fileGet, wrapper loading title stuck bugfix
2015-02-09 02:09:02 +01:00
if inner_path . endswith ( " content.json " ) :
self . site . content_manager . loadContent ( inner_path , add_bad_files = False )
2015-01-27 22:37:13 +01:00
2015-01-24 19:14:29 +01:00
return self . response ( to , " ok " )
version 0.2.0, new lib for bitcoin ecc, dont display or track notify errors, dont reload again within 1 sec, null peer ip fix, signingmoved to ContentManager, content.json include support, content.json multisig ready, content.json proper bitcoincore compatible signing, content.json include permissions, multithreaded publish, publish timeout 60s, no exception on invalid bitcoin address, testcase for new lib, bip32 based persite privatekey generation, multiuser ready, simple json database query command, websocket api fileGet, wrapper loading title stuck bugfix
2015-02-09 02:09:02 +01:00
# Find data in json files
def actionFileQuery ( self , to , dir_inner_path , query ) :
dir_path = self . site . getPath ( dir_inner_path )
rows = list ( QueryJson . query ( dir_path , query ) )
return self . response ( to , rows )
# Return file content
def actionFileGet ( self , to , inner_path ) :
try :
self . site . needFile ( inner_path , priority = 1 )
body = open ( self . site . getPath ( inner_path ) ) . read ( )
except :
body = None
return self . response ( to , body )
2015-01-24 19:14:29 +01:00
2015-01-12 02:03:45 +01:00
# - Admin actions -
# List all site info
2015-01-27 22:37:13 +01:00
def actionSiteList ( self , to ) :
2015-01-12 02:03:45 +01:00
ret = [ ]
SiteManager . load ( ) # Reload sites
for site in self . server . sites . values ( ) :
version 0.2.0, new lib for bitcoin ecc, dont display or track notify errors, dont reload again within 1 sec, null peer ip fix, signingmoved to ContentManager, content.json include support, content.json multisig ready, content.json proper bitcoincore compatible signing, content.json include permissions, multithreaded publish, publish timeout 60s, no exception on invalid bitcoin address, testcase for new lib, bip32 based persite privatekey generation, multiuser ready, simple json database query command, websocket api fileGet, wrapper loading title stuck bugfix
2015-02-09 02:09:02 +01:00
if not site . content_manager . contents . get ( " content.json " ) : continue # Broken site
2015-01-18 22:52:19 +01:00
ret . append ( self . formatSiteInfo ( site ) )
2015-01-12 02:03:45 +01:00
self . response ( to , ret )
# Join to an event channel on all sites
2015-01-27 22:37:13 +01:00
def actionChannelJoinAllsite ( self , to , channel ) :
if channel not in self . channels : # Add channel to channels
self . channels . append ( channel )
2015-01-12 02:03:45 +01:00
for site in self . server . sites . values ( ) : # Add websocket to every channel
if self not in site . websockets :
site . websockets . append ( self )
# Update site content.json
2015-01-27 22:37:13 +01:00
def actionSiteUpdate ( self , to , address ) :
2015-01-12 02:03:45 +01:00
site = self . server . sites . get ( address )
if site and ( site . address == self . site . address or " ADMIN " in self . site . settings [ " permissions " ] ) :
gevent . spawn ( site . update )
else :
self . response ( to , { " error " : " Unknown site: %s " % address } )
# Pause site serving
2015-01-27 22:37:13 +01:00
def actionSitePause ( self , to , address ) :
2015-01-12 02:03:45 +01:00
site = self . server . sites . get ( address )
if site :
site . settings [ " serving " ] = False
site . saveSettings ( )
site . updateWebsocket ( )
2015-01-21 12:58:26 +01:00
site . worker_manager . stopWorkers ( )
2015-01-12 02:03:45 +01:00
else :
self . response ( to , { " error " : " Unknown site: %s " % address } )
# Resume site serving
2015-01-27 22:37:13 +01:00
def actionSiteResume ( self , to , address ) :
2015-01-12 02:03:45 +01:00
site = self . server . sites . get ( address )
if site :
site . settings [ " serving " ] = True
site . saveSettings ( )
gevent . spawn ( site . update )
time . sleep ( 0.001 ) # Wait for update thread starting
site . updateWebsocket ( )
else :
self . response ( to , { " error " : " Unknown site: %s " % address } )
2015-01-21 12:58:26 +01:00
2015-01-27 22:37:13 +01:00
def actionSiteDelete ( self , to , address ) :
2015-01-21 12:58:26 +01:00
site = self . server . sites . get ( address )
if site :
site . settings [ " serving " ] = False
site . saveSettings ( )
site . worker_manager . running = False
site . worker_manager . stopWorkers ( )
site . deleteFiles ( )
SiteManager . delete ( address )
site . updateWebsocket ( )
else :
self . response ( to , { " error " : " Unknown site: %s " % address } )
2015-02-14 14:05:00 +01:00
def actionSiteSetLimit ( self , to , size_limit ) :
self . site . settings [ " size_limit " ] = size_limit
self . site . saveSettings ( )
self . response ( to , " Site size limit changed to %s MB " % size_limit )
self . site . download ( )