Module onionr.httpapi.miscpublicapi.endpoints
Onionr - Private P2P Communication
Misc public API endpoints too small to need their own file and that need access to the public api inst
Source code
'''
Onionr - Private P2P Communication
Misc public API endpoints too small to need their own file and that need access to the public api inst
'''
'''
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
'''
from flask import Response, Blueprint, request, send_from_directory, abort, g
from . import getblocks, upload, announce
from coredb import keydb
import config
class PublicEndpoints:
def __init__(self, public_api):
public_endpoints_bp = Blueprint('publicendpoints', __name__)
self.public_endpoints_bp = public_endpoints_bp
@public_endpoints_bp.route('/')
def banner():
# Display a bit of information to people who visit a node address in their browser
try:
with open('../static-data/index.html', 'r') as html:
resp = Response(html.read(), mimetype='text/html')
except FileNotFoundError:
resp = Response("")
return resp
@public_endpoints_bp.route('/getblocklist')
def get_block_list():
'''Get a list of blocks, optionally filtered by epoch time stamp, excluding those hidden'''
return getblocks.get_public_block_list(public_api, request)
@public_endpoints_bp.route('/getdata/<name>')
def get_block_data(name):
# Share data for a block if we have it and it isn't hidden
return getblocks.get_block_data(public_api, name)
@public_endpoints_bp.route('/www/<path:path>')
def www_public(path):
# A way to share files directly over your .onion
if not config.get("www.public.run", True):
abort(403)
return send_from_directory(config.get('www.public.path', 'static-data/www/public/'), path)
@public_endpoints_bp.route('/ping')
def ping():
# Endpoint to test if nodes are up
return Response("pong!")
@public_endpoints_bp.route('/pex')
def peer_exchange():
response = ','.join(keydb.listkeys.list_adders(recent=3600))
if len(response) == 0:
response = ''
return Response(response)
@public_endpoints_bp.route('/announce', methods=['post'])
def accept_announce():
'''Accept announcements with pow token to prevent spam'''
g.shared_state = public_api._too_many
resp = announce.handle_announce(request)
return resp
@public_endpoints_bp.route('/upload', methods=['post'])
def upload_endpoint():
'''Accept file uploads. In the future this will be done more often than on creation
to speed up block sync
'''
return upload.accept_upload(request)
Classes
class PublicEndpoints (public_api)
-
Source code
class PublicEndpoints: def __init__(self, public_api): public_endpoints_bp = Blueprint('publicendpoints', __name__) self.public_endpoints_bp = public_endpoints_bp @public_endpoints_bp.route('/') def banner(): # Display a bit of information to people who visit a node address in their browser try: with open('../static-data/index.html', 'r') as html: resp = Response(html.read(), mimetype='text/html') except FileNotFoundError: resp = Response("") return resp @public_endpoints_bp.route('/getblocklist') def get_block_list(): '''Get a list of blocks, optionally filtered by epoch time stamp, excluding those hidden''' return getblocks.get_public_block_list(public_api, request) @public_endpoints_bp.route('/getdata/<name>') def get_block_data(name): # Share data for a block if we have it and it isn't hidden return getblocks.get_block_data(public_api, name) @public_endpoints_bp.route('/www/<path:path>') def www_public(path): # A way to share files directly over your .onion if not config.get("www.public.run", True): abort(403) return send_from_directory(config.get('www.public.path', 'static-data/www/public/'), path) @public_endpoints_bp.route('/ping') def ping(): # Endpoint to test if nodes are up return Response("pong!") @public_endpoints_bp.route('/pex') def peer_exchange(): response = ','.join(keydb.listkeys.list_adders(recent=3600)) if len(response) == 0: response = '' return Response(response) @public_endpoints_bp.route('/announce', methods=['post']) def accept_announce(): '''Accept announcements with pow token to prevent spam''' g.shared_state = public_api._too_many resp = announce.handle_announce(request) return resp @public_endpoints_bp.route('/upload', methods=['post']) def upload_endpoint(): '''Accept file uploads. In the future this will be done more often than on creation to speed up block sync ''' return upload.accept_upload(request)