Esempio n. 1
0
        private void InitAnnounceTimer()
        {
            _userIdAnnounceTimer = new Timer(delegate(object state)
            {
                BinaryNumber maskedUserId = _maskedUserId; //separate variable to mitigate possible rare race condition

                if (maskedUserId == null)
                {
                    maskedUserId  = MeshNetwork.GetMaskedUserId(_userId);
                    _maskedUserId = maskedUserId;
                }

                _connectionManager.DhtManager.AnnounceAsync(maskedUserId, _allowOnlyLocalInboundInvitations, null);

                if (!_allowOnlyLocalInboundInvitations)
                {
                    _connectionManager.TcpRelayClientRegisterHostedNetwork(_maskedUserId);
                }
            }, null, Timeout.Infinite, Timeout.Infinite);

            if (_allowInboundInvitations)
            {
                _userIdAnnounceTimer.Change(5000, USER_ID_ANNOUNCE_INTERVAL);
            }
        }
Esempio n. 2
0
        public ChatListItem(MeshNetwork network)
        {
            InitializeComponent();

            _network = network;

            RefreshTitle();
            RefreshIcon();
            OnSelected();

            labLastMessage.Text = "";
            SetLastMessageDate();
            ResetUnreadMessageCount();

            _network.MessageReceived += network_MessageReceived;
            _network.PeerTyping      += network_PeerTyping;

            if (_network.Type == MeshNetworkType.Private)
            {
                _network.OtherPeer.StateChanged   += otherPeer_StateChanged;
                _network.OtherPeer.ProfileChanged += otherPeer_ProfileChanged;
            }
            else
            {
                _network.GroupImageChanged += network_GroupImageChanged;
            }

            _chatPanel      = new MeshNetworkPanel(_network, this);
            _chatPanel.Dock = DockStyle.Fill;
        }
Esempio n. 3
0
 private void RaiseEventInvitationReceived(MeshNetwork network)
 {
     _syncCxt.Send(delegate(object state)
     {
         InvitationReceived?.Invoke(network);
     }, null);
 }
Esempio n. 4
0
        public ChatMessageView(MeshNetwork network, ChatListItem chatItem)
        {
            InitializeComponent();

            _network  = network;
            _chatItem = chatItem;

            this.Title = _network.NetworkName;

            _network.MessageReceived             += network_MessageReceived;
            _network.MessageDeliveryNotification += network_MessageDeliveryNotification;
            _network.PeerTyping += network_PeerTyping;

            if (_network.Type == MeshNetworkType.Private)
            {
                _network.OtherPeer.ProfileChanged += otherPeer_ProfileChanged;
            }

            //load stored messages
            int totalMessageCount = _network.GetMessageCount();

            if (totalMessageCount > 0)
            {
                try
                {
                    customListView1.ReplaceItems(ConvertToListViewItems(_network.GetLatestMessages(totalMessageCount, MESSAGE_COUNT_PER_SCROLL), true));
                    customListView1.ScrollToBottom();
                }
                catch
                { }
            }
        }
Esempio n. 5
0
        public MeshNetworkPanel(MeshNetwork network, ChatListItem chatItem)
        {
            InitializeComponent();

            _network = network;

            _network.PeerAdded += network_PeerAdded;

            //create view
            _view                   = new ChatMessageView(_network, chatItem);
            _view.Dock              = DockStyle.Fill;
            _view.AllowDrop         = true;
            _view.SettingsModified += view_SettingsModified;
            _view.ForwardTo        += view_ForwardTo;
            _view.DragEnter        += lstFiles_DragEnter;
            _view.DragDrop         += lstFiles_DragDrop;

            //load all peers
            foreach (MeshNetwork.Peer peer in _network.GetPeers())
            {
                lstUsers.AddItem(new UserListItem(peer));

                peer.StateChanged += peer_StateChanged;
            }

            //add view to panel
            meshPanelSplitContainer.Panel1.Controls.Add(_view);
        }
