Ejemplo n.º 1
0
        private void OnTransferAuthorization(TransferManagerAuthorizationEventArgs e)
        {
            var handler = TransferAuthorization;

            if (handler != null)
            {
                handler(this, e);
            }
        }
Ejemplo n.º 2
0
        private void TransferAuthorizationHandler(object sender, TransferAuthorizationEventArgs e)
        {
            var transfer = (TransferConnection)sender;

            // NOTE: we should remember that active users don't have allow records
            // They will have an address of a hub in the Source property
            // defined in ConnectToMe command handle section

            List <TransferConnection> list;
            TransferRequest           req;
            Source source;

            lock (_synRoot)
            {
                var index = _allowedUsers.FindIndex(p => p.Nickname == e.UserNickname);

                if (index != -1)
                {
                    // passive user
                    req = _allowedUsers[index];
                    _allowedUsers.RemoveAt(index);
                }
                else
                {
                    // active user
                    if (!transfer.AllowedToConnect)
                    {
                        return;
                    }
                    req = TransferRequest.Empty;
                }

                source = new Source
                {
                    UserNickname = e.UserNickname,
                    HubAddress   = req.IsEmpty ? transfer.Source.HubAddress : req.Hub.RemoteAddressString
                };

                // find connections with the same user
                list = _connections.Where(transferConnection => transferConnection.Source == source).ToList();
            }

            // do not allow duplicate connections
            using (new PerfLimit("TransferManager disconnecting transfers"))
                foreach (var connection in list)
                {
                    connection.DisconnectAsync();
                    Logger.Info("Disconnecting old transfer {0}", source);
                }


            var ea = new TransferManagerAuthorizationEventArgs
            {
                Connection = (TransferConnection)sender,
                Nickname   = e.UserNickname
            };

            OnTransferAuthorization(ea);

            if (ea.Cancel)
            {
                Logger.Info("Transfer connection cancelled at top level {0}", e.UserNickname);
                return;
            }

            e.Allowed = true;

            lock (_synRoot)
            {
                if (req.IsEmpty)
                {
                    e.HubAddress = source.HubAddress;

                    HubConnection hub;

                    using (new PerfLimit("TransferManager Hub obtaining"))
                        hub = _engine.Hubs.FirstOrDefault(h => h.RemoteAddressString == e.HubAddress);

                    if (hub != null)
                    {
                        e.OwnNickname = hub.Settings.Nickname;
                    }
                    else
                    {
                        Logger.Error("Authorisation failed for {0}. There is no such hub: {1} ", e.UserNickname,
                                     e.HubAddress);
                        e.Allowed = false;
                    }
                }
                else
                {
                    e.OwnNickname = req.Hub.CurrentUser.Nickname;
                    e.HubAddress  = req.Hub.RemoteAddressString;
                }

                using (new PerfLimit("TransferManager SourceUpdate"))
                    _engine.SourceManager.UpdateRequests(source, -1);
            }
        }