Compare commits

..

12 Commits

Author SHA1 Message Date
Jens Langhammer
6f7b917c38 bump version: 0.1.23-beta -> 0.1.24-beta 2019-03-20 23:00:33 +01:00
Jens Langhammer
1456ee6d3e prepare 0.1.24 2019-03-20 23:00:22 +01:00
Jens Langhammer
5155204283 Merge branch '32-automatically-set-owner-field-when-creating-oauth-provider' into 'master'
Resolve "Automatically set owner field when creating OAuth Provider"

Closes #32

See merge request BeryJu.org/passbook!16
2019-03-20 21:20:54 +00:00
Jens Langhammer
5509ec9b0f Merge branch '29-oauth-provider-add-extra-info-button-to-show-urls' into 'master'
Resolve "OAuth Provider: Add extra info button to show URLs"

Closes #29

See merge request BeryJu.org/passbook!15
2019-03-20 21:17:36 +00:00
Jens Langhammer
d6f9b2e47d remove user field from form. Closes #32 2019-03-20 20:09:27 +01:00
Jens Langhammer
67aa4aef11 add modal for OAuth Providers showing the URLs 2019-03-20 20:03:28 +01:00
Jens Langhammer
9e46c8bfec bump version: 0.1.22-beta -> 0.1.23-beta 2019-03-18 20:54:31 +01:00
Jens Langhammer
1eaa9b9733 prepare 0.1.23 2019-03-18 20:54:23 +01:00
Jens Langhammer
ee05834b69 Merge branch '28-openid-connect-discovery' into 'master'
set issuer to root address instead of well-known path

Closes #28

See merge request BeryJu.org/passbook!13
2019-03-18 19:52:13 +00:00
Jens Langhammer
fccc8f4959 set issuer to root address instead of well-known path 2019-03-18 20:42:32 +01:00
Jens Langhammer
c721620f96 Merge branch '28-openid-connect-discovery' into 'master'
Resolve "OpenID Connect Discovery support"

Closes #28

See merge request BeryJu.org/passbook!12
2019-03-18 19:42:08 +00:00
Jens Langhammer
c9f73d718e start implementing openid connect discovery 2019-03-18 20:35:11 +01:00
29 changed files with 164 additions and 25 deletions

View File

@@ -1,5 +1,5 @@
[bumpversion]
current_version = 0.1.22-beta
current_version = 0.1.24-beta
tag = True
commit = True
parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)\-(?P<release>.*)

View File

@@ -54,7 +54,7 @@ package-docker:
before_script:
- echo "{\"auths\":{\"docker.$NEXUS_URL\":{\"auth\":\"$NEXUS_AUTH\"}}}" > /kaniko/.docker/config.json
script:
- /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination docker.pkg.beryju.org/passbook:latest --destination docker.pkg.beryju.org/passbook:0.1.22-beta
- /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination docker.pkg.beryju.org/passbook:latest --destination docker.pkg.beryju.org/passbook:0.1.24-beta
stage: build
only:
- tags

View File