Esempio n. 6
0
 internal void RemoveMeshNetwork(MeshNetwork network)
 {
     lock (_networks)
     {
         _networks.Remove(network.NetworkId);
     }
 }
Esempio n. 7
0
 internal void MeshNetworkChanged(MeshNetwork network, BinaryNumber newNetworkId)
 {
     lock (_networks)
     {
         _networks.Add(newNetworkId, network);
         _networks.Remove(network.NetworkId);
     }
 }
Esempio n. 8
0
        public MeshNetwork[] GetNetworks()
        {
            lock (_networks)
            {
                MeshNetwork[] networks = new MeshNetwork[_networks.Values.Count];
                _networks.Values.CopyTo(networks, 0);

                return(networks);
            }
        }
Esempio n. 9
0
        public frmViewGroup(MeshNetwork network)
        {
            InitializeComponent();

            _network = network;

            //name
            string name = _network.NetworkName;

            //name icon
            if (name.Length > 0)
            {
                labIcon.Text = name.Substring(0, 1).ToUpper();

                int x = name.LastIndexOf(" ", StringComparison.CurrentCultureIgnoreCase);
                if (x > 0)
                {
                    labIcon.Text += name.Substring(x + 1, 1).ToUpper();
                }
                else if (name.Length > 1)
                {
                    labIcon.Text += name.Substring(1, 1).ToLower();
                }
            }
            else
            {
                labIcon.Text = "";
            }

            if (_network.Status == MeshNetworkStatus.Online)
            {
                labIcon.BackColor = Color.FromArgb(102, 153, 255);
            }
            else
            {
                labIcon.BackColor = Color.Gray;
            }

            labName.Text = name;

            //image icon
            if ((_network.GroupDisplayImage != null) && (_network.GroupDisplayImage.Length > 0))
            {
                using (MemoryStream mS = new MemoryStream(_network.GroupDisplayImage))
                {
                    _groupImage   = Image.FromStream(mS);
                    picIcon.Image = _groupImage;
                }

                picIcon.Visible = true;
                labIcon.Visible = false;
            }
        }
Esempio n. 10
0
        private void MeshNode_InvitationReceived(MeshNetwork network)
        {
            AddChatView(network);

            if (lstChats.Controls.Count == 1)
            {
                lstChats.SelectItem(lstChats.GetFirstItem());
                ShowSelectedChatView();
            }

            SaveProfile();
        }
Esempio n. 11
0
        public MeshNetwork CreatePrivateChat(BinaryNumber peerUserId, string peerName, bool localNetworkOnly, string invitationMessage)
        {
            //use random userId for each independent chat network for privacy reasons
            BinaryNumber randomUserId = SecureChannelStream.GenerateUserId(SecureChannelStream.GetPublicKeyFromPrivateKey(_privateKey));
            MeshNetwork  network      = new MeshNetwork(_connectionManager, randomUserId, peerUserId, peerName, localNetworkOnly, invitationMessage);

            lock (_networks)
            {
                _networks.Add(network.NetworkId, network);
            }

            return(network);
        }
Esempio n. 12
0
        private ChatListItem AddChatView(MeshNetwork network)
        {
            ChatListItem itm = new ChatListItem(network);

            itm.ChatPanel.SettingsModified += chatPanel_SettingsModified;
            itm.ChatPanel.ForwardTo        += chatPanel_ForwardTo;

            network.MessageReceived += network_MessageReceived;

            mainContainer.Panel2.Controls.Add(itm.ChatPanel);

            lstChats.AddItem(itm);

            return(itm);
        }
