cas_callbacks.py 4.05 KB
Newer Older
1
2
# Future Imports
from __future__ import unicode_literals, absolute_import, print_function, division
David Haynes's avatar
David Haynes committed
3
4

# Django Imports
5
6
from django.contrib.auth.models import User
from django.conf import settings
David Haynes's avatar
David Haynes committed
7

David Haynes's avatar
David Haynes committed
8
# Other Imports
9
import requests
10

11
def pfparse(pf_name_result):
David Haynes's avatar
David Haynes committed
12
13
14
15
    """
    Parse what peoplefinder sends back to us and make a list out of it
    """

16
17
18
19
20
21
22
23
24
25
26
    # name comes in format of Anderson, Nicholas J
    name_list = pf_name_result.split(',')
    # there's random whitespace with the first name
    first_name_section = name_list[1].strip()
    # check if there's a middle initial
    mi_q = first_name_section.split(' ')
    # make sure that the additional elements aren't multiple names
    if len(mi_q[-1]) == 1:
        first_name = ' '.join(mi_q[:-1])
    else:
        first_name = first_name_section
David Haynes's avatar
David Haynes committed
27
    # our list containing the name of the person in a usable list
28
29
30
31
    new_name_list = [first_name, name_list[0]]
    return new_name_list

def pfinfo(uname):
David Haynes's avatar
David Haynes committed
32
33
34
35
    """
    Get information from peoplefinder
    """

36
37
38
39
40
41
    base_url = settings.PF_URL
    url = base_url + "basic/all/" + str(uname)
    try:
        metadata = requests.get(url, timeout=5)
        print("Retrieving information from the peoplefinder api.")
        metadata.raise_for_status()
42
43
    except requests.exceptions.RequestException as ex:
        print("Cannot resolve to peoplefinder api:", ex)
44
        print("Returning empty user info tuple.")
45
        return ['', '']
46
47
48
49
    else:
        pfjson = metadata.json()
        try:
            if len(pfjson['results']) == 1:
Nicholas Anderson's avatar
Nicholas Anderson committed
50
51
52
53
54
55
56
                if pfjson['method'] == 'peoplefinder':
                    name_str = pfjson['results'][0]['name']
                    name = pfparse(name_str)
                elif pfjson['method'] == 'ldap':
                    name = [pfjson['results'][0]['givenname'], pfjson['results'][0]['surname']]
                else:
                    name = pfjson['results'][0]['name']
David Haynes's avatar
David Haynes committed
57
                return name
58
            else:
Nicholas Anderson's avatar
Nicholas Anderson committed
59
60
61
62
63
64
65
                if pfjson['method'] == 'peoplefinder':
                    name_str = pfjson['results'][1]['name']
                    name = pfparse(name_str)
                elif pfjson['method'] == 'ldap':
                    name = [pfjson['results'][1]['givenname'], pfjson['results'][1]['surname']]
                else:
                    name = pfjson['results'][0]['name']
David Haynes's avatar
David Haynes committed
66
                return name
67
        # if the name is not in peoplefinder, return empty first and last name
68
        except IndexError as ex:
69
            print("Name not found in peoplefinder.")
David Haynes's avatar
David Haynes committed
70
            return ['', '']
71
72
        except Exception as ex:
            print("Unknown peoplefinder error:", ex)
73
            print("Returning empty user info tuple.")
74
            return ['', '']
75

76
def create_user(tree):
David Haynes's avatar
David Haynes committed
77
78
79
    """
    Create a django user based off of the peoplefinder info we parsed earlier
    """
80

81
82
83
84
    print("Parsing CAS information.")
    try:
        username = tree[0][0].text
        user, user_created = User.objects.get_or_create(username=username)
85
86
    except Exception as ex:
        print("CAS callback unsuccessful:", ex)
87
88
89
90
91
92
93
94
95

    # error handling in pfinfo function
    info_name = pfinfo(username)

    try:
        if user_created:
            print("Created user object %s." % username)

            # set and save the user's email
David Haynes's avatar
David Haynes committed
96
            email_str = "%s%s" % (username, settings.EMAIL_DOMAIN)
97
98
99
100
101
102
103
            user.email = email_str
            # Password is a required User object field, though doesn't matter for our
            # purposes because all user auth is handled through CAS, not Django's login.
            user.set_password('cas_used_instead')
            user.save()
            print("Added user's email, %s." % email_str)

David Haynes's avatar
David Haynes committed
104
105
106
107
            user.first_name = info_name[0]
            user.last_name = info_name[1]
            user.save()
            print("Added user's name, %s %s." % (info_name[0], info_name[1]))
108
109

            print("User object creation process completed.")
110

111
112
        else:
            print("User object already exists.")
113

114
        print("CAS callback successful.")
115
116
    except Exception as ex:
        print("Unhandled user creation error:", ex)