def test_renderWithHost(self):
        """
        L{NameVirtualHost.render} returns the result of rendering the resource
        which is the value in the instance's C{host} dictionary corresponding
        to the key indicated by the value of the I{Host} header in the request.
        """
        virtualHostResource = NameVirtualHost()
        virtualHostResource.addHost('example.org', Data("winner", ""))

        request = DummyRequest([''])
        request.headers['host'] = 'example.org'
        d = _render(virtualHostResource, request)
        def cbRendered(ignored, request):
            self.assertEqual(''.join(request.written), "winner")
        d.addCallback(cbRendered, request)

        # The port portion of the Host header should not be considered.
        requestWithPort = DummyRequest([''])
        requestWithPort.headers['host'] = 'example.org:8000'
        dWithPort = _render(virtualHostResource, requestWithPort)
        def cbRendered(ignored, requestWithPort):
            self.assertEqual(''.join(requestWithPort.written), "winner")
        dWithPort.addCallback(cbRendered, requestWithPort)

        return gatherResults([d, dWithPort])
Esempio n. 2
0
    def test_renderWithHost(self):
        """
        L{NameVirtualHost.render} returns the result of rendering the resource
        which is the value in the instance's C{host} dictionary corresponding
        to the key indicated by the value of the I{Host} header in the request.
        """
        virtualHostResource = NameVirtualHost()
        virtualHostResource.addHost(b'example.org', Data(b"winner", ""))

        request = DummyRequest([b''])
        request.requestHeaders.addRawHeader(b'host', b'example.org')
        d = _render(virtualHostResource, request)
        def cbRendered(ignored, request):
            self.assertEqual(b''.join(request.written), b"winner")
        d.addCallback(cbRendered, request)

        # The port portion of the Host header should not be considered.
        requestWithPort = DummyRequest([b''])
        requestWithPort.requestHeaders.addRawHeader(b'host', b'example.org:8000')
        dWithPort = _render(virtualHostResource, requestWithPort)
        def cbRendered(ignored, requestWithPort):
            self.assertEqual(b''.join(requestWithPort.written), b"winner")
        dWithPort.addCallback(cbRendered, requestWithPort)

        return gatherResults([d, dWithPort])
Esempio n. 3
0
    def test_getChild(self):
        """
        L{NameVirtualHost.getChild} returns correct I{Resource} based off
        the header and modifies I{Request} to ensure proper prepath and
        postpath are set.
        """
        virtualHostResource = NameVirtualHost()
        leafResource = Data(b"leaf data", "")
        leafResource.isLeaf = True
        normResource = Data(b"norm data", "")
        virtualHostResource.addHost(b'leaf.example.org', leafResource)
        virtualHostResource.addHost(b'norm.example.org', normResource)

        request = DummyRequest([])
        request.requestHeaders.addRawHeader(b'host', b'norm.example.org')
        request.prepath = [b'']

        self.assertIsInstance(virtualHostResource.getChild(b'', request),
                              NoResource)
        self.assertEqual(request.prepath, [b''])
        self.assertEqual(request.postpath, [])

        request = DummyRequest([])
        request.requestHeaders.addRawHeader(b'host', b'leaf.example.org')
        request.prepath = [b'']

        self.assertIsInstance(virtualHostResource.getChild(b'', request),
                              Data)
        self.assertEqual(request.prepath,  [])
        self.assertEqual(request.postpath, [b''])
Esempio n. 4
0
    def test_getChild(self):
        """
        L{_HostResource.getChild} returns the proper I{Resource} for the vhost
        embedded in the URL.  Verify that returning the proper I{Resource}
        required changing the I{Host} in the header.
        """
        bazroot = Data(b'root data', "")
        bazuri  = Data(b'uri data', "")
        baztest = Data(b'test data', "")
        bazuri.putChild(b'test', baztest)
        bazroot.putChild(b'uri', bazuri)
        hr = _HostResource()

        root = NameVirtualHost()
        root.default = Data(b'default data', "")
        root.addHost(b'baz.com', bazroot)

        request = DummyRequest([b'uri', b'test'])
        request.prepath = [b'bar', b'http', b'baz.com']
        request.site = Site(root)
        request.isSecure = lambda: False
        request.host = b''

        step = hr.getChild(b'baz.com', request) # Consumes rest of path
        self.assertIsInstance(step, Data)

        request = DummyRequest([b'uri', b'test'])
        step = root.getChild(b'uri', request)
        self.assertIsInstance(step, NoResource)
 def test_renderWithoutHost(self):
     """
     L{NameVirtualHost.render} returns the result of rendering the
     instance's C{default} if it is not C{None} and there is no I{Host}
     header in the request.
     """
     virtualHostResource = NameVirtualHost()
     virtualHostResource.default = Data("correct result", "")
     request = DummyRequest([""])
     self.assertEqual(virtualHostResource.render(request), "correct result")
