Struttura di content.json¶
Ogni sito ZeroNet ha un file content.json
. (Esempio di file content.json)
Questo file contiene, oltre ad altre cose, un elenco di tutti i file del sito e una firma creata con la chiave privata dell'autore. Questo per assicurare l'autenticità dei file del sito ed evitare le manomissioni (i.e.: solo l'autore, o persone autorizzate, possono modificare il contenuto del sito).
Qui c'è una lista di chiavi content.json
supportate:
Generato automaticamente¶
Queste chiavi sono aggiunte automaticamente quando il sito viene creato o clonato.
address¶
L'indirizzo del sito
Esempio: 1TaLk3zM7ZRskJvrh3ZNCDVGXvkJusPKQ
address_index¶
L'indice della sottochiave BIP32 del sito del seed BIP32. Aggiunta automaticamente quando si clona un sito. Consente di recuperare la chiave privata del sito dal seed BIP32.
Esempio: 30926910
cloned_from¶
Solo per siti clonati. L'indirizzo del sito da cui è stato clonato.
Esempio: 1BLogC9LN4oPDcruNz3qo1ysa133E9AGg8
clone_root¶
Solo per siti clonati. La sotto cartella sul sito da cui è stato clonato.
Esempio: template-new
files¶
Dimensione e chiave sha512 dei file scaricati automaticamente nel sito. Aggiunto automaticamente dal comando zeronet.py siteSign siteaddress privatekey
.
Esempio:
"css/all.css": { "sha512": "869b09328f07bac538c313c4702baa5276544346418378199fa5cef644c139e8", "size": 148208 }
files_optional¶
Dimensione e chiave sha512 per file opzionali contenuti nel sito. Aggiunto automaticamente dal comando zeronet.py siteSign siteaddress privatekey
.
Esempio:
"data/myvideo.mp4": { "sha512": "538c09328aa52765443464135cef644c144346418378199fa5cef61837819538", "size": 832103 }
modified¶
Data in cui è stato generato il file content.json.
Esempio: 1425857522.076
sign (deprecato)¶
Firma ECDSA del contenuto del file content.json (chiavi ordinate, senza spazi vuoti e senza i nodi sign
e signers_sign
). Per retrocompatibilità, verrà rimossa a breve.
Esempio:
"sign": [ 43117356513690007125104018825100786623580298637039067305407092800990252156956, 94139380599940414070721501960181245022427741524702752954181461080408625270000 ],
signers_sign¶
Possibile indirizzo del firmatario della root content.json firmato utilizzando la chiave privata del sito. Sono consentiti più valori abilitando la funzionalità Multisig.
Formato della stringa firmata: [numero_dei_firmatari_richiesto]:[indirizzi firmatari],[indirizzi firmatari]
Esempio:
signs_required: 1:1PcxwuHYxuJEmM4ydtB1vbiAY6WkNgsz9G,1CK6KHY6MHgYvmRQ4PAafKYDrg1ejbH1cE signers_sign: MEUCIQDuz+CzOVvFkv1P2ra9i5E1p1G0/1cOGecm7GpLpMLhuwIgBIbCL0YHXD1S2+x48QS5VO/rISrkdLiUR+o+x1X0y1A=
Il precedente messaggio è firmato utilizzando l'indirizzo "1PcxwuHYxuJEmM4ydtB1vbiAY6WkNgsz9G".
signs¶
Firma ECDSA per il contenuto del file content.json:
sign
,signs
nodi JSON rimossi- JSON scaricati con le chiavi ordinate alfabeticamente, senza spazi
- Firma generata sui dati scaricati, usando il formato di firma dei messaggi Electrum Bitcoin:
- Codifica messaggio:
sha256("\x18" || "Bitcoin Signed Message:\n" || num_to_var_int(len(message)) || message)
- Formato seriale:
recovery_id || r || s
, dove 27 ≤ recovery_id ≤ 30; lunghezza firma = 1 + 32 + 32 = 65 byte. - La doppia barra verticale
||
indica la concatenazione di byte.
- Codifica messaggio:
Esempio:
"signs": { "1TaLk3zM7ZRskJvrh3ZNCDVGXvkJusPKQ": "G6/QXFKvACPQ7LhoZG4fgqmeOSK99vGM2arVWkm9pV/WPCfc2ulv6iuQnuzw4v5z82qWswcRq907VPdBsdb9VRo=" },
import json import btctools privatekey = "super_secret_private_key" privatekey_address = "private_key_address" with open('content.json') as f: new_content = json.load(f) del(new_content["signs"]) # Delete old signs sign_content = json.dumps(new_content, sort_keys=True) sign = btctools.ecdsa_sign(sign_content, privatekey) new_content["signs"] = {} new_content["signs"][privatekey_address] = sign
zeronet_version¶
La versione ZeroNet utilizzata per creare il file content.json.
Esempio: 0.2.5
Impostazioni opzionali¶
Queste opzioni possono essere aggiunte se sono richieste le funzionalità.
background-color¶
Colore di sfondo del contenitore
Esempio: #F5F5F5
cloneable¶
Consente di clonare il sito se impostato a true.
Per rendere un sito correttamente clonabile serve avere una cartella separata per i file dati per una inizializzazione pulita (es. senza messaggi del blog). Per far questo serve aggiungere il suffisso -default ai file dati e cartelle. Durante il processo di copia, solo le cartelle con il suffisso -default vengono copiate. Il suffisso viene rimosso nel nuovo sito.
description¶
Descrizione del sito, visualizzata sotto il titolo del sito in ZeroHello.
Esempio: Demo formum decentralizzato
domain¶
Nome del dominio Namecoin del sito. ZeroHello si collegherà a questo se l'utente ha il plugin Zeroname abilitato.
Esempio: Blog.ZeroNetwork.bit
ignore¶
Non firmare i file con quesa modello.
Esempio: ((js|css)/(?!all.(js|css))|data/users/.*)
(ignora tutti i file js e css eccetto all.js e all.css e non aggiunge niente dalla cartella data/users/
)
Nota: Alcune restrizioni si applicano alle espressioni regolari.
includes¶
Include un altro content.json nel sito. Questo viene usato tipicamente per file content.json successivi utilizzati per gestire i dati utente.
Esempio:
"includes": { "data/users/content.json": { "signers": [ # Possibili indirizzi dei firmatari del file "1LSxsKfC9S9TVXGGNSM3vPHjyW82jgCX5f" ], "signers_required": 1 # Il *numero* di firme valide per accettare il file (possibilità Multisig), "files_allowed": "data.json", # Modello dei file consentiti nel file include "includes_allowed": false, # Abilitazione all'inclusione ricorsiva "max_size": 10000, # Massima dimensione consentita per i file content.json inclusi e i file che firmano (in byte) } }
merged_type¶
Parte dell'unione di cui il file fa parte.
Esempio: ZeroMe
optional¶
Modello file opzionali.
Esempio: (data/mp4/.*|updater/.*)
(qualsiasi cosa nelle cartella data/mp4
e updater
è opzionale)
Nota: Alcune restrizioni si applicano alle espressioni regolari.
signs_required¶
Il numero di firme valide richieste per accettare il file. Consente la funzionalità Multisig.
Esempio: 1
title¶
Il titolo del sito, visibile nel titolo del browser e su ZeroHello.
Esempio: ZeroTalk
translate¶
I file che devono essere tradotti. (utilizzare il file linguaggio json nella cartella languages
)
Esempio: ["index.html", "js/all.js"]
favicon¶
La favicon del sito. Sostituisce il logo di default ZeroNet con una icona specifica del sito. Può essere una .ico, .png, .svg, etc.
Esempio: favicon.ico
user_contents¶
Regole dei contenuti utente consentiti all'interno della cartella corrente.
Nodo | Descrizione |
---|---|
archived | Cancella la cartella del contenuto utente specificata che è firmata prima della data specificata (key: nome cartella, value: timestamp) |
archived_before | Cancella tutte le cartelle dei contenuti utente firmate prima della data specifica |
cert_signers | Domini accettati e indirizzi dei firmatari validi |
cert_signers_pattern | Modello regexp dei firmatari certificati accettati |
permission_rules | Nomi file consentiti e dimensione totale delle cartelle in base a domini certificati o metodi di autorizzazione |
permissions | Autorizzazioni per utente. (false = utente bloccato) |
Esempio:
"user_contents": { "archived": { "1165u6pt5mQNFjyhMVwy6azB7bZuQGLA9b": 1523088096 }, "archived_before": 1523088096, "cert_signers": { "zeroid.bit": [ "1iD5ZQJMNXu43w1qLB8sfdHVKppVMduGz" ] }, "cert_signers_pattern": "1Zero[0-9].*", "permission_rules": { ".*": { "files_allowed": "data.json", "files_allowed_optional" : "\\.(png|jpeg|jpg|gif|webm|mp4|ogg|mp3|pdf|epub|zip|tar\\.gz)(\\.piecemap\\.msgpack)", "max_size": 10000, "max_size_optional": 10000000 }, "bitid/.*@zeroid.bit": { "max_size": 40000 }, "bitmsg/.*@zeroid.bit": { "max_size": 15000 } }, "permissions": { "bad@zeroid.bit": false, "nofish@zeroid.bit": { "max_size": 100000 } } }
Nota: Alcune restrizioni si applicano alle espressioni regolari.
viewport¶
Contenuto del meta tag viewport. (utilizzato per le pagine mobile-friendly)
Esempio: width=device-width, initial-scale=1.0
Limitazioni espressioni regolari¶
Per evitare il complesso attacco algoritmico ReDoS, le seguenti restrizioni si applicano ad ogni modello:
- il carattere
.
è obbligatorio prima della ripetizione dei caratteri*,+,{
- In un singolo modello sono consentite al massimo 9 ripetizioni
- La massima lunghezza di un modello è 255 caratteri
Esempi:¶
- non è consentito
((?!json).)*$
, per la)
prima del carattere*
. Correzione possibile:.*(?!json)$
- non è consentito
(.*.epub|.*.jpg|.*.jpeg|.*.png|data/.*.gif|.*.avi|.*.ogg|.*.webm|.*.mp4|.*.mp3|.*.mkv|.*.eot)
, perché ci sono 12.*
. Possibile soluzione:.*(epub|jpg|jpeg|png|data/gif|avi|ogg|webm|mp4|mp3|mkv|eot)