Esempio n. 13
0
        internal void MeshNetworkRequest(Connection connection, BinaryNumber networkId, Stream channel)
        {
            MeshNetwork network = null;

            lock (_networks)
            {
                if (_networks.ContainsKey(networkId))
                {
                    network = _networks[networkId];
                }
            }

            if (network == null)
            {
                if (!networkId.Equals(_maskedUserId))
                {
                    //no network found
                    channel.Dispose();
                    return;
                }

                //private network connection invitation attempt
                if (!_allowInboundInvitations || (_allowOnlyLocalInboundInvitations && ((connection.RemotePeerEP.AddressFamily == AddressFamily.Unspecified) || !NetUtilities.IsPrivateIP((connection.RemotePeerEP as IPEndPoint).Address))))
                {
                    //not allowed
                    channel.Dispose();
                    return;
                }

                //accept invitation
                network = MeshNetwork.AcceptPrivateNetworkInvitation(_connectionManager, connection, channel);

                //add network
                lock (_networks)
                {
                    _networks.Add(network.NetworkId, network);
                }

                //notify UI
                RaiseEventInvitationReceived(network);
            }
            else
            {
                network.AcceptConnectionAndJoinNetwork(connection, channel);
            }
        }
Esempio n. 14
0
        public MeshNode(Stream s, string password, string profileFolder, TorController torController)
        {
            _password      = password;
            _profileFolder = profileFolder;

            switch (s.ReadByte()) //version
            {
            case 1:
                //read headers and init decryptor
                Aes decryptionAlgo = Aes.Create();
                decryptionAlgo.Key     = MeshNetwork.GetKdfValue32(Encoding.UTF8.GetBytes(password), s.ReadBytes(32), 1, 1 * 1024 * 1024); //salt
                decryptionAlgo.IV      = s.ReadBytes(16);                                                                                  //IV
                decryptionAlgo.Padding = PaddingMode.ISO10126;
                decryptionAlgo.Mode    = CipherMode.CBC;

                byte[] hmac = s.ReadBytes(32);     //hmac
                long   cipherTextStartPosition = s.Position;

                //authenticate data in Encrypt-then-MAC (EtM) mode
                using (HMAC aeHmac = new HMACSHA256(decryptionAlgo.Key))
                {
                    byte[] computedHmac = aeHmac.ComputeHash(s);

                    if (!BinaryNumber.Equals(hmac, computedHmac))
                    {
                        throw new CryptographicException("Invalid password or data tampered.");
                    }
                }

                //decrypt data and init node
                s.Position = cipherTextStartPosition;
                CryptoStream cS = new CryptoStream(s, decryptionAlgo.CreateDecryptor(), CryptoStreamMode.Read);

                InitMeshNode(new BinaryReader(cS), torController);
                break;

            case -1:
                throw new EndOfStreamException();

            default:
                throw new InvalidDataException("MeshNode format version not supported.");
            }
        }
Esempio n. 15
0
        public MeshNetwork CreateGroupChat(string networkName, string sharedSecret, bool localNetworkOnly)
        {
            //use random userId for each independent chat network for privacy reasons
            BinaryNumber randomUserId = SecureChannelStream.GenerateUserId(SecureChannelStream.GetPublicKeyFromPrivateKey(_privateKey));
            MeshNetwork  network      = new MeshNetwork(_connectionManager, randomUserId, networkName, sharedSecret, localNetworkOnly);

            lock (_networks)
            {
                if (_networks.ContainsKey(network.NetworkId))
                {
                    network.Dispose();
                    throw new MeshException("Mesh network for group chat '" + network.NetworkName + "' already exists.");
                }

                _networks.Add(network.NetworkId, network);
            }

            return(network);
        }
