# Twisted, the Framework of Your Internet
# Copyright (C) 2001 Matthew W. Lefkowitz
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of version 2.1 of the GNU Lesser General Public
# License as published by the Free Software Foundation.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
"""Web interface for the Twisted db authentication system.
Has pages to:
- show all the identities
- show the perspectives for an identity
- add a new identity
- add a perspective for an identity
- remove an identity
- remove a perspective
- change the password on an identity
top page: show identities and actions
- remove
- change password
- create new
for an identity: show perspectives and actions
- remove
- add
"""
import md5
from twisted.web import widgets
class IdentitiesGadget(widgets.Gadget, widgets.StreamWidget):
title = "Database Identities"
def __init__(self, authorizer):
widgets.Gadget.__init__(self)
self.authorizer = authorizer
self.putWidget('perspectives', PerspectivesGadget(authorizer))
self.putWidget('newIdentity', NewIdentityForm(authorizer))
self.putWidget('newPerspective', NewPerspectiveForm(authorizer))
self.putWidget('removeIdentity', RemoveIdentityForm(authorizer))
self.putWidget('removePerspective', RemovePerspectiveForm(authorizer))
self.putWidget('password', ChangePasswordForm(authorizer))
def display(self, request):
"""Display the list of identities
"""
return [self.authorizer.getIdentities().addCallback(self.gotIdentities)]
def gotIdentities(self, data):
l = []
l.append( '
')
l.append( '' )
l.append( ' Identity | ' )
l.append( ' # of Perspectives | ' )
l.append( ' Actions | ' )
l.append( '
\n' )
for (name, password, numPerspectives) in data:
l.append( " %s | " % (name, name) )
l.append( " %d | " % numPerspectives )
l.append( " [remove]" % name)
l.append( "[password] |
\n" % ( name) )
l.append("
")
l.append("
[Create an Identity]
")
l.append( '
Twisted DB Authentication ' )
return l
class PerspectivesGadget(widgets.Gadget, widgets.Widget):
title = " "
def __init__(self, authorizer):
widgets.Gadget.__init__(self)
self.authorizer = authorizer
def display(self, request):
"""Display the intro list of forums. This is only called if there is no URI.
"""
self.identityName = request.args.get('identityName',[0])[0]
return [self.authorizer.getPerspectives(self.identityName).addCallback(self.gotPerspectives)]
def gotPerspectives(self, data):
l = []
l.append('''
Perspectives for Identity: %s
Perspective Name |
Service |
Actions |
\n''' % self.identityName)
for (iname, pname, sname) in data:
l.append( " %s | %s | " % (pname, sname) )
l.append( " [remove] |
\n" % (pname, self.identityName) )
l.append("
")
l.append("
[Add a Perspective] " % self.identityName)
l.append("[Change Password]
" % self.identityName)
l.append( '
Twisted DB Authentication ' )
return l
class NewIdentityForm(widgets.Gadget, widgets.Form):
title = "Create a New Identity:"
def __init__(self, authorizer):
self.authorizer = authorizer
widgets.Gadget.__init__(self)
def display(self, request):
self.request = request
self.formFields = [
['string', 'Identity Name: ', 'name', ''],
['string', 'Password:', 'password', '']
]
return widgets.Form.display(self, self.request)
def process(self, write, request, submit, name, password):
m = md5.new()
m.update(password)
hashedPassword = m.digest()
self.authorizer.addEmptyIdentity(name, hashedPassword)
write("Created new identity '%s'.
\n" % name)
write("Return to Main")
class NewPerspectiveForm(widgets.Gadget, widgets.Form):
title = " "
def __init__(self, authorizer):
self.authorizer = authorizer
widgets.Gadget.__init__(self)
def display(self, request):
self.identityName = request.args.get('identityName',[0])[0]
self.request = request
return [" Add Perspective for Identity '%s'" % self.identityName,
self.authorizer.getServices().addCallback(self.onServices)]
def onServices(self, data):
menuList = []
for service, in data:
menuList.append( (service, service) )
self.formFields = [
['string', 'Perspective Name: ', 'name', ''],
['menu', 'Service', 'service', menuList],
['hidden', '', 'identityName', self.identityName]
]
return widgets.Form.display(self, self.request)
def process(self, write, request, submit, name, service, identityName):
self.authorizer.addPerspective(self.identityName, name, service)
write("Added perspective '%s' for '%s'.
\n" % (self.identityName, name) )
write("Return to Main")
class ChangePasswordForm(widgets.Gadget, widgets.Form):
title = " "
def __init__(self, authorizer):
self.authorizer = authorizer
widgets.Gadget.__init__(self)
def display(self, request):
self.identityName = request.args.get('identityName',[0])[0]
self.formFields = [
['string', 'New Password: ', 'password', ''],
['hidden', '', 'identityName', self.identityName]
]
return widgets.Form.display(self, request)
def process(self, write, request, submit, password, identityName):
m = md5.new()
m.update(password)
hashedPassword = m.digest()
self.authorizer.changePassword(self.identityName, hashedPassword)
write("Changed password for '%s'.
\n" % (self.identityName) )
write("Return to Main")
class NewIdentityForm(widgets.Gadget, widgets.Form):
title = "Create a New Identity:"
def __init__(self, authorizer):
self.authorizer = authorizer
widgets.Gadget.__init__(self)
def display(self, request):
self.request = request
self.formFields = [
['string', 'Identity Name: ', 'name', ''],
['string', 'Password:', 'password', '']
]
return widgets.Form.display(self, self.request)
def process(self, write, request, submit, name, password):
m = md5.new()
m.update(password)
hashedPassword = m.digest()
self.authorizer.addEmptyIdentity(name, hashedPassword)
write("Created new identity '%s'.
\n" % name)
write("Return to Main")
class RemoveIdentityForm(widgets.Gadget, widgets.Form):
title = "Confirm Removing Identity "
def __init__(self, authorizer):
self.authorizer = authorizer
widgets.Gadget.__init__(self)
def display(self, request):
self.identityName = request.args.get('identityName',[0])[0]
self.request = request
txt = "Remove Identity: %s" % self.identityName
self.formFields = [
['string', '', 'txt', txt],
['hidden', '', 'identityName', self.identityName]
]
return widgets.Form.display(self, self.request)
def process(self, write, request, submit, identityName, txt):
self.authorizer.removeIdentity(self.identityName)
write("Removed Identity %s.
\n" % identityName)
write("Return to Main")
class RemovePerspectiveForm(widgets.Gadget, widgets.Form):
title = "Confirm Removing Perspective"
def __init__(self, authorizer):
self.authorizer = authorizer
widgets.Gadget.__init__(self)
def display(self, request):
self.request = request
self.pname = request.args.get('pname',[0])[0]
self.iname = request.args.get('iname',[0])[0]
txt = "Remove Perspective %s for %s" % (self.pname, self.iname)
self.formFields = [
['string', '', 'txt', txt ],
['hidden', '', 'iname', self.iname],
['hidden', '', 'pname', self.pname]
]
return widgets.Form.display(self, self.request)
def process(self, write, request, submit, iname, pname, txt):
self.authorizer.removePerspective(self.iname, self.pname)
write("Removed %s for %s.
\n" % (pname, iname) )
write("Return to Main")