BLCM / OpenBLCMM

OpenBLCMM - Borderlands Community Mod Manager
GNU General Public License v3.0
29 stars 2 forks source link

File dialog opening can cause a crash, at least on Windows #72

Open apocalyptech opened 6 months ago

apocalyptech commented 6 months ago

System Info Operating System: Windows (unsure of exact version)

Describe the bug Opening a file dialog, under some circumstances (such as File -> Open) can lead to a crash with a relatively-unhelpful traceback like so:

2024-02-16 15:37:03 blcmm.Startup$MyExceptionHandler.logError(Startup.java:388) -> class java.lang.InternalError: Could not bind shell folder to interface
    org.graalvm.nativeimage.builder/com.oracle.svm.core.jni.functions.JNIFunctions$NewObjectWithObjectArrayArgFunctionPointer.invoke(JNIFunctions.java)
    org.graalvm.nativeimage.builder/com.oracle.svm.core.jni.functions.JNIFunctions.ThrowNew(JNIFunctions.java:889)
    java.desktop@17.0.8/sun.awt.shell.Win32ShellFolder2.initSpecial(Native Method)
    java.desktop@17.0.8/sun.awt.shell.Win32ShellFolder2$1.call(Win32ShellFolder2.java:297)
    java.desktop@17.0.8/sun.awt.shell.Win32ShellFolder2$1.call(Win32ShellFolder2.java:292)
    java.desktop@17.0.8/sun.awt.shell.Win32ShellFolderManager2$ComInvoker.invoke(Win32ShellFolderManager2.java:630)
    java.desktop@17.0.8/sun.awt.shell.ShellFolder.invoke(ShellFolder.java:540)
    java.desktop@17.0.8/sun.awt.shell.Win32ShellFolder2.<init>(Win32ShellFolder2.java:292)
    java.desktop@17.0.8/sun.awt.shell.Win32ShellFolderManager2.getNetwork(Win32ShellFolderManager2.java:222)
    java.desktop@17.0.8/sun.awt.shell.Win32ShellFolder2.getFileSystemPath(Win32ShellFolder2.java:631)
    java.desktop@17.0.8/sun.awt.shell.Win32ShellFolder2$10.call(Win32ShellFolder2.java:839)
    java.desktop@17.0.8/sun.awt.shell.Win32ShellFolder2$10.call(Win32ShellFolder2.java:830)
    java.base@17.0.8/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    java.base@17.0.8/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    java.base@17.0.8/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    java.desktop@17.0.8/sun.awt.shell.Win32ShellFolderManager2$ComInvoker$1.run(Win32ShellFolderManager2.java:599)
    java.base@17.0.8/java.lang.Thread.run(Thread.java:833)
    org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:838)
    org.graalvm.nativeimage.builder/com.oracle.svm.core.windows.WindowsPlatformThreads.osThreadStartRoutine(WindowsPlatformThreads.java:210)

It seems likely to somehow have something to do with network accessibility. Also in the user's logfile above was this line:

2024-02-16 15:37:01 blcmm.gui.MainGUI$7.doInBackground(MainGUI.java:543) -> class java.net.SocketException: Permission denied: connect

Some random searching around has yielded a couple of hits for this, both seemingly relating to network permissions, though both are pretty old. Here's a JDK bug from way back in the early 2000s talking about a Windows NT machine: https://bugs.openjdk.org/browse/JDK-4879395 -- And here's a StackOverflow post: https://stackoverflow.com/questions/17644390/what-causes-an-internalerror-to-be-thrown-by-sun-awt-shell-win32shellfolder2-ini (note the "Edit 2" specifically, which calls out a Win32ShellFolder2.NETWORK argument).

Also from the reporting user (in Discord):

BCMM worked beforehand, then I ran a few network tweaks to get Windows File Sharing working over LAN, and that's around the time that BCMM would throw this error.

So it does seem awfully likely that JFileChooser must have some problems when certain network attempts are made, which can result in a crash. It's rather vexing because I do intend OpenBLCMM to be fully functional without any network. The only intended network call is to check for a new version, which should fail gracefully (and can be toggled off by the user).