Esempio n. 16
0
        public void SaveTo(Stream s)
        {
            //generate salt for KDF
            byte[] salt = new byte[32];
            _rng.GetBytes(salt);

            //create encryptor
            Aes encryptionAlgo = Aes.Create();

            encryptionAlgo.Key = MeshNetwork.GetKdfValue32(Encoding.UTF8.GetBytes(_password), salt, 1, 1 * 1024 * 1024);
            encryptionAlgo.GenerateIV();
            encryptionAlgo.Padding = PaddingMode.ISO10126;
            encryptionAlgo.Mode    = CipherMode.CBC;

            //write headers
            s.WriteByte((byte)1);       //version
            s.Write(salt);              //salt
            s.Write(encryptionAlgo.IV); //IV
            s.Write(new byte[32]);      //placeholder for HMAC

            long cipherTextStartPosition = s.Position;

            //write encrypted data
            {
                CryptoStream   cS = new CryptoStream(s, encryptionAlgo.CreateEncryptor(), CryptoStreamMode.Write);
                BufferedStream bS = new BufferedStream(cS);
                WriteTo(new BinaryWriter(bS));
                bS.Flush();
                cS.FlushFinalBlock();
            }

            //write hmac for authenticated encryption Encrypt-then-MAC (EtM) mode
            using (HMAC aeHmac = new HMACSHA256(encryptionAlgo.Key))
            {
                s.Position = cipherTextStartPosition;
                byte[] hmac = aeHmac.ComputeHash(s);

                //write hmac
                s.Position = cipherTextStartPosition - 32;
                s.Write(hmac);
            }
        }
Esempio n. 17
0
    public void Start()
    {
        DontDestroyOnLoad(gameObject);
        meshnet = gameObject.GetComponent <MeshNetwork>();
        GameObject[] prefabs = Resources.LoadAll <GameObject>("NetworkPrefabs");

        foreach (GameObject prefab in prefabs)
        {
            if (prefab.GetComponent <IdentityContainer>() == null)
            {
                Debug.LogError("A NetworkPrefab is missing an IdentityContainer.");
            }
            else
            {
                string prefabID = prefab.name.Substring(prefab.name.LastIndexOf('_') + 1);
                networkPrefabs.Add(ushort.Parse(prefabID), prefab);
            }
        }
        Debug.Log("GameCoordinator tried to register " + prefabs.Length + " network prefabs, succeeded with " + networkPrefabs.Count + ".");
    }
Esempio n. 18
0
        internal void ReceivedMeshNetworkPeersViaTcpRelay(Connection viaConnection, BinaryNumber channelId, List <EndPoint> peerEPs)
        {
            MeshNetwork foundNetwork = null;

            lock (_networks)
            {
                foreach (KeyValuePair <BinaryNumber, MeshNetwork> network in _networks)
                {
                    if (network.Key.Equals(channelId) || ((network.Value.Type == MeshNetworkType.Private) && network.Value.OtherPeer.MaskedPeerUserId.Equals(channelId)))
                    {
                        foundNetwork = network.Value;
                        break;
                    }
                }
            }

            if (foundNetwork != null)
            {
                foundNetwork.TcpRelayClientReceivedPeers(viaConnection, peerEPs);
            }
        }
Esempio n. 19
0
        private void mnuAddGroupChat_Click(object sender, EventArgs e)
        {
            using (frmAddGroupChat frm = new frmAddGroupChat())
            {
                if (frm.ShowDialog(this) == DialogResult.OK)
                {
                    try
                    {
                        MeshNetwork network = _node.CreateGroupChat(frm.NetworkName, frm.SharedSecret, frm.LocalNetworkOnly);

                        lstChats.SelectItem(AddChatView(network));
                        ShowSelectedChatView();

                        SaveProfile();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    }
                }
            }
        }
Esempio n. 20
0
 public void SetMeshnetReference(MeshNetwork net)
 {
     meshnetReference = net;
 }
