Referenza API ZeroFrame¶
La API ZeroFrame¶
ZeroFrame è una API che consente ai siti ZeroNet di interagire con il deamon ZeroNet. Consente si siti di salvare/recuperare file, pubbicare modifiche e molte altre cose. Una copia della libreria è inclusa in js/ZeroFrame.js
ogni volta che un nuovo sito viene creato.
La libreria puà essere importata come ogni altro file JavaScript, o gli sviluppatori hanno l'opzione di importarla tramite NPM. Vedere la Referenza API ZeroFrame per i dettagli della API.
Wrapper¶
Comandi che interagiscono con il codice all'esterno dell'iframe.
wrapperConfirm¶
Visualizza una notifica con una conferma.
Esempio
zeroframe = new ZeroFrame() message = 'Sei sicuro di volerlo cancellare?' buttonTitle = 'Cancella' zeroframe.cmd 'wrapperConfirm', [message, buttonTitle], (confirmed) => if confirmed console.log 'Cancellazione post...'
const zeroframe = new ZeroFrame(); let message = 'Sei sicuro di volerlo cancellare?'; let buttonTitle = 'Cancella'; zeroframe.cmd('wrapperConfirm', [message, buttonTitle], (confirmed) => { if (confirmed) { console.log('Cancellazione post...'); } };
Risultato:
L'utente sa clic sulla conferma:
"Cancellazione post..."
Nota
La funzione di callback non viene eseguita se l'utente ignora la notifica.
wrapperInnerLoaded¶
Poiché #anchors
nell'URL si applica solo alla pagina web esterna e non all'interno dell'iframe dove è attivo il sito ZeroNet, bisogna usare il comando seguente. Quando il sito è completamente caricato, richiamare questo metodo per applicare l'anchor corrente al parametro src
dell'URL dell'iframe interno.
Esempio
zeroframe = new ZeroFrame() zeroframe.cmd 'wrapperInnerLoaded', []
const zeroframe = new ZeroFrame(); zeroframe.cmd('wrapperInnerLoaded', []);
Risultato:
Se l'utente è su http://127.0.0.1:43110/mysite.bit#my-title
:
Chiave aggiunta dal [Wrapper] alla locazione http://127.0.0.1:43110/mysite.bit/?wrapper_nonce=some_nonce#my-title
innerLoaded¶
Alias per wrapperInnerLoaded.
wrapperGetLocalStorage¶
Recupera il contenuto Local Storage del sito ZeroNet.
Nota
Poiché tutti i siti ZeroNet funzionano sullo stesso dominio, lo stesso Local Storage è tecnicamente condiviso da tutti i siti, che è un rischio per la sicurezza. Pertanto, il UiWrapper compartimenta ogni sito perché sia in grado di accedere solo alla propria porzione.
Restituisce: Il Local Storage per il sito in formato JSON.
Esempio
zeroframe = new ZeroFrame() zeroframe.cmd "wrapperGetLocalStorage", [], (res) => res ?= {} console.log "Valore Local storage:", res
const zeroframe = new ZeroFrame(); zeroframe.cmd("wrapperGetLocalStorage", [], (res) => { res = res || {}; console.log("Contenuto Local Storage:", res); });
Risultato:
Se il Local Storage è vuoto:
Local Storage contents: {}
Se il Local Storage è stato modificato con wrapperSetLocalStorage:
Local Storage contents: {"score": 500}
wrapperGetState¶
Restituisce lo storico della linguetta del browser corrente.
Restituisce: oggetto corrente dello storico del browser.
Esempio
zeroframe = new ZeroFrame() zeroframe.cmd 'wrapperGetState', {}, (state) -> console.log state
zeroframe = new ZeroFrame(); zeroframe.cmd('wrapperGetState', {}, (state) => { console.log(state); });
Risultato:
null
wrapperGetAjaxKey¶
Restituisce: recupera una chiave che può essere utilizzata per realizzare una richiesta ajax (XMLHTTPRequest, fetch).
Esempio
zeroframe = new ZeroFrame() zeroframe.cmd 'wrapperGetAjaxKey', {}, (ajax_key) -> req = new window.XMLHttpRequest() req.open 'GET', "content.json?ajax_key=#{ajax_key}" # Opzionale: solo se si vuole una parte di file # req.setRequestHeader 'Range', 'bytes=10-200' req.onload = -> console.log req.response req.send()
zeroframe = new ZeroFrame(); zeroframe.cmd('wrapperGetAjaxKey', {}, (ajax_key) => { const req = new window.XMLHttpRequest(); req.open('GET', `content.json?ajax_key=${ajax_key}`); // Opzionale: solo se si vuole una parte di file // req.setRequestHeader('Range', 'bytes=10-200'); req.onload = () => { console.log(req.response); }; req.send(); });
Risultato:
Il file richiesto. In questo caso, il file content.json
del sito corrente:
{ "address": "1HeLLo4uzjaLetFx6NH3PMwFP3qbRbTf3D", "address_index": 66669697, "background-color": "#FFF", "description": "", "files": { "index.html": { "sha512": "542f7724432a22ceb8821b4241af4d36cfd81e101b72d425c6c59e148856537e", "size": 1114 }, "js/ZeroFrame.js": { "sha512": "42125c7aa72496455e044e3fd940e0f05db86824c781381edb7a70f71a5f0882", "size": 3370 } }, "ignore": "", "inner_path": "content.json", "modified": 1541199581, "postmessage_nonce_security": true, "signers_sign": "G6Aq7MXMzCjvEdqCToGTDZ7mrsCfaQzZdoBqHg4Cle2NHGno1Pgx2dvgeTFpsWkFP/oAA4CHKt2Zu+KueJM+7Mg=", "signs": { "1HeLLo4uzjaLetFx6NH3PMwFP3qbRbTf3D": "COr0M7+egjY29ZhW7mQp4MPHYuwrgOKVk6kl1CnRPef2QPbUQARYigo0cId8nIs7Y6Fnaj+uHR2HPvh09XVGb1Q=" }, "signs_required": 1, "title": "my site", "translate": ["js/all.js"], "zeronet_version": "0.6.4" }
Nota
Il caso d'uso raccomandato è per la comunicazione con risorse non ZeroNet. Non è raccomandato per recuperare i contenuti di un file per un sito. Per questo, utilizzare il comando fileGet.
Il recupero di file da altri siti ZeroNet può essere fatto con il plugin CORS.
Si può anche utilizzare la sunzione monkeyPatchAjax
di ZeroFrame.js
per aggiustare la
XMLHTTPRequest predefinita e attuare implementazioni.
wrapperNotification¶
Visualizza una notifica.
Parametro | Descrizione |
---|---|
type | Style della notifica. Possibili valori: info , error , done |
message | Il messaggio che si vuole visualizzare |
timeout (opzionale) | Nasconde il messaggio dopo questo intervallo (millisecondi) |
Restituisce: Niente.
Esempio
zeroframe = new ZeroFrame() zeroframe.cmd 'wrapperNotification', ['done', 'La tua registrazione è stata inviata!', 10000]
const zeroframe = new ZeroFrame(); zeroframe.cmd('wrapperNotification', ['done', 'La tua registrazione è stata inviata!', 10000]);
wrapperOpenWindow¶
Sposta in una nuova finestra popup o la apre.
Parametro | Descrizione |
---|---|
url | URL della pagina aperta |
target (opzionale) | Nome della finestra obiettivo |
specs (opzionale) | Proprietà speciali della finestra (vedere: window.open) |
Esempio
zeroframe = new ZeroFrame() zeroframe.cmd 'wrapperOpenWindow', ['https://zeronet.io', '_blank', 'width=550,height=600,location=no,menubar=no']
zeroframe = new ZeroFrame(); zeroframe.cmd('wrapperOpenWindow', ['https://zeronet.io', '_blank', 'width=550,height=600,location=no,menubar=no']);
wrapperPermissionAdd¶
Richiede un nuovo permesso per il sito.
Parametro | Descrizione |
---|---|
permission | Nome del permesso (es. Merger:ZeroMe) |
Esempio
zeroframe = new ZeroFrame() zeroframe.cmd 'wrapperPermissionAdd', ['Merger:ZeroMe'], (res) -> if res == 'ok' console.log 'Permesso concesso.'
const zeroframe = new ZeroFrame(); zeroframe.cmd('wrapperPermissionAdd', ['Merger:ZeroMe'], (res) => { if (res === 'ok') { console.log('Permesso concesso.'); } });
Risultato:
Se l'utente accetta la richiesta di permesso:
Permesso concesso.
Se l'utente nega o non risponde alla richiesta, il metodo on viene eseguito.
wrapperPrompt¶
Richiesta di inserimento testo dall'utente.
Parametro | Descrizione |
---|---|
message | Il messaggio da visualizzare |
type (opzionale) | Il tupo di campo (es. text , password ) |
Restituisce: il resto inserito.
Esempio
zeroframe = new ZeroFrame() # Richista della chiave privata per un sito zeroframe.cmd 'wrapperPrompt', ['Inserire la chiave privata:', 'password'], (privatekey) -> # Firma e pubblica content.json zeroframe.cmd 'sitePublish', [privatekey], (res) -> console.log 'Risultato pubblicazione:', res
const zeroframe = new ZeroFrame(); zeroframe = new ZeroFrame(); // Richista della chiave privata per un sito zeroframe.cmd('wrapperPrompt', ['Inserire la chiave privata:', 'password'], function(privatekey) { // Firma e pubblica content.json zeroframe.cmd('sitePublish', [privatekey], function(res) { console.log('Risultato pubblicazione:', res); }); });
Risultato:
Risultato pubblicazione: ok
wrapperPushState¶
Modifica l'url attuale e aggiunge un nuovo valore nello storico del browser. Vedere JavaScript pushState. E vedere wrapperReplaceState per non aggiungere un valore nello storico.
Parametro | Descrizione |
---|---|
state | Oggetto stato JavaScript |
title | Titolo della pagina |
url | Percorso URL della pagina |
Restituisce: Niente.
Esempio
zeroframe = new ZeroFrame() zeroframe.cmd 'wrapperPushState', [{'scrollY': 100}, 'Profile page', 'Profile']
const zeroframe = new ZeroFrame(); zeroframe.cmd('wrapperPushState', [{'scrollY': 100}, 'Profile page', 'Profile']);
wrapperReplaceState¶
Modifica l'url della finestra senza aggiungere il valore allo storico del browser. Vedere JavaScript replaceState.
Parametro | Descrizione |
---|---|
state | Oggetto stato JavaScript |
title | Titolo della pagina |
url | Percorso URL della pagina |
Restituisce: Niente.
Esempio
zeroframe = new ZeroFrame() zeroframe.cmd 'wrapperReplaceState', [{'scrollY': 100}, 'Profile page', 'Profile']
const zeroframe = new ZeroFrame(); zeroframe.cmd('wrapperReplaceState', [{'scrollY': 100}, 'Profile page', 'Profile']);
wrapperRequestFullscreen¶
Deprecated
Starting from ZeroNet Rev3136 you can use the fullscreen javascript API directly, without needing to ask the wrapper first.
Set the current page to fullscreen.
Esempio
zeroframe = new ZeroFrame() zeroframe.cmd('wrapperRequestFullscreen')
const zeroframe = new ZeroFrame(); zeroframe.cmd('wrapperRequestFullscreen')
wrapperSetLocalStorage¶
Set browser's local store data stored for the site
Parametro | Descrizione |
---|---|
data | Any data structure you want to store for the site |
Restituisce: Niente.
Esempio
zeroframe = new ZeroFrame() setTimeout(-> zeroframe.cmd 'wrapperSetLocalStorage', {'score': 500}, (res) => console.log 'Punteggio salvato.' , 100)
import 'js/ZeroFrame.js' setTimeout(() => { zeroframe.cmd('wrapperSetLocalStorage', {'score': 500}, (res) => { console.log('Punteggio salvato.'); }); }, 100); const zeroframe = new ZeroFrame();
Nota
wrapperSetLocalStorage
si basa su site_info
, un oggetto che contiene
informazioni sul sito recuparato dal deamon ZeroNet sul carico ZeroFrame.
Perché questo avvenga, serve ritardare l'esecuzione di wrapperSetLocalStorage
per 100ms.
Risultato:
Se il local storage è vuoto:
Punteggio salvato.
wrapperSetTitle¶
Imposta il titolo del sito.
Parametro | Descrizione |
---|---|
title | Titolo della nuova linguetta del browser |
Restituisce: Niente.
Esempio
zeroframe = new ZeroFrame() zeroframe.cmd 'wrapperSetTitle', 'Il mio nuovo titolo'
const zeroframe = new ZeroFrame(); zeroframe.cmd('wrapperSetTitle', 'Il mio nuovo titolo');
Il titolo del sito sarà Il mio nuovo titolo
.
wrapperSetViewport¶
Imposta il contenuto del meta tag per il viewport del sito (richiesto per siti mobile).
Parametro | Descrizione |
---|---|
viewport | Contenuto del meta tag viewport |
Restituisce: Niente.
Esempio
zeroframe = new ZeroFrame() zeroframe.cmd 'wrapperSetViewport', 'width=device-width, initial-scale=1.0'
const zeroframe = new ZeroFrame(); zeroframe.cmd('wrapperSetViewport', 'width=device-width, initial-scale=1.0');
UiServer¶
L'UiServer fa tutto il lavoro nel 'backend' (es: interrogare il DB, accedere ai file, ecc.). Queste sono le chiamate API necessarie per realizzare un sito dinamico.
announcerInfo¶
Registratore delle statistiche per il sito
Restituisce:
{ "stats": { "zero://45.77.23.92:15555": { "status": "announced", "num_success": 1, "time_last_error": 0, "time_status": 1541776998.782, "num_request": 1, "time_request": 1541776996.884, "num_error": 0 }, ... } }
certAdd¶
Aggiunge un nuovo certificato al l'utente corrente.
Parametro | Descrizione |
---|---|
domain | Certificato del dominio emeittente |
auth_type | Tiopo autorizzazione utilizzata in registrazione |
auth_user_name | Nome utente utilizzato in registrazione |
cert | Il certificato stesso: stringa auth_address#auth_type/auth_user_name firmata dal certificato del titolare del sito |
Restituisce: "ok"
, "Not changed"
or {"error": error_message}
.
Esempio:
@cmd "certAdd", ["zeroid.bit", auth_type, user_name, cert_sign], (res) => $(".ui").removeClass("flipped") if res.error @cmd "wrapperNotification", ["error", "#{res.error}"]
certSelect¶
Visualizza il selettore del certificato.
Parametro | Descrizione |
---|---|
accepted_domains (opzionale) | Elenco dei domini accettati dal sito come fornitori di autorizzazioni (predefinito: []) |
accept_any (opzionale) | Non limita i fornitori di certificati accettati (predefinito: False) |
accepted_pattern (opzionale) | Regexp pattern for accepted certificate providers address (predefinto.: Niente) |
Restituisce: Niente.
Esempio:
@cmd "certSelect", {"accepted_domains": ["zeroid.bit"], "accepted_pattern": "1ZeroiD[0-9]"}
channelJoin¶
Richiesta notifiche sugli eventi del sito.
Parametro | Descrizione |
---|---|
channel | Canale da connettere |
Restituisce: Niente.
Channels:
- siteChanged (joined by default)
Events: peers_added, file_started, file_done, file_failed
Esempio:
# Connessione wrapper websocket pronta onOpenWebsocket: (e) => @cmd "channelJoinAllsite", {"channel": "siteChanged"} # Percorso richiesta in arrivo e messaggi route: (cmd, data) -> if cmd == "setSiteInfo" @log "Site changed", data else @log "Unknown command", cmd, data
Example event data
{ "tasks":0, "size_limit":10, "address":"1RivERqttrjFqwp9YH1FviduBosQPtdBN", "next_size_limit":10, "event":[ "file_done", "index.html" ], [...] # Come il dizionaro di risposta siteInfo }
dbQuery¶
Esegue una query nella chache sql
Parametro | Descrizione |
---|---|
query | Comando sql |
params | Sostituzione parametro nella query |
Restituisce: Risultaro della quesry come matrice.
Esempio:
Page.cmd("dbQuery", [ "SELECT * FROM json WHERE file_name = :file_name", {file_name: "data.json"} ], (res) => { console.log(res.length) })
Page.cmd("dbQuery", [ "SELECT * FROM json WHERE file_name IN :file_names", {file_names: ["data.json", "content.json"]} ], (res) => { console.log(res.length) })
Page.cmd("dbQuery", [ "SELECT * FROM json ?", {file_name: ["data.json", "content.json"]} ], (res) => { console.log(res.length) })
@log "Updating user info...", @my_address Page.cmd "dbQuery", ["SELECT user.*, json.json_id AS data_json_id FROM user LEFT JOIN json USING(path) WHERE path='#{@my_address}/data.json'"], (res) => if res.error or res.length == 0 # Db not ready yet or No user found $(".head-user.visitor").css("display", "") $(".user_name-my").text("Visitor") if cb then cb() return @my_row = res[0] @my_id = @my_row["user_id"] @my_name = @my_row["user_name"] @my_max_size = @my_row["max_size"]
dirList¶
Elenca il contenuto di una cartella
Parametro | Descrizione |
---|---|
inner_path | La cartella che si vuole analizzare |
Restituisce: Elenco dei file e delle cartelle
fileDelete¶
Cancella un file.
Parametro | Descrizione |
---|---|
inner_path | Il file che si vuole cancellare |
Restituisce: "ok"
al successo, altrimenti il messaggio di errore.
fileGet¶
Ottiene il contenuto di un file.
Parametro | Descrizione |
---|---|
inner_path | Il file che si vuole estrarre |
required (opzionale) | Prova e aspetta il file se non esiste (predefinito: True) |
format (opzionale) | Codifica dei dati restituiti (text or Base64) (predefinito: text) |
timeout (opzionale) | Tempo massimo di attesa per arrivo dei dati (predefinito: 300) |
Restituisce:
Esempio:
# Voto di un argomento su ZeroTalk submitTopicVote: (e) => if not Users.my_name # Not registered Page.cmd "wrapperNotification", ["info", "Effettuare l'accesso prima di votare."] return false elem = $(e.currentTarget) elem.toggleClass("active").addClass("loading") inner_path = "data/users/#{Users.my_address}/data.json" Page.cmd "fileGet", [inner_path], (data) => data = JSON.parse(data) data.topic_votes ?= {} # Create if not exits topic_address = elem.parents(".topic").data("topic_address") if elem.hasClass("active") # Add upvote to topic data.topic_votes[topic_address] = 1 else # Remove upvote from topic delete data.topic_votes[topic_address] # Write file and publish to other peers Page.writePublish inner_path, Page.jsonEncode(data), (res) => elem.removeClass("loading") if res == true @log "File written" else # Failed elem.toggleClass("active") # Change back return false
fileList¶
Elenco ricorsivo dei file di una cartella
Parametro | Descrizione |
---|---|
inner_path | Cartella da analizzare |
Restituisce: Elenco dei file nella cartella (ricorsivo).
fileNeed¶
Inizializza il download di un file (opzionale).
Parametro | Descrizione |
---|---|
inner_path | Il file che si vuole ottenere |
timeout (opzionale) | Tempo massimo di arrivo dei dati (predefinito: 300) |
Restituisce: "ok"
al successo del download.
fileQuery¶
Semplice comando di richiesta di file json
Parametro | Descrizione |
---|---|
dir_inner_path | Modello del file interrogato |
query | Comando di richiesta (opzionale) |
Restituisce: Contenuti ottenuti in formato matrice.
Esempi di query:
["data/users/*/data.json", "topics"]
: Restituisce tutti gli argomenti per tutti i file utente["data/users/*/data.json", "comments.1@2"]
: Restituisce i valoriuser_data["comments"]["1@2"]
da tutti i file utente["data/users/*/data.json", ""]
: Restituisce tutti i dati dai file utenti["data/users/*/data.json"]
: Restituisce tutti i dati dai file utenti (come il precedente)
Esempio:
@cmd "fileQuery", ["data/users/*/data.json", "topics"], (topics) => topics.sort (a, b) -> # Ordinato per data return a.added - b.added for topic in topics @log topic.topic_id, topic.inner_path, topic.title
fileRules¶
Restituisce le regole per il file
Parametro | Descrizione |
---|---|
inner_path | Percorso interno del file |
Restituisce: il contenuto corrispondente come matrice
Esempio risultato:
{ "current_size": 2485, "cert_signers": {"zeroid.bit": ["1iD5ZQJMNXu43w1qLB8sfdHVKppVMduGz"]}, "files_allowed": "data.json", "signers": ["1J3rJ8ecnwH2EPYa6MrgZttBNc61ACFiCj"], "user_address": "1J3rJ8ecnwH2EPYa6MrgZttBNc61ACFiCj", "max_size": 100000 }
Esempio:
@cmd "fileRules", "data/users/1J3rJ8ecnwH2EPYa6MrgZttBNc61ACFiCj/content.json", (rules) => @log rules
fileWrite¶
Scrive il contenuto del file
Parametro | Descrizione |
---|---|
inner_path | Percorso interno del file che si vuole scrivere |
content_base64 | Contenuto che si vuole scrivere nel file (codificato in Base6) |
Restituisce: "ok"
al successo, altrimenti il messaggio di errore.
Esempio:
writeData: (cb=null) -> # Codifica in json, utf8 json_raw = unescape(encodeURIComponent(JSON.stringify({"hello": "ZeroNet"}, undefined, '\t'))) # Converte in Base64 e spedisce @cmd "fileWrite", ["data.json", btoa(json_raw)], (res) => if res == "ok" if cb then cb(true) else @cmd "wrapperNotification", ["error", "File write error: #{res}"] if cb then cb(false)
Nota: per scrivere file che non sono ancora nel content.json, serve avere "own": true
in data/sites.json
nel sito che si vuole scrivere
ping¶
Testa la connessione websocket UiServer
Restituisce: pong
serverInfo¶
Restituisce: Tutte le informazioni sul server come oggetto JavaScript.
Esempio:
@cmd "serverInfo", {}, (server_info) => @log "Server info:", server_info
Esempio valore restituito:
{ "debug": true, # Funzionamento in modalità debug "fileserver_ip": "*", # Fileserver collegato a "fileserver_port": 15441, # Porta FileServer "ip_external": true, # Modalità attiva o passiva "platform": "win32", # Sistema operativo "ui_ip": "127.0.0.1", # UiServer collegato a "ui_port": 43110, # Porta UiServer (Web) "version": "0.2.5" # Versione }
siteInfo¶
Restituisce: Tutte le informazioni sul sito come oggetto JavaScript.
Esempio:
@cmd "siteInfo", {}, (site_info) => @log "Site info:", site_info
Example return value:
{ "tasks": 0, # Numero di file attualmente in download "size_limit": 10, # Limite dimensione del sito attuale in MB "address": "1EU1tbG9oC1A8jz2ouVwGZyQ5asrNsE4Vr", # Indirizzo del sito "next_size_limit": 10, # Limite dimensione richiesta dalla somma dei file del sito "auth_address": "2D6xXUmCVAXGrbVUGRRJdS4j1hif1EMfae", # Indirizzo Bitcoin dell'utente corrente "auth_key_sha512": "269a0f4c1e0c697b9d56ccffd9a9748098e51acc5d2807adc15a587779be13cf", # Deprecato, non utilizzare "peers": 14, # Peer del sito "auth_key": "pOBdl00EJ29Ad8OmVIc763k4", # Deprecato, non usare "settings": { "peers": 13, # Numero salvato di peer per l'ordinamento "serving": true, # Sito abilitato "modified": 1425344149.365, # Ultimo aggiornamento di tutti i file del sito "own": true, # Sito proprio "permissions": ["ADMIN"], # Permessi del sito "size": 342165 # Dimensione totale del sito in byte }, "bad_files": 0, # File che devono essere scaricati "workers": 0, # Numero di download concorrenti attuali "content": { # Radice di content.json "files": 12, # Numero di file, rimosse le informazioni dettagliate dei file per ridurre il trasferimento di dati e il tempo di elaborazione "description": "This site", "title": "ZeroHello", "signs_required": 1, "modified": 1425344149.365, "ignore": "(js|css)/(?!all.(js|css))", "signers_sign": null, "address": "1EU1tbG9oC1A8jz2ouVwGZyQ5asrNsE4Vr", "zeronet_version": "0.2.5", "includes": 0 }, "cert_user_id": "zeronetuser@zeroid.bit", # Certificato attualmente slezionato per il sito "started_task_num": 1, # Ultimo numero di file scaricati "content_updated": 1426008289.71 # Data aggiornamento Content.json }
sitePublish¶
Pubblica un content.json del sito
Parametro | Descrizione |
---|---|
privatekey (opzionale) | Chiave privata utilizzata per la firma (predefinita: chiave privata dell'utente corrente) |
inner_path (opzionale) | Percorso interno del contenuto json che si vuole pubblicare (predefinito: content.json) |
sign (opzionale) | Se True firma il content.json prima di pubblicarlo (predefinito: True) |
Restituisce: "ok"
al successo, altrimenti il messaggio di errore.
Esempio:
# Mostra la chiave privata @cmd "wrapperPrompt", ["Enter your private key:", "password"], (privatekey) => $(".publishbar .button").addClass("loading") # Invia il content.json firmato e pubblica la richiesta al server @cmd "sitePublish", [privatekey], (res) => $(".publishbar .button").removeClass("loading") @log "Publish result:", res
siteReload¶
Ricarica il contenuto del file content.json e controlla se ci sono nuovi file
Restituisce: "ok" al successo
siteSign¶
Firma un content.json del sito
Parametro | Descrizione |
---|---|
privatekey (opzionale) | Chiave privata utilizzata per firmare (predefinita: chiave privata utente corrente) |
inner_path (opzionale) | Percorso interno dei contenuto json che si vuole firmare (predefinito: content.json) |
remove_missing_optional (opzionale) | Rimuove da content.json i file opzionali non più presenti nella cartella (predefinito: False) |
Restituisce: "ok"
al successo, altrimenti il messaggio di errore.
Nota: Utilizzare "stored" come chiave privata se è definita in users.json (es siti clonati)
Esempio:
if @site_info["privatekey"] # Chiave privata salvata in users.json @cmd "siteSign", ["stored", "content.json"], (res) => @log "Sign result", res
siteUpdate¶
Forza il controllo e scarica il contenuto modificato dagli altri peer (necessario solo se l'utente è in modalità passiva e utilizzando una vcchia versione di Zeronet)
Parametro | Descrizione |
---|---|
address | Indirizzo che il sito vuole aggiornare (consentito solo per il sito corrente senza autorizzazione ADMIN) |
Restituisce: Niente.
Esempio:
# Aggiornamento manuale del sito per connessioni passive updateSite: => $("#passive_error a").addClass("loading").removeClassLater("loading", 1000) @log "Updating site..." @cmd "siteUpdate", {"address": @site_info.address}
userGetSettings¶
Ottiene le impostazioni salvate dell'utente
Restituisce: Le impostazioni utente specifiche del sito salvate utilizzando userSetSettings.
userSetSettings¶
Setta le impostazioni utente specifiche del sito.
Parametro | Descrizione |
---|---|
settings | Le impostazioni utente specifiche del sito che si vogliono salvare. |
Restituisce: "ok"
al successo.
Plugin: Bigfile¶
BigfileUploadInit¶
Inizializza un nuovo endpoint di trasferimento per un file grande.
Parametro | Descrizione |
---|---|
inner_path | Percorso del trasferimento |
size | Dimensione del file |
Restituisce: Un dizionario con le informazioni sul trasferimento:
Parametro | Descrizione |
---|---|
url | Endpoint Http del trasferimento |
piece_size | Dimensione di ogni parte del file firmata separatamente |
inner_path | Percorso del file all'interno del sito |
file_relative_path | Percorso del file relativo a content.json |
Nota: I caratteri non ascii non supportati verranno automaticamente rimossi dai valori di
inner_path
efile_relative_path
Esempio
var input = document.createElement('input') document.body.appendChild(input) input.type = "file" input.style.visibility = "hidden" input.onchange = () => { var file = input.files[0] page.cmd("bigfileUploadInit", ["optional/"+file.name, file.size], (init_res) => { var formdata = new FormData() formdata.append(file.name, file) var req = new XMLHttpRequest() req.upload.addEventListener("progress", console.log) req.upload.addEventListener("loadend", () => page.cmd("wrapperConfirm", ["Upload finished!", "Open file"], () => { window.top.location = init_res.inner_path } ) ) req.withCredentials = true req.open("POST", init_res.url) req.send(formdata) }) } input.click()
Plugin: Chart¶
chartDbQuery¶
Esegue la query sul database grafico
Argomenti e valore restituito: uguale a dbQuery [todo] sistemare il link
chartGetPeerLocations¶
Ottiene un elenco di peer univoco dal client.
Restituisce: Un elenco di peer univoci.
Esempio:
Page.cmd("chartGetPeerLocations") > [ > {lat: 43.6655, city: "Toronto", ping: null, lon: -79.4204, country: "Canada"}, > ... > ]
Plugin: Cors¶
Consente l'accesso ai file tra siti attraverso la cartella virtuale /cors-siteaddress/ e valida le query tra database tra siti utilizzando il comando API as.
corsPermission¶
Richiede la risorsa tra origini diverse condividendo i permessi con il sito indicato.
Parametro | Descrizione |
---|---|
address | L'indirizzo del sito per il quale si viole ottenere l'accesso cors |
Restituisce: "ok"
al successo.
Dopo che il permesso è concesso i file dell'altro sito saranno disponibili nella cartella virtuale /cors-siteaddress/ attraverso una richiesta http o dal comando API fileGet.
Il sito verrà aggiunto al client dell'utente se richiesto.
Plugin: Multiuser¶
Nota
Il seguente comando può essere eseguito solamente da un sito con il permesso "ADMIN".
userLoginForm¶
Richiesta di accesso con chiave privata.
Info
Il plugin Multiuser utilizzerà questa chiave privata, la convertirà in un seed master
e imposterà un cookie nel browser (es. master_address=1bc83cc...
); si può specificare
quale utente utilizzare come per tutte le richieste seguenti.
Questo cookie è spedito dal UiWrapper come parte della sua richiesta di connessione WebSocket. Questo metodo è stato scelto perchè non richiede la modifica della richiesta esistente e inoltre lavora comunicando ai client ZeroNet che sono ospitati in una macchina separata (come i proxy ZeroNet).
Esempio
zeroframe = new ZeroFrame() zeroframe.cmd 'userLoginForm', []
const zeroframe = new ZeroFrame(); zeroframe.cmd('userShowMasterSeed', []);
Risultato:
Nessuno, il messaggio di login apparirà in una finestra non accessibile all'iframe.
userShowMasterSeed¶
Richiesta di mostrare la chiave privata dell'utente.
Esempio
zeroframe = new ZeroFrame() zeroframe.cmd 'userShowMasterSeed', []
const zeroframe = new ZeroFrame(); zeroframe.cmd('userShowMasterSeed', []);
Risultato:
Nessuno, la chiave privata apparirà in una finestra non accessibile all'iframe.
Plugin: CryptMessage¶
userPublickey¶
Ottiene la chiave pubblica specifica del sito dell'utente.
Parametro | Descrizione |
---|---|
index (opzionale) | La chiave sub-pubblica all'interno del sito (predefinito: 0) |
Restituisce: La chiave pubblica codificata in Base64.
eciesEncrypt¶
Cripta un testo utilizzando una chiave pubblica.
Parametro | Descrizione |
---|---|
text | Il testo da criptare |
publickey (opzionale) | Indice (intero) della chiave pubblica dell'utente o chiave pubblica codificata in Base64 (predefinito: 0) |
return_aes_key (opzionale) | Ottiene la chiave AES utilizzata per criptare (predefinito: False) |
Restituisce: Testo criptato nel formato Base64 o [Testo criptato nel formato Base64, chiave AES in formato Base6].
eciesDecrypt¶
Tenta di decodificare un elenco di testi
Parametro | Descrizione |
---|---|
params | Un testo o elenco di testi criptati |
privatekey (opzionale) | Indice (intero) della chiave privata dell'utente o chiave privata codificata in Base64 (predefinito: 0) |
Restituisce: Testo decodificato o matrice di testi decodificati (null per decodifiche fallite).
aesEncrypt¶
Cripta un testo utilizzando la chiave e l'iv
Parametro | Descrizione |
---|---|
text | Un testo criptato utilizzando AES |
key (opzionale) | Password codificata in Base64 (predefinita: genera una nuova) |
iv (opzionale) | IV codificato in Base64 (predefinito: genera uno nuovo) |
Restituisce: [chiave codificata in Base64, IV codificato in Base64, testo criptato codificato in Base64].
aesDecrypt¶
Decodifica il testo utilizzando IV e la chiave AES
Parametro | Descrizione |
---|---|
iv | IV in formato Base64 |
encrypted_text | Testo criptato in formato Base64 |
encrypted_texts | Matrice di coppie [IV codificato in Base64, testo criptato codificato in Base64] |
key | Password per il testo codificata in Base64 |
keys | Chiavi per la decofica (tenta ogniuna per ogni coppia) |
Restituisce: Testo decodificato o matrice di testi decodificati.
Plugin: Newsfeed¶
feedFollow¶
Imposta le query sql di sottoscrizione.
La query sql deve risultare come una serie di righe con colonne:
Campo | Descrizione |
---|---|
type | Tipo: post, article, comment, mention |
date_added | Data evento |
title | Prima riga visualizzata dell'evento |
body | Seconda e terza riga dell'evento |
url | Link alla pagina dell'evento |
Parametro | Descrizione |
---|---|
feeds | Formato: {"nome della query": [query SQL, [parametro1, parametro2, ...], ...}, i parametri verranno esclusi, uniti da , inseriti al posto di :params nella query sql. |
Restituisce: "ok"
.
Esempio:
# Sottoscrive i post ZeroBlog query = " SELECT post_id AS event_uri, 'post' AS type, date_published AS date_added, title AS title, body AS body, '?Post:' || post_id AS url FROM post " params = [""] Page.cmd feedFollow [{"Posts": [query, params]}]
feedListFollow¶
Restituisce le tracce attualmente sottoscritte
Restituisce: Le tracce attualmente sottoscritte nello stesso formato del comendo feedFollow.
feedQuery¶
Esegue tutte le query per i siti/pagine sottoscritti nella traccia di notifiche dell'utente.
Restituisce: Il risultato delle query sql sottoscritte.
Parametro | Descrizione |
---|---|
limit | Limite dei risultati per sito sottoscritto (predefinito: 10) |
day_limit | Eventi non più vecchi di questi giorni (predefinito: 3) |
Plugin: MergerSite¶
mergerSiteAdd¶
Inizia a scaricare nuovo/i sito/i distribuito.
Parametro | Descrizione |
---|---|
addresses | Indirizzo del sito o elenco di indirizzi di siti |
mergerSiteDelete¶
Ferma la distribuzione e cancella un sito distribuito.
Parametro | Descrizione |
---|---|
address | Indirizzo del sito |
mergerSiteList¶
Restituisce i siti distribuiti.
Parametro | Descrizione |
---|---|
query_site_info | Se true, restituisce informazioni dettagliate per i siti distribuiti |
Plugin: Mute¶
muteAdd¶
Aggiunge un utente alla lista degli esclusi. (Richiede la conferma per siti non-admin)
Parametro | Descrizione |
---|---|
auth_address | Nome della cartella dei dati utente |
cert_user_id | Nome certificato dell'utente |
reason | Motivo dell'esclusione |
Restituisce: "ok"
se confermato.
Esempio:
Page.cmd("muteAdd", ['1GJUaZMjTfeETdYUhchSkDijv6LVhjekHz','helloworld@kaffie.bit','Spammer'])
muteRemove¶
Rimuove un utente dalla lista degli esclusi. (Richiede la conferma per siti non-admin).
Parametro | Descrizione |
---|---|
auth_address | Nome della cartella dei dati utente |
Restituisce: "ok"
se confermato.
Esempio:
Page.cmd("muteRemove", '1GJUaZMjTfeETdYUhchSkDijv6LVhjekHz')
muteList¶
Elenco utenti esclusi. (Richiede il permesso admin sul sito).
Restituisce: Matrice di utenti esclusi.
Plugin: OptionalManager¶
optionalFileList¶
Restituisce una matrice di informazioni sui file opzionali.
Parametro | Descrizione |
---|---|
address | L'indirizzo del sito di cui estrarre la lista dei file opzionali (predefinito: sito corrente) |
orderby | Ordine dei file opzionali restituiti (predefinito: time_downloaded decrescente) |
limit | Numero massimo di file opzionali restituiti (predefinito: 10) |
Restituisce: Le righe del database con le seguenti colonne per ogni file opzionale restituito:
Column name | Descrizione |
---|---|
file_id | L'ID del file |
site_id | L'ID del sito di origine del file |
inner_path | Il percorso del file partendo dalla radice del sito |
hash_id | La chiave del file |
size | La dimensione del file (in byte) |
peer | Quanti peer ha questo file |
uploaded | Quanti byte di questo file sono stati caricati su altri peer |
is_downloaded | Se questo file è stata scaricato completamente |
is_pinned | Se questo file è stato marcato |
time_added | Quando è stato aggiunto questo file |
time_downloaded | Quando si è completato lo scaricamento di questo file |
time_accessed | Quando è stato eseguito l'ultimo accesso a questo file |
optionalFileInfo¶
Richiesta di informazioni di un file opziona dato il suo persorso.
Parametro | Descrizione |
---|---|
inner_path | Il percorso del file partendo dalla radice del sito |
Restituisce: Riga del database con le seguenti colonne:
Nome colonna | Descrizione |
---|---|
file_id | L'ID del file |
site_id | L'ID del sito cui appartiene il file |
inner_path | Il percorso del file partendo dalla radice del sito |
hash_id | La chiave del file |
size | La dimensione del file (in byte) |
peer | Quanti peer ha il file |
uploaded | Quanti byte del file sono stati caricati sui peer |
is_downloaded | Se il file è stato scaricato completamente |
is_pinned | Se questo file è stato marcato |
time_added | Quando è stato aggiunto il file |
time_downloaded | Quando è terminato lo scaricamento del file |
time_accessed | L'ultimo accesso al file |
optionalFilePin¶
Marca un file opzionale scaricato. Ora il fiel è escluso dalla pulizia automatica dei file opzionali.
Parametro | Descrizione |
---|---|
inner_path | Il percorso del file |
address | Indirizzo del sito (predefinito: sito corrente) |
optionalFileUnpin¶
Rimuove la marcatura di un file opzionale scaricato. Ora il file è incluso nella pulizia automatica dei file opzionali.
Parametro | Descrizione |
---|---|
inner_path | Il percorso del file |
address | Indirizzo del sito (predefinito: sito corrente) |
optionalFileDelete¶
Delete a downloaded optional file.
Parametro | Descrizione |
---|---|
inner_path | Il percorso del file |
address | Indirizzo del sito (predefinito: sito corrente) |
optionalLimitStats¶
Restituisce lo spazio attualmente occupato dai file opzionali.
Restituisce: Statistiche di spazio limite, utilizzato e libero.
optionalLimitSet¶
Imposta il limite dei file opzionali.
Parametro | Descrizione |
---|---|
limit | Massima dimensione in GB utilizzata dai file opzionali o percentuale di spazio utilizzato |
optionalHelpList¶
Elenca le cartelle di scaricamento automatico dei file opzionali.
Parametro | Descrizione |
---|---|
address | Indirizzo del sito di cui elencare le cartelle (predefinito: sito corrente) |
Restituisce: Cartelle di scaricamento automatico e descrizioni come oggetto JavaScript.
optionalHelp¶
Aggiunge una cartella alla lista degli scaricamenti automatici.
Parametro | Descrizione |
---|---|
directory | Cartella da aggiungere all'elenco di scaricamento automatico |
title | Titolo dei dati (visualizzata in ZeroHello) |
address | Indirizzo del sito che si vuole aggiungere alla cartella di scaricamento automatico (predefinto: sito corrente) |
--- |
optionalHelpRemove¶
Previene lo scaricamento automatico dei file opzionali in una cartella. Effettivo solo se optionalHelp è attivo sul sito.
Parametro | Descrizione |
---|---|
directory | Cartella da eliminare dall'elenco di auto scaricamento |
address | Indirizzo del sito (predefinito: sito corrente) |
optionalHelpAll¶
Aiuta a scaricare ogni nuovo file opzionale caricato sul sito
Parametro | Descrizione |
---|---|
value | Abilita o disabilita lo scaricamento automatico |
address | Indirizzo del sito interessato (predefinito: sito corrente) |
Plugin: UiPluginManager¶
pluginAddRequest¶
Chiede all'utente di installare un nuovo plugin da una cartella del sito corrente.
Parametro | Descrizione |
---|---|
inner_path | Cartella del plugin |
Esempio:
Page.cmd("pluginAddRequest", "plugins/Example")
La cartella del plugin deve contenere un file plugin_info.json che contiene il nome del plugin, una descrizione breve e il numero di versione (rev).
Esempio plugins/Esempio/plugin_info.json:
{ "name": "Plugin esempio", "description": "Solo un esempio di un plugin di terze parti", "rev": 5 }
Restituisce: "ok" al successo
Nota Si possono visualizzare le versioni dei plugin attualmente installati nel nodo informazioni del server plugins_rev.
Comandi amministratore¶
(richiede l'autorizzazione ADMIN in data/sites.json)
as¶
Esegue il comando nel contesto di un altro sito
Parametro | Descrizione |
---|---|
address | L'indirizzo del contesto del sito |
cmd | Nome del comando API |
arguments | Argomenti del comando API |
Restituisce: Valore restituito dal comando
Esempio
Page.cmd("as", ["138R53t3ZW7KDfSfxVpWUsMXgwUnsDNXLP", "siteSetLimit", 20], console.log )
address = "138R53t3ZW7KDfSfxVpWUsMXgwUnsDNXLP" query = "SELECT * FROM json WHERE file_name = :file_name" params = {"file_name": "data.json"} Page.cmd("as", [address, "dbQuery", [query, params]], function(res) { console.log(res.length) } )
certList¶
Restituisce le informazioni relative ai certificati dei fornitori di identità conosciuti.
Restituisce: Un elenco di oggetti ognuno rappresentante un certificato da un fornitore di identità.
Esempio
Page.cmd("certSelect")
[ ... { "auth_type": "web", "domain": "zeroid.bit", "selected": false, "auth_user_name": "username", "auth_address": "1GUDV..." }, ... ]
certSet¶
Imposta il certificato utilizzato per il sito corrente.
Parametro | Descrizione |
---|---|
domain | Dominio dell'emmittente del certificato |
Restituisce: Niente
channelJoinAllsite¶
Richiede la notifica di ogni evento del sito.
Parametro | Descrizione |
---|---|
channel | Canale da seguire (vedere channelJoin) |
Restituisce: Niente
Restituisce: ok
configSet¶
Crea o modifica una informazione nel file di configurazione di ZeroNet. (predefinito zeronet.conf)
Parametro | Descrizione |
---|---|
key | Nome dell'informazione della configurazione |
value | Nuovo valore dell'informazione della configurazione |
Restituisce: ok
serverPortcheck¶
Inizia il controllo se la porta è aperta
Restituisce: True (porta aperta) or False (porta chiusa)
serverShutdown¶
Ferma l'esecuzione del client ZeroNet.
Restituisce: Niente
serverUpdate¶
Riscarica ZeroNet da Github.
Restituisce: Niente
siteClone¶
Copia i file di un sito in uno nuovo.
Ogni file e cartella vengono saltate se esiste la versione consuffisso -default
e la versione con suffisso verrà utilizzata al suo posto.
Es. Se c'è una cartella data
e una data-default
: la cartella data
non verrà copiata e la cartella data-default
verrà rinominata in data
.
Parametro | Descrizione |
---|---|
address | Indirizzo del sito da copiare |
root_inner_path | La cartella sorgente del nuovo sito |
Restituisce: Niente, reindirizza automaticamente al nuovo sito al completamento
siteList¶
Restituisce: Elenco siteInfo di tutti i siti scaricati
sitePause¶
Mette in pausa la distribuzione del sito
Parametro | Descrizione |
---|---|
address | Indirizzo del sito da mettere in pausa |
Restituisce: Niente
siteResume¶
Riprendere a distribuire il sito
Parametro | Descrizione |
---|---|
address | Indirizzo del sito da riprendere a distribuire |
Restituisce: Niente