johannes@2301: # -*- coding: iso-8859-1 -*- johannes@2301: """ johannes@2301: MoinMoin - OpenID preferences johannes@2301: johannes@2301: @copyright: 2007 MoinMoin:JohannesBerg johannes@2301: @license: GNU GPL, see COPYING for details. johannes@2301: """ johannes@2301: johannes@2301: from MoinMoin import wikiutil johannes@2301: from MoinMoin.widget import html johannes@2301: from MoinMoin.userprefs import UserPrefBase johannes@2301: from MoinMoin.auth.openidrp import OpenIDAuth johannes@2301: import sha johannes@2301: from MoinMoin.util.moinoid import MoinOpenIDStore johannes@2301: from openid.consumer import consumer johannes@2301: from openid.yadis.discover import DiscoveryFailure johannes@2301: from openid.fetchers import HTTPFetchingError johannes@2301: johannes@2301: johannes@2301: class Settings(UserPrefBase): johannes@2301: def __init__(self, request): johannes@2301: """ Initialize OpenID settings form. """ johannes@2301: UserPrefBase.__init__(self, request) johannes@2301: self.request = request johannes@2301: self._ = request.getText johannes@2301: self.cfg = request.cfg johannes@2301: self.title = self._("OpenID settings") johannes@2301: johannes@2301: def allowed(self): johannes@2301: for authm in self.request.cfg.auth: johannes@2301: if isinstance(authm, OpenIDAuth): johannes@2301: return True johannes@2301: return False johannes@2301: johannes@2301: def _handle_remove(self): johannes@2301: _ = self.request.getText johannes@2301: openids = self.request.user.openids[:] johannes@2301: for oid in self.request.user.openids: johannes@2301: name = "rm-%s" % sha.new(oid).hexdigest() johannes@2301: if name in self.request.form: johannes@2301: openids.remove(oid) johannes@2301: if not openids and len(self.request.cfg.auth) == 1: johannes@2301: return _("Cannot remove all OpenIDs.") johannes@2301: self.request.user.openids = openids johannes@2301: self.request.user.save() johannes@2301: return _("The selected OpenIDs have been removed.") johannes@2301: johannes@2301: def _handle_add(self): johannes@2301: _ = self.request.getText johannes@2301: request = self.request johannes@2301: johannes@2301: openid_id = request.form.get('openid_identifier', [''])[0] johannes@2301: johannes@2301: if openid_id in request.user.openids: johannes@2301: return _("OpenID is already present.") johannes@2301: johannes@2301: oidconsumer = consumer.Consumer(request.session, johannes@2301: MoinOpenIDStore(self.request)) johannes@2301: try: johannes@2301: oidreq = oidconsumer.begin(openid_id) johannes@2301: except HTTPFetchingError: johannes@2301: return _('Failed to resolve OpenID.') johannes@2301: except DiscoveryFailure: johannes@2301: return _('OpenID discovery failure, not a valid OpenID.') johannes@2301: else: johannes@2301: if oidreq is None: johannes@2301: return _("No OpenID.") johannes@2301: johannes@2301: qstr = wikiutil.makeQueryString({'action': 'userprefs', johannes@2301: 'handler': 'oid', johannes@2301: 'oid.return': '1'}) johannes@2301: return_to = ''.join([request.getBaseURL(), '?', qstr]) johannes@2301: trust_root = request.getBaseURL() johannes@2301: if oidreq.shouldSendRedirect(): johannes@2301: redirect_url = oidreq.redirectURL(trust_root, return_to) johannes@2301: request.http_redirect(redirect_url) johannes@2301: else: johannes@2301: form_html = oidreq.formMarkup(trust_root, return_to, johannes@2301: form_tag_attrs={'id': 'openid_message'}) johannes@2301: request.session['openid.prefs.form_html'] = form_html johannes@2301: johannes@2301: johannes@2301: def _handle_oidreturn(self): johannes@2301: request = self.request johannes@2301: _ = request.getText johannes@2301: johannes@2301: oidconsumer = consumer.Consumer(request.session, johannes@2301: MoinOpenIDStore(request)) johannes@2301: query = {} johannes@2301: for key in request.form: johannes@2301: query[key] = request.form[key][0] johannes@2301: qstr = wikiutil.makeQueryString({'action': 'userprefs', johannes@2301: 'handler': 'oid', johannes@2301: 'oid.return': '1'}) johannes@2301: return_to = ''.join([request.getBaseURL(), '?', qstr]) johannes@2301: info = oidconsumer.complete(query, return_to=return_to) johannes@2301: if info.status == consumer.FAILURE: johannes@2301: return _('OpenID error: %s.') % info.message johannes@2301: elif info.status == consumer.CANCEL: johannes@2301: return _('Verification canceled.') johannes@2301: elif info.status == consumer.SUCCESS: johannes@2301: if not info.identity_url in request.user.openids: johannes@2301: request.user.openids.append(info.identity_url) johannes@2301: request.user.save() johannes@2301: return _("OpenID added successfully.") johannes@2301: else: johannes@2301: return _("OpenID is already present.") johannes@2301: else: johannes@2301: return _('OpenID failure.') johannes@2301: johannes@2301: johannes@2301: def handle_form(self): johannes@2301: _ = self._ johannes@2301: form = self.request.form johannes@2301: johannes@2301: if form.has_key('oid.return'): johannes@2301: return self._handle_oidreturn() johannes@2301: johannes@2301: if form.has_key('cancel'): johannes@2301: return johannes@2301: johannes@2301: if form.has_key('remove'): johannes@2301: return self._handle_remove() johannes@2301: johannes@2301: if form.has_key('add'): johannes@2301: return self._handle_add() johannes@2301: johannes@2301: return johannes@2301: johannes@2301: def _make_form(self): johannes@2301: sn = self.request.getScriptname() johannes@2301: pi = self.request.getPathinfo() johannes@2301: action = u"%s%s" % (sn, pi) johannes@2301: _form = html.FORM(action=action) johannes@2301: _form.append(html.INPUT(type="hidden", name="action", value="userprefs")) johannes@2301: _form.append(html.INPUT(type="hidden", name="handler", value="oid")) johannes@2301: return _form johannes@2301: johannes@2301: def _make_row(self, label, cell, **kw): johannes@2301: """ Create a row in the form table. johannes@2301: """ johannes@2301: self._table.append(html.TR().extend([ johannes@2301: html.TD(**kw).extend([html.B().append(label), ' ']), johannes@2301: html.TD().extend(cell), johannes@2301: ])) johannes@2301: johannes@2301: def _oidlist(self): johannes@2301: _ = self.request.getText johannes@2301: form = self._make_form() johannes@2301: for oid in self.request.user.openids: johannes@2301: name = "rm-%s" % sha.new(oid).hexdigest() johannes@2301: form.append(html.INPUT(type="checkbox", name=name, id=name)) johannes@2301: form.append(html.LABEL(for_=name).append(html.Text(oid))) johannes@2301: form.append(html.BR()) johannes@2301: self._make_row(_("Current OpenIDs"), [form], valign='top') johannes@2301: label = _("Remove selected") johannes@2301: form.append(html.BR()) johannes@2301: form.append(html.INPUT(type="submit", name="remove", value=label)) johannes@2301: johannes@2301: def _addoidform(self): johannes@2301: _ = self.request.getText johannes@2301: form = self._make_form() johannes@2301: # go back to this page johannes@2301: form.append(html.INPUT(type="hidden", name="sub", value="oid")) johannes@2301: label = _("Add OpenID") johannes@2301: form.append(html.INPUT(type="text", size="32", johannes@2301: name="openid_identifier", johannes@2301: id="openididentifier")) johannes@2301: form.append(html.BR()) johannes@2301: form.append(html.INPUT(type="submit", name="add", value=label)) johannes@2301: self._make_row(_('Add OpenID'), [form]) johannes@2301: johannes@2301: def create_form(self): johannes@2301: """ Create the complete HTML form code. """ johannes@2301: _ = self._ johannes@2301: johannes@2301: ret = html.P() johannes@2301: # Use the user interface language and direction johannes@2301: lang_attr = self.request.theme.ui_lang_attr() johannes@2301: ret.append(html.Raw('