summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorVlastimil Zíma <vlastimil.zima@nic.cz>2017-12-12 16:47:27 +0100
committerVlastimil Zíma <vlastimil.zima@nic.cz>2018-01-22 08:21:57 +0100
commit615df55b186cac51fb4330eea0e946d75adf191f (patch)
treea117252a03eb3ce953135bcd4a457084af2c5806 /examples
parenta14a20576f1d5e21806886a0af1b89203c8ca31a (diff)
downloadopenid-615df55b186cac51fb4330eea0e946d75adf191f.tar.gz
Clean djopenid and run its tests
Diffstat (limited to 'examples')
-rw-r--r--examples/djopenid/consumer/urls.py16
-rw-r--r--examples/djopenid/consumer/views.py25
-rw-r--r--examples/djopenid/manage.py30
-rw-r--r--examples/djopenid/server/tests.py15
-rw-r--r--examples/djopenid/server/urls.py23
-rw-r--r--examples/djopenid/server/views.py69
-rw-r--r--examples/djopenid/settings.py65
-rw-r--r--examples/djopenid/templates/index.html4
-rw-r--r--examples/djopenid/templates/server/idPage.html4
-rw-r--r--examples/djopenid/templates/server/index.html2
-rw-r--r--examples/djopenid/templates/server/trust.html2
-rw-r--r--examples/djopenid/urls.py15
-rw-r--r--examples/djopenid/util.py53
-rw-r--r--examples/djopenid/views.py15
14 files changed, 111 insertions, 227 deletions
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 @@
</p>
<ul>
- <li><a href="{{ consumer_url }}">Example Consumer (Relying Party)</a></li>
- <li><a href="{{ server_url }}">Example Server (Identity Provider)</a></li>
+ <li><a href="{% url 'consumer:index' %}">Example Consumer (Relying Party)</a></li>
+ <li><a href="{% url 'server:index' %}">Example Server (Identity Provider)</a></li>
</ul>
<p>
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 %}
<!-- We should be able to space-separate both rel values in one attribute,
but some older OpenID implementations don't parse that. -->
-<link rel="openid.server" href="{{ server_url }}">
-<link rel="openid2.provider" href="{{ server_url }}">
+<link rel="openid.server" href="{{ endpoint_url }}">
+<link rel="openid2.provider" href="{{ endpoint_url }}">
{% 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
<pre>
-<a href="{{ user_url }}">{{ user_url }}</a>
+<a href="{{ local_id }}">{{ local_id }}</a>
</pre>
</p>
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 @@
<div>
<form method="post"
- action="{{ trust_handler_url }}">
+ action="{% url 'server:process-confirmation' %}">
Verify your identity to the relying party?
<br/>
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})