Esempio n. 6
0
 def test_renderWithoutHost(self):
     """
     L{NameVirtualHost.render} returns the result of rendering the
     instance's C{default} if it is not C{None} and there is no I{Host}
     header in the request.
     """
     virtualHostResource = NameVirtualHost()
     virtualHostResource.default = Data("correct result", "")
     request = DummyRequest([''])
     self.assertEqual(virtualHostResource.render(request), "correct result")
Esempio n. 7
0
 def test_renderWithUnknownHost(self):
     """
     L{NameVirtualHost.render} returns the result of rendering the
     instance's C{default} if it is not C{None} and there is no host
     matching the value of the I{Host} header in the request.
     """
     virtualHostResource = NameVirtualHost()
     virtualHostResource.default = Data(b"correct data", "")
     request = DummyRequest([b''])
     request.requestHeaders.addRawHeader(b'host', b'example.com')
     d = _render(virtualHostResource, request)
     def cbRendered(ignored):
         self.assertEqual(b''.join(request.written), b"correct data")
     d.addCallback(cbRendered)
     return d
 def test_renderWithUnknownHost(self):
     """
     L{NameVirtualHost.render} returns the result of rendering the
     instance's C{default} if it is not C{None} and there is no host
     matching the value of the I{Host} header in the request.
     """
     virtualHostResource = NameVirtualHost()
     virtualHostResource.default = Data("correct data", "")
     request = DummyRequest([''])
     request.headers['host'] = 'example.com'
     d = _render(virtualHostResource, request)
     def cbRendered(ignored):
         self.assertEqual(''.join(request.written), "correct data")
     d.addCallback(cbRendered)
     return d
Esempio n. 9
0
    def test_getChild(self):
        """
        L{_HostResource.getChild} returns the proper I{Resource} for the vhost
        embedded in the URL.  Verify that returning the proper I{Resource}
        required changing the I{Host} in the header.
        """
        bazroot = Data(b"root data", "")
        bazuri = Data(b"uri data", "")
        baztest = Data(b"test data", "")
        bazuri.putChild(b"test", baztest)
        bazroot.putChild(b"uri", bazuri)
        hr = _HostResource()

        root = NameVirtualHost()
        root.default = Data(b"default data", "")
        root.addHost(b"baz.com", bazroot)

        request = DummyRequest([b"uri", b"test"])
        request.prepath = [b"bar", b"http", b"baz.com"]
        request.site = Site(root)
        request.isSecure = lambda: False
        request.host = b""

        step = hr.getChild(b"baz.com", request)  # Consumes rest of path
        self.assertIsInstance(step, Data)

        request = DummyRequest([b"uri", b"test"])
        step = root.getChild(b"uri", request)
        self.assertIsInstance(step, NoResource)
Esempio n. 10
0
    def test_getChild(self):
        """
        L{NameVirtualHost.getChild} returns correct I{Resource} based off
        the header and modifies I{Request} to ensure proper prepath and
        postpath are set.
        """
        virtualHostResource = NameVirtualHost()
        leafResource = Data(b"leaf data", "")
        leafResource.isLeaf = True
        normResource = Data(b"norm data", "")
        virtualHostResource.addHost(b"leaf.example.org", leafResource)
        virtualHostResource.addHost(b"norm.example.org", normResource)

        request = DummyRequest([])
        request.requestHeaders.addRawHeader(b"host", b"norm.example.org")
        request.prepath = [b""]

        self.assertIsInstance(virtualHostResource.getChild(b"", request),
                              NoResource)
        self.assertEqual(request.prepath, [b""])
        self.assertEqual(request.postpath, [])

        request = DummyRequest([])
        request.requestHeaders.addRawHeader(b"host", b"leaf.example.org")
        request.prepath = [b""]

        self.assertIsInstance(virtualHostResource.getChild(b"", request), Data)
        self.assertEqual(request.prepath, [])
        self.assertEqual(request.postpath, [b""])
