def setUp(self): # Patch the two-factor verification to avoid intermittent errors patcher = mock.patch('journalist.Journalist.verify_token') self.addCleanup(patcher.stop) self.mock_journalist_verify_token = patcher.start() self.mock_journalist_verify_token.return_value = True signal.signal(signal.SIGUSR1, lambda _, s: traceback.print_stack(s)) env.create_directories() self.gpg = env.init_gpg() db.init_db() source_port = self._unused_port() journalist_port = self._unused_port() self.source_location = "http://localhost:%d" % source_port self.journalist_location = "http://localhost:%d" % journalist_port def start_source_server(): # We call Random.atfork() here because we fork the source and # journalist server from the main Python process we use to drive # our browser with multiprocessing.Process() below. These child # processes inherit the same RNG state as the parent process, which # is a problem because they would produce identical output if we # didn't re-seed them after forking. Random.atfork() source.app.run(port=source_port, debug=True, use_reloader=False, threaded=True) def start_journalist_server(): Random.atfork() journalist.app.run(port=journalist_port, debug=True, use_reloader=False, threaded=True) self.source_process = Process(target=start_source_server) self.journalist_process = Process(target=start_journalist_server) self.source_process.start() self.journalist_process.start() self.driver = self._create_webdriver() # Set window size and position explicitly to avoid potential bugs due # to discrepancies between environments. self.driver.set_window_position(0, 0) self.driver.set_window_size(1024, 768) # Poll the DOM briefly to wait for elements. It appears .click() does # not always do a good job waiting for the page to load, or perhaps # Firefox takes too long to render it (#399) self.driver.implicitly_wait(5) self.secret_message = 'blah blah blah'
def setup(self, session_expiration=30): # Patch the two-factor verification to avoid intermittent errors self.patcher = mock.patch('db.Journalist.verify_token') self.mock_journalist_verify_token = self.patcher.start() self.mock_journalist_verify_token.return_value = True self.patcher2 = mock.patch('source_app.main.get_entropy_estimate') self.mock_get_entropy_estimate = self.patcher2.start() self.mock_get_entropy_estimate.return_value = 8192 signal.signal(signal.SIGUSR1, lambda _, s: traceback.print_stack(s)) env.create_directories() self.gpg = env.init_gpg() db.init_db() source_port = self._unused_port() journalist_port = self._unused_port() self.source_location = "http://localhost:%d" % source_port self.journalist_location = "http://localhost:%d" % journalist_port # Allow custom session expiration lengths self.session_expiration = session_expiration def start_source_server(): # We call Random.atfork() here because we fork the source and # journalist server from the main Python process we use to drive # our browser with multiprocessing.Process() below. These child # processes inherit the same RNG state as the parent process, which # is a problem because they would produce identical output if we # didn't re-seed them after forking. Random.atfork() config.SESSION_EXPIRATION_MINUTES = self.session_expiration source_app = create_app(config) source_app.run(port=source_port, debug=True, use_reloader=False, threaded=True) def start_journalist_server(): Random.atfork() journalist.app.run(port=journalist_port, debug=True, use_reloader=False, threaded=True) self.source_process = Process(target=start_source_server) self.journalist_process = Process(target=start_journalist_server) self.source_process.start() self.journalist_process.start() for tick in range(30): try: requests.get(self.source_location) requests.get(self.journalist_location) except: time.sleep(1) else: break if not hasattr(self, 'override_driver'): self.driver = self._create_webdriver(self._prepare_webdriver()) # Polls the DOM to wait for elements. To read more about why # this is necessary: # # http://www.obeythetestinggoat.com/how-to-get-selenium-to-wait-for-page-load-after-a-click.html # # A value of 5 is known to not be enough in some cases, when # the machine hosting the tests is slow, reason why it was # raised to 10. Setting the value to 60 or more would surely # cover even the slowest of machine. However it also means # that a test failing to find the desired element in the DOM # will only report failure after 60 seconds which is painful # for quickly debuging. # self.driver.implicitly_wait(10) # Set window size and position explicitly to avoid potential bugs due # to discrepancies between environments. self.driver.set_window_position(0, 0) self.driver.set_window_size(1024, 768) self.secret_message = ('These documents outline a major government ' 'invasion of privacy.')
def setup(self, session_expiration=30): # Patch the two-factor verification to avoid intermittent errors self.patcher = mock.patch('db.Journalist.verify_token') self.mock_journalist_verify_token = self.patcher.start() self.mock_journalist_verify_token.return_value = True self.patcher2 = mock.patch('source_app.main.get_entropy_estimate') self.mock_get_entropy_estimate = self.patcher2.start() self.mock_get_entropy_estimate.return_value = 8192 signal.signal(signal.SIGUSR1, lambda _, s: traceback.print_stack(s)) env.create_directories() self.gpg = env.init_gpg() db.init_db() source_port = self._unused_port() journalist_port = self._unused_port() self.source_location = "http://localhost:%d" % source_port self.journalist_location = "http://localhost:%d" % journalist_port # Allow custom session expiration lengths self.session_expiration = session_expiration def start_source_server(): # We call Random.atfork() here because we fork the source and # journalist server from the main Python process we use to drive # our browser with multiprocessing.Process() below. These child # processes inherit the same RNG state as the parent process, which # is a problem because they would produce identical output if we # didn't re-seed them after forking. Random.atfork() config.SESSION_EXPIRATION_MINUTES = self.session_expiration source_app = create_app(config) source_app.run( port=source_port, debug=True, use_reloader=False, threaded=True) def start_journalist_server(): Random.atfork() journalist.app.run( port=journalist_port, debug=True, use_reloader=False, threaded=True) self.source_process = Process(target=start_source_server) self.journalist_process = Process(target=start_journalist_server) self.source_process.start() self.journalist_process.start() for tick in range(30): try: requests.get(self.source_location) requests.get(self.journalist_location) except: time.sleep(1) else: break if not hasattr(self, 'override_driver'): self.driver = self._create_webdriver(self._prepare_webdriver()) # Polls the DOM to wait for elements. To read more about why # this is necessary: # # http://www.obeythetestinggoat.com/how-to-get-selenium-to-wait-for-page-load-after-a-click.html # # A value of 5 is known to not be enough in some cases, when # the machine hosting the tests is slow, reason why it was # raised to 10. Setting the value to 60 or more would surely # cover even the slowest of machine. However it also means # that a test failing to find the desired element in the DOM # will only report failure after 60 seconds which is painful # for quickly debuging. # self.driver.implicitly_wait(10) # Set window size and position explicitly to avoid potential bugs due # to discrepancies between environments. self.driver.set_window_position(0, 0) self.driver.set_window_size(1024, 768) self.secret_message = ('These documents outline a major government ' 'invasion of privacy.')
def sd_servers(self): logging.info("Starting SecureDrop servers (session expiration = %s)", self.session_expiration) # Patch the two-factor verification to avoid intermittent errors logging.info("Mocking models.Journalist.verify_token") with mock.patch("models.Journalist.verify_token", return_value=True): logging.info("Mocking source_app.main.get_entropy_estimate") with mock.patch("source_app.main.get_entropy_estimate", return_value=8192): try: signal.signal(signal.SIGUSR1, lambda _, s: traceback.print_stack(s)) source_port = self._unused_port() journalist_port = self._unused_port() self.source_location = "http://127.0.0.1:%d" % source_port self.journalist_location = "http://127.0.0.1:%d" % journalist_port self.source_app = source_app.create_app(config) self.journalist_app = journalist_app.create_app(config) self.journalist_app.config["WTF_CSRF_ENABLED"] = True self.__context = self.journalist_app.app_context() self.__context.push() env.create_directories() db.create_all() self.gpg = env.init_gpg() # Add our test user try: valid_password = "******" user = Journalist(username="******", password=valid_password, is_admin=True) user.otp_secret = "JHCOGO7VCER3EJ4L" db.session.add(user) db.session.commit() except IntegrityError: logging.error("Test user already added") db.session.rollback() # This user is required for our tests cases to login self.admin_user = { "name": "journalist", "password": ("correct horse battery staple" " profanity oil chewy"), "secret": "JHCOGO7VCER3EJ4L", } self.admin_user["totp"] = pyotp.TOTP( self.admin_user["secret"]) def start_journalist_server(app): app.run(port=journalist_port, debug=True, use_reloader=False, threaded=True) self.source_process = Process( target=lambda: self.start_source_server(source_port)) self.journalist_process = Process( target=lambda: start_journalist_server(self. journalist_app)) self.source_process.start() self.journalist_process.start() for tick in range(30): try: requests.get(self.source_location, timeout=1) requests.get(self.journalist_location, timeout=1) except Exception: time.sleep(0.25) else: break yield finally: try: self.source_process.terminate() except Exception as e: logging.error("Error stopping source app: %s", e) try: self.journalist_process.terminate() except Exception as e: logging.error("Error stopping source app: %s", e) env.teardown() self.__context.pop()