Ejemplo n.º 1
0
        public void Configuration(IAppBuilder app)
        {
            //ConfigureAuth(app);
            var idProvider = new UserIdProvider();

            GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => idProvider);
        }
Ejemplo n.º 2
0
        public void Configuration(IAppBuilder app)
        {
            var idProvider = new UserIdProvider();

            GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => idProvider);
            app.MapSignalR();
        }
Ejemplo n.º 3
0
 public WorkoutController(IWorkoutService workoutService, ICommandInvoker commandInvoker, IViewFactory <int, WorkoutSummaryViewModel> viewFactory, IViewFactory <string, IList <Workout> > workoutViewFactory, UserIdProvider idProvider)
 {
     _workoutService     = workoutService;
     _commandInvoker     = commandInvoker;
     _viewFactory        = viewFactory;
     _workoutViewFactory = workoutViewFactory;
     _idProvider         = idProvider;
 }
        private Task ProcessRequestPostGroupRead(HostContext context, string groupsToken)
        {
            string connectionId = Transport.ConnectionId;

            // Get the user id from the request
            string userId = UserIdProvider.GetUserId(context.Request);

            IList <string> signals = GetSignals(userId, connectionId);
            IList <string> groups  = AppendGroupPrefixes(context, connectionId, groupsToken);

            Connection connection = CreateConnection(connectionId, signals, groups);

            Connection = connection;
            string groupName = PrefixHelper.GetPersistentConnectionGroupName(DefaultSignalRaw);

            Groups = new GroupManager(connection, groupName);

            // We handle /start requests after the PersistentConnection has been initialized,
            // because ProcessStartRequest calls OnConnected.
            if (IsStartRequest(context.Request) && !(Transport is WebSocketTransport))
            {
                return(ProcessStartRequest(context, connectionId));
            }

            Transport.Connected = () =>
            {
                return(TaskAsyncHelper.FromMethod(() => OnConnected(context.Request, connectionId).OrEmpty()));
            };

            Transport.Reconnected = () =>
            {
                return(TaskAsyncHelper.FromMethod(() => OnReconnected(context.Request, connectionId).OrEmpty()));
            };

            Transport.Received = data =>
            {
                Counters.ConnectionMessagesSentTotal.Increment();
                Counters.ConnectionMessagesSentPerSec.Increment();
                return(TaskAsyncHelper.FromMethod(() => OnReceived(context.Request, connectionId, data).OrEmpty()));
            };

            Transport.Disconnected = clean =>
            {
                return(TaskAsyncHelper.FromMethod(() => OnDisconnected(context.Request, connectionId, stopCalled: clean).OrEmpty()));
            };

            if (IsConnectRequest(context.Request) && (Transport is WebSocketTransport))
            {
                return(OnConnected(context.Request, connectionId).OrEmpty()
                       .Then(c => c.ConnectionsConnected.Increment(), Counters).Then(() => Transport.ProcessRequest(connection).OrEmpty()
                                                                                     .Catch(Trace, Counters.ErrorsAllTotal, Counters.ErrorsAllPerSec).Then(() => connection.Send(connectionId, "OK")
                                                                                                                                                           .Catch(Trace, Counters.ErrorsAllTotal, Counters.ErrorsAllPerSec))));
            }


            return(Transport.ProcessRequest(connection).OrEmpty()
                   .Catch(Trace, Counters.ErrorsAllTotal, Counters.ErrorsAllPerSec));
        }
Ejemplo n.º 5
0
        public void Configuration(IAppBuilder app)
        {
            this.ConfigureAuth(app, NinjectWebCommon.Kernel);

            var idProvider = new UserIdProvider();

            GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => idProvider);
            app.MapSignalR();
        }
