private void OnMessageMyNick(ref MyNickMessage arg) { var ea = new TransferAuthorizationEventArgs { UserNickname = arg.Nickname }; OnAuthorization(ea); if (!ea.Allowed || string.IsNullOrEmpty(ea.OwnNickname)) { Logger.Info(RemoteAddress + " connection is not allowed"); Dispose(); return; } Source = new Source { UserNickname = arg.Nickname, HubAddress = ea.HubAddress }; if (FirstMessages == null) { using (var transaction = new SendTransaction(this)) { transaction.Send(new MyNickMessage { Nickname = ea.OwnNickname }.Raw); transaction.Send(new LockMessage().Raw); } } }
private void OnAuthorization(TransferAuthorizationEventArgs e) { var handler = Authorization; 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); } }