Ejemplo n.º 1
0
        /// <summary>
        /// Callback function for reacting to changes in wlan connectivity.
        /// </summary>
        /// <param name="notificationData">WLAN notification data structure containing details about the notification.</param>
        /// <param name="context">Notification context, not used.</param>
        public void WlanNotifyHook(ref WlanApi.WlanNotificationData notificationData, IntPtr context)
        {
            // Do not perform wlan detection if user's unsecure network alert setting is turned off.
            if (!Manager.Settings.Network.UnsecureNetworkAlert)
            {
                return;
            }

            // If connected, ignore any and all messages
            if (Manager.MainWindowViewModel.Status == Models.ConnectionState.Protected)
            {
                return;
            }

            const int clientVersion = 2;

            if ((WlanApi.WlanNotificationMsm)notificationData.NotificationCode == WlanApi.WlanNotificationMsm.Connected)
            {
                if (WlanApi.WlanOpenHandle(clientVersion, IntPtr.Zero, out uint _, out IntPtr clientHandle) != 0)
                {
                    ErrorHandling.ErrorHandler.Handle("Can't open Wlan handle for unsecured network detection.", ErrorHandling.LogLevel.Error);
                    return;
                }

                var queryData       = IntPtr.Zero;
                var wlanQueryResult = WlanApi.WlanQueryInterface(clientHandle, new Guid(notificationData.InterfaceGuid.ToString()), WlanApi.WlanIntfOpcode.CurrentConnection, IntPtr.Zero, out _, ref queryData, IntPtr.Zero);

                if (wlanQueryResult == 0)
                {
                    var connectionData = Marshal.PtrToStructure <WlanApi.WlanConnectionAttributes>(queryData);

                    // Detect open network or WEP secured network
                    if (connectionData.WlanSecurityAttributes.Dot11AuthAlgorithm == WlanApi.Dot11AuthAlgorithm.Open ||
                        (
                            connectionData.WlanSecurityAttributes.Dot11CipherAlgorithm == WlanApi.Dot11CipherAlgorithm.Wep ||
                            connectionData.WlanSecurityAttributes.Dot11CipherAlgorithm == WlanApi.Dot11CipherAlgorithm.Wep40 ||
                            connectionData.WlanSecurityAttributes.Dot11CipherAlgorithm == WlanApi.Dot11CipherAlgorithm.Wep104)
                        )
                    {
                        var showNotification = true;
                        var bSsid            = connectionData.WlanAssociationAttributes.Dot11Bssid.ToString();
                        if (!accessPoints.ContainsKey(connectionData.WlanAssociationAttributes.Dot11Bssid.ToString()))
                        {
                            var newAp = new AccessPoint()
                            {
                                Ssid         = connectionData.ProfileName,
                                Bssid        = bSsid,
                                LastNotified = DateTime.UtcNow,
                            };
                            accessPoints[bSsid] = newAp;
                        }
                        else
                        {
                            if ((DateTime.UtcNow - accessPoints[bSsid].LastNotified).TotalSeconds < ProductConstants.InsecureWiFiTimeout)
                            {
                                showNotification = false;
                            }

                            var accessPoint = accessPoints[bSsid];
                            accessPoint.LastNotified = DateTime.UtcNow;
                            accessPoints[bSsid]      = accessPoint;
                        }

                        if (showNotification)
                        {
                            Manager.TrayIcon.ShowNotification(
                                Manager.TranslationService.GetString("wifi-unsecure-network-detected-msg"),
                                string.Concat(Manager.TranslationService.GetString("wifi-network-unsecure-msg", UI.Resources.Localization.TranslationService.Args("wifiName", connectionData.WlanAssociationAttributes.Dot11Ssid.ToString())), " ", Manager.TranslationService.GetString("wifi-you-should-turn-on-msg")),
                                NotificationArea.ToastIconType.Disconnected
                                );
                        }
                    }

                    if (queryData != IntPtr.Zero)
                    {
                        WlanApi.WlanFreeMemory(queryData);
                    }
                }
            }
        }