Esempio n. 1
0
    def test_load_file(self):
        temp = self.mktemp()

        with file(temp, 'w') as f:
            f.write(VALID_CONFIG)

        self._assert_valid_config(Config(temp))
Esempio n. 2
0
def main(basefp):
    default_port = 443
    port = None
    ssl_enabled = True
    redirect_port = 80

    for arg in sys.argv:
        if arg.startswith('--port='):
            port = int(arg[len('--port='):])
        elif arg.startswith('--redirectport='):
            redirect_port = int(arg[len('--redirectport='):])
        elif arg == '--dev':
            ssl_enabled = False
            redirect_port = None
            default_port = 8000
        elif arg == '--nossl':
            ssl_enabled = False
            redirect_port = None
            default_port = 80
        elif arg == '--noredirect':
            redirect_port = None

    if port is None:
        port = default_port

    config = Config()

    logging.basicConfig(
        stream=sys.stdout,
        level=logging.DEBUG,
        format=
        '%(asctime)s %(levelname) 7s [%(module) 8s L%(lineno)d] %(message)s',
        datefmt='%Y-%m-%dT%H:%M:%S%z',
    )

    site = make_site(basefp, config)

    logging.info('Listening on port %d...' % (port, ))
    if ssl_enabled:
        logging.info('SSL/TLS is enabled (start with --nossl to disable).')
        KEYFILE = '../secret_config/rapidssl/server.key'
        CERTFILE = '../secret_config/rapidssl/server.crt'
        assert os.path.exists(
            KEYFILE), "Private key file %s not found" % (KEYFILE, )
        assert os.path.exists(
            CERTFILE), "Certificate file %s not found" % (CERTFILE, )

        # http://twistedmatrix.com/documents/current/core/howto/ssl.html
        sslfactory = ssl.DefaultOpenSSLContextFactory(KEYFILE, CERTFILE)
        reactor.listenSSL(port, site, sslfactory)

        if redirect_port is not None:
            logging.info('http->https redirector listening on port %d...' %
                         (redirect_port, ))
            reactor.listenTCP(redirect_port, make_redirector_site(port))
    else:
        logging.info('SSL/TLS is disabled.')
        reactor.listenTCP(port, site)
Esempio n. 3
0
    def test_site(self):
        config = Config(StringIO(SITE_CONFIG_JSON))
        site = make_site(FilePath('.'), config)

        (req, resp) = self._mock_request(site, '/', 'GET')
        req.setResponseCode.assert_called_with(OK)
        self.failUnlessIn("Simple, secure", resp)

        #(req, resp) = self._mock_request(site, '/support', 'GET')
        #req.setResponseCode.assert_called_with(OK)
        #self.failUnlessIn("<h2>Support</h2>", resp)

        (req, resp) = self._mock_request(site, '/noexist', 'GET')
        req.setResponseCode.assert_called_with(NOT_FOUND)
    def OFF_test_signuphandler(self):
        config = Config(StringIO(SITE_CONFIG_JSON))
        handler = SignupHandler(config.products)
        (req, resp) = self._mock_request(handler, 'GET')
        req.setResponseCode.assert_called_with(OK)

        # FIXME: this is no longer dynamic.
        #self.failUnlessIn("Yummy cloud hotness for everyone", resp)
        #self.failUnlessIn('<a href="/signup/product">', resp)
        #self.failIfIn("Cloud delicacy for our bestest friends", resp)
        #self.failIfIn('<a href="/signup/product-discount">', resp)

        self._check_redirect(handler, 'product',
                             "https://example.com/abc?offeringCode=12345678")
        self._check_redirect(handler, 'product-discount',
                             "https://example.com/abc?offeringCode=87654321")
Esempio n. 5
0
    def _test_devpaypurchasehandler(self, method):
        out = StringIO()
        config = Config(StringIO(SITE_CONFIG_JSON))

        d = devpay_complete.start(self.basefp)
        d.addCallback(lambda ign:
                      self._mock_request(devpay_complete.DevPayPurchaseHandler(self.basefp, config.products, out=out),
                                         method, ActivationKey=["ACTIVATIONKEY"], ProductCode=["PRODUCTCODE"]))

        def _finished( (req, output) ):
            self.failUnlessEqual(req.responsecode, OK)
            self.failUnlessIn('name="ActivationKey" value="ACTIVATIONKEY"', output)
            self.failUnlessIn('name="ProductCode" value="PRODUCTCODE"', output)
            self.failUnlessIn("ACTIVATIONKEY,PRODUCTCODE\n",
                              FilePath("devpay_completions.csv").getContent())
        d.addCallback(_finished)
        return d
Esempio n. 6
0
 def _load_from_string(text):
     return Config( StringIO(text) )
