| changeset | 9c3ec0a5c7fc |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | chore: remove __future print_funcion from code. Not needed as of Python 3. |
| files |
| changeset | 5fbf6451a782 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | bug: harden header/environment values for roundup-server and cgi If the environment (cgi) or header variables (server) have values with characters outside of the printable ascii range (chr(32-126)), return HTTP 400 error. This is overly strict but nothing that Roundup looks at requires a larger range. When deploying with wsgi and Zope, server software should verify proper values. This fix was riggered by the waitress wsgi server bug: https://github.com/Pylons/waitress/security/advisories/GHSA-m5ff-3wj3-8ph4 which was caused by incorrect validation of header values resulting in a the proxy and waitress having different interpretations of what the header meant. My testing of the roundup.cgi script is to use a cgi->wsgi wrapper and run it under wsgi (using waitress). I need to try it under a real server that can run cgi. It looks like python http.server --cgi is missing definitions of HTTP_HOST and other required CGI variables. That's probably why the --cgi option was removed, but it leaves me without a good way to test. Maybe https://github.com/mdklatt/pytest-cgi could be used to test that front end? Arguably CGI is old, but cheap hosting still allows it. |
| files |
| changeset | a2c376d0f110 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | fix: fix possible HTTP Response Splitting in roundup-server CodeQL flagged a possible HTTP Response Splitting in the Location header's URL. The AI suggested cleaning the Host value, except the URL also includes the query parameters in the URL so they could potentially trigger the issue. Th host header probably doesn;t have a newline or cr in it otherwise it wouldn't have been recognized by the server as a valid host. In any case strip all \n or \r from the url before use. Also update CHANGES.txt with fixing the gpg install. |
| files |
| changeset | 03513f5066f3 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | fix: issue2551238 - roundup-server should exit with error ... if -d <pidfile> is used without -l <logfile>. Now exits with error if -l or -L are not specified with -d. This exposed a problem with relative paths when using a logging config file. -d enables deamon mode by default. This changes the current direcory to /. So relative paths in a logging config file are opened in / and fail. Added documentation to dmin guide noting the problem. |
| files |
| changeset | 341841a9edc5 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | Handle timeout exception in roundup-server better. A timeout in roundup-server used to generate another exception: OSError: cannot read from timed out object when it tried to reuse the socket that timed out. Now return status 408, a brief message and trigger closing of the socket. Manual testing, no CI. To test used curl -X POST with no --data defined. |
| files |
| changeset | 3a04ff6f1004 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | fix: crash when logging ip if roundup-server times out Under some conditions (seen in production, no reproducer), if connection timed out, there is no headers attribute RoundupRequestHandler. Check for headers attr before accessing self.headers. |
| files |
| changeset | 4ed886dc2558 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | fix(web): issue2551381 - roundup-server parses multiple '?" incorrectly. Change 'rfind()' to 'find()' to locate the first unencoded/unescaped '?' in a URL. End the path component of the url at that point. This matches https://www.rfc-editor.org/rfc/rfc3986#section-3.4. |
| files |
| changeset | bf4a5bd5aa9f |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | fix formatting of config.ini help text for roundup-server. all lines < 80 characters, try to fill to 65 or so characters. |
| files |
| changeset | 627c5d6a0551 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | allow roundup-server to log real client IP behind reverse proxy added -P flag to roundup-server to log client address from X-Forwarded-For reverse proxy header rather than connecting address. This logs the actual client address when roundup-server is run behind a reverse proxy. It also appends a '+' sign to the logged address/name. This makes correlating reverse proxy logs to roundup logs much easier by propagating the IP address. Also added documentation for -D flag that was undocumented. |
| files |
| changeset | 5a122373641a |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | fix: roundup-server Content-Length when generating index Cleanup tracker index generation by roundup-server. Send correct Content-Length headers so HTTP/1.1 connections don't hang. Also added charset to the Content-Type header. |
| files |
| changeset | 0f5d31be5418 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | issue2551219 - use of PEM file with roundup-server Document requirements of PEM file when using roundup-server in SSL/TLS mode in the config.ini generated by roundup-server --save-config. Trap errors produced by missing cert or key when reading a pem file and try to produce a more useful error. Man page already had correct documentation. However because man pages are justified, the marker lines get additional internal spacing. Use example macros to prevent this spacing in case somebody cuts/pastes the marker lines. |
| files |
| changeset | 683af7c57ce5 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | fix: add content-length to 301 response If the root URL is missing the trailing /, roundup-server returns a 301 redirect with the trailing /. However it was missing the content-length that allows the client to handle the response and redirect and reuse the connection (for http 1.1). |
| files |
| changeset | 216662fbaaee |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | fix(i18n): fix incorrect lookup of some translations The code had: _("some term %s here" % term) this extracts the template, but looks up the string with %s replaced. So the translation is broken. Changed to: _("some term %s here") % term which looks up the template and substitutes in the translation of the template. Found by ruff INT ruleset. |
| files |
| changeset | 5a35cfee727a |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | doc: use 'TEST-NET' IPv4 or IPv6 IP address ranges from RFC 6890 Replace ip examples with test doc ip addresses for any address not in 127.0.0.1 or 0.0.0.0. |
| files |
| changeset | 91fad2d2c4b3 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | fix: exit quickly on keyboard interrupt When exiting roundup_server (issue was seen in use of roundup_demo) using ^C, the keyboard interrupt message is generated but the application didn't exit until the 60 second socket timeout is complete. This seems to be more of an issue with Windows. With this change the socket is explicitly shut down telling the client what's happening. Then the file descriptor is closed. |
| files |
| changeset | dba4b1b25528 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | flake8: add space between del and ( |
| files |
| changeset | 46f92ac4e170 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | - issue2551275 - Allow configuring max_children in roundup-server. new -m and --max_children command line arguments and max_children config file setting for roundup_server.py/roundup-server. CHANGES.txt, admin_guide.txt, roundup-server.1 updated. |
| files |
| changeset | c0d030bd472e |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | Fix: Send Content-Length header to client from top Exception handler The top exception handler in run_cgi wasn't sending the Content-Length header for the error message. This resulted in a hung client. Probably wasn't an issue with http 1.0, but when using 1.1 it's required. |
| files |
| changeset | 8e4028669d2a |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | flake8 fixes. |
| files |
| changeset | 5129fc03dc1f |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | issue2551137, 2551138 - roundup-server SSL issues. Python3 no longer supports socket._fileobject, so fake it using SocketIO and layering io.BufferedReader as in: https://bugs.launchpad.net/python-glanceclient/+bug/1812525 Also handle SSL.ZeroReturnError exception by ignoring it. This exception is thrown when the SSL layer has been closed and a read happens. There is a warning in openssl as well as python docs that the underlying (unencrypted) socket may not be closed. In manual testing, netstat -anp didn't show any unclosed socket so.... Could it leak a fd still, unknown. This also seesm to have fixed an error when running under python2 where socket shutdown throws an error. Maybe ignoring ZeroErrorREturn handled that case? Also added doc to man page recommending not using -s and using a real web server instead. Also added doc on format of pem file passed to -e. No automated testing on this, so no test updates 8-(. |
| files |
| changeset | d659cfa8439c |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | Make roundup-server EACCES errors clearer If roundup-server is run on a priv port without privs (i.e. non root) it just returns: [Errno 13] Permission denied make this case clearer by reporting: Unable to bind to port 70, access not allowed, errno: 13 Permission denied so it points to the port bind operation as failing. |
| files |
| changeset | 06d750efbc50 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | Fix ResourceWarning error due to unclosed socket on exit from roundup_server. The warning adds clutter that I don't need to parse through. |
| files |
| changeset | 98a9df71e24c |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | If-Range doesn't work with roundup-server. Found while debugging test case for test_liveserver(via wsgi) using roundup-server. roundup-server wasn't passing If-Range header. |
| files |
| changeset | c3dfc4977ec6 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | Cache /favicon.ico |
| files |
| changeset | 6cf050b43eaf |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | Send content-length for /favico.ico Browser was stuck trying to download and server was reporting connection timeout after a minute. |
| files |
| changeset | a036712c96f4 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | Enable HTTP/1.1 support for roundup-server This enables keepalives and seems to prevent a lot of hangs/slowness in my configuration. configuration.py: add new HttpVersionOption. This is used by the command line/config in roundup-server. Validates http version string. roundup-server.py: enable HTTP 1.1 by default. use -V to set HTTP/1.0 on command line or set http_version in config file. Fix typo in config description for option include_headers. Add more vertical spacing for error report and usage display. roundup-server.1: add doc on -V also doc -I which was missing. Remove uneeded "to" from a sentence on ssl. |
| files |
| changeset | 7fb13dc67a41 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | roundup-server native SSL support only TLS 1.2. 1.1 was suported but is deprecated. |
| files |
| changeset | 1f2f7c0b8968 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | issue2550837 - New option for web auth (also http header passing) Implement experimental support to allow tracker to use an alternate authentication variable replacing ROUNDUP_USER. Also add -I option to roundup-server to whitelist HTTP headers that should be passed through to the tracker. |
| files |
| changeset | 5d6b6e948e17 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | Upgrade SSL params for roundup-server Params were still using md5, a key size of 768 and allowed SSL 2 and 3. Now using sha512, key size of 2048 and TLS 1.1 or newer. This still doesn't fix the use of SSL in roundup-server. It has problems under both 2.7 and 3.x. Tickets in tracker opened for both, |
| files |
| changeset | ff6580ee3882 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | Remove import of reload from imp (deprecated module), use importlib |
| files |
| changeset | bc2b00afa980 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | Replace depricated base64.decodestring with base64.b64decode. |
| files |
| changeset | e7cb0147e6fe |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | Make format strings use named placeholders rather than %s/%r Fixing some issues reported while updating roundup.pot to prep for 2.0.0 beta releases. Still more to do but.... |
| files |
| changeset | 5f275158cfa9 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | Christof Meerwald <cmeerw@cmeerw.org> |
| description | there is no thread module in Python 3 any more, so need to check for threading instead |
| files |
| changeset | d5c51d1ef09c |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | flake8 whitespace format fixes. |
| files |
| changeset | f822a91b3778 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | Better error message running with -c and pywin32 is not importable. Atempting to do this. It should work on windows, but I can't test. |
| files |
| changeset | 883c9e90b403 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | Fix problem with cgi.escape being depricated a different way. This way uses anypy and is cleaner. Also fixes incorrect/incomplete change that resulted in escaped in TAL generated by TALInterpreter.py. The escaped quotes break javascript etc. defined using tal string: values. TODO: add test cases for TAL. This wouldn't have snuck through for a month if we had good coverage of that library. |
| files |
| changeset | 1a835db41674 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | Call cgi.escape only on python 2. Replace with html.escapeif it can be found. |
| files |
| changeset | 320a1692a473 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | Fix exception handling code for case where port already in use. Change e[0] to e.args[0] (old style to new style reference??) Also wrap call to config.get_server in try/except block and print any exception to disable traceback. |
| files |
| changeset | 5ad31de777a8 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | Prevent env['CONTENT_TYPE'] from being None. FieldStorage's content header parser can handle empty string or missing value but can't handle None. |
| files |
| changeset | 8e3df461d316 |
|---|---|
| branch | maint-1.6 |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | issue2551023: Fix CSRF headers for use with wsgi and cgi. The env variable array used - separators rather than _. Compare: HTTP_X-REQUESTED-WITH to HTTP_X_REQUESTED_WITH. The last is correct. Also fix roundup-server to produce the latter form. (Patch by Cédric Krier) |
| files |
| changeset | b3618882f906 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | issue2551023: Fix CSRF headers for use with wsgi and cgi. The env variable array used - separators rather than _. Compare: HTTP_X-REQUESTED-WITH to HTTP_X_REQUESTED_WITH. The last is correct. Also fix roundup-server to produce the latter form. (Patch by Cédric Krier) |
| files |
| changeset | 5df309febe49 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | Path to support OPTIONS verb when using rest interface via roundup-server. Also make sure rest interface doesn't hang when processing OPTIONS, DELETE, PATCH which don't have a payload by creating a CONTENT_LENGTH of 0 if these verbs are used and CONTENT_LENGTH is missing. |
| files |
| changeset | 3d80e7752783 |
|---|---|
| branch | REST-rebased |
| bookmark | |
| tag | |
| user | Chau Nguyen <dangchau1991@yahoo.com> |
| description | Added POST and DELETE [[Ralf Schlatterbeck: Add *all* http methods in roundup_server.py as done on the bugs.python.org branch]] committer: Ralf Schlatterbeck <rsc@runtux.com> |
| files |
| changeset | fb9abb842f36 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | Joseph Myers <jsm@polyomino.org.uk> |
| description | Fix roundup-server logging for Python 3. Using the roundup-server support for redirecting output to a log file fails with Python 3: sys.stdout = sys.stderr = open(self["LOGFILE"], 'a', 0) ValueError: can't have unbuffered text I/O Thus, this patch switches that redirection to use line-buffered output (1 as third argument to open), which works with both Python 2 and Python 3. |
| files |
| changeset | fec18298ae02 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | Joseph Myers <jsm@polyomino.org.uk> |
| description | Python 3 preparation: HTTP headers handling in roundup_server.py. HTTP headers are handled differently in Python 3 (where they use email.message.Message) compared to Python 2 (where they use mimetools.Message). In some places the code needs to check which version of the interface is available. For the common case of getting a single header, ".get" is available in both versions, and is an alias of ".getheader" in Python 2. (Note that the Python 3 semantics of ".get" are slightly different from those in Python 2 if there is more than one of a given header - it returns an arbitrary one, when in Python 2 it's specified to return the last one. Hopefully the places using this interface rather than explicitly allowing for multiple headers with the same name are OK with that and it shouldn't actually occur with well-behaved clients.) |
| files |
| changeset | 4c724ad7b849 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | Joseph Myers <jsm@polyomino.org.uk> |
| description | Python 3 preparation: write bytes to socket in roundup_server.py. |
| files |
| changeset | 5dc27422f3ec |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | Joseph Myers <jsm@polyomino.org.uk> |
| description | Python 3 preparation: use byte-string argument to base64.decodestring for favicon. |
| files |
| changeset | 55f09ca366c4 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | Joseph Myers <jsm@polyomino.org.uk> |
| description | Python 3 preparation: StringIO. This generally arranges for StringIO and cStringIO references to use io.StringIO for Python 3 but io.BytesIO for Python 2, consistent with the string representations generally used in Roundup. A special FasterStringIO in the TAL code, which referenced internals of the old Python 2 StringIO module, is cut down so it doesn't actually do anything beyond the StringIO class it inherits from (it would also be reasonable to remove FasterStringIO completely). One place in roundup_server.py clearly needing binary I/O is made to use io.BytesIO unconditionally. |
| files |
| changeset | d0816d50ee8f |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | Joseph Myers <jsm@polyomino.org.uk> |
| description | Python 3 preparation: update SocketServer import. Manual patch. |
| files |
| changeset | 277e91bf7936 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | Joseph Myers <jsm@polyomino.org.uk> |
| description | Python 3 preparation: update BaseHTTPServer imports. roundup/anypy/http_.py extended and used in more places. Manual patch. |
| files |
| changeset | 56cc58d20add |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | Joseph Myers <jsm@polyomino.org.uk> |
| description | Python 3 preparation: use imp.reload instead of reload as needed. Manual patch. |
| files |
| changeset | 7f6afc7477e8 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | Joseph Myers <jsm@polyomino.org.uk> |
| description | Python 3 preparation: remove unused ConfigParser import. Manual patch (trivial, removing an unused import of a module that's changed its name in Python 3). |
| files |
| changeset | 88dbacd11cd1 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | Joseph Myers <jsm@polyomino.org.uk> |
| description | Python 3 preparation: update urllib / urllib2 / urlparse imports. The existing roundup/anypy/urllib_.py is extended to cover more imports and used in more places. Manual patch. |
| files |
| changeset | 99667a0cbd2d |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | Joseph Myers <jsm@polyomino.org.uk> |
| description | Python 3 preparation: use list() around filter() as needed. Tool-assisted patch. |
| files |
| changeset | 23b8e6067f7c |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | Joseph Myers <jsm@polyomino.org.uk> |
| description | Python 3 preparation: update calls to dict methods. Tool-assisted patch. Changes of iterkeys / itervalues / iteritems to keys / values / items are fully automated, but may make things less efficient in Python 2. Automated tools want to add list() around many calls to keys / values / items, but I thought most such list() additions were unnecessary because it seemed the result of keys / values / items was just iterated over while the set of dict keys remained unchanged, rather than used in a way requiring an actual list, or used while the set of keys in the dict could change. It's quite possible I missed some cases where list() was really needed, or left in some unnecessary list() calls. In cases where list() was only needed because the resulting list was then sorted in-place, I changed the code to use calls to sorted(). |
| files |
| changeset | fc97f1f4a7e3 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | Joseph Myers <jsm@polyomino.org.uk> |
| description | Python 3 preparation: use sys.maxsize instead of sys.maxint. Tool-generated patch. |
| files |
| changeset | 0942fe89e82e |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | Joseph Myers <jsm@polyomino.org.uk> |
| description | Python 3 preparation: change "x.has_key(y)" to "y in x". (Also likewise "not in" where appropriate.) Tool-generated patch. |
| files |
| changeset | 35ea9b1efc14 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | Joseph Myers <jsm@polyomino.org.uk> |
| description | Python 3 preparation: "raise" syntax. Changing "raise Exception, value" to "raise Exception(value)". Tool-assisted patch. Particular cases to check carefully are the one place in frontends/ZRoundup/ZRoundup.py where a string exception needed to be fixed, and the one in roundup/cgi/client.py involving raising an exception with a traceback (requires three-argument form of raise in Python 2, which as I understand it requires exec() to avoid a Python 3 syntax error). |
| files |
| changeset | 64b05e24dbd8 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | Joseph Myers <jsm@polyomino.org.uk> |
| description | Python 3 preparation: convert print to a function. Tool-assisted patch. It is possible that some "from __future__ import print_function" are not in fact needed, if a file only uses print() with a single string as an argument and so would work fine in Python 2 without that import. |
| files |
| changeset | 91954be46a66 |
|---|---|
| branch | |
| bookmark | |
| tag | |
| user | John Rouillard <rouilj@ieee.org> |
| description | A real fix for the problem where: import random would result in every call to random() returning the same value in the web interface. While cgi/client.py:Client::__init.py__ was calling random.seed(), on most systems random was SystemRandom and not the default random. As a result the random as you would get from: import random was never being seeded. I added a function to access and seed the random bound instance of random.Random that is called during init. This fixes all three places where I saw the broken randomness. It should also fix: http://psf.upfronthosting.co.za/roundup/meta/issue644 I also removed the prior code that would bail if systemRandom was not available. |
| files |