From 615df55b186cac51fb4330eea0e946d75adf191f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vlastimil=20Z=C3=ADma?= Date: Tue, 12 Dec 2017 16:47:27 +0100 Subject: Clean djopenid and run its tests --- examples/djopenid/consumer/urls.py | 16 +++--- examples/djopenid/consumer/views.py | 25 ++++------ examples/djopenid/manage.py | 30 +++++++---- examples/djopenid/server/tests.py | 15 ++++-- examples/djopenid/server/urls.py | 23 +++++---- examples/djopenid/server/views.py | 69 ++++++++------------------ examples/djopenid/settings.py | 65 ++++-------------------- examples/djopenid/templates/index.html | 4 +- examples/djopenid/templates/server/idPage.html | 4 +- examples/djopenid/templates/server/index.html | 2 +- examples/djopenid/templates/server/trust.html | 2 +- examples/djopenid/urls.py | 15 +++--- examples/djopenid/util.py | 53 ++------------------ examples/djopenid/views.py | 15 ------ 14 files changed, 111 insertions(+), 227 deletions(-) delete mode 100644 examples/djopenid/views.py (limited to 'examples') diff --git a/examples/djopenid/consumer/urls.py b/examples/djopenid/consumer/urls.py index 7190093..9b37b1a 100644 --- a/examples/djopenid/consumer/urls.py +++ b/examples/djopenid/consumer/urls.py @@ -1,8 +1,10 @@ -from django.conf.urls.defaults import patterns +"""Consumer URLs.""" +from django.conf.urls import url -urlpatterns = patterns( - 'djopenid.consumer.views', - (r'^$', 'startOpenID'), - (r'^finish/$', 'finishOpenID'), - (r'^xrds/$', 'rpXRDS'), -) +from djopenid.consumer.views import finishOpenID, rpXRDS, startOpenID + +urlpatterns = [ + url(r'^$', startOpenID, name='index'), + url(r'^finish/$', finishOpenID, name='return_to'), + url(r'^xrds/$', rpXRDS, name='xrds'), +] diff --git a/examples/djopenid/consumer/views.py b/examples/djopenid/consumer/views.py index bbc0ff8..c92208b 100644 --- a/examples/djopenid/consumer/views.py +++ b/examples/djopenid/consumer/views.py @@ -1,5 +1,6 @@ from django.http import HttpResponseRedirect -from django.views.generic.simple import direct_to_template +from django.shortcuts import render +from django.urls import reverse from openid.consumer import consumer from openid.consumer.discover import DiscoveryFailure @@ -36,12 +37,11 @@ def getConsumer(request): def renderIndexPage(request, **template_args): - template_args['consumer_url'] = util.getViewURL(request, startOpenID) + template_args['consumer_url'] = request.build_absolute_uri(reverse('consumer:index')) template_args['pape_policies'] = POLICY_PAIRS - response = direct_to_template( - request, 'consumer/index.html', template_args) - response[YADIS_HEADER_NAME] = util.getViewURL(request, rpXRDS) + response = render(request, 'consumer/index.html', template_args) + response[YADIS_HEADER_NAME] = request.build_absolute_uri(reverse('consumer:xrds')) return response @@ -114,8 +114,8 @@ def startOpenID(request): # Compute the trust root and return URL values to build the # redirect information. - trust_root = util.getViewURL(request, startOpenID) - return_to = util.getViewURL(request, finishOpenID) + trust_root = util.request.build_absolute_uri(reverse('consumer:index')) + return_to = util.request.build_absolute_uri(reverse('consumer:return_to')) # Send the browser to the server either by sending a redirect # URL or by generating a POST form. @@ -130,8 +130,7 @@ def startOpenID(request): form_id = 'openid_message' form_html = auth_request.formMarkup(trust_root, return_to, False, {'id': form_id}) - return direct_to_template( - request, 'consumer/request_form.html', {'html': form_html}) + return render(request, 'consumer/request_form.html', {'html': form_html}) return renderIndexPage(request) @@ -159,7 +158,7 @@ def finishOpenID(request): # Get a response object indicating the result of the OpenID # protocol. - return_to = util.getViewURL(request, finishOpenID) + return_to = request.build_absolute_uri(reverse('consumer:return_to')) response = c.complete(request_args, return_to) # Get a Simple Registration response object if response @@ -218,7 +217,5 @@ def rpXRDS(request): """ Return a relying party verification XRDS document """ - return util.renderXRDS( - request, - [RP_RETURN_TO_URL_TYPE], - [util.getViewURL(request, finishOpenID)]) + return_to = request.build_absolute_uri(reverse('consumer:return_to')) + return util.renderXRDS(request, [RP_RETURN_TO_URL_TYPE], [return_to]) diff --git a/examples/djopenid/manage.py b/examples/djopenid/manage.py index 45a1ee6..fb88042 100644 --- a/examples/djopenid/manage.py +++ b/examples/djopenid/manage.py @@ -1,14 +1,22 @@ #!/usr/bin/env python -from django.core.management import execute_manager - -try: - import settings # Assumed to be in the same directory. -except ImportError: - import sys - sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've " - "customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If " - "the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__) - sys.exit(1) +import os +import sys if __name__ == "__main__": - execute_manager(settings) + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djopenid.settings") + try: + from django.core.management import execute_from_command_line + except ImportError: + # The above import may fail for some other reason. Ensure that the + # issue is really that Django is missing to avoid masking other + # exceptions on Python 2. + try: + import django # noqa: F401 + except ImportError: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) + raise + execute_from_command_line(sys.argv) diff --git a/examples/djopenid/server/tests.py b/examples/djopenid/server/tests.py index 6cae547..8d0b8de 100644 --- a/examples/djopenid/server/tests.py +++ b/examples/djopenid/server/tests.py @@ -1,7 +1,9 @@ +from urlparse import urljoin -from django.contrib.sessions.middleware import SessionWrapper +import django from django.http import HttpRequest from django.test.testcases import TestCase +from django.urls import reverse from openid.message import Message from openid.server.server import CheckIDRequest @@ -11,11 +13,14 @@ from openid.yadis.services import applyFilter from .. import util from ..server import views +# Allow django tests to run through discover +django.setup() + def dummyRequest(): request = HttpRequest() - request.session = SessionWrapper("test") - request.META['HTTP_HOST'] = 'example.invalid' + request.session = {} + request.META['HTTP_HOST'] = 'example.cz' request.META['SERVER_PROTOCOL'] = 'HTTP' return request @@ -24,7 +29,7 @@ class TestProcessTrustResult(TestCase): def setUp(self): self.request = dummyRequest() - id_url = util.getViewURL(self.request, views.idPage) + id_url = urljoin('http://example.cz/', reverse('server:local_id')) # Set up the OpenID request we're responding to. op_endpoint = 'http://127.0.0.1:8080/endpoint' @@ -65,7 +70,7 @@ class TestShowDecidePage(TestCase): def test_unreachableRealm(self): self.request = dummyRequest() - id_url = util.getViewURL(self.request, views.idPage) + id_url = urljoin('http://example.cz/', reverse('server:local_id')) # Set up the OpenID request we're responding to. op_endpoint = 'http://127.0.0.1:8080/endpoint' diff --git a/examples/djopenid/server/urls.py b/examples/djopenid/server/urls.py index 6763d85..2eff514 100644 --- a/examples/djopenid/server/urls.py +++ b/examples/djopenid/server/urls.py @@ -1,11 +1,14 @@ -from django.conf.urls.defaults import patterns +"""Server URLs.""" +from django.conf.urls import url +from django.views.generic import TemplateView -urlpatterns = patterns( - 'djopenid.server.views', - (r'^$', 'server'), - (r'^xrds/$', 'idpXrds'), - (r'^processTrustResult/$', 'processTrustResult'), - (r'^user/$', 'idPage'), - (r'^endpoint/$', 'endpoint'), - (r'^trust/$', 'trustPage'), -) +from djopenid.server.views import endpoint, idPage, idpXrds, processTrustResult, server + +urlpatterns = [ + url(r'^$', server, name='index'), + url(r'^xrds/$', idpXrds, name='xrds'), + url(r'^user/$', idPage, name='local_id'), + url(r'^endpoint/$', endpoint, name='endpoint'), + url(r'^trust/$', TemplateView.as_view(template_name='server/trust.html'), name='confirmation'), + url(r'^processTrustResult/$', processTrustResult, name='process-confirmation'), +] diff --git a/examples/djopenid/server/views.py b/examples/djopenid/server/views.py index bbb9468..0701ab3 100644 --- a/examples/djopenid/server/views.py +++ b/examples/djopenid/server/views.py @@ -18,7 +18,8 @@ Some code conventions used here: import cgi from django import http -from django.views.generic.simple import direct_to_template +from django.shortcuts import render +from django.urls import reverse from openid.consumer.discover import OPENID_IDP_2_0_TYPE from openid.extensions import pape, sreg @@ -28,7 +29,6 @@ from openid.server.trustroot import verifyReturnTo from openid.yadis.discover import DiscoveryFailure from .. import util -from ..util import getViewURL def getOpenIDStore(): @@ -43,7 +43,8 @@ def getServer(request): """ Get a Server object to perform OpenID authentication. """ - return Server(getOpenIDStore(), getViewURL(request, endpoint)) + endpoint_url = request.build_absolute_uri(reverse('server:endpoint')) + return Server(getOpenIDStore(), endpoint_url) def setRequest(request, openid_request): @@ -67,12 +68,10 @@ def server(request): """ Respond to requests for the server's primary web page. """ - return direct_to_template( - request, - 'server/index.html', - {'user_url': getViewURL(request, idPage), - 'server_xrds_url': getViewURL(request, idpXrds), - }) + local_id = request.build_absolute_uri(reverse('server:local_id')) + server_xrds_url = request.build_absolute_uri(reverse('server:xrds')) + context = {'local_id': local_id, 'server_xrds_url': server_xrds_url} + return render(request, 'server/index.html', context) def idpXrds(request): @@ -80,29 +79,16 @@ def idpXrds(request): Respond to requests for the IDP's XRDS document, which is used in IDP-driven identifier selection. """ - return util.renderXRDS( - request, [OPENID_IDP_2_0_TYPE], [getViewURL(request, endpoint)]) + endpoint_url = request.build_absolute_uri(reverse('server:endpoint')) + return util.renderXRDS(request, [OPENID_IDP_2_0_TYPE], [endpoint_url]) def idPage(request): """ Serve the identity page for OpenID URLs. """ - return direct_to_template( - request, - 'server/idPage.html', - {'server_url': getViewURL(request, endpoint)}) - - -def trustPage(request): - """ - Display the trust page template, which allows the user to decide - whether to approve the OpenID verification. - """ - return direct_to_template( - request, - 'server/trust.html', - {'trust_handler_url': getViewURL(request, processTrustResult)}) + endpoint_url = request.build_absolute_uri(reverse('server:endpoint')) + return render(request, 'server/idPage.html', {'endpoint_url': endpoint_url}) def endpoint(request): @@ -119,18 +105,12 @@ def endpoint(request): openid_request = s.decodeRequest(query) except ProtocolError as why: # This means the incoming request was invalid. - return direct_to_template( - request, - 'server/endpoint.html', - {'error': str(why)}) + return render(request, 'server/endpoint.html', {'error': str(why)}) # If we did not get a request, display text indicating that this # is an endpoint. if openid_request is None: - return direct_to_template( - request, - 'server/endpoint.html', - {}) + return render(request, 'server/endpoint.html') # We got a request; if the mode is checkid_*, we will handle it by # getting feedback from the user or by checking the session. @@ -157,7 +137,7 @@ def handleCheckIDRequest(request, openid_request): # what URL should be sent. if not openid_request.idSelect(): - id_url = getViewURL(request, idPage) + id_url = request.build_absolute_uri(reverse('server:local_id')) # Confirm that this server can actually vouch for that # identifier @@ -204,14 +184,10 @@ def showDecidePage(request, openid_request): pape_request = pape.Request.fromOpenIDRequest(openid_request) - return direct_to_template( - request, - 'server/trust.html', - {'trust_root': trust_root, - 'trust_handler_url': getViewURL(request, processTrustResult), - 'trust_root_valid': trust_root_valid, - 'pape_request': pape_request, - }) + context = {'trust_root': trust_root, + 'trust_root_valid': trust_root_valid, + 'pape_request': pape_request} + return render(request, 'server/trust.html', context) def processTrustResult(request): @@ -224,7 +200,7 @@ def processTrustResult(request): openid_request = getRequest(request) # The identifier that this server can vouch for - response_identity = getViewURL(request, idPage) + response_identity = request.build_absolute_uri(reverse('server:local_id')) # If the decision was to allow the verification, respond # accordingly. @@ -274,10 +250,7 @@ def displayResponse(request, openid_response): except EncodingError as why: # If it couldn't be encoded, display an error. text = why.response.encodeToKVForm() - return direct_to_template( - request, - 'server/endpoint.html', - {'error': cgi.escape(text)}) + return render(request, 'server/endpoint.html', {'error': cgi.escape(text)}) # Construct the appropriate django framework response. r = http.HttpResponse(webresponse.body) diff --git a/examples/djopenid/settings.py b/examples/djopenid/settings.py index 1ba3ff4..fc2a2b1 100644 --- a/examples/djopenid/settings.py +++ b/examples/djopenid/settings.py @@ -1,5 +1,4 @@ -# Django settings for djopenid project. - +"""Example Django settings for djopenid project.""" import os import sys import warnings @@ -13,60 +12,26 @@ else: del openid DEBUG = True -TEMPLATE_DEBUG = DEBUG - -ADMINS = ( - # ('Your Name', 'your_email@domain.com'), -) - -MANAGERS = ADMINS +ALLOWED_HOSTS = ['*'] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. - 'NAME': '/tmp/test.db', # Or path to database file if using sqlite3. - 'USER': '', # Not used with sqlite3. - 'PASSWORD': '', # Not used with sqlite3. - 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. - 'PORT': '', # Set to empty string for default. Not used with sqlite3. + 'NAME': ':memory:', } } -# Local time zone for this installation. All choices can be found here: -# http://www.postgresql.org/docs/current/static/datetime-keywords.html#DATETIME-TIMEZONE-SET-TABLE -TIME_ZONE = 'America/Chicago' - -# Language code for this installation. All choices can be found here: -# http://www.w3.org/TR/REC-html40/struct/dirlang.html#langcodes -# http://blogs.law.harvard.edu/tech/stories/storyReader$15 -LANGUAGE_CODE = 'en-us' - -SITE_ID = 1 - -# Absolute path to the directory that holds media. -# Example: "/home/media/media.lawrence.com/" -MEDIA_ROOT = '' - -# URL that handles the media served from MEDIA_ROOT. -# Example: "http://media.lawrence.com" -MEDIA_URL = '' - -# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a -# trailing slash. -# Examples: "http://foo.com/media/", "/media/". -ADMIN_MEDIA_PREFIX = '/media/' - -# Make this unique, and don't share it with anybody. SECRET_KEY = 'u^bw6lmsa6fah0$^lz-ct$)y7x7#ag92-z+y45-8!(jk0lkavy' -# List of callables that know how to import templates from various sources. -TEMPLATE_LOADERS = ( - 'django.template.loaders.filesystem.Loader', - 'django.template.loaders.app_directories.Loader', - # 'django.template.loaders.eggs.load_template_source', -) +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [os.path.abspath(os.path.join(os.path.dirname(__file__), 'templates'))], + 'APP_DIRS': True, + } +] -MIDDLEWARE_CLASSES = ( +MIDDLEWARE = ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', @@ -75,16 +40,8 @@ MIDDLEWARE_CLASSES = ( ROOT_URLCONF = 'djopenid.urls' -TEMPLATE_CONTEXT_PROCESSORS = () - -TEMPLATE_DIRS = ( - os.path.abspath(os.path.join(os.path.dirname(__file__), 'templates')), -) - INSTALLED_APPS = ( - 'django.contrib.contenttypes', 'django.contrib.sessions', - 'djopenid.consumer', 'djopenid.server', ) diff --git a/examples/djopenid/templates/index.html b/examples/djopenid/templates/index.html index 62691ec..2757bfc 100644 --- a/examples/djopenid/templates/index.html +++ b/examples/djopenid/templates/index.html @@ -15,8 +15,8 @@

