-
Notifications
You must be signed in to change notification settings - Fork 1
/
server.py
113 lines (83 loc) · 3.14 KB
/
server.py
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import os
from zope import interface
from twisted.application import internet, service
from twisted.cred import checkers, portal
from twisted.python import log
from twisted.web import resource, server, static
import credfactory, wrapper
class PostableFile(static.File):
def render(self, request):
#import pdb; pdb.set_trace()
pass
def render_GET(self, request):
return self.render_GET(request)
def render_POST(self, request):
##import pdb; pdb.set_trace()
request.method = 'GET'
return self.render_GET(request)
def logout():
"""
A simple do-nothing placeholder for logout behavior.
"""
log.msg('logout called.')
return None
def sessionExpired(session):
log.msg('session expired.')
session.avatar = None
class WebAuthSession(server.Session):
sessionTimeout = 3600
def __init__(self, site, uid, reactor=None):
server.Session.__init__(self, site, uid, reactor)
self.avatar = None
class WebAuthenticatedRealm(object):
interface.implements(portal.IRealm)
def __init__(self, anonymousRoot, authorizedRoot):
self.anonymousRoot = anonymousRoot
self.authorizedRoot = authorizedRoot
def requestAvatar(self, avatarId, request, *interfaces):
"""
Called after the user has successfully authenticated, returning an
IResource instance representing the user's HTTP interface to an app.
"""
if resource.IResource in interfaces:
session = request.getSession()
if avatarId is checkers.ANONYMOUS:
log.msg('Anonymous')
return (resource.IResource, self.anonymousRoot(), logout)
else:
log.msg('Authenticated: ' + avatarId)
avatar = self.authorizedRoot('/Users/%s' % (avatarId,))
session.avatar = avatar
if not session.expireCallbacks:
session.notifyOnExpire(lambda: sessionExpired(session))
return (
resource.IResource,
avatar,
logout
)
log.msg('requestAvatar: Realm not implemented.')
raise NotImplementedError()
credentialFactories = [credfactory.FormCredentialFactory("myapp")]
def authorizedResource(*args, **kw):
avatar = resource.Resource()
avatar.putChild('myapp', PostableFile(*args, **kw))
return avatar
root = wrapper.WebAuthSessionWrapper(
portal.Portal(
WebAuthenticatedRealm(wrapper.UnauthorizedResource, authorizedResource), #static.File
[
checkers.AllowAnonymousAccess(),
checkers.InMemoryUsernamePasswordDatabaseDontUse(**{'jbernier': 'letmein', 'ldb': 'letmein'})
#checkers.FilePasswordDB('httpd.password')
]
),
credentialFactories
)
def getWebService():
"""Return a service suitable for creating an application object. """
site = server.Site(root)
site.sessionFactory = WebAuthSession
return internet.TCPServer(9000, site)
application = service.Application("FormAuthDemo")
service = getWebService()
service.setServiceParent(application)