private void OnTransferAuthorization(TransferManagerAuthorizationEventArgs e) { var handler = TransferAuthorization; if (handler != null) { handler(this, e); } }
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); } }