- #! /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 ------------------------------------