digital-preservation / droid

DROID (Digital Record and Object Identification)
BSD 3-Clause "New" or "Revised" License
284 stars 75 forks source link

Signatures update doesn't work in Droid 6.5 #657

Closed sviscapi closed 3 years ago

sviscapi commented 3 years ago

Dear Droid team,

A colleague of mine just told me about some issues when trying to update the signatures in Droid 6.5:

MicrosoftTeams-image

Preferences are set as per the screenshot below:

MicrosoftTeams-image (1)

What are we doing wrong ?

Best regards,

Samuel, for Conseil Départemental de l'Hérault (France) herault.fr

Dclipsham commented 3 years ago

Hi Samuel, This may be a temporary problem, so please do retry. The address for the endpoint is certainly correct, so as long as you can reach the internet it should be reachable.

You may have issues if you're behind a proxy (which your IT Support team would be able to advise on), in which case you can configure the proxy details via the 'Proxy settings' button.

If the problems do persist then please can you provide a little more information about your operating environment - which operating system you're using, which java version, which DROID version (i.e. bundled with java SDK or unbundled).

David

nishihatapalmer commented 3 years ago

I get the same issue on my dev build of DROID. I get a 301 error - moved permanently.

image

Running on Pop OS (Ubuntu derivative), OpenJDK 11 most recent update. Network has no proxies, just a standard home broadband connection that's working fine. I don't think the problem is at my end though, given other reports of the same issue from a release build. I'm running off the latest master code of DROID from GitHub.

nishihatapalmer commented 3 years ago

I also had to disable the PronomSignatureServiceTest, as that now fails too for the same reason. Another issue has been raised to make this test independent of the environment.

nishihatapalmer commented 3 years ago

I'll also add that signature updates did work in DROID 6.5 when it was released, and I've had no problems updating signatures until a week or so ago. I suspect this is a problem at the TNA network end.

Dclipsham commented 3 years ago

Thanks Matt, ahh I think I see the problem here.

Can you please try https endpoints? https://www.nationalarchives.gov.uk/pronom/service.asmx https://www.nationalarchives.gov.uk/pronom/container-signature.xml

David

nishihatapalmer commented 3 years ago

I'm afraid it doesn't seem to have fixed it in latest build of Master. It's still getting a 301 moved permanently error still, although the actual Exception seems to be generated because the PRONOM service is returning HTML unexpectedly (rather than a SOAP message I guess).

I've followed it in the debugger - it fails trying to contact PRONOM service (so not a container signature file issue). The endpoint it uses is the correct http://www.nationalarchives.gov.uk/pronom/service.asmx.

Here's the standard DROID setings, which match the URL endpoints you gave: image

Here's a stack trace from running DROID and selecting signature update:

