brutella / hkcam

Open-Source HomeKit Surveillance Camera
https://hochgatterer.me/hkcam/
Apache License 2.0
932 stars 141 forks source link

SetupEndpoints issue in a special situation #142

Open 0x5e opened 1 year ago

0x5e commented 1 year ago

Hi @brutella , Thanks for this great project at first :)

I'm testing this project running on my MBP and found a small issue: When iPhone connects the usb cable with MBP, the camera live stream usually not working in Home App.

And I found when usb cable connected, iPhone sometimes request hap server directly from the wired network, not via wifi. https://github.com/brutella/hkcam/blob/959d66471bc0d76859a82d429e9077061f4dde9f/setup.go#L89-L98

The iface value is en14 instead of en0. then the server failed to get ip of en14 because it only have a ipv6 address.

Instead of get localIP from r.Context().Value(http.LocalAddrContextKey), my solution is like this:

  1. Obtain remoteIP from req.ControllerAddr.IPAddr
  2. Enumerate net.Interfaces(), find the proper subnet that contains remoteIP, return the ip of this interface.
func FindLocalIPForRemoteIP(remoteIP string) string {
    ifaces, _ := net.Interfaces()
    for _, iface := range ifaces {
        addrs, _ := iface.Addrs()
        for _, addr := range addrs {
            ip, subnet, _ := net.ParseCIDR(addr.String())
            if subnet.Contains(net.ParseIP(remoteIP)) {
                return ip.String()
            }
        }
    }
    return ""
}

localIP := util.FindLocalIPForRemoteIP(req.ControllerAddr.IPAddr)
if localIP == "" {
    log.Debug.Println("Failed to get localIP")
    return
}
brutella commented 1 year ago

Sounds good to me. Happy to accept a pull request. 😉