diff --git a/examples/djopenid/templates/server/idPage.html b/examples/djopenid/templates/server/idPage.html index 06eb582..b63ea8f 100644 --- a/examples/djopenid/templates/server/idPage.html +++ b/examples/djopenid/templates/server/idPage.html @@ -3,8 +3,8 @@ {% block head %} - - + + {% endblock %} {% block body %} diff --git a/examples/djopenid/templates/server/index.html b/examples/djopenid/templates/server/index.html index 01108d0..8655ba9 100644 --- a/examples/djopenid/templates/server/index.html +++ b/examples/djopenid/templates/server/index.html @@ -41,7 +41,7 @@ application. The OpenID it serves is

-{{ user_url }}
+{{ local_id }}
     

diff --git a/examples/djopenid/templates/server/trust.html b/examples/djopenid/templates/server/trust.html index 815ab85..ee098e2 100644 --- a/examples/djopenid/templates/server/trust.html +++ b/examples/djopenid/templates/server/trust.html @@ -39,7 +39,7 @@
+ action="{% url 'server:process-confirmation' %}"> Verify your identity to the relying party?
diff --git a/examples/djopenid/urls.py b/examples/djopenid/urls.py index 3783317..551fc5e 100644 --- a/examples/djopenid/urls.py +++ b/examples/djopenid/urls.py @@ -1,8 +1,9 @@ -from django.conf.urls.defaults import include, patterns +"""Djopenid URLs.""" +from django.conf.urls import include, url +from django.views.generic import TemplateView -urlpatterns = patterns( - '', - ('^$', 'djopenid.views.index'), - ('^consumer/', include('djopenid.consumer.urls')), - ('^server/', include('djopenid.server.urls')), -) +urlpatterns = [ + url('^$', TemplateView.as_view(template_name='index.html'), name='index'), + url('^consumer/', include(('djopenid.consumer.urls', 'consumer'))), + url('^server/', include(('djopenid.server.urls', 'server'))), +] diff --git a/examples/djopenid/util.py b/examples/djopenid/util.py index 2847d8e..aa41727 100644 --- a/examples/djopenid/util.py +++ b/examples/djopenid/util.py @@ -1,13 +1,10 @@ """ Utility code for the Django example consumer and server. """ -from urlparse import urljoin - from django.conf import settings from django.core.exceptions import ImproperlyConfigured -from django.core.urlresolvers import reverse as reverseURL from django.db import connection -from django.views.generic.simple import direct_to_template +from django.shortcuts import render from openid.store import sqlstore from openid.store.filestore import FileOpenIDStore @@ -77,47 +74,6 @@ def getOpenIDStore(filestore_path, table_prefix): return s -def getViewURL(req, view_name_or_obj, args=None, kwargs=None): - relative_url = reverseURL(view_name_or_obj, args=args, kwargs=kwargs) - full_path = req.META.get('SCRIPT_NAME', '') + relative_url - return urljoin(getBaseURL(req), full_path) - - -def getBaseURL(req): - """ - Given a Django web request object, returns the OpenID 'trust root' - for that request; namely, the absolute URL to the site root which - is serving the Django request. The trust root will include the - proper scheme and authority. It will lack a port if the port is - standard (80, 443). - """ - name = req.META['HTTP_HOST'] - try: - name = name[:name.index(':')] - except Exception: - pass - - try: - port = int(req.META['SERVER_PORT']) - except Exception: - port = 80 - - proto = req.META['SERVER_PROTOCOL'] - - if 'HTTPS' in proto: - proto = 'https' - else: - proto = 'http' - - if port in [80, 443] or not port: - port = '' - else: - port = ':%s' % (port,) - - url = "%s://%s%s/" % (proto, name, port) - return url - - def normalDict(request_data): """ Converts a django request MutliValueDict (e.g., request.GET, @@ -135,8 +91,5 @@ def renderXRDS(request, type_uris, endpoint_urls): URLs in one service block, and return a response with the appropriate content-type. """ - response = direct_to_template( - request, 'xrds.xml', - {'type_uris': type_uris, 'endpoint_urls': endpoint_urls}) - response['Content-Type'] = YADIS_CONTENT_TYPE - return response + context = {'type_uris': type_uris, 'endpoint_urls': endpoint_urls} + return render(request, 'xrds.xml', context, content_type=YADIS_CONTENT_TYPE) diff --git a/examples/djopenid/views.py b/examples/djopenid/views.py deleted file mode 100644 index 5d7a4e2..0000000 --- a/examples/djopenid/views.py +++ /dev/null @@ -1,15 +0,0 @@ - -from django.views.generic.simple import direct_to_template - -from . import util - - -def index(request): - consumer_url = util.getViewURL( - request, 'djopenid.consumer.views.startOpenID') - server_url = util.getViewURL(request, 'djopenid.server.views.server') - - return direct_to_template( - request, - 'index.html', - {'consumer_url': consumer_url, 'server_url': server_url}) -- cgit v1.2.1