Esempio n. 7
0
    def test_collectemailhandler(self):
        out = StringIO()
        config = Config(StringIO(SITE_CONFIG_JSON))
        self.email_content = None

        def call_send_plain_email(fromEmail, toEmail, content, headers):
            self.email_content = content
        self.patch(send_email, 'send_plain_email', call_send_plain_email)
        self.patch(devpay_complete, 'send_plain_email', call_send_plain_email)

        d = devpay_complete.start(self.basefp)
        d.addCallback(lambda ign:
                      self._mock_request(devpay_complete.CollectEmailHandler(self.basefp, config.products, out=out),
                                         "POST", Email=["*****@*****.**"], ProductName=["future"],
                                         ProductFullName=["Voyage to Tau Ceti"]))

        def _finished_future( (req, output) ):
            self.failUnlessEqual(req.responsecode, OK)
            self.failUnlessIn('Thank you for your interest in Voyage to Tau Ceti!', output)
            self.failIfIn('<a href="/signup/future">', output)
            self.failUnlessIn("We've just sent you an email", output)
            self.failIfIn("https://leastauthority.com/signup/", self.email_content)
            self.failUnlessIn("[email protected],future\n",
                              FilePath("emails.csv").getContent())
            remove_if_possible(self.basefp.child("emails.csv"))
            self.email_content = None
        d.addCallback(_finished_future)

        d.addCallback(lambda ign:
                      self._mock_request(devpay_complete.CollectEmailHandler(self.basefp, config.products, out=out),
                                         "POST", Email=["*****@*****.**"], ProductName=["product"],
                                         ProductFullName=["Yummy cloud hotness"]))

        def _finished_valid( (req, output) ):
            self.failUnlessEqual(req.responsecode, OK)
            self.failUnlessIn('Thank you for your interest in Yummy cloud hotness!', output)
            self.failUnlessIn('<a href="/signup/product">', output)
            self.failUnlessIn("We've just sent you an email", output)
            self.failUnlessIn("https://leastauthority.com/signup/product", self.email_content)
            self.failUnlessIn("[email protected],product\n",
                              FilePath("emails.csv").getContent())
            remove_if_possible(self.basefp.child("emails.csv"))
            self.email_content = None
        d.addCallback(_finished_valid)

        d.addCallback(lambda ign:
                      self._mock_request(devpay_complete.CollectEmailHandler(self.basefp, config.products, out=out),
                                         "POST", Email=["blah"], ProductName=["product"],
                                         ProductFullName=["Yummy cloud hotness"]))
        def _finished_invalid( (req, output) ):
            self.failUnlessEqual(req.responsecode, OK)
            self.failUnlessIn('Thank you for your interest in Yummy cloud hotness, but', output)
            self.failIfIn('<a href="/signup/product">', output)
            self.failIf(self.email_content)
            self.failUnlessIn('<form action="/collect-email"', output)
            self.failUnlessIn("blah,product\n",
                              FilePath("emails.csv").getContent())
            remove_if_possible(self.basefp.child("emails.csv"))
            self.email_content = None
        d.addCallback(_finished_invalid)

        def call_send_plain_email_broken(fromEmail, toEmail, content, headers):
            raise Exception("something went wrong")
        d.addCallback(lambda ign: self.patch(send_email, 'send_plain_email', call_send_plain_email_broken))
        d.addCallback(lambda ign: self.patch(devpay_complete, 'send_plain_email', call_send_plain_email_broken))

        d.addCallback(lambda ign:
                      self._mock_request(devpay_complete.CollectEmailHandler(self.basefp, config.products, out=out),
                                         "POST", Email=["*****@*****.**"], ProductName=["product"],
                                         ProductFullName=["Yummy cloud hotness"]))

        def _finished_could_not_send( (req, output) ):
            self.failUnlessEqual(req.responsecode, OK)
            self.failUnlessIn('Thank you for your interest in Yummy cloud hotness!', output)
            self.failUnlessIn('<a href="/signup/product">', output)
            self.failUnlessIn("We weren't able to send email", output)
            self.failIf(self.email_content)
            self.failUnlessIn("[email protected],product\n",
                              FilePath("emails.csv").getContent())
            remove_if_possible(self.basefp.child("emails.csv"))
            self.email_content = None
        d.addCallback(_finished_could_not_send)
        return d
