1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
#this file contains stub functions that can be extended to support
#connect legacy login with external site
from django.conf import settings
from django_authopenid.models import ExternalLoginData
import httplib
import urllib
import Cookie
import cookielib
from django import forms
import xml.dom.minidom as xml
import logging
from models import User as MWUser
def login(request,user):
"""performs the additional external login operation
"""
pass
def set_login_cookies(response,user):
#should be unique value by design
try:
eld = ExternalLoginData.objects.get(user=user)
data = eld.external_session_data
dom = xml.parseString(data)
login_response = dom.getElementsByTagName('login')[0]
userid = login_response.getAttribute('lguserid')
username = login_response.getAttribute('lgusername')
token = login_response.getAttribute('lgtoken')
prefix = login_response.getAttribute('cookieprefix').decode('utf-8')
sessionid = login_response.getAttribute('sessionid')
c = {}
c[prefix + 'UserName'] = username
c[prefix + 'UserID'] = userid
c[prefix + 'Token'] = token
c[prefix + '_session'] = sessionid
logging.debug('have cookies ' + str(c))
#custom code that copies cookies from external site
#not sure how to set paths and domain of cookies here
domain = settings.MEDIAWIKI_COOKIE_DOMAIN
for key in c:
if c[key]:
response.set_cookie(str(key),\
value=str(c[key]),\
domain=domain)
for c in response.cookies.values():
logging.debug(c.output())
except ExternalLoginData.DoesNotExist:
#this must be an OpenID login
pass
#function to perform external logout, if needed
def logout(request):
pass
#should raise User.DoesNotExist or pass
def clean_username(username):
return username
def check_password(username,password):
"""connects to external site and submits username/password pair
return True or False depending on correctness of login
saves remote unique id and remote session data in table ExternalLoginData
may raise forms.ValidationError
"""
host = settings.EXTERNAL_LEGACY_LOGIN_HOST
port = settings.EXTERNAL_LEGACY_LOGIN_PORT
ext_site = httplib.HTTPConnection(host,port)
print 'connected to %s:%s' % (str(host),str(port))
#custom code. this one does authentication through
#MediaWiki API
params = urllib.urlencode({'action':'login','format':'xml',
'lgname':username,'lgpassword':password})
headers = {"Content-type": "application/x-www-form-urlencoded",
'User-Agent':"User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7",
"Accept": "text/xml"}
ext_site.request("POST","/wiki/api.php",params,headers)
response = ext_site.getresponse()
if response.status != 200:
raise forms.ValidationError('error ' + response.status + ' ' + response.reason)
data = response.read().strip()
ext_site.close()
print data
dom = xml.parseString(data)
login = dom.getElementsByTagName('login')[0]
result = login.getAttribute('result')
if result == 'Success':
username = login.getAttribute('lgusername')
try:
eld = ExternalLoginData.objects.get(external_username=username)
except ExternalLoginData.DoesNotExist:
eld = ExternalLoginData()
eld.external_username = username
eld.external_session_data = data
eld.save()
return True
else:
error = login.getAttribute('details')
raise forms.ValidationError(error)
return False
def createuser(username,email,password):
pass
#retrieve email address
def get_email(username,password):
try:
u = MWUser.objects.get(user_name=username)
return u.user_email
except MWUser.DoesNotExist:
return ''
#try to get full name from mediawiki
def get_screen_name(username,password):
try:
u = MWUser.objects.get(user_name=username)
full_name = u' '.join((u.user_first_name, u.user_last_name)).strip()
if full_name != u'':
return full_name
else:
return username
except MWUser.DoesNotExist:
return username
def connect_local_user_to_external_user(user, login, password):
try:
u = MWUser.objects.get(user_name=login)
user.mediawiki_user = u
except MWUser.DoesNotExist:
pass
|