-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdjango_session.py
More file actions
55 lines (45 loc) · 1.62 KB
/
django_session.py
File metadata and controls
55 lines (45 loc) · 1.62 KB
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
import sys
import psycopg2
import pickle
import json
import inspect
import traceback
def user(session_id):
db_credentials = {}
execfile('/srv/www/main/public/inc/config.py', db_credentials)
def _query(query):
try:
cursor = connection.cursor()
cursor.execute(query)
return cursor.fetchone() # Returns a tuple
except psycopg2.DatabaseError, e:
return _build_error_dict(message=str(e))
finally:
cursor.close()
def _build_error_dict(message):
return {
'error': message,
'stack_trace': ''.join(traceback.format_stack(inspect.currentframe()))
}
try:
connection = psycopg2.connect(database='main_django', user=db_credentials['POSTGRESQL_USERNAME'], password=db_credentials['POSTGRESQL_PASSWORD'])
except psycopg2.DatabaseError, e:
return _build_error_dict(message=str(e))
session_data = _query(query="SELECT session_data FROM django_session WHERE session_key='{0}'".format(session_id))
try:
if 'error' in session_data:
return session_data
else:
# Decode the session data and unpickle it
# The first 40 bytes are a crypto hash that we don't care about
session_data = pickle.loads(session_data[0].decode('base64')[41:])
user_id = session_data['_auth_user_id']
user_data = _query(query="SELECT username, first_name, last_name, email FROM auth_user WHERE id='{0}'".format(user_id))
is_faculty = _query(query="SELECT is_faculty FROM auth2_userdata WHERE user_id='{0}'".format(user_id))
user_data += is_faculty # Concatenate the tuples
return user_data
except Exception, e:
return _build_error_dict(message=str(e))
finally:
connection.close()
print json.dumps(user(sys.argv[1]))