Esempio n. 8
0
    def _test_activationrequesthandler(self, method):
        out = StringIO()
        config = Config(StringIO(SITE_CONFIG_JSON))

        d = devpay_complete.start(self.basefp)
        d.addCallback(lambda ign:
                      self._mock_request(devpay_complete.ActivationRequestHandler(self.basefp, config.products, out=out),
                                         method, ActivationKey=["ACTIVATIONKEY"], ProductCode=["PRODUCTCODE"],
                                         Name=["Joe & Mildred"], Email=["*****@*****.**"], PublicKey=["===BEGIN BLAH==="]))

        def _finished( (req, output) ):
            self.failUnlessEqual(req.responsecode, OK)
            self.failUnlessIn("<title>Activation requested</title>", output)
            self.failUnlessIn("Your Simple Secure Storage Service has been activated", output)
            self.failUnlessIn(",ACTIVATIONKEY,PRODUCTCODE,Joe %26 Mildred,[email protected],===BEGIN BLAH===\n",
                              FilePath("activation_requests.csv").getContent())
            self.failUnlessIn(",success,ACTIVATIONKEY,PRODUCTCODE,Joe %26 Mildred,[email protected],===BEGIN BLAH===\n",
                              FilePath("signups.csv").getContent())
        d.addCallback(_finished)

        d.addCallback(lambda ign:
                      self._mock_request(devpay_complete.ActivationRequestHandler(self.basefp, config.products, out=out),
                                         method, ActivationKey=["ACTIVATIONKEY"], ProductCode=["PRODUCTCODE"],
                                         Name=["Joe & Mildred"], Email=["*****@*****.**"], PublicKey=["===BEGIN BLAH==="]))

        def _finished_again( (req, output) ):
            self.failUnlessEqual(req.responsecode, OK)
            self.failUnlessIn("<title>Activation already succeeded</title>", output)

            devpay_complete.flappcommand.should_succeed = False
        d.addCallback(_finished_again)

        d.addCallback(lambda ign:
                      self._mock_request(devpay_complete.ActivationRequestHandler(self.basefp, config.products, out=out),
                                         method, ActivationKey=["ACTIVATIONKEY2"], ProductCode=["PRODUCTCODE"],
                                         Name=[""], Email=["*****@*****.**"], PublicKey=["===BEGIN BLAH==="]))
        def _no_name( (req, output) ):
            self.failUnlessEqual(req.responsecode, OK)
            self.failUnlessIn("<title>Missing name</title>", output)
            self.failUnlessIn("The 'Name' field was not filled in", output)
            self.failUnlessIn(",ACTIVATIONKEY2,PRODUCTCODE,,[email protected],===BEGIN BLAH===\n",
                              FilePath("activation_requests.csv").getContent())
            self.failIfIn("ACTIVATIONKEY2", FilePath("signups.csv").getContent())
        d.addCallback(_no_name)

        d.addCallback(lambda ign:
                      self._mock_request(devpay_complete.ActivationRequestHandler(self.basefp, config.products, out=out),
                                         method, ActivationKey=["ACTIVATIONKEY3"], ProductCode=["PRODUCTCODE"],
                                         Name=["Joe & Mildred"], Email=["joe&[email protected]"], PublicKey=["===BEGIN BLAH==="]))
        def _bad_email( (req, output) ):
            self.failUnlessEqual(req.responsecode, OK)
            self.failUnlessIn("<title>Missing or invalid email address</title>", output)
            self.failUnlessIn("The 'Email address' field was not filled in with a valid-looking address", output)
            self.failUnlessIn(",ACTIVATIONKEY3,PRODUCTCODE,Joe %26 Mildred,joe%[email protected],===BEGIN BLAH===\n",
                              FilePath("activation_requests.csv").getContent())
            self.failIfIn("ACTIVATIONKEY3", FilePath("signups.csv").getContent())
        d.addCallback(_bad_email)

        d.addCallback(lambda ign:
                      self._mock_request(devpay_complete.ActivationRequestHandler(self.basefp, config.products, out=out),
                                         method, ActivationKey=["ACTIVATIONKEY4"], ProductCode=["PRODUCTCODE"],
                                         Name=["Joe & Mildred"], Email=["*****@*****.**"], PublicKey=["===BEGIN BLAH==="]))
        def _finished_error( (req, output) ):
            self.failUnlessEqual(req.responsecode, OK)
            self.failUnlessIn("<title>Activation requested</title>", output)
            self.failUnlessIn("We weren't able to complete your account activation automatically", output)
            self.failUnlessIn(",ACTIVATIONKEY4,PRODUCTCODE,Joe %26 Mildred,[email protected],===BEGIN BLAH===\n",
                              FilePath("activation_requests.csv").getContent())
            self.failUnlessIn(",failure,ACTIVATIONKEY4,PRODUCTCODE,Joe %26 Mildred,[email protected],===BEGIN BLAH===\n",
                              FilePath("signups.csv").getContent())
        d.addCallback(_finished_error)
        return d