2021-10-27T10:10:51,070  INFO [AWT-EventQueue-0] DroidMainFrame:289 - Starting DROID.
2021-10-27T10:10:56,579  INFO [AWT-EventQueue-0] ProfileManagerImpl:119 - Creating profile: 1635325856579
2021-10-27T10:10:56,643  INFO [SwingWorker-pool-3-thread-1] ProfileManagerImpl:199 - Opening profile: 1635325856579
2021-10-27T10:10:57,656  WARN [SwingWorker-pool-3-thread-1] DriverDataSource:68 - Registered driver with driverClassName=org.apache.derby.jdbc.EmbeddedDriver was not found, trying direct instantiation.
2021-10-27T10:11:01,756  INFO [AWT-EventQueue-0] ProfileInstance:319 - Attempting state change [INITIALISING] to [VIRGIN]
2021-10-27T10:11:02,159  WARN [SwingWorker-pool-3-thread-2] PhaseInterceptorChain:468 - Interceptor for {http://pronom.nationalarchives.gov.uk}PronomServiceService#{http://pronom.nationalarchives.gov.uk}getSignatureFileVersionV1 has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Response was of unexpected text/html ContentType.  Incoming portion of HTML stream: <html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
</body>
</html>

    at org.apache.cxf.interceptor.StaxInInterceptor.handleMessage(StaxInInterceptor.java:97) ~[cxf-core-3.4.4.jar:3.4.4]
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) [cxf-core-3.4.4.jar:3.4.4]
    at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:831) [cxf-core-3.4.4.jar:3.4.4]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1697) [cxf-rt-transports-http-3.4.4.jar:3.4.4]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1571) [cxf-rt-transports-http-3.4.4.jar:3.4.4]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1371) [cxf-rt-transports-http-3.4.4.jar:3.4.4]
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) [cxf-core-3.4.4.jar:3.4.4]
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:671) [cxf-rt-transports-http-3.4.4.jar:3.4.4]
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:63) [cxf-core-3.4.4.jar:3.4.4]
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) [cxf-core-3.4.4.jar:3.4.4]
    at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:530) [cxf-core-3.4.4.jar:3.4.4]
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:441) [cxf-core-3.4.4.jar:3.4.4]
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:356) [cxf-core-3.4.4.jar:3.4.4]
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:314) [cxf-core-3.4.4.jar:3.4.4]
    at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96) [cxf-rt-frontend-simple-3.4.4.jar:3.4.4]
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:140) [cxf-rt-frontend-jaxws-3.4.4.jar:3.4.4]
    at com.sun.proxy.$Proxy65.getSignatureFileVersionV1(Unknown Source) [?:?]
    at uk.gov.nationalarchives.droid.signature.PronomSignatureService.getLatestVersion(PronomSignatureService.java:144) [classes/:?]
    at uk.gov.nationalarchives.droid.signature.SignatureManagerImpl.getLatestSignatureFiles(SignatureManagerImpl.java:317) [classes/:?]
    at uk.gov.nationalarchives.droid.gui.signature.CheckSignatureUpdateAction.doInBackground(CheckSignatureUpdateAction.java:87) [classes/:?]
    at uk.gov.nationalarchives.droid.gui.signature.CheckSignatureUpdateAction.doInBackground(CheckSignatureUpdateAction.java:55) [classes/:?]
    at javax.swing.SwingWorker$1.call(SwingWorker.java:304) [?:?]
    at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]
    at javax.swing.SwingWorker.run(SwingWorker.java:343) [?:?]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
    at java.lang.Thread.run(Thread.java:829) [?:?]
2021-10-27T10:11:02,284  WARN [AWT-EventQueue-0] CheckSignatureUpdateAction:118 - javax.xml.ws.soap.SOAPFaultException: Response was of unexpected text/html ContentType.  Incoming portion of HTML stream: <html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
</body>
</html>