@@ -3,7 +3,7 @@ from setuptools import setup
setup(
name='django-allauth-passbook',
version='0.1.22-beta',
version='0.1.24-beta',
description='passbook support for django-allauth',
# long_description='\n'.join(read_simple('docs/index.md')[2:]),
long_description_content_type='text/markdown',

View File

@@ -18,7 +18,7 @@ tests_require = [
setup(
name='sentry-auth-passbook',
version='0.1.22-beta',
version='0.1.24-beta',
author='BeryJu.org',
author_email='support@beryju.org',
url='https://passbook.beryju.org',

14
debian/changelog vendored
View File

@@ -1,3 +1,17 @@
passbook (0.1.24) stable; urgency=medium
* bump version: 0.1.22-beta -> 0.1.23-beta
* add modal for OAuth Providers showing the URLs
* remove user field from form. Closes #32
-- Jens Langhammer <jens.langhammer@beryju.org> Wed, 20 Mar 2019 21:59:21 +0000
passbook (0.1.23) stable; urgency=medium
* add support for OpenID-Connect Discovery
-- Jens Langhammer <jens.langhammer@beryju.org> Thu, 18 Mar 2019 20:19:27 +0000
passbook (0.1.22) stable; urgency=medium
* bump version: 0.1.20-beta -> 0.1.21-beta

View File

@@ -1,6 +1,6 @@
apiVersion: v1
appVersion: "0.1.22-beta"
appVersion: "0.1.24-beta"
description: A Helm chart for passbook.
name: passbook
version: "0.1.22-beta"
version: "0.1.24-beta"
icon: https://passbook.beryju.org/images/logo.png

View File

@@ -5,7 +5,7 @@
replicaCount: 1
image:
tag: 0.1.22-beta
tag: 0.1.24-beta
nameOverride: ""

View File

@@ -1,2 +1,2 @@
"""passbook"""
__version__ = '0.1.22-beta'
__version__ = '0.1.24-beta'

View File

@@ -1,2 +1,2 @@
"""passbook admin"""
__version__ = '0.1.22-beta'
__version__ = '0.1.24-beta'

View File

@@ -57,6 +57,10 @@
<a class="btn btn-default btn-sm"
href="{{ href }}?back={{ request.get_full_path }}">{% trans name %}</a>
{% endfor %}
{% get_htmls provider as htmls %}
{% for html in htmls %}
{{ html|safe }}
{% endfor %}
</td>
</tr>
{% endfor %}

View File

@@ -5,6 +5,8 @@ from logging import getLogger
from django import template
from django.db.models import Model
from passbook.lib.utils.template import render_to_string
register = template.Library()
LOGGER = getLogger(__name__)
@@ -29,3 +31,24 @@ def get_links(model_instance):
pass
return links
@register.simple_tag(takes_context=True)
def get_htmls(context, model_instance):
"""Find all html_ methods on an object instance, run them and return as dict"""
prefix = 'html_'
htmls = []
if not isinstance(model_instance, Model):
LOGGER.warning("Model %s is not instance of Model", model_instance)
return htmls
try:
for name, method in inspect.getmembers(model_instance, predicate=inspect.ismethod):
if name.startswith(prefix):
template, _context = method(context.get('request'))
htmls.append(render_to_string(template, _context))
except NotImplementedError:
pass
return htmls

View File

@@ -1,2 +1,2 @@
"""passbook api"""
__version__ = '0.1.22-beta'
__version__ = '0.1.24-beta'

View File

@@ -1,2 +1,2 @@
"""passbook audit Header"""
__version__ = '0.1.22-beta'
__version__ = '0.1.24-beta'

View File

@@ -1,2 +1,2 @@
"""passbook captcha_factor Header"""
__version__ = '0.1.22-beta'
__version__ = '0.1.24-beta'

View File

@@ -1,2 +1,2 @@
"""passbook core"""
__version__ = '0.1.22-beta'
__version__ = '0.1.24-beta'

View File

@@ -1,2 +1,2 @@
"""passbook hibp_policy"""
__version__ = '0.1.22-beta'
__version__ = '0.1.24-beta'

View File

@@ -1,2 +1,2 @@
"""Passbook ldap app Header"""
__version__ = '0.1.22-beta'
__version__ = '0.1.24-beta'

View File

@@ -1,2 +1,2 @@
"""passbook lib"""
__version__ = '0.1.22-beta'
__version__ = '0.1.24-beta'

View File

@@ -1,2 +1,2 @@
"""passbook oauth_client Header"""
__version__ = '0.1.22-beta'
__version__ = '0.1.24-beta'

View File

@@ -120,5 +120,5 @@ class AzureADOAuthSourceForm(OAuthSourceForm):
'request_token_url': '',
'authorization_url': 'https://login.microsoftonline.com/common/oauth2/authorize',
'access_token_url': 'https://login.microsoftonline.com/common/oauth2/token',
'profile_url': ' https://login.microsoftonline.com/common/openid/userinfo',
'profile_url': ' https://graph.windows.net/myorganization/me?api-version=1.6',
}

View File

@@ -1,2 +1,2 @@
"""passbook oauth_provider Header"""
__version__ = '0.1.22-beta'
__version__ = '0.1.24-beta'

View File

@@ -11,5 +11,5 @@ class OAuth2ProviderForm(forms.ModelForm):
class Meta:
model = OAuth2Provider
fields = ['name', 'user', 'redirect_uris', 'client_type',
fields = ['name', 'redirect_uris', 'client_type',
'authorization_grant_type', 'client_id', 'client_secret', ]

View File

@@ -1,5 +1,6 @@
"""Oauth2 provider product extension"""
from django.shortcuts import reverse
from django.utils.translation import gettext as _
from oauth2_provider.models import AbstractApplication
@@ -14,6 +15,20 @@ class OAuth2Provider(Provider, AbstractApplication):
def __str__(self):
return "OAuth2 Provider %s" % self.name
def html_setup_urls(self, request):
"""return template and context modal with URLs for authorize, token, openid-config, etc"""
return "oauth2_provider/setup_url_modal.html", {
'provider': self,
'authorize_url': request.build_absolute_uri(
reverse('passbook_oauth_provider:oauth2-authorize')),
'token_url': request.build_absolute_uri(
reverse('passbook_oauth_provider:token')),
'userinfo_url': request.build_absolute_uri(
reverse('passbook_api:openid')),
'openid_url': request.build_absolute_uri(
reverse('passbook_oauth_provider:openid-discovery'))
}
class Meta:
verbose_name = _('OAuth2 Provider')

View File

@@ -0,0 +1,49 @@
{% load i18n %}
<button class="btn btn-default btn-sm" data-toggle="modal" data-target="#{{ provider.pk }}">{% trans 'View Setup URLs' %}</button>
<div class="modal fade" id="{{ provider.pk }}" tabindex="-1" role="dialog" aria-labelledby="{{ provider.pk }}Label" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true" aria-label="Close">
<span class="pficon pficon-close"></span>
</button>
<h4 class="modal-title" id="{{ provider.pk }}Label">{% trans 'Setup URLs' %}</h4>
</div>
<div class="modal-body">
<form class="form-horizontal">
<div class="form-group">
<label class="col-sm-3 control-label">{% trans 'Authroize URL' %}</label>
<div class="col-sm-9">
<input type="text"class="form-control" readonly value="{{ authorize_url }}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">{% trans 'Token URL' %}</label>
<div class="col-sm-9">
<input type="text" class="form-control" readonly value="{{ token_url }}">
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">{% trans 'Userinfo Endpoint' %}</label>
<div class="col-sm-9">
<input type="text" class="form-control" readonly value="{{ userinfo_url }}">
</div>
</div>
</form>
<hr>
<form class="form-horizontal">
<div class="form-group">
<label class="col-sm-3 control-label">{% trans 'OpenID Configuration URL' %}</label>
<div class="col-sm-9">
<input type="text"class="form-control" readonly value="{{ openid_url }}">
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal">{% trans 'Close' %}</button>
</div>
</div>
</div>
</div>

View File

@@ -3,7 +3,7 @@
from django.urls import path
from oauth2_provider import views
from passbook.oauth_provider.views import oauth2
from passbook.oauth_provider.views import oauth2, openid
urlpatterns = [
# Custom OAuth 2 Authorize View
@@ -14,8 +14,12 @@ urlpatterns = [
path('authorize/permission_denied/', oauth2.OAuthPermissionDenied.as_view(),
name='oauth2-permission-denied'),
# OAuth API
path("authorize/", views.AuthorizationView.as_view(), name="authorize"),
path("token/", views.TokenView.as_view(), name="token"),
path("revoke_token/", views.RevokeTokenView.as_view(), name="revoke-token"),
path("introspect/", views.IntrospectTokenView.as_view(), name="introspect"),
# OpenID-Connect Discovery
path('.well-known/openid-configuration', openid.OpenIDConfigurationView.as_view(),
name='openid-discovery'),
path('.well-known/jwks.json', openid.JSONWebKeyView.as_view(),
name='openid-jwks'),
]

View File

@@ -0,0 +1,30 @@
"""passbook oauth provider OpenID Views"""
from django.http import HttpRequest, JsonResponse
from django.shortcuts import reverse
from django.views.generic import View
class OpenIDConfigurationView(View):
"""Return OpenID Configuration"""
def get(self, request: HttpRequest):
"""Get Response conform to https://openid.net/specs/openid-connect-discovery-1_0.html"""
return JsonResponse({
'issuer': request.build_absolute_uri(reverse('passbook_core:overview')),
'authorization_endpoint': request.build_absolute_uri(
reverse('passbook_oauth_provider:oauth2-authorize')),
'token_endpoint': request.build_absolute_uri(reverse('passbook_oauth_provider:token')),
"jwks_uri": request.build_absolute_uri(reverse('passbook_oauth_provider:openid-jwks')),
"scopes_supported": [
"openid:userinfo",
],
})
class JSONWebKeyView(View):
"""JSON Web Key View"""
def get(self, request: HttpRequest):
"""JSON Webkeys are not implemented yet, hence return an empty object"""
return JsonResponse({})

View File

@@ -1,2 +1,2 @@
"""passbook otp Header"""
__version__ = '0.1.22-beta'
__version__ = '0.1.24-beta'

View File

@@ -1,2 +1,2 @@
"""passbook password_expiry"""
__version__ = '0.1.22-beta'
__version__ = '0.1.24-beta'

View File

@@ -1,2 +1,2 @@
"""passbook saml_idp Header"""
__version__ = '0.1.22-beta'
__version__ = '0.1.24-beta'