Esempio n. 21
0
        private void InitMeshNode(BinaryReader bR, TorController torController)
        {
            switch (bR.ReadByte()) //version
            {
            case 1:
                _type             = (MeshNodeType)bR.ReadByte();
                _privateKey       = bR.ReadBuffer();
                _supportedCiphers = (SecureChannelCipherSuite)bR.ReadByte();

                //
                _userId = new BinaryNumber(bR.BaseStream);

                //
                _localServicePort = bR.ReadUInt16();
                _downloadFolder   = bR.ReadShortString();

                //
                _profileDateModified  = bR.ReadDate();
                _profileDisplayName   = bR.ReadShortString();
                _profileStatus        = (MeshProfileStatus)bR.ReadByte();
                _profileStatusMessage = bR.ReadShortString();

                //
                _profileImageDateModified = bR.ReadDate();
                _profileDisplayImage      = bR.ReadBuffer();

                //
                _ipv4BootstrapDhtNodes = new EndPoint[bR.ReadInt32()];
                for (int i = 0; i < _ipv4BootstrapDhtNodes.Length; i++)
                {
                    _ipv4BootstrapDhtNodes[i] = EndPointExtension.Parse(bR);
                }

                _ipv6BootstrapDhtNodes = new EndPoint[bR.ReadInt32()];
                for (int i = 0; i < _ipv6BootstrapDhtNodes.Length; i++)
                {
                    _ipv6BootstrapDhtNodes[i] = EndPointExtension.Parse(bR);
                }

                _torBootstrapDhtNodes = new EndPoint[bR.ReadInt32()];
                for (int i = 0; i < _torBootstrapDhtNodes.Length; i++)
                {
                    _torBootstrapDhtNodes[i] = EndPointExtension.Parse(bR);
                }

                //
                _enableUPnP = bR.ReadBoolean();
                _allowInboundInvitations          = bR.ReadBoolean();
                _allowOnlyLocalInboundInvitations = bR.ReadBoolean();

                //
                if (bR.ReadBoolean())
                {
                    _proxy = new NetProxy((NetProxyType)bR.ReadByte(), bR.ReadShortString(), bR.ReadUInt16(), (bR.ReadBoolean() ? new NetworkCredential(bR.ReadShortString(), bR.ReadShortString()) : null));
                }

                //
                _appData = bR.ReadBuffer();

                //start connection manager
                _connectionManager = new ConnectionManager(this, torController);

                //
                int networkCount = bR.ReadInt32();

                for (int i = 0; i < networkCount; i++)
                {
                    MeshNetwork network = new MeshNetwork(_connectionManager, bR);
                    _networks.Add(network.NetworkId, network);
                }

                InitAnnounceTimer();
                break;

            default:
                throw new InvalidDataException("MeshNode format version not supported.");
            }
        }
Esempio n. 22
0
        public frmChatProperties(MeshNetwork network)
        {
            InitializeComponent();

            _network = network;

            this.Text = _network.NetworkName + " - Properties";
            chkLocalNetworkOnly.Checked = _network.LocalNetworkOnly;
            txtNetworkId.Text           = _network.NetworkId.ToString();
            txtPassword.Text            = _network.SharedSecret;

            if (_network.Type == MeshNetworkType.Private)
            {
                labNetworkName.Text = "Peer's User Id";
                txtNetworkName.Text = _network.OtherPeer.PeerUserId.ToString();
            }
            else
            {
                labNetworkName.Text = "Group Name";
                txtNetworkName.Text = _network.NetworkName;
            }

            {
                ListViewItem dhtItem = lstPeerInfo.Items.Add("IPv4 DHT");

                dhtItem.SubItems.Add("");
                dhtItem.SubItems.Add("");
            }

            {
                ListViewItem dhtItem = lstPeerInfo.Items.Add("IPv6 DHT");

                dhtItem.SubItems.Add("");
                dhtItem.SubItems.Add("");
            }

            {
                ListViewItem dhtItem = lstPeerInfo.Items.Add("LAN DHT");

                dhtItem.SubItems.Add("");
                dhtItem.SubItems.Add("");
            }

            {
                ListViewItem dhtItem = lstPeerInfo.Items.Add("Tor DHT");

                dhtItem.SubItems.Add("");
                dhtItem.SubItems.Add("");
            }

            {
                ListViewItem dhtItem = lstPeerInfo.Items.Add("IPv4 Tcp Relay");

                dhtItem.SubItems.Add("");
                dhtItem.SubItems.Add("");
            }

            {
                ListViewItem dhtItem = lstPeerInfo.Items.Add("IPv6 Tcp Relay");

                dhtItem.SubItems.Add("");
                dhtItem.SubItems.Add("");
            }

            _timer          = new Timer();
            _timer.Interval = 1000;
            _timer.Tick    += timer_Tick;
            _timer.Start();
        }