Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

libnet: ipv6_support: skip some checks to provide android ipv6 support (for android 10 and newer) #26

Closed

Conversation

nexplorer-3e
Copy link

@nexplorer-3e nexplorer-3e commented Jun 2, 2024

upd: this pr may only be able to fix read proc denied caused by selinux policy introduced around Android 10 (and affect all version newer) (ref:https://cs.android.com/android/_/android/platform/system/sepolicy/+/424517721cb71bc842cc37d82e8b61a6a4a6e00a)
THAT SAID IF U CAN RUN cat /proc/net/if_inet6 WITHOUT ERROR BUT IPV6 STILL NOT WORKING, THAT PR MAY NOT WORK FOR YOU
(for example PojavLauncherTeam/PojavLauncher#5125 (comment))

this PR should solve PojavLauncherTeam/PojavLauncher#5125 for Android version >= 10 and for those kernel doesn't restrict socket(2) call.
(Though I don't know why just skip check without touch selinux policy would make ipv6 working, it just works on my machine and seems aosp is doing the same thing (see issue above for reference))

image
Screenshot_20240602-140911

Maintainers may need to merge this commit to dev branch not a patch branch (or to say WIP branch).

@Xinhe9
Copy link

Xinhe9 commented Jun 2, 2024

i waited it for 1 term

@nexplorer-3e
Copy link
Author

i waited it for 1 term

you can check the test build at my fork's action if you know how to import runtime ;)

@Xinhe9
Copy link

Xinhe9 commented Jun 2, 2024

i waited it for 1 term

you can check the test build at my fork's action if you know how to import runtime ;)

yes

@Xinhe9
Copy link

Xinhe9 commented Jun 2, 2024

i waited it for 1 term

you can check the test build at my fork's action if you know how to import runtime ;)

yes it was working just now!! thank you very much.

@Xinhe9
Copy link

Xinhe9 commented Jun 2, 2024

Screenshot_20240603_000440_net.kdt.pojavlaunch.jpg

@Silvigarabis
Copy link

Silvigarabis commented Jun 4, 2024

It isn't working on my Android 8.1 device
I'm sure I have a valid IPv6 network, it can pass the test in http://ipv6.test-ipv6.com/
But with this build, I still unable to connect to a server using IPv6 address

With an address that link to an IPv6 address:
Screenshot_20240604121859

Direct connect to an IPv6 address:
Screenshot_20240604121813

log: https://mclo.gs/koSSZTW

edit: I have placed the images to the wrong place, so I fixed it.

@nexplorer-3e
Copy link
Author

nexplorer-3e commented Jun 4, 2024

It isn't working on my Android 8.1 device I'm sure I have a valid IPv6 network, it can pass the test in http://ipv6.test-ipv6.com/ But with this build, I still unable to connect to a server using IPv6 address

With an address that link to an IPv6 address: Screenshot_20240604121813

Direct connect to an IPv6 address: Screenshot_20240604121859

log: https://mclo.gs/koSSZTW

well, i've just tested on another device i have (android 13, kernel 4.19) with vanilla 1.12.2 installed, and it's working.
as i do poor in kernel debugging (and your device is huawei which can be creepy to get kernel source), so there are my questions:

  • how do you install jre and are you really using the jre just imported? (download jre17-pojav.zip from artifact, unzip, untar bin-<arch> and universal and tar xJf (all done in sdcard so there are symlink error but it just works), then import in pojav, and choose the newly imported jre in game settings)
  • could you test the code that libnet uses to check ipv6 is supported? I've pasted them in the issue but for your convience i would paste them below:
    (update: fix compilation error)
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define JNI_TRUE 1
#define JNI_FALSE 0

typedef union {
    struct sockaddr     sa;
    struct sockaddr_in  sa4;
    struct sockaddr_in6 sa6;
} SOCKETADDRESS;

void ipv6_supported();
int main() {
    ipv6_supported();
    return 0;
}

void ipv6_supported()
{
    int fd;
    void *ipv6_fn;
    SOCKETADDRESS sa;
    socklen_t sa_len = sizeof(SOCKETADDRESS);

    fd = socket(AF_INET6, SOCK_STREAM, 0) ;
    if (fd < 0) {
        /*
         *  TODO: We really cant tell since it may be an unrelated error
         *  for now we will assume that AF_INET6 is not available
         */
        fprintf(stderr, "socket AF_INET6 failed!\n");
    }

    /*
     * If fd 0 is a socket it means we may have been launched from inetd or
     * xinetd. If it's a socket then check the family - if it's an
     * IPv4 socket then we need to disable IPv6.
     */
    if (getsockname(0, &sa.sa, &sa_len) == 0) {
        if (sa.sa.sa_family == AF_INET) {
            close(fd);
            fprintf(stderr, "getsockname is not AF_INET6!\n");
        }
    }

    /**
     * Linux - check if any interface has an IPv6 address.
     * Don't need to parse the line - we just need an indication.
     */
#ifdef __linux__
    {
        FILE *fP = fopen("/proc/net/if_inet6", "r");
        char buf[255];
        char *bufP;

        if (fP == NULL) {
            close(fd);
            fprintf(stderr, "Cannot open /proc/net/if_inet6!\n");
            fprintf(stderr, "Skip buffer check for ENOENT\n");
            return;
        }
        bufP = fgets(buf, sizeof(buf), fP);
        fclose(fP);
        if (bufP == NULL) {
            close(fd);
            fprintf(stderr, "buffer of /proc/net/if_inet6 is NULL!\n");
        }
    }
#endif

    /*
     *  OK we may have the stack available in the kernel,
     *  we should also check if the APIs are available.
     */
    // ipv6_fn = JVM_FindLibraryEntry(RTLD_DEFAULT, "inet_pton");
    // if (ipv6_fn == NULL ) {
    //     return JNI_FALSE;
    // } else {
    //     return JNI_TRUE;
    // }
    close(fd);
    printf("IPv6 is supported!\n");
}

(you can get Termux app which should still be able to support android 8 to compile and run it, if you don't know how to use host ndk to cross-build it (me neither))
(maybe i can upload a binary huh)

  • as for network, if you are sure that your device has ipv6 address (you fight with your home router to let it advertise an address to your phone or you are using mobile data etc), you may need to disable some vpnservice, which is a known issue that would cause MC cannot connect to ipv6 network
  • (kernel version, selinux policies, etc although i don't know how to debug it :( )

@Silvigarabis
Copy link

It isn't working on my Android 8.1 device I'm sure I have a valid IPv6 network, it can pass the test in http://ipv6.test-ipv6.com/ But with this build, I still unable to connect to a server using IPv6 address
With an address that link to an IPv6 address: Screenshot_20240604121813
Direct connect to an IPv6 address: Screenshot_20240604121859
log: https://mclo.gs/koSSZTW

well, i've just tested on another device i have (android 13, kernel 4.19) with vanilla 1.12.2 installed, and it's working. as i do poor in kernel debugging (and your device is huawei which can be creepy to get kernel source), so there are my questions:

  • how do you install jre and are you really using the jre just imported? (download jre17-pojav.zip from artifact, unzip, untar bin-<arch> and universal and tar xJf (all done in sdcard so there are symlink error but it just works), then import in pojav, and choose the newly imported jre in game settings)
  • could you test the code that libnet uses to check ipv6 is supported? I've pasted them in the issue but for your convience i would paste them below:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define JNI_TRUE 1
#define JNI_FALSE 0

typedef union {
    struct sockaddr     sa;
    struct sockaddr_in  sa4;
    struct sockaddr_in6 sa6;
} SOCKETADDRESS;
typedef int socklen_t;

void ipv6_supported();
int main() {
    ipv6_supported();
    return 0;
}

void ipv6_supported()
{
    int fd;
    void *ipv6_fn;
    SOCKETADDRESS sa;
    socklen_t sa_len = sizeof(SOCKETADDRESS);

    fd = socket(AF_INET6, SOCK_STREAM, 0) ;
    if (fd < 0) {
        /*
         *  TODO: We really cant tell since it may be an unrelated error
         *  for now we will assume that AF_INET6 is not available
         */
        fprintf(stderr, "socket AF_INET6 failed!\n");
    }

    /*
     * If fd 0 is a socket it means we may have been launched from inetd or
     * xinetd. If it's a socket then check the family - if it's an
     * IPv4 socket then we need to disable IPv6.
     */
    if (getsockname(0, &sa.sa, &sa_len) == 0) {
        if (sa.sa.sa_family == AF_INET) {
            close(fd);
            fprintf(stderr, "getsockname is not AF_INET6!\n");
        }
    }

    /**
     * Linux - check if any interface has an IPv6 address.
     * Don't need to parse the line - we just need an indication.
     */
#ifdef __linux__
    {
        FILE *fP = fopen("/proc/net/if_inet6", "r");
        char buf[255];
        char *bufP;

        if (fP == NULL) {
            close(fd);
            fprintf(stderr, "Cannot open /proc/net/if_inet6!\n");
            fprintf(stderr, "Skip buffer check for ENOENT\n");
            return;
        }
        bufP = fgets(buf, sizeof(buf), fP);
        fclose(fP);
        if (bufP == NULL) {
            close(fd);
            fprintf(stderr, "buffer of /proc/net/if_inet6 is NULL!\n");
        }
    }
#endif

    /*
     *  OK we may have the stack available in the kernel,
     *  we should also check if the APIs are available.
     */
    // ipv6_fn = JVM_FindLibraryEntry(RTLD_DEFAULT, "inet_pton");
    // if (ipv6_fn == NULL ) {
    //     return JNI_FALSE;
    // } else {
    //     return JNI_TRUE;
    // }
    close(fd);
    printf("IPv6 is supported!\n");
}

(you can get Termux app which should still be able to support android 8 to compile and run it, if you don't know how to use host ndk to cross-build it (me neither)) (maybe i can upload a binary huh)

  • as for network, if you are sure that your device has ipv6 address (you fight with your home router to let it advertise an address to your phone or you are using mobile data etc), you may need to disable some vpnservice, which is a known issue that would cause MC cannot connect to ipv6 network
  • (kernel version, selinux policies, etc although i don't know how to debug it :( )
  • I downloaded jre17-aarch64.zip from your build (https://github.com/nexplorer-3e/android-openjdk-build-multiarch/actions/runs/9336686817), and unzip the tar.xz inside it, then using PojavLauncher Runtime Manager to import the tar.xz, and then change the Java Runtime to version I just imported for the vanilla 1.12.2 profile, and started my test.
  • I couldn't compile the code for the test with Termux and I don't know how to fix it, so I used ping6 to prove that I've connected to an IPv6 network:
$ ping6 -c 4 bing.com
PING bing.com(2620:1ec:c11::200) 56 data bytes
64 bytes from 2620:1ec:c11::200: icmp_seq=1 ttl=49 time=277 ms
64 bytes from 2620:1ec:c11::200: icmp_seq=2 ttl=49 time=285 ms
64 bytes from 2620:1ec:c11::200: icmp_seq=3 ttl=49 time=282 ms
64 bytes from 2620:1ec:c11::200: icmp_seq=4 ttl=49 time=287 ms

--- bing.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 277.151/283.156/287.761/4.030 ms
  • uname -a: Linux localhost 4.9.82+ #1 SMP PREEMPT Mon Sep 27 14:33:22 CST 2021 aarch64 Android

Others: the compile log of the test code

$ cc some_code_to_check_ipv6_support_but_i_dont_know_what_it_is.c
some_code_to_check_ipv6_support_but_i_dont_know_what_it_is.c:13:13: error: typedef redefinition with different types ('int' vs '__socklen_t' (aka 'unsigned int'))
   13 | typedef int socklen_t;
      |             ^
/data/data/com.termux/files/usr/include/sys/types.h:117:21: note: previous definition is here
  117 | typedef __socklen_t socklen_t;
      |                     ^
some_code_to_check_ipv6_support_but_i_dont_know_what_it_is.c:44:13: error: call to undeclared function 'close'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
   44 |             close(fd);
      |             ^
some_code_to_check_ipv6_support_but_i_dont_know_what_it_is.c:60:13: error: call to undeclared function 'close'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
   60 |             close(fd);
      |             ^
some_code_to_check_ipv6_support_but_i_dont_know_what_it_is.c:68:13: error: call to undeclared function 'close'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
   68 |             close(fd);
      |             ^
some_code_to_check_ipv6_support_but_i_dont_know_what_it_is.c:84:5: error: call to undeclared function 'close'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
   84 |     close(fd);
      |     ^
5 errors generated.

@nexplorer-3e
Copy link
Author

nexplorer-3e commented Jun 4, 2024

It isn't working on my Android 8.1 device I'm sure I have a valid IPv6 network, it can pass the test in http://ipv6.test-ipv6.com/ But with this build, I still unable to connect to a server using IPv6 address
With an address that link to an IPv6 address: Screenshot_20240604121813
Direct connect to an IPv6 address: Screenshot_20240604121859
log: https://mclo.gs/koSSZTW

well, i've just tested on another device i have (android 13, kernel 4.19) with vanilla 1.12.2 installed, and it's working. as i do poor in kernel debugging (and your device is huawei which can be creepy to get kernel source), so there are my questions:

  • how do you install jre and are you really using the jre just imported? (download jre17-pojav.zip from artifact, unzip, untar bin-<arch> and universal and tar xJf (all done in sdcard so there are symlink error but it just works), then import in pojav, and choose the newly imported jre in game settings)
  • could you test the code that libnet uses to check ipv6 is supported? I've pasted them in the issue but for your convience i would paste them below:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define JNI_TRUE 1
#define JNI_FALSE 0

typedef union {
    struct sockaddr     sa;
    struct sockaddr_in  sa4;
    struct sockaddr_in6 sa6;
} SOCKETADDRESS;
typedef int socklen_t;

void ipv6_supported();
int main() {
    ipv6_supported();
    return 0;
}

void ipv6_supported()
{
    int fd;
    void *ipv6_fn;
    SOCKETADDRESS sa;
    socklen_t sa_len = sizeof(SOCKETADDRESS);

    fd = socket(AF_INET6, SOCK_STREAM, 0) ;
    if (fd < 0) {
        /*
         *  TODO: We really cant tell since it may be an unrelated error
         *  for now we will assume that AF_INET6 is not available
         */
        fprintf(stderr, "socket AF_INET6 failed!\n");
    }

    /*
     * If fd 0 is a socket it means we may have been launched from inetd or
     * xinetd. If it's a socket then check the family - if it's an
     * IPv4 socket then we need to disable IPv6.
     */
    if (getsockname(0, &sa.sa, &sa_len) == 0) {
        if (sa.sa.sa_family == AF_INET) {
            close(fd);
            fprintf(stderr, "getsockname is not AF_INET6!\n");
        }
    }

    /**
     * Linux - check if any interface has an IPv6 address.
     * Don't need to parse the line - we just need an indication.
     */
#ifdef __linux__
    {
        FILE *fP = fopen("/proc/net/if_inet6", "r");
        char buf[255];
        char *bufP;

        if (fP == NULL) {
            close(fd);
            fprintf(stderr, "Cannot open /proc/net/if_inet6!\n");
            fprintf(stderr, "Skip buffer check for ENOENT\n");
            return;
        }
        bufP = fgets(buf, sizeof(buf), fP);
        fclose(fP);
        if (bufP == NULL) {
            close(fd);
            fprintf(stderr, "buffer of /proc/net/if_inet6 is NULL!\n");
        }
    }
#endif

    /*
     *  OK we may have the stack available in the kernel,
     *  we should also check if the APIs are available.
     */
    // ipv6_fn = JVM_FindLibraryEntry(RTLD_DEFAULT, "inet_pton");
    // if (ipv6_fn == NULL ) {
    //     return JNI_FALSE;
    // } else {
    //     return JNI_TRUE;
    // }
    close(fd);
    printf("IPv6 is supported!\n");
}

(you can get Termux app which should still be able to support android 8 to compile and run it, if you don't know how to use host ndk to cross-build it (me neither)) (maybe i can upload a binary huh)

  • as for network, if you are sure that your device has ipv6 address (you fight with your home router to let it advertise an address to your phone or you are using mobile data etc), you may need to disable some vpnservice, which is a known issue that would cause MC cannot connect to ipv6 network
  • (kernel version, selinux policies, etc although i don't know how to debug it :( )
  • I downloaded jre17-aarch64.zip from your build (https://github.com/nexplorer-3e/android-openjdk-build-multiarch/actions/runs/9336686817), and unzip the tar.xz inside it, then using PojavLauncher Runtime Manager to import the tar.xz, and then change the Java Runtime to version I just imported for the vanilla 1.12.2 profile, and started my test.
  • I couldn't compile the code for the test with Termux and I don't know how to fix it, so I used ping6 to prove that I've connected to an IPv6 network:
$ ping6 -c 4 bing.com
PING bing.com(2620:1ec:c11::200) 56 data bytes
64 bytes from 2620:1ec:c11::200: icmp_seq=1 ttl=49 time=277 ms
64 bytes from 2620:1ec:c11::200: icmp_seq=2 ttl=49 time=285 ms
64 bytes from 2620:1ec:c11::200: icmp_seq=3 ttl=49 time=282 ms
64 bytes from 2620:1ec:c11::200: icmp_seq=4 ttl=49 time=287 ms

--- bing.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 277.151/283.156/287.761/4.030 ms
  • uname -a: Linux localhost 4.9.82+ #1 SMP PREEMPT Mon Sep 27 14:33:22 CST 2021 aarch64 Android

Others: the compile log of the test code

$ cc some_code_to_check_ipv6_support_but_i_dont_know_what_it_is.c
some_code_to_check_ipv6_support_but_i_dont_know_what_it_is.c:13:13: error: typedef redefinition with different types ('int' vs '__socklen_t' (aka 'unsigned int'))
   13 | typedef int socklen_t;
      |             ^
/data/data/com.termux/files/usr/include/sys/types.h:117:21: note: previous definition is here
  117 | typedef __socklen_t socklen_t;
      |                     ^
some_code_to_check_ipv6_support_but_i_dont_know_what_it_is.c:44:13: error: call to undeclared function 'close'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
   44 |             close(fd);
      |             ^
some_code_to_check_ipv6_support_but_i_dont_know_what_it_is.c:60:13: error: call to undeclared function 'close'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
   60 |             close(fd);
      |             ^
some_code_to_check_ipv6_support_but_i_dont_know_what_it_is.c:68:13: error: call to undeclared function 'close'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
   68 |             close(fd);
      |             ^
some_code_to_check_ipv6_support_but_i_dont_know_what_it_is.c:84:5: error: call to undeclared function 'close'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
   84 |     close(fd);
      |     ^
5 errors generated.

oh there are some mistakes in the code :( please include a new file at the head of file #include <unistd.h> and comment the typedef int socklen_t with // prepending before the line.

one more thing: try the jvm arg: -Djava.net.preferIPv6Addresses=true

@Silvigarabis
Copy link

I just tested on a non-Huawei device (but it's Android 6.0), and it's working well:
截屏_20240604_231340_1

Also, I will test the code on my Huawei device later and try to export more logs.

@nexplorer-3e nexplorer-3e changed the title android ipv6 support: skip /proc/net check libnet: ipv6_support: skip /proc/net check to provide android ipv6 support (for android 10 and newer) Jun 4, 2024
@Mathias-Boulay
Copy link

Thank you for the Pull request @nexplorer-3e !
I'll take a look at it. Chances are we are going to streamline a bit the patch apply process to make it easier to debug issues like yours during the development process.

Side note: your PR only targets one java version here, java 17. chances are similar patches might be needed for 21 and 8

@nexplorer-3e
Copy link
Author

nexplorer-3e commented Jun 4, 2024

Thank you for the Pull request @nexplorer-3e ! I'll take a look at it. Chances are we are going to streamline a bit the patch apply process to make it easier to debug issues like yours during the development process.

Side note: your PR only targets one java version here, java 17. chances are similar patches might be needed for 21 and 8

Oh thank you if your guy can just fix a tag in clone-jdk.sh that might be great
21 support is trivial. for 8 the file locates at somewhere the path includes solaris, and as i am not playing with lower MC version i consider not to provide support for java8

@Silvigarabis
Copy link

Silvigarabis commented Jun 4, 2024

I have tested again on Huawei DUB-AL00 device and export these informations:

the full logs is too long to show in there, so I created a gist to store them: <deleted>

Anyway, working with different devices is hard. If you know how to make it work on my device, that would be very much appreciated!

edit: the log has been deleted

@Silvigarabis
Copy link

I just tested on a non-Huawei device (but it's Android 6.0), and it's working well: 截屏_20240604_231340_1

Also, I will test the code on my Huawei device later and try to export more logs.

Since test on Android 6.0 is ok, this patch should also work on versions lower than Android 10 (but may not work on some Huawei device)

@Mathias-Boulay
Copy link

Oh thank you if your guy can just fix a tag in clone-jdk.sh that might be great
@nexplorer-3e we don't, as we always try to ship updated java versions for security/performance reasons. This usually forces us to make the changes as small/maintainable as possible. Do not that this philosophy impacts java 8,17 and 21

@nexplorer-3e
Copy link
Author

nexplorer-3e commented Jun 5, 2024

I have tested again on Huawei DUB-AL00 device and export these informations:

the full logs is too long to show in there, so I created a gist to store them:https://gist.github.com/Silvigarabis/ef3d2021c931fc0829bcad3479e88e73

Anyway, working with different devices is hard. If you know how to make it work on my device, that would be very much appreciated!

in your logcat:

06-04 23:52:34.552 2321 2321 W JNISurfaceTextu: type=1400 audit(0.0:18224602): avc: denied { ioctl } for path="socket:[321550628]" dev="sockfs" ino=321550628 ioctlcmd=0x8927 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:r:untrusted_app:s0:c512,c768 tclass=udp_socket permissive=0

this ioctlcmd points to SIOCGIFHWADDR function, but i wonder why this cause checkAddress to fail. (and why the native program doesn't affect by the rule as normal user apps should also be restricted by the rule)
Anyway, that selinux message indicates the error might mostly caused by huawei selinux policy. There may be two ways to workaround it:

  • set selinux to permissive/load some allow policy, but without root you cannot do it
  • patch the jdk to not call this ioctl if possible

in the next few day i need to deal with my college homework so the progress may be slower

another thing is i managed to get the kernel of your device via huawei open source website, but they didn't released the android device tree (aka android_device_huawei_xxx) so selinux policy is also unavailable to public. If you know how to rip the selinux policy that might be helpful (might)
(btw your logcat contains some sensitive information like your email your wifi ssid you may need to check them and redact them)

upd: wait i am hit by the memory of the comment in that issue, maybe there is no way but to comment socket call

@nexplorer-3e
Copy link
Author

@Silvigarabis
Copy link

Silvigarabis commented Jun 14, 2024

@Silvigarabis hello can u test the new one at my repo? https://github.com/nexplorer-3e/android-openjdk-build-multiarch/actions/runs/9381245493

It's still not work for my device…with same error

@Mathias-Boulay
Copy link

@nexplorer-3e The branch you're targeting via the PR got worked on a bit
It will be pretty easy for you to adapt your PR

@nexplorer-3e nexplorer-3e changed the title libnet: ipv6_support: skip /proc/net check to provide android ipv6 support (for android 10 and newer) libnet: ipv6_support: skip some checks to provide android ipv6 support (for android 10 and newer) Jun 18, 2024
@Mathias-Boulay
Copy link

By the way, you can split the diff into their own files. It allows you to comment the purpose of them as well

@Mathias-Boulay
Copy link

Thank you for the PR, there was a small file called "" so I picked whatever was truly necessary.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants