added site creator command

This commit is contained in:
Kevin Froman 2019-11-04 04:52:38 -06:00
parent ff9bdc690e
commit 9fa05d6e1f
7 changed files with 61 additions and 12 deletions

View File

@ -1,4 +1,4 @@
from typing import Union
from typing import Union, Tuple
import tarfile
import io
import os
@ -6,8 +6,11 @@ import os
from coredb import blockmetadb
from onionrblocks import onionrblockapi
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:
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 None
def create_site(admin_pass: DeterministicKeyPassphrase, directory:str='.')->UserID:
public_key, private_key = generate.generate_deterministic(admin_pass)
def create_site(admin_pass: DeterministicKeyPassphrase, directory:str='.')->Tuple[UserID, BlockHash]:
public_key, private_key = generate_deterministic(admin_pass)
raw_tar = io.BytesIO()
@ -36,6 +39,6 @@ def create_site(admin_pass: DeterministicKeyPassphrase, directory:str='.')->User
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)

View File

@ -26,7 +26,8 @@ def insert_block(data: Union[str, bytes], header: str ='txt',
our_private_key = crypto.priv_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_pub_key = crypto.cryptoutils.get_pub_key_from_priv(our_private_key)

View File

@ -74,7 +74,9 @@ def register():
try:
if cmd != 'start': os.chdir(os.environ['ORIG_ONIONR_RUN_DIR'])
except KeyError: pass
arguments.get_func(cmd)()
try:
arguments.get_func(cmd)()
except KeyboardInterrupt: pass
except onionrexceptions.NotFound:
if not register_plugin_commands(cmd) and not is_help_cmd:
recommend.recommend()

View File

@ -30,7 +30,7 @@ from .. import softreset # command to delete onionr blocks
from .. import restartonionr # command to restart Onionr
from .. import runtimetestcmd
from .. import motdcreator
from httpapi import onionrsitesapi
from .. import sitecreator
import onionrexceptions
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,
('get-url', 'url', 'get-web'): openwebinterface.get_url,
('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,
('get-file', 'getfile'): filecommands.get_file,
('export-block', 'exportblock'): exportblocks.export_block,

View 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."

View File

@ -6,6 +6,7 @@ import nacl.encoding, nacl.signing, nacl.exceptions
from onionrutils import bytesconverter
from onionrutils import mnemonickeys
import logger
def ed_sign(data, key, encodeResult=False):
'''Ed25519 sign data'''
key = unpaddedbase32.repad(bytesconverter.str_to_bytes(key))

View File

@ -4,3 +4,5 @@ UserID = NewType('UserID', str)
UserIDSecretKey = NewType('UserIDSecretKey', str)
DeterministicKeyPassphrase = NewType('DeterministicKeyPassphrase', str)
BlockHash = NewType('BlockHash', str)