Esempio n. 11
0
    def setupSite(self):
        html.WebStatus.setupSite(self)
        resource = self.site.resource

        docdevPath = os.path.join(self.master.basedir, "doc-dev")
        docdev = File(docdevPath)

        File.contentTypes[".py,cover"] = "text/plain"
        File.contentTypes[".svg"] = "image/svg+xml"
        File.contentTypes[".json"] = "application/json"

        # Historical name
        resultsPath = os.path.join(self.master.basedir, "private_html")
        results = File(resultsPath)
        resource.putChild(b'results', results)

        resource.putChild(b'metrics', PrometheusMetrics())

        vhost = NameVirtualHost()
        vhost.default = resource
        vhost.addHost('doc-dev.clusterhq.com', docdev)
        self.site.resource = vhost
 def test_renderWithoutHostNoDefault(self):
     """
     L{NameVirtualHost.render} returns a response with a status of I{NOT
     FOUND} if the instance's C{default} is C{None} and there is no I{Host}
     header in the request.
     """
     virtualHostResource = NameVirtualHost()
     request = DummyRequest([''])
     d = _render(virtualHostResource, request)
     def cbRendered(ignored):
         self.assertEqual(request.responseCode, NOT_FOUND)
     d.addCallback(cbRendered)
     return d
Esempio n. 13
0
    def setupSite(self):
        html.WebStatus.setupSite(self)
        resource = self.site.resource

        docdevPath = os.path.join(self.master.basedir, "doc-dev")
        docdev = File(docdevPath)

        File.contentTypes[".py,cover"] = "text/plain"
        File.contentTypes[".svg"] = "image/svg+xml"
        File.contentTypes[".json"] = "application/json"

        # Historical name
        resultsPath = os.path.join(self.master.basedir, "private_html")
        results = File(resultsPath)
        resource.putChild(b'results', results)

        resource.putChild(b'metrics', PrometheusMetrics())

        vhost = NameVirtualHost()
        vhost.default = resource
        vhost.addHost('doc-dev.clusterhq.com', docdev)
        self.site.resource = vhost
 def test_renderWithUnknownHostNoDefault(self):
     """
     L{NameVirtualHost.render} returns a response with a status of I{NOT
     FOUND} if the instance's C{default} is C{None} and there is no host
     matching the value of the I{Host} header in the request.
     """
     virtualHostResource = NameVirtualHost()
     request = DummyRequest([''])
     request.headers['host'] = 'example.com'
     d = _render(virtualHostResource, request)
     def cbRendered(ignored):
         self.assertEqual(request.responseCode, NOT_FOUND)
     d.addCallback(cbRendered)
     return d
Esempio n. 15
0
    def setUp(self):
        # prepare the authentication systems
        self.userdb = cred.InMemoryUnicodeUsernamePasswordDatabase()
        self.sitedb = cred.InMemoryUnicodeUsernamePasswordDatabase()
        self.userrealm = TestUserRealm()
        self.siterealm = TestSiteRealm()
        self.userportal = portal.Portal(self.userrealm)
        self.siteportal = portal.Portal(self.siterealm)
        self.userportal.registerChecker(self.userdb)
        self.siteportal.registerChecker(self.sitedb)

        # register tokens
        self.sitedb.addUser(
            self.SITE_A_TOKEN,
            self.SITE_A_SECRET,
        )
        self.siterealm.register_csauth_perm(
            self.SITE_A_TOKEN,
            TestWebAuthPermission(
                self.SITE_A_NAME,
                "http://{}/login".format(self.WEB_NAME),
                full_username=True,
            ),
        )
        self.sitedb.addUser(
            self.SITE_B_TOKEN,
            self.SITE_B_SECRET,
        )
        self.siterealm.register_csauth_perm(
            self.SITE_B_TOKEN,
            TestWebAuthPermission(
                self.SITE_B_NAME,
                "http://{}/bpage".format(self.WEB_NAME),
                full_username=False,
            ),
        )

        # register Users
        self.userdb.addUser(
            self.USER_A_NAME,
            self.USER_A_PSWD,
        )
        self.userdb.addUser(
            self.USER_B_NAME,
            self.USER_B_PSWD,
        )

        # prepare the auth site
        lr = BasicLoginResource()
        authpage = AuthResource(
            self.siteportal,
            self.userportal,
            lr,
            url=u"http://{}/auth".format(self.AUTH_NAME),
        )
        arr = DebugResource("auth")
        arr.putChild(b"auth", authpage)
        arr.putChild(b"expire", SessionExpiringResource())

        # prepare the web site
        lrr = DebugResource("web")

        # add the login page
        loginpage = TestLoginResource(
            u"http://{}/auth".format(self.AUTH_NAME),
            self.SITE_A_TOKEN,
            self.SITE_A_SECRET,
        )
        lrr.putChild(b"login", loginpage)

        # add a login page with a different permission
        bpage = TestLoginResource(
            u"http://{}/auth".format(self.AUTH_NAME),
            self.SITE_B_TOKEN,
            self.SITE_B_SECRET,
        )
        lrr.putChild(b"bpage", bpage)

        # add a resource with an invalid token/secret combination
        invalidepage = TestLoginResource(
            u"http://{}/auth".format(self.AUTH_NAME),
            self.SITE_A_TOKEN,
            self.SITE_B_SECRET,  # <- site B secret
        )
        lrr.putChild(b"invalid", invalidepage)

        # create and install treq stubs
        supersite = NameVirtualHost()
        supersite.addHost(self.AUTH_NAME.encode("ascii"), arr)
        supersite.addHost(self.WEB_NAME.encode("ascii"), lrr)
        supersite.default = DebugResource("default")

        self.treq = StubTreq(supersite)
        loginpage._set_request_dispatcher(self.treq)
        bpage._set_request_dispatcher(self.treq)
        invalidepage._set_request_dispatcher(self.treq)
