Esempio 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);
            }
        }
Esempio n. 2
0
 public FAPServerHandler(IPAddress host, int port, Model m, MulticastClientService c, LANPeerFinderService p,
                         MulticastServerService ms)
 {
     multicastServer     = ms;
     logger              = LogManager.GetLogger("faplog");
     peerFinder          = p;
     serverNode          = new Overlord();
     serverNode.Nickname = "Overlord";
     serverNode.Host     = host.ToString();
     serverNode.Port     = port;
     serverNode.Online   = true;
     serverNode.ID       = IDService.CreateID();
     model              = m;
     m.PropertyChanged += m_PropertyChanged;
     serverNode.GenerateStrength(m.OverlordPriority);
     network         = new Entities.Network();
     multicastClient = c;
     multicastClient.OnMultiCastRX += multicastClient_OnMultiCastRX;
 }
Esempio n. 3
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);
        }
Esempio n. 4
0
        private void ProcessLanConnection(object o)
        {
            mserver.SendMessage(WhoVerb.CreateRequest());
            Domain.Entities.Network network = model.Network;
            network.PropertyChanged += network_PropertyChanged;
            while (run)
            {
                if (network.State != ConnectionState.Connected)
                {
                    //Not connected so connect automatically..

                    //Regenerate local secret to stop any updates if we reconnecting..
                    network.Overlord        = new Node();
                    network.Overlord.Secret = IDService.CreateID();
                    //Clear old peers
                    network.Nodes.Clear();

                    //Build up a prioritised server list
                    var availibleNodes = new List <DetectedNode>();

                    List <DetectedNode> detectedPeers = peerFinder.Peers.ToList();

                    //Prioritise a server we havent connected to already
                    foreach (DetectedNode peer in detectedPeers)
                    {
                        if (attemptedPeers.Where(s => s.Node == peer).Count() == 0)
                        {
                            availibleNodes.Add(peer);
                        }
                    }
                    foreach (LanPeer peer in attemptedPeers.OrderByDescending(x => x.LastConnectionTime))
                    {
                        availibleNodes.Add(peer.Node);
                    }

                    while (network.State != ConnectionState.Connected && availibleNodes.Count > 0)
                    {
                        DetectedNode node = availibleNodes[0];
                        availibleNodes.RemoveAt(0);
                        if (!Connect(network, node))
                        {
                            peerFinder.RemovePeer(node);
                        }
                    }
                }
                if (network.State == ConnectionState.Connected)
                {
                    CheckModelChanges();
                    //Check for network timeout

                    if ((Environment.TickCount - model.Network.Overlord.LastUpdate) > Model.UPLINK_TIMEOUT)
                    {
                        //We havent recently sent/recieved so went a noop so check we are still connected.
                        var req = new NetworkRequest
                        {
                            Verb     = "NOOP",
                            SourceID = model.LocalNode.ID,
                            AuthKey  = model.Network.Overlord.Secret
                        };
                        var client = new Client(model.LocalNode);
                        if (!client.Execute(req, model.Network.Overlord, 4000))
                        {
                            if (network.State == ConnectionState.Connected)
                            {
                                Disconnect();
                            }
                        }
                    }

                    workerEvent.WaitOne(10000);
                }
                else
                {
                    workerEvent.WaitOne(100);
                }
            }
        }
Esempio n. 5
0
        public void CheckSetDefaults()
        {
            if (string.IsNullOrEmpty(LocalNode.ID))
            {
                LocalNode.ID = IDService.CreateID();
            }

            if (string.IsNullOrEmpty(LocalNode.Secret))
            {
                LocalNode.Secret = IDService.CreateID();
            }

            if (LocalNode.Port == 0)
            {
                LocalNode.Port = 30;
            }

            //If there is no avatar set then set the default
            if (string.IsNullOrEmpty(Avatar))
            {
                Stream stream =
                    Application.GetResourceStream(new Uri("Images/Default_Avatar.png", UriKind.Relative)).Stream;
                var img = new byte[stream.Length];
                stream.Read(img, 0, (int)stream.Length);
                Avatar = Convert.ToBase64String(img);
                Save();
            }
            //Set default nick
            if (string.IsNullOrEmpty(Nickname))
            {
                //Try to use the username
                string user = WindowsIdentity.GetCurrent().Name;
                if (!string.IsNullOrEmpty(user) && user.Contains('\\'))
                {
                    user = user.Substring(user.IndexOf('\\') + 1);
                }
                //If the username is a default one then use the PC name
                if (string.IsNullOrEmpty(user) ||
                    string.Equals(user, "Administrator", StringComparison.InvariantCultureIgnoreCase) ||
                    string.Equals(user, "Guest", StringComparison.InvariantCultureIgnoreCase))
                {
                    user = Dns.GetHostName();
                }
                Nickname = user;
            }

            //Set default limits
            if (MaxDownloads == 0)
            {
                MaxDownloads = 3;
            }
            if (MaxDownloadsPerUser == 0)
            {
                MaxDownloadsPerUser = 3;
            }
            if (MaxUploads == 0)
            {
                MaxUploads = 3;
            }
            if (MaxUploadsPerUser == 0)
            {
                MaxUploadsPerUser = 4;
            }

            //Set default download folder
            if (string.IsNullOrEmpty(DownloadFolder))
            {
                DownloadFolder = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) +
                                 "\\FAP Downloads";
            }

            if (!Directory.Exists(DownloadFolder))
            {
                Directory.CreateDirectory(DownloadFolder);
            }

            //Set incomplete download folder
            if (string.IsNullOrEmpty(IncompleteFolder) || !Directory.Exists(IncompleteFolder))
            {
                IncompleteFolder = DownloadFolder + "\\Incomplete";
            }

            if (!Directory.Exists(DownloadFolder))
            {
                Directory.CreateDirectory(DownloadFolder);
            }

            if (!Directory.Exists(IncompleteFolder))
            {
                Directory.CreateDirectory(IncompleteFolder);
            }
        }
Esempio n. 6
0
 public Share()
 {
     id = IDService.CreateID();
 }