|
|
|
@ -24,6 +24,8 @@ try:
|
|
|
|
|
except ImportError:
|
|
|
|
|
lasso = None
|
|
|
|
|
|
|
|
|
|
import xml.etree.ElementTree as ET
|
|
|
|
|
|
|
|
|
|
from django.utils.encoding import force_bytes, force_str
|
|
|
|
|
from quixote import get_publisher, get_request, get_response, get_session, redirect
|
|
|
|
|
from quixote.directory import Directory
|
|
|
|
@ -212,13 +214,15 @@ class AdminIDPDir(Directory):
|
|
|
|
|
def _q_index(self):
|
|
|
|
|
get_response().set_title(self.title)
|
|
|
|
|
r = TemplateIO(html=True)
|
|
|
|
|
r += htmltext('<div id="appbar">')
|
|
|
|
|
r += htmltext('<h2>%s</h2>') % _('Identity Providers')
|
|
|
|
|
r += htmltext('<ul id="nav-idp-admin">\n')
|
|
|
|
|
r += htmltext(' <li><a href="new">%s</a></li>\n') % _('New')
|
|
|
|
|
r += htmltext(' <li><a href="new_remote">%s</a></li>\n') % _('Create new from remote URL')
|
|
|
|
|
r += htmltext('</ul>')
|
|
|
|
|
r += htmltext('<span class="actions">\n')
|
|
|
|
|
r += htmltext(' <a rel="popup" href="new_remote">%s</a>\n') % _('Create new from remote URL')
|
|
|
|
|
r += htmltext(' <a href="new">%s</a>\n') % _('New')
|
|
|
|
|
r += htmltext('</span>')
|
|
|
|
|
r += htmltext('</div>')
|
|
|
|
|
|
|
|
|
|
r += htmltext('<ul class="biglist">')
|
|
|
|
|
r += htmltext('<ul class="biglist idp--list">')
|
|
|
|
|
for kidp, idp in sorted(get_cfg('idp', {}).items(), key=lambda k: k[0]):
|
|
|
|
|
p = None
|
|
|
|
|
if idp and isinstance(idp, dict):
|
|
|
|
@ -234,17 +238,21 @@ class AdminIDPDir(Directory):
|
|
|
|
|
except TypeError:
|
|
|
|
|
p = None
|
|
|
|
|
|
|
|
|
|
r += htmltext('<li>')
|
|
|
|
|
r += htmltext('<li class="biglistitem">')
|
|
|
|
|
r += htmltext('<span class="biglistitem--content">')
|
|
|
|
|
if p:
|
|
|
|
|
r += htmltext('<strong class="label">%s</strong>') % misc.get_provider_label(p)
|
|
|
|
|
r += htmltext('<span class="label"><a href="%s/">%s</a></span>') % (
|
|
|
|
|
kidp,
|
|
|
|
|
misc.get_provider_label(p),
|
|
|
|
|
)
|
|
|
|
|
else:
|
|
|
|
|
r += htmltext('<strong class="label">%s %s</strong>') % (kidp, _('Broken'))
|
|
|
|
|
if p:
|
|
|
|
|
r += htmltext('<p class="details">')
|
|
|
|
|
r += htmltext('<span class="label">%s %s</span>') % (kidp, _('Broken'))
|
|
|
|
|
if p and p.providerId != misc.get_provider_label(p):
|
|
|
|
|
r += htmltext('<span class="biglistitem--content-details">')
|
|
|
|
|
r += htmltext('<span class="data">%s</span>') % p.providerId
|
|
|
|
|
r += htmltext('</p>')
|
|
|
|
|
r += htmltext('</span>')
|
|
|
|
|
r += htmltext('</span>')
|
|
|
|
|
r += htmltext('<p class="commands">')
|
|
|
|
|
r += command_icon('%s/' % kidp, 'view')
|
|
|
|
|
r += command_icon('%s/edit' % kidp, 'edit')
|
|
|
|
|
r += command_icon('%s/delete' % kidp, 'remove')
|
|
|
|
|
r += htmltext('</p></li>')
|
|
|
|
@ -605,17 +613,19 @@ class AdminIDPUI(Directory):
|
|
|
|
|
with open(misc.get_abs_path(self.idp['metadata'])) as fd:
|
|
|
|
|
metadata = fd.read()
|
|
|
|
|
try:
|
|
|
|
|
t = metadata.decode('utf8').encode(get_publisher().site_charset)
|
|
|
|
|
except Exception:
|
|
|
|
|
t = metadata
|
|
|
|
|
r += htmltext(t)
|
|
|
|
|
metadata_tree = ET.fromstring(metadata)
|
|
|
|
|
misc.indent_xml(metadata_tree)
|
|
|
|
|
metadata_text = ET.tostring(metadata_tree).decode()
|
|
|
|
|
except Exception as e:
|
|
|
|
|
metadata_text = str(_('Unable to display metadata (%s)') % e)
|
|
|
|
|
r += metadata_text
|
|
|
|
|
r += htmltext('</pre>')
|
|
|
|
|
r += htmltext('</div>')
|
|
|
|
|
|
|
|
|
|
r += htmltext('<p>')
|
|
|
|
|
r += htmltext('<a href="edit">%s</a> ') % _('Edit')
|
|
|
|
|
r += htmltext('<a class="button" href="edit">%s</a> ') % _('Edit')
|
|
|
|
|
if self.idp.get('metadata_url'):
|
|
|
|
|
r += htmltext('<a href="update_remote">%s</a>') % _('Update from remote URL')
|
|
|
|
|
r += htmltext('<a class="button" href="update_remote">%s</a>') % _('Update from remote URL')
|
|
|
|
|
r += htmltext('</p>')
|
|
|
|
|
return r.getvalue()
|
|
|
|
|
|
|
|
|
@ -794,7 +804,7 @@ class MethodAdminDirectory(Directory):
|
|
|
|
|
get_response().set_title(self.title)
|
|
|
|
|
r = TemplateIO(html=True)
|
|
|
|
|
r += htmltext('<h2>SAML 2.0</h2>')
|
|
|
|
|
r += htmltext('<dl> <dt><a href="sp">%s</a></dt> <dd>%s</dd>') % (
|
|
|
|
|
r += htmltext('<a class="button button-paragraph" href="sp">%s <p>%s</p></a>') % (
|
|
|
|
|
_('Service Provider'),
|
|
|
|
|
_('Configure SAML 2.0 parameters'),
|
|
|
|
|
)
|
|
|
|
@ -803,22 +813,21 @@ class MethodAdminDirectory(Directory):
|
|
|
|
|
hasattr(get_publisher().root_directory_class, 'saml')
|
|
|
|
|
):
|
|
|
|
|
metadata_url = '%s/metadata.xml' % get_cfg('sp')['saml2_base_url']
|
|
|
|
|
r += htmltext('<dt><a href="%s">%s</a></dt> <dd>%s</dd>') % (
|
|
|
|
|
r += htmltext('<a class="button button-paragraph" href="%s">%s <p>%s</p></a>') % (
|
|
|
|
|
metadata_url,
|
|
|
|
|
_('SAML 2.0 Service Provider Metadata'),
|
|
|
|
|
_('Download Service Provider SAML 2.0 Metadata file'),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
r += htmltext('<dt><a href="idp/">%s</a></dt> <dd>%s</dd>') % (
|
|
|
|
|
r += htmltext('<a class="button button-paragraph" href="idp/">%s <p>%s</p></a>') % (
|
|
|
|
|
_('Identity Providers'),
|
|
|
|
|
_('Add and remove identity providers'),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
r += htmltext('<dt><a href="identities">%s</a></dt> <dd>%s</dd>') % (
|
|
|
|
|
r += htmltext('<a class="button button-paragraph" href="identities">%s <p>%s</p></a>') % (
|
|
|
|
|
_('Identities'),
|
|
|
|
|
_('Configure identities creation'),
|
|
|
|
|
)
|
|
|
|
|
r += htmltext('</dl>')
|
|
|
|
|
return r.getvalue()
|
|
|
|
|
|
|
|
|
|
def generate_rsa_keypair(self, branch='sp'):
|
|
|
|
|