Module src.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

Expand 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)
Expand 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)