java.util.concurrent.ExecutionException: javax.xml.ws.soap.SOAPFaultException: Response was of unexpected text/html ContentType.  Incoming portion of HTML stream: <html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
</body>
</html>

    at java.util.concurrent.FutureTask.report(FutureTask.java:122) ~[?:?]
    at java.util.concurrent.FutureTask.get(FutureTask.java:191) ~[?:?]
    at javax.swing.SwingWorker.get(SwingWorker.java:613) ~[?:?]
    at uk.gov.nationalarchives.droid.gui.signature.CheckSignatureUpdateAction.done(CheckSignatureUpdateAction.java:114) [classes/:?]
    at javax.swing.SwingWorker$5.run(SwingWorker.java:750) [?:?]
    at javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.run(SwingWorker.java:847) [?:?]
    at sun.swing.AccumulativeRunnable.run(AccumulativeRunnable.java:112) [?:?]
    at javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.actionPerformed(SwingWorker.java:857) [?:?]
    at javax.swing.Timer.fireActionPerformed(Timer.java:317) [?:?]
    at javax.swing.Timer$DoPostEvent.run(Timer.java:249) [?:?]
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313) [?:?]
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:770) [?:?]
    at java.awt.EventQueue$4.run(EventQueue.java:721) [?:?]
    at java.awt.EventQueue$4.run(EventQueue.java:715) [?:?]
    at java.security.AccessController.doPrivileged(Native Method) ~[?:?]
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85) [?:?]
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:740) [?:?]
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) [?:?]
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) [?:?]
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:117) [?:?]
    at java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:190) [?:?]
    at java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:235) [?:?]
    at java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:233) [?:?]
    at java.security.AccessController.doPrivileged(Native Method) ~[?:?]
    at java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:233) [?:?]
    at java.awt.Dialog.show(Dialog.java:1070) [?:?]
    at java.awt.Component.show(Component.java:1716) [?:?]
    at java.awt.Component.setVisible(Component.java:1663) [?:?]
    at java.awt.Window.setVisible(Window.java:1031) [?:?]
    at java.awt.Dialog.setVisible(Dialog.java:1005) [?:?]
    at uk.gov.nationalarchives.droid.gui.signature.CheckSignatureUpdateAction.start(CheckSignatureUpdateAction.java:102) [classes/:?]
    at uk.gov.nationalarchives.droid.gui.DroidMainFrame.updateNowMenuItemActionPerformed(DroidMainFrame.java:1286) [classes/:?]
    at uk.gov.nationalarchives.droid.gui.DroidMainFrame.access$3700(DroidMainFrame.java:123) [classes/:?]
    at uk.gov.nationalarchives.droid.gui.DroidMainFrame$39.actionPerformed(DroidMainFrame.java:940) [classes/:?]
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967) [?:?]
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308) [?:?]
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405) [?:?]
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262) [?:?]
    at javax.swing.AbstractButton.doClick(AbstractButton.java:369) [?:?]
    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1020) [?:?]
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1064) [?:?]
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:297) [?:?]
    at java.awt.Component.processMouseEvent(Component.java:6635) [?:?]
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3342) [?:?]
    at java.awt.Component.processEvent(Component.java:6400) [?:?]
    at java.awt.Container.processEvent(Container.java:2263) [?:?]
    at java.awt.Component.dispatchEventImpl(Component.java:5011) [?:?]
    at java.awt.Container.dispatchEventImpl(Container.java:2321) [?:?]
    at java.awt.Component.dispatchEvent(Component.java:4843) [?:?]
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918) [?:?]
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547) [?:?]
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488) [?:?]
    at java.awt.Container.dispatchEventImpl(Container.java:2307) [?:?]
    at java.awt.Window.dispatchEventImpl(Window.java:2772) [?:?]
    at java.awt.Component.dispatchEvent(Component.java:4843) [?:?]
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772) [?:?]
    at java.awt.EventQueue$4.run(EventQueue.java:721) [?:?]
    at java.awt.EventQueue$4.run(EventQueue.java:715) [?:?]
    at java.security.AccessController.doPrivileged(Native Method) ~[?:?]
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85) [?:?]
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95) [?:?]
    at java.awt.EventQueue$5.run(EventQueue.java:745) [?:?]
    at java.awt.EventQueue$5.run(EventQueue.java:743) [?:?]
    at java.security.AccessController.doPrivileged(Native Method) ~[?:?]
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85) [?:?]
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:742) [?:?]
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203) [?:?]
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124) [?:?]
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113) [?:?]
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109) [?:?]
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) [?:?]
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) [?:?]
Caused by: javax.xml.ws.soap.SOAPFaultException: Response was of unexpected text/html ContentType.  Incoming portion of HTML stream: <html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
</body>
</html>

    at org.apache.cxf.jaxws.JaxWsClientProxy.mapException(JaxWsClientProxy.java:195) ~[cxf-rt-frontend-jaxws-3.4.4.jar:3.4.4]
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:145) ~[cxf-rt-frontend-jaxws-3.4.4.jar:3.4.4]
    at com.sun.proxy.$Proxy65.getSignatureFileVersionV1(Unknown Source) ~[?:?]
    at uk.gov.nationalarchives.droid.signature.PronomSignatureService.getLatestVersion(PronomSignatureService.java:144) ~[classes/:?]
    at uk.gov.nationalarchives.droid.signature.SignatureManagerImpl.getLatestSignatureFiles(SignatureManagerImpl.java:317) ~[classes/:?]
    at uk.gov.nationalarchives.droid.gui.signature.CheckSignatureUpdateAction.doInBackground(CheckSignatureUpdateAction.java:87) ~[classes/:?]
    at uk.gov.nationalarchives.droid.gui.signature.CheckSignatureUpdateAction.doInBackground(CheckSignatureUpdateAction.java:55) ~[classes/:?]
    at javax.swing.SwingWorker$1.call(SwingWorker.java:304) ~[?:?]
    at java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[?:?]
    at javax.swing.SwingWorker.run(SwingWorker.java:343) ~[?:?]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[?:?]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[?:?]
    at java.lang.Thread.run(Thread.java:829) ~[?:?]
