Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 15 additions & 9 deletions docs/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,15 @@
master_doc = 'index'

project = 'Django OpenID Provider'
_author = u"Roman Barczyński"
copyright = u"2010, %s" % _author
_author = 'Roman Barczyński'
copyright = '2010, %s' % _author
release = 'v0.4'

pygments_style = 'sphinx'


html_style = 'default.css'
html_title = "%s documentation" % (project)
html_title = '%s documentation' % (project)
html_static_path = ['.static']
html_last_updated_fmt = '%b %d, %Y'

Expand All @@ -32,26 +32,32 @@
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, document class [howto/manual]).
latex_documents = [
(master_doc, 'openid_provider.tex', '%s Documentation' % project, _author, 'howto'), # 'manual' or 'howto'
(
master_doc,
'openid_provider.tex',
'%s Documentation' % project,
_author,
'howto',
), # 'manual' or 'howto'
]

latex_elements = {
'papersize': 'a4',
'pointsize': '10pt',
'fncychap': '\\usepackage{fancyhdr}',
'preamble': '\\pagenumbering{arabic}'
'preamble': '\\pagenumbering{arabic}',
}

# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# latex_logo = None

# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# latex_use_parts = False

# Documents to append as an appendix to all manuals.
#latex_appendices = []
# latex_appendices = []

# If false, no module index is generated.
#latex_use_modindex = True
# latex_use_modindex = True
12 changes: 7 additions & 5 deletions openid_provider/admin.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
# -*- coding: utf-8 -*-
# vim: set ts=4 sw=4 : */

from django.contrib import admin

from openid_provider.models import TrustedRoot, OpenID


class TrustedRootInline(admin.TabularInline):
model = TrustedRoot


@admin.register(OpenID)
class OpenIDAdmin(admin.ModelAdmin):
list_display = ['openid', 'user', 'default']
inlines = [TrustedRootInline, ]
raw_id_fields = ("user",)
inlines = [
TrustedRootInline,
]
raw_id_fields = ('user',)
search_fields = ('user__email',)

admin.site.register(OpenID, OpenIDAdmin)
29 changes: 20 additions & 9 deletions openid_provider/conf.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,32 @@
import os
from django.conf import settings

STORE = getattr(settings, 'OPENID_PROVIDER_STORE',
'openid.store.filestore.FileOpenIDStore')
STORE = getattr(
settings, 'OPENID_PROVIDER_STORE', 'openid.store.filestore.FileOpenIDStore'
)

if STORE == 'openid.store.filestore.FileOpenIDStore':
import tempfile

tempdir = tempfile.gettempdir()

FILESTORE_PATH = getattr(settings, 'OPENID_PROVIDER_FILESTORE_PATH',
os.path.join(tempdir, 'openid-filestore'))

SREG_DATA_CALLBACK = getattr(settings, 'OPENID_PROVIDER_SREG_DATA_CALLBACK',
'openid_provider.utils.get_default_sreg_data')
FILESTORE_PATH = getattr(
settings,
'OPENID_PROVIDER_FILESTORE_PATH',
os.path.join(tempdir, 'openid-filestore'),
)

SREG_DATA_CALLBACK = getattr(
settings,
'OPENID_PROVIDER_SREG_DATA_CALLBACK',
'openid_provider.utils.get_default_sreg_data',
)

AX_DATA_CALLBACK = getattr(settings, 'OPENID_PROVIDER_AX_DATA_CALLBACK',
'openid_provider.utils.get_default_ax_data')
AX_DATA_CALLBACK = getattr(
settings,
'OPENID_PROVIDER_AX_DATA_CALLBACK',
'openid_provider.utils.get_default_ax_data',
)

AX_EXTENSION = getattr(settings, 'OPENID_PROVIDER_AX_EXTENSION', False)

Expand Down
38 changes: 30 additions & 8 deletions openid_provider/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations
from django.conf import settings


