improved CAS
This commit is contained in:
@@ -1 +1 @@
|
|||||||
Version 1.99.3 (2011-12-02 23:27:41) dev
|
Version 1.99.3 (2011-12-03 00:15:24) dev
|
||||||
|
|||||||
@@ -97,7 +97,13 @@ class CasAuth( object ):
|
|||||||
if data.startswith('yes') or data.startswith('no'):
|
if data.startswith('yes') or data.startswith('no'):
|
||||||
data = data.split('\n')
|
data = data.split('\n')
|
||||||
if data[0]=='yes':
|
if data[0]=='yes':
|
||||||
a=b=c = data[1]
|
if ':' in data[1]: # for Compatibility with Custom CAS
|
||||||
|
items = data[1].split(':')
|
||||||
|
a = items[0]
|
||||||
|
b = len(items)>1 and items[1] or a
|
||||||
|
c = len(items)>2 and items[2] or b
|
||||||
|
else:
|
||||||
|
a = b = c = data[1]
|
||||||
return dict(user=a,email=b,username=c)
|
return dict(user=a,email=b,username=c)
|
||||||
return None
|
return None
|
||||||
import xml.dom.minidom as dom
|
import xml.dom.minidom as dom
|
||||||
|
|||||||
+35
-33
@@ -1143,7 +1143,7 @@ class Auth(object):
|
|||||||
if args(1) == self.settings.cas_actions['login']:
|
if args(1) == self.settings.cas_actions['login']:
|
||||||
return self.cas_login(version=2)
|
return self.cas_login(version=2)
|
||||||
elif args(1) == self.settings.cas_actions['validate']:
|
elif args(1) == self.settings.cas_actions['validate']:
|
||||||
return self.cas_validate(version=1)
|
return self.cas_validate(version=2)
|
||||||
elif args(1) == self.settings.cas_actions['servicevalidate']:
|
elif args(1) == self.settings.cas_actions['servicevalidate']:
|
||||||
return self.cas_validate(version=2, proxy=False)
|
return self.cas_validate(version=2, proxy=False)
|
||||||
elif args(1) == self.settings.cas_actions['proxyvalidate']:
|
elif args(1) == self.settings.cas_actions['proxyvalidate']:
|
||||||
@@ -1531,8 +1531,11 @@ class Auth(object):
|
|||||||
ticket = row.ticket
|
ticket = row.ticket
|
||||||
else:
|
else:
|
||||||
ticket = 'ST-'+web2py_uuid()
|
ticket = 'ST-'+web2py_uuid()
|
||||||
table.insert(service=session._cas_service, user_id=self.user.id,
|
table.insert(service=session._cas_service,
|
||||||
ticket=ticket, created_on=request.now, renew=interactivelogin)
|
user_id=self.user.id,
|
||||||
|
ticket=ticket,
|
||||||
|
created_on=request.now,
|
||||||
|
renew=interactivelogin)
|
||||||
service = session._cas_service
|
service = session._cas_service
|
||||||
del session._cas_service
|
del session._cas_service
|
||||||
if request.vars.has_key('warn'):
|
if request.vars.has_key('warn'):
|
||||||
@@ -1558,6 +1561,7 @@ class Auth(object):
|
|||||||
ticket = request.vars.ticket
|
ticket = request.vars.ticket
|
||||||
renew = True if request.vars.has_key('renew') else False
|
renew = True if request.vars.has_key('renew') else False
|
||||||
row = table(ticket=ticket)
|
row = table(ticket=ticket)
|
||||||
|
success = False
|
||||||
if row:
|
if row:
|
||||||
if self.settings.login_userfield:
|
if self.settings.login_userfield:
|
||||||
userfield = self.settings.login_userfield
|
userfield = self.settings.login_userfield
|
||||||
@@ -1566,39 +1570,37 @@ class Auth(object):
|
|||||||
else:
|
else:
|
||||||
userfield = 'email'
|
userfield = 'email'
|
||||||
# If ticket is a service Ticket and RENEW flag respected
|
# If ticket is a service Ticket and RENEW flag respected
|
||||||
if ticket[0:3] == 'ST-' and not ((row.renew and renew) ^ renew):
|
if ticket[0:3] == 'ST-' and \
|
||||||
|
not ((row.renew and renew) ^ renew):
|
||||||
user = self.settings.table_user(row.user_id)
|
user = self.settings.table_user(row.user_id)
|
||||||
row.delete_record()
|
row.delete_record()
|
||||||
if version == 1:
|
success = True
|
||||||
raise HTTP(200,'yes\n%s'%(user[userfield]))
|
def build_response(body):
|
||||||
# assume version 2
|
return '<?xml version="1.0" encoding="UTF-8"?>\n'+\
|
||||||
|
TAG['cas:serviceResponse'](
|
||||||
|
body,**{'_xmlns:cas':'http://www.yale.edu/tp/cas'}).xml()
|
||||||
|
if success:
|
||||||
|
if version == 1:
|
||||||
|
message = 'yes\n%s' % user[userfield]
|
||||||
|
else: # assume version 2
|
||||||
username = user.get('username',user[userfield])
|
username = user.get('username',user[userfield])
|
||||||
raise HTTP(200,'<?xml version="1.0" encoding="UTF-8"?>\n'+\
|
message = build_response(
|
||||||
TAG['cas:serviceResponse'](
|
TAG['cas:authenticationSuccess'](
|
||||||
TAG['cas:authenticationSuccess'](
|
TAG['cas:user'](username),
|
||||||
TAG['cas:user'](username),
|
*[TAG['cas:'+field.name](user[field.name]) \
|
||||||
*[TAG['cas:'+field.name](user[field.name]) \
|
for field in self.settings.table_user \
|
||||||
for field in self.settings.table_user \
|
if field.readable]))
|
||||||
if field.readable]),
|
else:
|
||||||
**{'_xmlns:cas':'http://www.yale.edu/tp/cas'}).xml())
|
if version == 1:
|
||||||
else:
|
message = 'no\n'
|
||||||
raise HTTP(200,'<?xml version="1.0" encoding="UTF-8"?>\n'+\
|
elif row:
|
||||||
TAG['cas:serviceResponse'](
|
message = build_response(TAG['cas:authenticationFailure']())
|
||||||
TAG['cas:authenticationFailure'](),
|
else:
|
||||||
**{'_xmlns:cas':'http://www.yale.edu/tp/cas'}).xml())
|
message = build_response(
|
||||||
# Delete ticket if not already done
|
TAG['cas:authenticationFailure'](
|
||||||
row.delete_record()
|
'Ticket %s not recognized' % ticket,
|
||||||
|
_code='INVALID TICKET'))
|
||||||
if version == 1:
|
raise HTTP(200,message)
|
||||||
raise HTTP(200,'no\n')
|
|
||||||
# assume version 2
|
|
||||||
raise HTTP(200,'<?xml version="1.0" encoding="UTF-8"?>\n'+\
|
|
||||||
TAG['cas:serviceResponse'](
|
|
||||||
TAG['cas:authenticationFailure'](
|
|
||||||
'Ticket %s not recognized' % ticket,
|
|
||||||
_code='INVALID TICKET'),
|
|
||||||
**{'_xmlns:cas':'http://www.yale.edu/tp/cas'}).xml())
|
|
||||||
|
|
||||||
|
|
||||||
def login(
|
def login(
|
||||||
self,
|
self,
|
||||||
|
|||||||
Reference in New Issue
Block a user