public void AddStream(SecureChannelStream stream) { if (!_peerCert.IssuedTo.EmailAddress.Address.Equals(stream.RemotePeerCertificate.IssuedTo.EmailAddress.Address, StringComparison.CurrentCultureIgnoreCase)) throw new BitChatException("Secure stream certificate email address doesn't match with existing peer email address."); lock (_streamList) { if (_streamList.Count > 0) { if (!_peerCert.Equals(stream.RemotePeerCertificate)) throw new BitChatException("Secure stream certificates doesn't match with existing peer secure stream certificate."); } else { _peerCert = stream.RemotePeerCertificate; } _streamList.Add(stream); } lock (_readThreadList) { Thread readThread = new Thread(ReadPacketAsync); readThread.IsBackground = true; _readThreadList.Add(readThread); readThread.Start(stream); } lock (this) { _isOnline = true; if (StreamStateChanged != null) StreamStateChanged(this, EventArgs.Empty); } }
public void JoinNetwork(string peerID, SecureChannelStream peerStream, bool checkCertificateRevocationList) { if (_type == BitChatNetworkType.PrivateChat) { if (!peerStream.RemotePeerCertificate.IssuedTo.EmailAddress.Equals(_peerEmailAddress)) throw new BitChatException("User with another email address '" + peerStream.RemotePeerCertificate.IssuedTo.EmailAddress.Address + " [" + peerStream.RemotePeerEP.Address.ToString() + "]' trying to join private chat."); _peerName = peerStream.RemotePeerCertificate.IssuedTo.Name; } peerID = peerID.ToLower(); VirtualPeer vPeer; bool peerAdded = false; lock (_virtualPeers) { if (_virtualPeers.ContainsKey(peerID)) { vPeer = _virtualPeers[peerID]; } else { vPeer = new VirtualPeer(peerStream.RemotePeerCertificate, this); _virtualPeers.Add(peerID, vPeer); peerAdded = true; } } if (peerAdded) VirtualPeerAdded(this, vPeer); vPeer.AddStream(peerStream); if (checkCertificateRevocationList) { //start async revocation list check process ThreadPool.QueueUserWorkItem(CheckCertificateRevocationListAsync, peerStream); } }