Ejemplo n.º 6
0
        public IHttpActionResult CreateAd([FromBody] CreateAdBindingModel model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            if (!model.Categories.Any())
            {
                return(BadRequest("You must specify at least 1 category!"));
            }

            if (model.Categories.Count() > 3)
            {
                return(BadRequest("You cannot have more than 3 categories!"));
            }

            if (!Data.AdTypes.All().Any(ad => ad.Id == model.TypeId))
            {
                return(BadRequest("Type with the Id specified doesnt exist!"));
            }

            if (Data.Categories.All().Where(c => model.Categories.Contains(c.Id)).ToList().Count !=
                model.Categories.Count())
            {
                return(BadRequest("One or more of the specified category Id's doesnt belong to a category!"));
            }


            var uId = UserIdProvider.GetUserId();

            var add = new Ad
            {
                Name        = model.Name,
                Description = model.Description,
                TypeId      = model.TypeId,
                Status      = 0,
                PostedOn    = DateTime.Now,
                OwnerId     = uId,
                Price       = model.Price,
                Categories  = (Data.Categories.All().Where(c => model.Categories.Contains(c.Id)))
                              .ToList()
            };


            Data.Ads.Add(add);

            Data.SaveChanges();

            var result = Data.Ads.All().Where(d => d.Id == add.Id)
                         .Select(AdViewModel.Create)
                         .FirstOrDefault();

            return(Ok(result));
        }
Ejemplo n.º 7
0
        private IEnumerable <Claim> BuildClaims(HostContext context)
        {
            // Pass appname through jwt token to client, so that when client establishes connection with service, it will also create a corresponding AppName-connection
            yield return(new Claim(Constants.ClaimType.AppName, _appName));

            var user   = new Owin.OwinContext(context.Environment).Authentication?.User;
            var userId = UserIdProvider?.GetUserId(context.Request);

            var claims = ClaimsUtility.BuildJwtClaims(user, userId, null);

            foreach (var claim in claims)
            {
                yield return(claim);
            }
        }
        public void Return_CorrectUserId(string expected)
        {
            // Arrange
            var identity = new Mock <ClaimsIdentity>();

            identity.Setup(i => i.FindFirst(It.IsAny <string>()))
            .Returns(new Claim("sa", expected));
            var request = new Mock <IRequest>();

            request.SetupGet(r => r.User.Identity)
            .Returns(identity.Object);
            var sut = new UserIdProvider();

            // Act
            var actual = sut.GetUserId(request.Object);

            // Assert
            Assert.AreSame(expected, actual);
        }
Ejemplo n.º 9
0
        /// <inheritdoc/>
        public void ContextAddAuditChanges <TEntity>(EntityEntry <TEntity> entry, string metadata = null)
            where TEntity : class
        {
            var tableName  = GetTableName(typeof(TEntity));
            var primaryKey = (TKey)entry.CurrentValues[GetPrimaryKeyColumnName(typeof(TEntity))];
            var auditDate  = DateTimeOffset.Now;

            object userId = null;

            if (UserIdProvider.HasCurrentUser())
            {
                userId = UserIdProvider.GetCurrentUserId();
            }

            foreach (var changedProp in entry.CurrentValues.Properties)
            {
                var currentValue  = entry.CurrentValues[changedProp];
                var originalValue = entry.OriginalValues[changedProp];

                if (
                    (currentValue != null || originalValue != null) &&
                    (
                        (currentValue != null && originalValue == null) ||
                        (currentValue == null && originalValue != null) ||
                        !currentValue.Equals(originalValue)))
                {
                    dbSet.Add(new TAuditEntity
                    {
                        Table      = tableName,
                        TableId    = primaryKey,
                        Type       = AuditType.Audit,
                        UserId     = (TKey)userId,
                        ColumnName = changedProp.GetColumnName(),
                        From       = originalValue?.ToString(),
                        To         = currentValue?.ToString(),
                        DateAudit  = auditDate,
                        Metadata   = metadata,
                    });
                }
            }
        }
Ejemplo n.º 10
0
        public IHttpActionResult CloseAd(int id)
        {
            if (!Data.Ads.All().Any(a => a.Id == id))
            {
                return(BadRequest("No such ad!"));
            }

            if (Data.Ads.All().First(a => a.Id == id).OwnerId != UserIdProvider.GetUserId())
            {
                return(Unauthorized());
            }

            var ad = Data.Ads.All().First(a => a.Id == id);

            ad.Status = AdStatus.Closed;

            ad.ClosedOn = DateTime.Now;

            Data.SaveChanges();

            return(Ok());
        }