Esempio n. 16
0
class WebBoxVHost:
    """ Class to manage and spawn Virtual Hosts, each with a different WebBox. """

    def __init__(self, config):
        self.config = config
       
        self.host = config['management']['host'] # hostname of the management interface
        self.port = config['management']['port'] # port to listen on
        self.srcdir = config['management']['srcdir'] # source directory of templates
        # TODO ssl port? or multiple ports?

        self.vhost = NameVirtualHost()

        # allow the config to be readable by .rpy files
        registry = Registry()
        registry.setComponent(WebBoxVHost, self)

        root = FileNoDirectoryListings(self.srcdir, registry=registry)
        # make .rpy python cgi
        root.processors = {'.rpy': script.ResourceScript}
        root.ignoreExt('.rpy')

        # hook in the vhost controller urls to /start /stop etc.
        root.putChild("start", WSGIResource(reactor, reactor.getThreadPool(), self.do_start))
        root.putChild("stop", WSGIResource(reactor, reactor.getThreadPool(), self.do_stop))

        class MgmtRealm(object):
            implements(IRealm)
            def requestAvatar(self, avatarId, mind, *interfaces):
                if IResource in interfaces:
                    return (IResource, root, lambda: None)
                logging.debug("Error in requestAvatar.")

        realm = MgmtRealm()
        portal = Portal(realm, [FilePasswordDB(config['htdigest'])]) #FIXME insecure passwords
        credentialFactory = DigestCredentialFactory("md5", "webbox") # webbox is the "realm" of the htdigest
        rootAuth = HTTPAuthSessionWrapper(portal, [credentialFactory])
        self.vhost.addHost(self.host, rootAuth)

        self.site = Site(self.vhost)
        reactor.listenTCP(self.port, self.site)
        # TODO ssl port?

        self.url = "http://"+self.host+":"+str(self.port)

        # load a web browser once the server has started
        def on_start(arg):
            logging.debug("Listening on: "+self.url)
            try:
                import webbrowser
                webbrowser.open(server_url)
            except Exception as e:
                pass # no web browser? no problem.
        def start_failed(arg):
            logging.debug("Startup failed: "+str(arg))

        # calls the web browser opening function above when the reactor has finished starting up
        d = Deferred()
        d.addCallbacks(on_start, start_failed)
        reactor.callWhenRunning(d.callback, "Server startup")

        logging.debug("Starting WebBox management interface on: "+self.url)

        # add vhosts already configured
        self.webboxes = {}
        self.add_vhosts()

        reactor.run()

    def start_vhost(self, vhost):
        """ Start the vhost with the definition 'vhost'. """
        vhost['status'] = "running"

        path = "webbox"

        webbox = WebBox(vhost['config'])
        resource = webbox.get_resource()

        self.vhost.addHost(vhost['host'], resource)
        self.webboxes[ vhost['host'] ] = webbox


    def stop_vhost(self, vhost):
        """ Stop the vhost with the defintion 'vhost'. """
        vhost['status'] = "stopped"
        self.vhost.removeHost(vhost['host'])
        webbox = self.webboxes[ vhost['host'] ]
        webbox.stop()


    def add_vhosts(self):
        """ Add the vhosts from the configuration. """
        for vhost in self.config['vhosts']:
            self.start_vhost(vhost)

    def get_config(self):
        for vhost in self.config['vhosts']:
            vhost['url_scheme'] = self.config['url_scheme']
            vhost['port'] = self.config['management']['port'] 
            if vhost['status'] == "stopped":
                vhost['modify'] = "Start"
                vhost['modify_action'] = "start"
            elif vhost['status'] == "running":
                vhost['modify'] = "Stop"
                vhost['modify_action'] = "stop"

        return self.config

    def do_start(self, environment, start_response):
        host = environment['PATH_INFO'][1:] # remove leading slash
        for vhost in self.config['vhosts']:
            if host == vhost['host']:
                self.start_vhost(vhost)
                start_response("302 Found", [("Content-type", "text/html"), ("Location", "/")] )
                return []

        start_response("404 Not Found", [("Content-type", "text/html")] )
        return ["That virtual host was not found."]

    def do_stop(self, environment, start_response):
        host = environment['PATH_INFO'][1:] # remove leading slash
        for vhost in self.config['vhosts']:
            if host == vhost['host']:
                self.stop_vhost(vhost)
                start_response("302 Found", [("Content-type", "text/html"), ("Location", "/")] )
                return []

        start_response("404 Not Found", [("Content-type", "text/html")] )
        return ["That virtual host was not found."]
