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