Ejemplo n.º 11
0
        /// <inheritdoc/>
        public void ContextAddLog <TEntity>(EntityEntry <TEntity> entry, string note, string metadata = null)
            where TEntity : class
        {
            var tableName  = GetTableName(typeof(TEntity));
            var primaryKey = (TKey)entry.CurrentValues[GetPrimaryKeyColumnName(typeof(TEntity))];

            object userId = null;

            if (UserIdProvider.HasCurrentUser())
            {
                userId = (TKey)UserIdProvider.GetCurrentUserId();
            }

            dbSet.Add(new TAuditEntity
            {
                Table     = tableName,
                TableId   = primaryKey,
                Type      = AuditType.Log,
                UserId    = (TKey)userId,
                Note      = note,
                DateAudit = DateTimeOffset.Now,
                Metadata  = metadata,
            });
        }
Ejemplo n.º 12
0
        /// <summary>
        /// Handles all requests for <see cref="PersistentConnection"/>s.
        /// </summary>
        /// <param name="context">The <see cref="HttpContext"/> for the current request.</param>
        /// <returns>A <see cref="Task"/> that completes when the <see cref="PersistentConnection"/> pipeline is complete.</returns>
        /// <exception cref="T:System.InvalidOperationException">
        /// Thrown if the transport wasn't specified.
        /// Thrown if the connection id wasn't specified.
        /// </exception>
        public virtual async Task ProcessRequestCore(HttpContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            if (IsNegotiationRequest(context.Request))
            {
                await ProcessNegotiationRequest(context).PreserveCulture();

                return;
            }
            else if (IsPingRequest(context.Request))
            {
                await ProcessPingRequest(context).PreserveCulture();

                return;
            }

            Transport = GetTransport(context);

            if (Transport == null)
            {
                await FailResponse(context.Response, String.Format(CultureInfo.CurrentCulture, Resources.Error_ProtocolErrorUnknownTransport)).PreserveCulture();

                return;
            }

            string connectionToken = context.Request.Query["connectionToken"];

            // If there's no connection id then this is a bad request
            if (String.IsNullOrEmpty(connectionToken))
            {
                await FailResponse(context.Response, String.Format(CultureInfo.CurrentCulture, Resources.Error_ProtocolErrorMissingConnectionToken)).PreserveCulture();

                return;
            }

            string connectionId;
            string message;
            int    statusCode;

            if (!TryGetConnectionId(context, connectionToken, out connectionId, out message, out statusCode))
            {
                await FailResponse(context.Response, message, statusCode).PreserveCulture();

                return;
            }

            // Set the transport's connection id to the unprotected one
            Transport.ConnectionId = connectionId;

            // Get the user id from the request
            string userId = UserIdProvider.GetUserId(context.Request);

            // Get the groups oken from the request
            string groupsToken = await Transport.GetGroupsToken().PreserveCulture();

            IList <string> signals = GetSignals(userId, connectionId);
            IList <string> groups  = AppendGroupPrefixes(context, connectionId, groupsToken);

            Connection connection = CreateConnection(connectionId, signals, groups);

            Connection = connection;
            string groupName = PrefixHelper.GetPersistentConnectionGroupName(DefaultSignalRaw);

            Groups = new GroupManager(connection, groupName);

            // We handle /start requests after the PersistentConnection has been initialized,
            // because ProcessStartRequest calls OnConnected.
            if (IsStartRequest(context.Request))
            {
                await ProcessStartRequest(context, connectionId).PreserveCulture();

                return;
            }

            Transport.Connected = () =>
            {
                return(TaskAsyncHelper.FromMethod(() => OnConnected(context.Request, connectionId).OrEmpty()));
            };

            Transport.Reconnected = () =>
            {
                return(TaskAsyncHelper.FromMethod(() => OnReconnected(context.Request, connectionId).OrEmpty()));
            };

            Transport.Received = data =>
            {
                Counters.ConnectionMessagesSentTotal.Increment();
                Counters.ConnectionMessagesSentPerSec.Increment();
                return(TaskAsyncHelper.FromMethod(() => OnReceived(context.Request, connectionId, data).OrEmpty()));
            };

            Transport.Disconnected = async clean =>
            {
                await OnDisconnected(context.Request, connectionId, stopCalled : clean).OrEmpty().PreserveCulture();

                if (clean)
                {
                    // Only call the old OnDisconnected method for disconnects we know
                    // have *not* been caused by clients switching servers.
                    await OnDisconnected(context.Request, connectionId).OrEmpty().PreserveCulture();
                }
            };

            await Transport.ProcessRequest(connection).OrEmpty().Catch(Counters.ErrorsAllTotal, Counters.ErrorsAllPerSec).PreserveCulture();
        }
