1
# -*- coding: iso-8859-1 -*-
3
MoinMoin - Simple Registration Extension for OpenID authorization
5
@copyright: 2009 Canonical, Inc.
6
@license: GNU GPL, see COPYING for details.
8
#from MoinMoin.util.moinoid import MoinOpenIDStore
9
from MoinMoin import user
10
from MoinMoin.auth import BaseAuth
11
from MoinMoin.auth.openidrp import OpenIDAuth
12
#from openid.consumer import consumer
13
#from openid.yadis.discover import DiscoveryFailure
14
#from openid.fetchers import HTTPFetchingError
15
#from MoinMoin.widget import html
16
#from MoinMoin.auth import CancelLogin, ContinueLogin
17
#from MoinMoin.auth import MultistageFormLogin, MultistageRedirectLogin
18
#from MoinMoin.auth import get_multistage_continuation_url
20
from openid.extensions.sreg import *
21
from MoinMoin import i18n
22
from datetime import datetime, timedelta
23
from pytz import timezone
26
OpenIDAuth.auth_attribs = ('name', 'email', 'aliasname', 'language', 'tz_offset')
28
openidrp_sreg_required = ['nickname', 'email', 'timezone']
29
openidrp_sreg_optional = ['fullname', 'language']
30
openidrp_sreg_username_field = 'nickname'
32
def openidrp_sreg_modify_request(oidreq, cfg):
33
oidreq.addExtension(SRegRequest(required=cfg.openidrp_sreg_required,
34
optional=cfg.openidrp_sreg_optional))
36
def openidrp_sreg_create_user(info, u, cfg):
37
sreg = _openidrp_sreg_extract_values(info)
38
if sreg and sreg[cfg.openidrp_sreg_username_field] != '':
39
u.name = sreg[cfg.openidrp_sreg_username_field]
42
def openidrp_sreg_update_user(info, u, cfg):
43
sreg = _openidrp_sreg_extract_values(info)
45
u.name = sreg[cfg.openidrp_sreg_username_field]
46
if sreg['email'] != '':
47
u.email = sreg['email']
48
if sreg['language'] != '':
49
u.language = sreg['language']
50
if sreg['timezone'] != '':
51
u.tz_offset = sreg['timezone']
52
if sreg['fullname'] != '':
53
u.fullname = sreg['fullname']
55
def _openidrp_sreg_extract_values(info):
56
# Pull SREG data here instead of asking user
57
sreg_resp = SRegResponse.fromSuccessResponse(info)
58
sreg = {'nickname': '', 'email': '', 'fullname': '',
59
'dob': '0000-00-00', 'gender': '', 'postcode': '',
60
'country': '', 'language': '', 'timezone': ''}
62
if sreg_resp.get('nickname'):
63
sreg['nickname'] = sreg_resp.get('nickname')
64
if sreg_resp.get('fullname'):
65
sreg['fullname'] = sreg_resp.get('fullname')
66
if sreg_resp.get('email'):
67
sreg['email'] = sreg_resp.get('email')
68
# Language must be a valid value
69
# check the MoinMoin list, or restrict to first 2 chars
70
if sreg_resp.get('language'):
71
# convert unknown codes to 2 char format
72
langs = i18n.wikiLanguages().items()
73
sreg['language'] = sreg_resp.get('language')
76
if lang[0] == sreg['language']:
79
if langs[sreg['language'][0:2]]:
80
sreg['language'] = sreg['language'][0:2]
81
# Timezone must be converted to offset in seconds
82
if sreg_resp.get('timezone'):
84
user_tz = timezone(sreg_resp.get('timezone').encode('ascii'))
85
except pytz.UnknownTimeZoneError:
89
user_utcoffset = user_tz.utcoffset(datetime.utcnow())
90
sreg['timezone'] = user_utcoffset.days * 24 * 60 * 60 + user_utcoffset.seconds
92
# XXX when does user_tz get falsy? if it does, shouldn't we just 'pass'?