Ejemplo n.º 1
0
        private void ProcessLanConnections(object no)
        {
            while (run)
            {
                List <DetectedNode> localNodes = peerFinder.Peers.ToList();

                foreach (DetectedNode peer in localNodes)
                {
                    if (peer.Address == serverNode.Location)
                    {
                        continue;
                    }

                    //If not already connected to that peer then connect
                    if (extOverlordServers.ToList().Where(o => o.Destination.Location == peer.Address).Count() == 0)
                    {
                        logger.Debug("Server connecting as client to external overlord at {0}", peer.Address);
                        var verb = new ConnectVerb();
                        verb.Address    = serverNode.Location;
                        verb.ClientType = ClientType.Overlord;
                        verb.Secret     = IDService.CreateID();

                        var uplink = new Uplink(model.LocalNode,
                                                new Node
                        {
                            ID       = peer.OverlordID,
                            Location = peer.Address,
                            NodeType = ClientType.Overlord,
                            Secret   = verb.Secret
                        });
                        extOverlordServers.Add(uplink);


                        var client = new Client(serverNode);
                        if (client.Execute(verb, peer.Address, 5000))
                        {
                            //Connected as client on an external overlord

                            uplink.OnDisconnect += uplink_OnDisconnect;

                            uplink.Start();
                            logger.Debug("Server connected to client to external overlord at {0}", peer.Address);
                            break;
                        }
                        else
                        {
                            //Failed to connect ot the external overlord
                            logger.Debug("Server failed to connect to external overlord at {0}", peer.Address);
                            peerFinder.RemovePeer(peer);
                            extOverlordServers.Remove(uplink);
                        }
                    }
                }
                Thread.Sleep(3000);
            }
        }
Ejemplo n.º 2
0
        private bool Connect(Domain.Entities.Network net, DetectedNode n)
        {
            try
            {
                LogManager.GetLogger("faplog").Info("Client connecting to {0}", n.Address);
                net.State = ConnectionState.Connecting;

                var verb = new ConnectVerb();
                verb.ClientType = ClientType.Client;
                verb.Address    = model.LocalNode.Location;
                verb.Secret     = IDService.CreateID();
                var client = new Client(model.LocalNode);

                transmitted.Data.Clear();
                foreach (var info in model.LocalNode.Data.ToList())
                {
                    transmitted.SetData(info.Key, info.Value);
                }

                net.Overlord          = new Node();
                net.Overlord.Location = n.Address;
                net.Overlord.Secret   = verb.Secret;
                LogManager.GetLogger("faplog").Debug("Client using secret {0}", verb.Secret);
                if (client.Execute(verb, n.Address))
                {
                    net.State       = ConnectionState.Connected;
                    net.Overlord.ID = verb.OverlordID;
                    LogManager.GetLogger("faplog").Info("Client connected");
                    return(true);
                }
                else
                {
                    net.Overlord = new Node();
                }
            }
            catch
            {
                net.State = ConnectionState.Disconnected;
            }
            return(false);
        }
Ejemplo n.º 3
0
        private bool HandleConnect(NetworkRequest r, RequestEventArgs e)
        {
            string address = string.Empty;

            try
            {
                var iv = new ConnectVerb();
                iv.ProcessRequest(r);
                address = iv.Address;

                if (string.IsNullOrEmpty(iv.Secret))
                {
                    //Dont allow connections with no secret
                    return(false);
                }

                //Dont allow connections to ourselves..
                if (iv.Address == serverNode.Location)
                {
                    return(false);
                }

                //Only allow one connect attempt at once
                lock (sync)
                {
                    if (connectingIDs.Contains(address))
                    {
                        return(false);
                    }
                    connectingIDs.Add(address);
                }

                //Connect to the remote client
                var verb   = new InfoVerb();
                var client = new Client(serverNode);

                if (!client.Execute(verb, address))
                {
                    return(false);
                }
                //Connected ok
                var c = new ClientStream();
                c.OnDisconnect += c_OnDisconnect;
                Node n = verb.GetValidatedNode();
                if (null == n)
                {
                    return(false);
                }
                n.Location   = iv.Address;
                n.Online     = true;
                n.NodeType   = iv.ClientType;
                n.OverlordID = serverNode.ID;
                n.Secret     = iv.Secret;

                lock (sync)
                {
                    //Notify other clients
                    var update = new UpdateVerb();

                    //Was this person already connected?
                    ClientStream search = connectedClientNodes.Where(xn => xn.Node.ID == n.ID).FirstOrDefault();
                    if (null != search)
                    {
                        connectedClientNodes.Remove(search);
                        search.Kill();
                    }
                    c.Start(n, serverNode);
                    connectedClientNodes.Add(c);
                    update.Nodes.Add(n);
                    NetworkRequest req = update.CreateRequest();
                    req.SourceID   = serverNode.ID;
                    req.OverlordID = serverNode.ID;
                    req.AuthKey    = iv.Secret;

                    SendToStandardClients(req);
                    //Dont send overlord logs to other overlords
                    if (n.NodeType != ClientType.Overlord)
                    {
                        SendToOverlordClients(req);
                    }
                }
                //Find client servers
                ThreadPool.QueueUserWorkItem(ScanClientAsync, n);
                //return ok

                //Add headers
                var headers = e.Response.Headers as HeaderCollection;
                if (null != headers)
                {
                    headers.Add("FAP-AUTH", iv.Secret);
                    headers.Add("FAP-SOURCE", serverNode.ID);
                    headers.Add("FAP-OVERLORD", serverNode.ID);
                }

                SendResponse(e, null);

                //Send network info
                if (n.NodeType == ClientType.Overlord)
                {
                    var update = new UpdateVerb();
                    //Only send local nodes
                    foreach (
                        ClientStream peer in
                        connectedClientNodes.ToList().Where(x => x.Node.NodeType == ClientType.Client))
                    {
                        update.Nodes.Add(peer.Node);
                    }
                    NetworkRequest req = update.CreateRequest();
                    req.SourceID   = serverNode.ID;
                    req.OverlordID = serverNode.ID;
                    req.AuthKey    = iv.Secret;
                    c.AddMessage(req);
                }
                else
                {
                    var update = new UpdateVerb();
                    //None overlord client.  Send local nodes and external ones.
                    update.Nodes = GetBestKnownClientList();

                    NetworkRequest req = update.CreateRequest();
                    req.SourceID   = serverNode.ID;
                    req.OverlordID = serverNode.ID;
                    req.AuthKey    = iv.Secret;
                    c.AddMessage(req);
                }
                return(true);
            }
            catch
            {
            }
            finally
            {
                connectingIDs.Remove(address);
            }
            SendError(e);
            return(false);
        }