Ejemplo n.º 13
0
        /// <summary>
        /// Handles all requests for <see cref="PersistentConnection"/>s.
        /// </summary>
        /// <param name="context">The <see cref="HostContext"/> for the current request.</param>
        /// <returns>A <see cref="Task"/> that completes when the <see cref="PersistentConnection"/> pipeline is complete.</returns>
        /// <exception cref="T:System.InvalidOperationException">
        /// Thrown if connection wasn't initialized.
        /// Thrown if the transport wasn't specified.
        /// Thrown if the connection id wasn't specified.
        /// </exception>
        public virtual Task ProcessRequest(HostContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            if (!_initialized)
            {
                throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, Resources.Error_ConnectionNotInitialized));
            }

            if (IsNegotiationRequest(context.Request))
            {
                return(ProcessNegotiationRequest(context));
            }
            else if (IsPingRequest(context.Request))
            {
                return(ProcessPingRequest(context));
            }

            Transport = GetTransport(context);

            if (Transport == null)
            {
                return(FailResponse(context.Response, String.Format(CultureInfo.CurrentCulture, Resources.Error_ProtocolErrorUnknownTransport)));
            }

            string connectionToken = context.Request.QueryString["connectionToken"];

            // If there's no connection id then this is a bad request
            if (String.IsNullOrEmpty(connectionToken))
            {
                return(FailResponse(context.Response, String.Format(CultureInfo.CurrentCulture, Resources.Error_ProtocolErrorMissingConnectionToken)));
            }

            string connectionId;
            string message;
            int    statusCode;

            if (!TryGetConnectionId(context, connectionToken, out connectionId, out message, out statusCode))
            {
                return(FailResponse(context.Response, message, statusCode));
            }

            // Set the transport's connection id to the unprotected one
            Transport.ConnectionId = connectionId;

            // Get the user id from the request
            string userId = UserIdProvider.GetUserId(context.Request);

            IList <string> signals = GetSignals(userId, connectionId);
            IList <string> groups  = AppendGroupPrefixes(context, connectionId);

            Connection connection = CreateConnection(connectionId, signals, groups);

            Connection = connection;
            string groupName = PrefixHelper.GetPersistentConnectionGroupName(DefaultSignalRaw);

            Groups = new GroupManager(connection, groupName);

            Transport.TransportConnected = () =>
            {
                var command = new ServerCommand
                {
                    ServerCommandType = ServerCommandType.RemoveConnection,
                    Value             = connectionId
                };

                return(_serverMessageHandler.SendCommand(command));
            };

            Transport.Connected = () =>
            {
                return(TaskAsyncHelper.FromMethod(() => OnConnected(context.Request, connectionId).OrEmpty()));
            };

            Transport.Reconnected = () =>
            {
                return(TaskAsyncHelper.FromMethod(() => OnReconnected(context.Request, connectionId).OrEmpty()));
            };

            Transport.Received = data =>
            {
                Counters.ConnectionMessagesSentTotal.Increment();
                Counters.ConnectionMessagesSentPerSec.Increment();
                return(TaskAsyncHelper.FromMethod(() => OnReceived(context.Request, connectionId, data).OrEmpty()));
            };

            Transport.Disconnected = () =>
            {
                return(TaskAsyncHelper.FromMethod(() => OnDisconnected(context.Request, connectionId).OrEmpty()));
            };

            return(Transport.ProcessRequest(connection).OrEmpty().Catch(Counters.ErrorsAllTotal, Counters.ErrorsAllPerSec));
        }
Ejemplo n.º 14
0
 public void Setup()
 {
     UserId = UserIdProvider.GetAuthenticatedUserId(HttpContext);
 }