This happened for the user both on the EXE version (still Liberica NIK's Java 17), and on Pure Java on (I believe) Java 8.

So anyway, I'll have to see if I can reproduce this in a VM and then see what can be done about it. If I can't fix JFileChooser (which, honestly, seems like a pretty likely case), perhaps I could at least fall back to a more basic file-chooser dialog instead? The SO post mentions trying FileDialog instead... We'll have to see.

apocalyptech commented 6 months ago

From the reporting user, btw, here's what was done on the PC which seems to have resulted in this file-dialog behavior:

File-Sharing.ps1

# Start Required Services
Start-Service -DisplayName "SSDP Discovery"
Start-Service -DisplayName "UPnP Device Host"
Start-Service -DisplayName "Function Discovery Provider Host"
Start-Service -DisplayName "Function Discovery Resource Publication"

# Control Panel\All Control Panel Items\Network and Sharing Centre > Advanced Sharing Settings > Private and Public > Network Discovery [Enabled]
Set-NetFirewallRule -DisplayGroup "Network Discovery" -Profile "Any" -Enabled "True"

# Control Panel\All Control Panel Items\Network and Sharing Centre > Advanced Sharing Settings > Private and Public > Network Discovery > Automatic Setup of Network Connected Devices [Enabled]
New-ItemProperty -Path "HKLM:\Software\Microsoft\Windows\CurrentVersion\NcdAutoSetup\Private" -Name "AutoSetup" -PropertyType "DWORD" -Value "1" -Force | Out-Null

# Control Panel\All Control Panel Items\Network and Sharing Centre > Advanced Sharing Settings > Private and Public > File and Printer Sharing [Enabled]
Set-NetFirewallRule -DisplayGroup "File and Printer Sharing" -Enabled "True" -Profile "Any"

# Control Panel\All Control Panel Items\Network and Sharing Centre > Advanced Sharing Settings > All Networks > Public Folder Sharing [Enable]
how to do this?

# Control Panel\All Control Panel Items\Network and Sharing Centre > WiFi Status > Properties > Client for Microsoft Networks
Get-NetAdapterBinding -Name "WiFi" | Set-NetAdapterBinding -ComponentID "ms_server" -Enabled $True

# Folder > Right Click [Properties] > Sharing Tab [Enable]
New-ItemProperty -Path "Registry::HKEY_CLASSES_ROOT\Drive\shellex\PropertySheetHandlers\Sharing" -Name "(Default)" -Value "{f81e9010-6ea4-11ce-a7ff-00aa003ca9f6}"
New-ItemProperty -Path "Registry::HKEY_CLASSES_ROOT\Directory\shellex\PropertySheetHandlers\Sharing" -Name "(Default)" -Value "{f81e9010-6ea4-11ce-a7ff-00aa003ca9f6}"
Remove-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked" -Name "{f81e9010-6ea4-11ce-a7ff-00aa003ca9f6}"

# Folder > Right Click [Properties] > Sharing Tab > Network File and Folder Sharing > Share Button [Enable]
Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name "SharingWizardOn" -Value 1

windows features > enable > smb stuff

$wifiInterfaceIndex = Get-NetConnectionProfile | Where-Object { $_.InterfaceAlias -eq "WiFi" } | Select-Object -ExpandProperty "InterfaceIndex"

Hide Account Profile from Login Screen.ps1

$regPath = "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
$specialAccountsKey = "SpecialAccounts"
$userListKey = "UserList"
$userName = "USERNAME_SELECT"

New-Item -Path "$regPath" -Name "$specialAccountsKey" -Force
New-Item -Path "$regPath\$specialAccountsKey" -Name "$userListKey" -Force
New-ItemProperty -Path "$regPath\$specialAccountsKey\$userListKey" -Name "$userName" -Value 0 -PropertyType DWORD -Force

# Enable network in file explorer left pane
Set-ItemProperty -Path "Registry::HKEY_CLASSES_ROOT\CLSID\{F02C1A0D-BE21-4350-88B0-7367FC96EF3C}\ShellFolder" -Name "Attributes" -Value "b0040064"

# Disable network file pane
Set-ItemProperty -Path "Registry::HKEY_CLASSES_ROOT\CLSID\{F02C1A0D-BE21-4350-88B0-7367FC96EF3C}\ShellFolder" -Name "Attributes" -Value "b0940064"

net share start.bat

@echo off
REM List of services required for Windows 10 file sharing
set services=FDResPub SSDPSRV upnphost LanmanServer Browser

REM Start each service
for %%s in (%services%) do (
    sc start %%s
)