added site creator command
This commit is contained in:
parent
ff9bdc690e
commit
9fa05d6e1f
@ -1,4 +1,4 @@
|
|||||||
from typing import Union
|
from typing import Union, Tuple
|
||||||
import tarfile
|
import tarfile
|
||||||
import io
|
import io
|
||||||
import os
|
import os
|
||||||
@ -6,8 +6,11 @@ import os
|
|||||||
from coredb import blockmetadb
|
from coredb import blockmetadb
|
||||||
from onionrblocks import onionrblockapi
|
from onionrblocks import onionrblockapi
|
||||||
from onionrblocks import insert
|
from onionrblocks import insert
|
||||||
from onionrtypes import UserID, DeterministicKeyPassphrase # Import types. Just for type hiting
|
|
||||||
from onionrcrypto import generate
|
# Import types. Just for type hiting
|
||||||
|
from onionrtypes import UserID, DeterministicKeyPassphrase, BlockHash
|
||||||
|
|
||||||
|
from onionrcrypto import generate_deterministic
|
||||||
|
|
||||||
def find_site_gzip(user_id: str)->str:
|
def find_site_gzip(user_id: str)->str:
|
||||||
sites = blockmetadb.get_blocks_by_type('osite')
|
sites = blockmetadb.get_blocks_by_type('osite')
|
||||||
@ -25,8 +28,8 @@ def get_file(user_id, file)->Union[bytes, None]:
|
|||||||
return site.extractfile(file)
|
return site.extractfile(file)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def create_site(admin_pass: DeterministicKeyPassphrase, directory:str='.')->UserID:
|
def create_site(admin_pass: DeterministicKeyPassphrase, directory:str='.')->Tuple[UserID, BlockHash]:
|
||||||
public_key, private_key = generate.generate_deterministic(admin_pass)
|
public_key, private_key = generate_deterministic(admin_pass)
|
||||||
|
|
||||||
raw_tar = io.BytesIO()
|
raw_tar = io.BytesIO()
|
||||||
|
|
||||||
@ -36,6 +39,6 @@ def create_site(admin_pass: DeterministicKeyPassphrase, directory:str='.')->User
|
|||||||
|
|
||||||
raw_tar.seek(0)
|
raw_tar.seek(0)
|
||||||
|
|
||||||
insert.insert(raw_tar.read())
|
block_hash = insert(raw_tar.read(), signing_key=private_key)
|
||||||
|
|
||||||
return public_key
|
return (public_key, block_hash)
|
||||||
|
@ -26,7 +26,8 @@ def insert_block(data: Union[str, bytes], header: str ='txt',
|
|||||||
our_private_key = crypto.priv_key
|
our_private_key = crypto.priv_key
|
||||||
our_pub_key = crypto.pub_key
|
our_pub_key = crypto.pub_key
|
||||||
|
|
||||||
if signingKey != '':
|
if signing_key != '':
|
||||||
|
# if it was specified to use an alternative private key
|
||||||
our_private_key = signing_key
|
our_private_key = signing_key
|
||||||
our_pub_key = crypto.cryptoutils.get_pub_key_from_priv(our_private_key)
|
our_pub_key = crypto.cryptoutils.get_pub_key_from_priv(our_private_key)
|
||||||
|
|
||||||
|
@ -74,7 +74,9 @@ def register():
|
|||||||
try:
|
try:
|
||||||
if cmd != 'start': os.chdir(os.environ['ORIG_ONIONR_RUN_DIR'])
|
if cmd != 'start': os.chdir(os.environ['ORIG_ONIONR_RUN_DIR'])
|
||||||
except KeyError: pass
|
except KeyError: pass
|
||||||
arguments.get_func(cmd)()
|
try:
|
||||||
|
arguments.get_func(cmd)()
|
||||||
|
except KeyboardInterrupt: pass
|
||||||
except onionrexceptions.NotFound:
|
except onionrexceptions.NotFound:
|
||||||
if not register_plugin_commands(cmd) and not is_help_cmd:
|
if not register_plugin_commands(cmd) and not is_help_cmd:
|
||||||
recommend.recommend()
|
recommend.recommend()
|
||||||
|
@ -30,7 +30,7 @@ from .. import softreset # command to delete onionr blocks
|
|||||||
from .. import restartonionr # command to restart Onionr
|
from .. import restartonionr # command to restart Onionr
|
||||||
from .. import runtimetestcmd
|
from .. import runtimetestcmd
|
||||||
from .. import motdcreator
|
from .. import motdcreator
|
||||||
from httpapi import onionrsitesapi
|
from .. import sitecreator
|
||||||
|
|
||||||
import onionrexceptions
|
import onionrexceptions
|
||||||
from onionrutils import importnewblocks # func to import new blocks
|
from onionrutils import importnewblocks # func to import new blocks
|
||||||
@ -50,7 +50,7 @@ def get_arguments()->dict:
|
|||||||
('openhome', 'gui', 'openweb', 'open-home', 'open-web'): openwebinterface.open_home,
|
('openhome', 'gui', 'openweb', 'open-home', 'open-web'): openwebinterface.open_home,
|
||||||
('get-url', 'url', 'get-web'): openwebinterface.get_url,
|
('get-url', 'url', 'get-web'): openwebinterface.get_url,
|
||||||
('addhtml', 'add-html'): filecommands.add_html,
|
('addhtml', 'add-html'): filecommands.add_html,
|
||||||
('addsite', 'add-site'): onionrsitesapi.sitefiles.create_site,
|
('addsite', 'add-site', 'update-site', 'updatesite'): sitecreator.create_multipage_site,
|
||||||
('addfile', 'add-file'): filecommands.add_file,
|
('addfile', 'add-file'): filecommands.add_file,
|
||||||
('get-file', 'getfile'): filecommands.get_file,
|
('get-file', 'getfile'): filecommands.get_file,
|
||||||
('export-block', 'exportblock'): exportblocks.export_block,
|
('export-block', 'exportblock'): exportblocks.export_block,
|
||||||
|
40
onionr/onionrcommands/sitecreator.py
Normal file
40
onionr/onionrcommands/sitecreator.py
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import sys
|
||||||
|
import getpass
|
||||||
|
|
||||||
|
from httpapi import onionrsitesapi
|
||||||
|
import onionrexceptions
|
||||||
|
import logger
|
||||||
|
from etc import onionrvalues
|
||||||
|
|
||||||
|
def create_multipage_site():
|
||||||
|
error_encountered = False
|
||||||
|
try:
|
||||||
|
directory = sys.argv[2]
|
||||||
|
except IndexError:
|
||||||
|
directory = '.'
|
||||||
|
try:
|
||||||
|
passphrase = sys.argv[3]
|
||||||
|
except IndexError:
|
||||||
|
logger.warn('''It is critical that this passphrase is long.
|
||||||
|
If you want to update your site later you must remember the passphrase.''', terminal=True)
|
||||||
|
logger.info(f'Please enter a site passphrase of at least {onionrvalues.PASSWORD_LENGTH} characters.', terminal=True)
|
||||||
|
passphrase = getpass.getpass()
|
||||||
|
logger.info('Confirm:', terminal=True)
|
||||||
|
confirm = getpass.getpass()
|
||||||
|
if passphrase != confirm:
|
||||||
|
logger.error('Passphrases do not match', terminal=True)
|
||||||
|
error_encountered = True
|
||||||
|
|
||||||
|
if len(passphrase) < onionrvalues.PASSWORD_LENGTH:
|
||||||
|
error_encountered = True
|
||||||
|
logger.error(f'Passphrase must be at least {onionrvalues.PASSWORD_LENGTH} characters.', terminal=True)
|
||||||
|
|
||||||
|
if error_encountered:
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
results = onionrsitesapi.sitefiles.create_site(passphrase, directory=directory)
|
||||||
|
results = (results[0].replace('=', ''), results[1])
|
||||||
|
logger.info(f'Site address {results[0]}', terminal=True)
|
||||||
|
logger.info(f'Block for this version {results[1]}', terminal=True)
|
||||||
|
|
||||||
|
create_multipage_site.onionr_help = "[directory path (default relative)] - packages a whole directory and makes it available as an Onionr site."
|
@ -6,6 +6,7 @@ import nacl.encoding, nacl.signing, nacl.exceptions
|
|||||||
from onionrutils import bytesconverter
|
from onionrutils import bytesconverter
|
||||||
from onionrutils import mnemonickeys
|
from onionrutils import mnemonickeys
|
||||||
import logger
|
import logger
|
||||||
|
|
||||||
def ed_sign(data, key, encodeResult=False):
|
def ed_sign(data, key, encodeResult=False):
|
||||||
'''Ed25519 sign data'''
|
'''Ed25519 sign data'''
|
||||||
key = unpaddedbase32.repad(bytesconverter.str_to_bytes(key))
|
key = unpaddedbase32.repad(bytesconverter.str_to_bytes(key))
|
||||||
|
@ -3,4 +3,6 @@ from typing import NewType
|
|||||||
UserID = NewType('UserID', str)
|
UserID = NewType('UserID', str)
|
||||||
UserIDSecretKey = NewType('UserIDSecretKey', str)
|
UserIDSecretKey = NewType('UserIDSecretKey', str)
|
||||||
|
|
||||||
DeterministicKeyPassphrase = NewType('DeterministicKeyPassphrase', str)
|
DeterministicKeyPassphrase = NewType('DeterministicKeyPassphrase', str)
|
||||||
|
|
||||||
|
BlockHash = NewType('BlockHash', str)
|
Loading…
Reference in New Issue
Block a user