class Migration(migrations.Migration):

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
Expand All @@ -15,10 +11,23 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='OpenID',
fields=[
('id', models.AutoField(primary_key=True, verbose_name='ID', auto_created=True, serialize=False)),
(
'id',
models.AutoField(
primary_key=True,
verbose_name='ID',
auto_created=True,
serialize=False,
),
),
('openid', models.CharField(max_length=200, blank=True, unique=True)),
('default', models.BooleanField(default=False)),
('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)),
(
'user',
models.ForeignKey(
to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE
),
),
],
options={
'verbose_name_plural': 'OpenIDs',
Expand All @@ -29,9 +38,22 @@ class Migration(migrations.Migration):
migrations.CreateModel(
name='TrustedRoot',
fields=[
('id', models.AutoField(primary_key=True, verbose_name='ID', auto_created=True, serialize=False)),
(
'id',
models.AutoField(
primary_key=True,
verbose_name='ID',
auto_created=True,
serialize=False,
),
),
('trust_root', models.CharField(max_length=200)),
('openid', models.ForeignKey(to='openid_provider.OpenID', on_delete=models.CASCADE)),
(
'openid',
models.ForeignKey(
to='openid_provider.OpenID', on_delete=models.CASCADE
),
),
],
),
]
24 changes: 16 additions & 8 deletions openid_provider/models.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
# -*- coding: utf-8 -*-
# vim: set ts=4 sw=4 : */
import random
import base64

from django.utils.translation import ugettext_lazy as _
from hashlib import sha1

from django.utils.translation import gettext_lazy as _
from django.db import models

from openid_provider.conf import AUTH_USER_MODEL
from openid_provider.utils import get_username


class OpenID(models.Model):
user = models.ForeignKey(AUTH_USER_MODEL, on_delete=models.CASCADE)
openid = models.CharField(max_length=200, blank=True, unique=True)
Expand All @@ -18,22 +22,26 @@ class Meta:
ordering = ['openid']

def __unicode__(self):
return u"%s|%s" % (get_username(self.user), self.openid)
return '{}|{}'.format(get_username(self.user), self.openid)

def save(self, *args, **kwargs):
if self.openid in ['', u'', None]:
from hashlib import sha1
import random, base64
if self.openid in ['', '', None]:
sha = sha1()
sha.update(get_username(self.user).encode('utf-8'))
sha.update(str(random.random()).encode('utf-8'))
value = str(base64.b64encode(sha.digest()))
value = value.replace('/', '').replace('+', '').replace('=', '').replace('\'', '')
value = (
value.replace('/', '')
.replace('+', '')
.replace('=', '')
.replace("'", '')
)
self.openid = value
super(OpenID, self).save(*args, **kwargs)
super().save(*args, **kwargs)
if self.default:
self.user.openid_set.exclude(pk=self.pk).update(default=False)


class TrustedRoot(models.Model):
openid = models.ForeignKey(OpenID, on_delete=models.CASCADE)
trust_root = models.CharField(max_length=200)
Expand Down
16 changes: 10 additions & 6 deletions openid_provider/urls.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
# -*- coding: utf-8 -*-
# vim: set ts=4 sw=4 : */

from django.conf.urls import url
from django.urls import path, re_path

from . import views

urlpatterns = [
url(r'^$', views.openid_server, name='openid-provider-root'),
url(r'^decide/$', views.openid_decide, name='openid-provider-decide'),
url(r'^xrds/$', views.openid_xrds, name='openid-provider-xrds'),
url(r'^(?P<id>.*)/$', views.openid_xrds, {'identity': True}, name='openid-provider-identity'),
path('', views.openid_server, name='openid-provider-root'),
path('decide/', views.openid_decide, name='openid-provider-decide'),
path('xrds/', views.openid_xrds, name='openid-provider-xrds'),
re_path(
r'^(?P<id>.*)/$',
views.openid_xrds,
{'identity': True},
name='openid-provider-identity',
),
]
13 changes: 11 additions & 2 deletions openid_provider/utils.py
Original file line number Diff line number Diff line change
@@ -1,32 +1,36 @@
# -*- coding: utf-8 -*-
# vim: set ts=4 sw=4 fdm=indent : */
# some code from http://www.djangosnippets.org/snippets/310/ by simon
# and from examples/djopenid from python-openid-2.2.4
from openid_provider import conf
from openid.extensions import ax, sreg

from django.core.exceptions import ImproperlyConfigured

try:
from importlib import import_module
except ImportError:
from django.utils.importlib import import_module


def import_module_attr(path):
package, module = path.rsplit('.', 1)
return getattr(import_module(package), module)


def get_username(u):
if hasattr(u, 'get_username'):
return u.get_username()
return u.username


def get_default_sreg_data(request, orequest):
return {
'email': request.user.email,
'nickname': request.user.get_short_name(),
'fullname': request.user.get_full_name(),
}


def get_default_ax_data(request, orequest):
return {
'http://axschema.org/contact/email': request.user.email,
Expand All @@ -36,6 +40,7 @@ def get_default_ax_data(request, orequest):
'http://axschema.org/namePerson/last': request.user.last_name,
}


def add_sreg_data(request, orequest, oresponse):
callback = get_sreg_callback()
if callback is None or not callable(callback):
Expand All @@ -45,6 +50,7 @@ def add_sreg_data(request, orequest, oresponse):
sreg_resp = sreg.SRegResponse.extractResponse(sreg_req, sreg_data)
oresponse.addExtension(sreg_resp)


def add_ax_data(request, orequest, oresponse):
callback = get_ax_callback()
if callback is None or not callable(callback):
Expand All @@ -59,23 +65,26 @@ def add_ax_data(request, orequest, oresponse):
ax_resp.addValue(attr, value)
oresponse.addExtension(ax_resp)


def get_sreg_callback():
try:
return import_module_attr(conf.SREG_DATA_CALLBACK)
except (ImportError, AttributeError):
return None


def get_ax_callback():
try:
return import_module_attr(conf.AX_DATA_CALLBACK)
except (ImportError, AttributeError):
return None


def get_store(request):
try:
store_class = import_module_attr(conf.STORE)
except ImportError:
raise ImproperlyConfigured("OpenID store %r could not be imported" % conf.STORE)
raise ImproperlyConfigured('OpenID store %r could not be imported' % conf.STORE)
# The FileOpenIDStore requires a path to save the user files.
if conf.STORE == 'openid.store.filestore.FileOpenIDStore':
return store_class(conf.FILESTORE_PATH)
Expand Down
Loading