Esempio n. 17
0
# First Fix the PYTHONPATH
import sys
from os.path import abspath, dirname
sys.path.append(dirname(abspath(__file__)))

# Now Perform the main imports
from twisted.application import internet, service 
from twisted.web import server, resource
from twisted.web.static import File
from twisted.web.vhost import NameVirtualHost
from api.resources import APIRoot
from api.manager import ClientManager
from website.resources import SiteRoot


manager = ClientManager()
api = APIRoot(manager)
web = SiteRoot() 
vhostManager = NameVirtualHost()
vhostManager.addHost('api.notiserv.org', api)
vhostManager.addHost('notiserv.org', web)
vhostManager.addHost('www.notiserv.org', web)
site = server.Site(vhostManager)
application = service.Application('notiserv') 

siteServer = internet.TCPServer(9100, site)

siteServer.setServiceParent(application)
Esempio n. 18
0
    def __init__(self, config):
        self.config = config
       
        self.host = config['management']['host'] # hostname of the management interface
        self.port = config['management']['port'] # port to listen on
        self.srcdir = config['management']['srcdir'] # source directory of templates
        # TODO ssl port? or multiple ports?

        self.vhost = NameVirtualHost()

        # allow the config to be readable by .rpy files
        registry = Registry()
        registry.setComponent(WebBoxVHost, self)

        root = FileNoDirectoryListings(self.srcdir, registry=registry)
        # make .rpy python cgi
        root.processors = {'.rpy': script.ResourceScript}
        root.ignoreExt('.rpy')

        # hook in the vhost controller urls to /start /stop etc.
        root.putChild("start", WSGIResource(reactor, reactor.getThreadPool(), self.do_start))
        root.putChild("stop", WSGIResource(reactor, reactor.getThreadPool(), self.do_stop))

        class MgmtRealm(object):
            implements(IRealm)
            def requestAvatar(self, avatarId, mind, *interfaces):
                if IResource in interfaces:
                    return (IResource, root, lambda: None)
                logging.debug("Error in requestAvatar.")

        realm = MgmtRealm()
        portal = Portal(realm, [FilePasswordDB(config['htdigest'])]) #FIXME insecure passwords
        credentialFactory = DigestCredentialFactory("md5", "webbox") # webbox is the "realm" of the htdigest
        rootAuth = HTTPAuthSessionWrapper(portal, [credentialFactory])
        self.vhost.addHost(self.host, rootAuth)

        self.site = Site(self.vhost)
        reactor.listenTCP(self.port, self.site)
        # TODO ssl port?

        self.url = "http://"+self.host+":"+str(self.port)

        # load a web browser once the server has started
        def on_start(arg):
            logging.debug("Listening on: "+self.url)
            try:
                import webbrowser
                webbrowser.open(server_url)
            except Exception as e:
                pass # no web browser? no problem.
        def start_failed(arg):
            logging.debug("Startup failed: "+str(arg))

        # calls the web browser opening function above when the reactor has finished starting up
        d = Deferred()
        d.addCallbacks(on_start, start_failed)
        reactor.callWhenRunning(d.callback, "Server startup")

        logging.debug("Starting WebBox management interface on: "+self.url)

        # add vhosts already configured
        self.webboxes = {}
        self.add_vhosts()

        reactor.run()