Caused by: org.apache.cxf.interceptor.Fault: Response was of unexpected text/html ContentType.  Incoming portion of HTML stream: <html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
</body>
</html>

    at org.apache.cxf.interceptor.StaxInInterceptor.handleMessage(StaxInInterceptor.java:97) ~[cxf-core-3.4.4.jar:3.4.4]
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) ~[cxf-core-3.4.4.jar:3.4.4]
    at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:831) ~[cxf-core-3.4.4.jar:3.4.4]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1697) ~[cxf-rt-transports-http-3.4.4.jar:3.4.4]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1571) ~[cxf-rt-transports-http-3.4.4.jar:3.4.4]
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1371) ~[cxf-rt-transports-http-3.4.4.jar:3.4.4]
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) ~[cxf-core-3.4.4.jar:3.4.4]
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:671) ~[cxf-rt-transports-http-3.4.4.jar:3.4.4]
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:63) ~[cxf-core-3.4.4.jar:3.4.4]
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) ~[cxf-core-3.4.4.jar:3.4.4]
    at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:530) ~[cxf-core-3.4.4.jar:3.4.4]
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:441) ~[cxf-core-3.4.4.jar:3.4.4]
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:356) ~[cxf-core-3.4.4.jar:3.4.4]
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:314) ~[cxf-core-3.4.4.jar:3.4.4]
    at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96) ~[cxf-rt-frontend-simple-3.4.4.jar:3.4.4]
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:140) ~[cxf-rt-frontend-jaxws-3.4.4.jar:3.4.4]
    at com.sun.proxy.$Proxy65.getSignatureFileVersionV1(Unknown Source) ~[?:?]
    at uk.gov.nationalarchives.droid.signature.PronomSignatureService.getLatestVersion(PronomSignatureService.java:144) ~[classes/:?]
    at uk.gov.nationalarchives.droid.signature.SignatureManagerImpl.getLatestSignatureFiles(SignatureManagerImpl.java:317) ~[classes/:?]
    at uk.gov.nationalarchives.droid.gui.signature.CheckSignatureUpdateAction.doInBackground(CheckSignatureUpdateAction.java:87) ~[classes/:?]
    at uk.gov.nationalarchives.droid.gui.signature.CheckSignatureUpdateAction.doInBackground(CheckSignatureUpdateAction.java:55) ~[classes/:?]
    at javax.swing.SwingWorker$1.call(SwingWorker.java:304) ~[?:?]
    at java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[?:?]
    at javax.swing.SwingWorker.run(SwingWorker.java:343) ~[?:?]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[?:?]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[?:?]
    at java.lang.Thread.run(Thread.java:829) ~[?:?]
2021-10-27T10:11:13,562  INFO [AWT-EventQueue-0] ProfileManagerImpl:183 - Closing profile: 1635325856579
2021-10-27T10:11:13,658  INFO [AWT-EventQueue-0] DroidMainFrame:1603 - Closing DROID.

Process finished with exit code 0
Dclipsham commented 3 years ago

Thanks for the detailed response Matt. Have you tried the https endpoint for the signature update? https://www.nationalarchives.gov.uk/pronom/service.asmx

nishihatapalmer commented 3 years ago

I get valid web pages if I connect to that URL with a browser.

Dclipsham commented 3 years ago

is DROID itself still misbehaving? I can replicate the 301 with DROID under the http: address but https: seems to be behaving as expected for me

nishihatapalmer commented 3 years ago

Ah. Well the standard config for DROID is using HTTP, not HTTPS., as we can see in the config screenshot. I'll try again once I'm back, out for a bit.

I guess http is no longer supported. Clearly used to work as that's the default configuration.

Of course, much better to use HTTPS, might need to update DROID default config, and maybe post some instructions for existing users if that's the case.

nishihatapalmer commented 3 years ago

HTTP seems to be the issue. Works OK with HTTPS, but not HTTP (which is still the default config in DROID).

Did TNA just stop supporting plain HTTP recently? May have a bunch of people who'll need to update their preferences.

I notice if you use the HTTP URL with a browser, you are redirected to an HTTPS URL. I wonder if the code just expects HTTP to work, and can't handle a redirect to HTTPS URL.

Dclipsham commented 3 years ago

There was a recent website migration that appears to have had a few unintended consequences. If deprecating http:// I'd prefer to do it a bit more gracefully, including a new DROID release with correct defaults first. I'm seeing if we can get the http:// endpoint back up...

sviscapi commented 3 years ago

Dear all,

Thank you very much for your help, really appreciated :)

The https workaround seems to be working for my colleague. She had to check the "use an HTTP proxy server for update" box to make it work though.

Best regards,

Samuel, for Conseil Départemental de l'Hérault herault.fr

Dclipsham commented 3 years ago

@sviscapi glad the HTTPS address worked for you as a workaround. The HTTP issue has now also been resolved so you should be able to use either address for the time-being. With the next DROID release we'll formally announce an intention to deprecate the HTTP endpoint.

CC @nishihatapalmer - would you like to verify that your tests etc are now working again and if so we can close this ticket. Thanks also for your help in investigating this.

nishihatapalmer commented 3 years ago

I can confirm that tests now pass.