diff --git a/README.rst b/README.rst index f24aa59..6ce4d5f 100644 --- a/README.rst +++ b/README.rst @@ -99,3 +99,24 @@ You may source the new Python virtual environment during development: # source env/bin/activate.fish . env/bin/activate + +Python Pyramid Shell +========================== + +If you want to use an interactive Python interpreter to interact with Make Post Sell app/models & DB: + +.. code-block:: bash + + pshell development.ini + +.. code-block:: python + + # begin the database transaction. + request.tm.begin() + + # flush / commit all changes stored the the sqlachemy session. + request.dbsession.flush() + + # commit/close the database transaction to really make changes. + request.tm.commit() + diff --git a/make_post_sell/routes.py b/make_post_sell/routes.py index b6c3220..5d67a94 100644 --- a/make_post_sell/routes.py +++ b/make_post_sell/routes.py @@ -4,6 +4,8 @@ def includeme(config): config.add_route("robots", "/robots.txt") config.add_route("markup-editor-preview", "/markup-editor-preview") + config.add_route("ask-for-on-demand-tls", "/ask-for-on-demand-tls") + config.add_route("home", "/") config.add_route("search", "/search") diff --git a/make_post_sell/views/misc.py b/make_post_sell/views/misc.py index f534ed1..fc920ea 100644 --- a/make_post_sell/views/misc.py +++ b/make_post_sell/views/misc.py @@ -5,8 +5,8 @@ from ..models.product import get_all_products # needed for favicon import os from pyramid.response import ( - FileResponse, - Response, + FileResponse, + Response, ) from make_post_sell.lib.render import markdown_to_html @@ -29,29 +29,46 @@ def favicon_view(request): def robots_view(request): """Load and return either default robots.txt or version from .ini""" response = Response( - body=request.app.get( - "robots_dot_txt", - DEFAULT_ROBOTS_DOT_TXT - ).lstrip() + body=request.app.get("robots_dot_txt", DEFAULT_ROBOTS_DOT_TXT).lstrip() ) response.content_type = "text/plain" return response +@view_config(route_name="ask-for-on-demand-tls", require_csrf=False) +def ask_for_on_demand_tls(request): + """ + This implements Caddy ask protocol defined here: + + * https://caddyserver.com/docs/caddyfile/options#on-demand-tls + + Caddy will make an HTTP request to the given URL with a query string of ?domain= containing + the value of the domain name. If the endpoint returns a 2xx status code, Caddy will be authorized + to obtain a certificate for that name. Any other status code will result in cancelling issuance + of the certificate. + """ + domain_name_requesting_tls = request.params.get("domain") + if domain_name_requesting_tls: + # "SELECT domain_name FROM mps_shop;" + result = request.dbsession.execute("SELECT domain_name FROM mps_shop;") + rows = result.all() + registered_domains = [r[0] for r in rows] + if domain_name_requesting_tls in registered_domains: + return Response(status_code=200) + return Response(status_code=401) + + # I set require_csfr to false because new browsers # don't save 3rd party cookies anymore. # This ajax endpoint should work whether a user is authenticated or not. @view_config( - route_name="markup-editor-preview", - renderer="string", - xhr=True, - require_csrf=False + route_name="markup-editor-preview", renderer="string", xhr=True, require_csrf=False ) def markup_editor_preview(request): """AJAJ: Accept Markup data param, return HTML""" return markdown_to_html(request.params["data"], request.shop) # currently only supports markdown, but eventually we could support others. - #try: + # try: # return markdown_to_html(request.params["data"], request.shop) - #except: + # except: # return "we could not create markdown to html preview."