#! /usr/bin/python
#------------------------------------------------------------------------
# name:
# author: J Skinner
# Date Written:
# Purpose:
# Notes
#------------------------------------------------------------------------
#------------------------ GLOBALS ------------------------------------
DEBUG_MAIN = 0
DEBUG = 0
IS_CGI = 1
IS_DB = 1
#------------------------ IMPORTS ------------------------------------
import string
import os
import sys
import cgi
import traceback
import MySQLdb
import access
import Cookie
from the_form import The_Form
TEMPLATE_DIR = '/home/joe/Work/pysocks/'
def get_file_as_string(fname):
return '\n'.join(open(fname, 'r').readlines())
class Auth:
auth_exception = 'authentication exception'
# error pages start at id 10000
ERROR_PAGE = 10001
__logout_link = '<a href="./index.cgi?action=logout">logout</a>'
__login_link = '<a href="./index.cgi?action=login">login</a>'
def test(self):
print 'visted', self.__visted, '<br>'
print 'auth_level', self.auth_level, '<br>'
print 'user_id', self.__user_id, '<br>'
print 'cookie', self.__cookie, '<br>'
print 'auth_id', self.__auth_id, '<br>'
print 'set_cookie', self.__set_cookie, '<br>'
print
print 'logged_in', self.__logged_in, '<br>'
#print 'cookie', self.__cookie['pysocks_id'].value, '<br>'
#print 'env cookie', os.environ['HTTP_COOKIE'], '<br>'
#print 'form_data', `self.__form_data`
def __init__(self, db, form_data=None):
self.__visted = []
self.__form_data = form_data
self.__db = db
self.auth_level = 0
self.__user_id = None
self.__cookie = None
self.__auth_id = None
self.__set_cookie = None
self.do_login = None
self.do_logout = None
self.do_download = None
self.__logged_in = None
self.__setup()
if self.__form_data.action == 'login':
self.do_login = 1
elif self.__form_data.action == 'login_check':
self.login_check()
elif self.__form_data.action == 'logout':
self.do_logout = 1
self.logout()
elif self.__form_data.action == 'download':
self.do_download = 1
def __setup(self):
if os.environ.has_key('HTTP_COOKIE'):
self.__visted.append('setup: environ check')
self.__cookie = Cookie.SmartCookie(os.environ['HTTP_COOKIE'])
else:
self.__cookie = Cookie.SmartCookie()
if self.__cookie.has_key('pysocks_id'):
self.__visted.append('setup: cookie key')
self.__user_id = self.__cookie['pysocks_id'].value
try:
self.__auth_id, self.__status = self.__db.get('auth',
['auth_id', 'status'],
where='auth_id="%s"'%self.__user_id)[0]
self.__visted.append('setup: %s'%self.__auth_id)
if self.__status not in [-1, 0]:
self.__logged_in = 1
except self.__db.NO_DATA:
# something wrong - maybe the cookie has been expired.
# set the cookie to the active but not logged in status
# 0 and give the person a new auth record.
self.__auth_id = self.__db.put('auth', {'status':'0'} )
self.__cookie['pysocks_id'] = self.__auth_id
self.__visted.append('setup: except clause')
else:
# we have no cookie set it up
# check to see that the login isn't expired
self.__auth_id = self.__db.put('auth', {'status':'0'} )
self.__cookie['pysocks_id'] = self.__auth_id
# if expired send them to a login screen or an error screen
# not sure which.
# get further details.
# user_info = self.__db.get_dict('user', [...],
# where='auth_id="%s"'%self.__auth_id)[0]
def show_login(self):
# this is a temp hack.
self.__set_cookie = 1
print get_file_as_string(Template_DIR+'login.html')
def login_check(self):
# this is broken fix.
self.__visted.append('login_check')
if self.__form_data.username and \
self.__form_data.passwd:
pass
else:
# we have a bad password bail out.
return -1, 1000
try:
results = self.__db.get_dict('users',
['username', 'passwd', 'user_id', 'auth_level'],
where='username="%s" and passwd="%s"'%(
self.__form_data.username, self.__form_data.passwd))[0]
self.__db.set('auth', {'status':1},
where='auth_id="%s"'%self.__auth_id)
self.auth_level = results['auth_level']
self.__logged_in = 1
except self.__db.NO_DATA:
return -1, 1000
return 1, 1
def logout(self):
'''\
expire the cookie to logout the person and
update the status in the db'''
try:
self.__db.set('auth', {'status':0},
where='auth_id=%s'%self.__cookie['pysocks_id'].value)
except:
self.__visted.append('logout: Error in auth.logout()')
self.__cookie['pysocks_id'] = 0
self.__logged_in = 0
self.__visted.append('logout: %s'%self.__logged_in)
self.__visted.append('logout: %s'%str(self.__cookie))
def is_logged_in(self):
return self.__logged_in
def __get_cookie(self):
if os.environ.has_key('HTTP_COOKIE'):
self.__cookie.load(os.environ['HTTP_COOKIE'])
self.__user_id = self.__cookie['pysocks_id']
# query the database to check if this is still valid.
try:
self.__user_id, self.auth_level = \
self.__db.get_dict('auth', ['logged_in'],
where='id=%s'%self.__cockie['user_id', 'auth_level'])[0]
except self.__db.NO_DATA:
# no one home.
# generate an error
raise self.auth_exception
def error_page(self):
return Page(self.__ERROR_PAGE)
pass
def show(self):
return self.__cookie
def login_status(self):
self.__visted.append('login status %s'%self.__logged_in)
if self.__logged_in:
return 'Currently Logged in | %s'%self.__logout_link
else:
return 'Not logged in | %s'%self.__login_link
def get_cookie_header(self):
#self.__cookie['pysocks_id'] = self.__auth_id
return str(self.__cookie)
#------------------------ CODE ------------------------------------
#class The_Form:
# __attributes = {'username':None, 'passwd':None, 'function':'default',
# 'action':None}
# __keys = __attributes.keys()
#
# def __init__(self, vals=None, extra_attrs=None):
# '''\
# init object
# has two optional parameters both dictionaries
# vals is a set of vals to put into the object and
# extra_attrs is a list of attributes with defaults that can be
# added
# '''
#
# if extra_attrs:
# for i in extra_attrs.keys():
# self.__attributes[i] = extra_attrs[i]
# self.__keys = self.__attributes.keys()
#
# if vals:
# for i in vals.keys():
# if i in self.__keys:
# self.__attributes[i] = vals[i]
# else:
# self.__invalid_item = 1
#
# def error(self):
# if self.__invalid_item:
# return 1
# else:
# return 0
#
#
# def get_values_from_form(self, form):
# for i in self.__keys:
# if form.has_key(i):
# self.__attributes[i] = form[i].value
#
# def __setattr__(self, attr, val):
# if attr in self.__keys:
# self.__attributes[attr] = val
#
#
# def __getattr__(self, attr):
# if attr in self.__keys:
# return self.__attributes[attr]
class Page:
__attributes = {'login':None}
__keys = __attributes.keys()
def __init__(self, auth):
self.__auth = auth
pass
def __set_cookie(self):
pass
def __show_header(self):
print 'Content-type: text/html'
print self.__auth.get_cookie_header()
print
def __show_body(self):
self.__attributes['login'] = self.__auth.login_status()
print self.__template%self.__attributes
def load_template(self, template):
self.__template = get_file_as_string(template)
def show(self):
self.__show_header()
self.__show_header()
self.__show_body()
def main():
form = cgi.FieldStorage()
form_data = The_Form()
form_data.get_values_from_form(form)
db = access.Access(dbname='pysocks', user='crypt')
auth = Auth(db, form_data)
page = Page(auth)
# print 'Content-type: text/html'
# print
page.load_template('/home/crypt/Work/pysocks/simple.html')
page.show()
auth.test()
# print os.environ['cookie']
# print cgi.print_environ()
#------------------------------------------------------------------------
if __name__ == '__main__':
main()
#------------------------ END ------------------------------------