summaryrefslogtreecommitdiffstats
path: root/mediawiki/api.py
blob: 912de04190578fe92bb7a334ab2a110a1a17a9a1 (plain)
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