public void MakesUserOwner() { var repository = new InMemoryRepository(); var user = new ChatUser { Name = "foo" }; var user2 = new ChatUser { Name = "foo2" }; repository.Add(user); repository.Add(user2); var room = new ChatRoom { Name = "Room", Creator = user }; room.Owners.Add(user); user.OwnedRooms.Add(room); user.Rooms.Add(room); room.Users.Add(user); var service = new ChatService(repository); service.AddOwner(user, user2, room); Assert.True(room.Owners.Contains(user2)); Assert.True(user2.OwnedRooms.Contains(room)); }
public void ThrowsIfNameIsInValid() { var repository = new InMemoryRepository(); var service = new ChatService(new Mock<ICache>().Object, repository,new Mock<ICryptoService>().Object); Assert.Throws<InvalidOperationException>(() => service.AddUser("some in valid name", clientId: null, userAgent: null, password: null)); }
public void MakesOwnerAllowedIfRoomLocked() { var repository = new InMemoryRepository(); var user = new ChatUser { Name = "foo" }; var user2 = new ChatUser { Name = "foo2" }; repository.Add(user); repository.Add(user2); var room = new ChatRoom { Name = "Room", Creator = user, Private = true }; room.Owners.Add(user); user.OwnedRooms.Add(room); user.Rooms.Add(room); room.Users.Add(user); var service = new ChatService(repository, new Mock<ICryptoService>().Object); service.AddOwner(user, user2, room); Assert.True(user2.AllowedRooms.Contains(room)); Assert.True(room.AllowedUsers.Contains(user2)); Assert.True(room.Owners.Contains(user2)); Assert.True(user2.OwnedRooms.Contains(room)); }
public void ThrowsIfPasswordIsTooShort() { var repository = new InMemoryRepository(); var service = new ChatService(new Mock<ICache>().Object, repository,new Mock<ICryptoService>().Object); Assert.Throws<InvalidOperationException>(() => service.AddUser("SomeUser", clientId: null, userAgent: null, password: "******")); }
public void UnicodeNameIsValid() { // Fix issue #370 var repository = new InMemoryRepository(); var service = new ChatService(new Mock<ICache>().Object, repository,new Mock<ICryptoService>().Object); var user = service.AddUser("ТарасБуга", clientId: null, userAgent: null, password: "******"); Assert.Equal("ТарасБуга", user.Name); }
public void ThrowsIfNameInUse() { var repository = new InMemoryRepository(); repository.Add(new ChatUser() { Name = "taken" }); var service = new ChatService(new Mock<ICache>().Object, repository,new Mock<ICryptoService>().Object); Assert.Throws<InvalidOperationException>(() => service.AddUser("taken", clientId: null, userAgent: null, password: null)); }
public void AddsUserToRepository() { var crypto = new Mock<ICryptoService>(); crypto.Setup(c => c.CreateSalt()).Returns("salted"); var repository = new InMemoryRepository(); var service = new ChatService(new Mock<ICache>().Object, repository,crypto.Object); service.AddUser("SomeUser", clientId: null, userAgent: null, password: "******"); var user = repository.GetUserByName("SomeUser"); Assert.NotNull(user); Assert.Equal("SomeUser", user.Name); Assert.Equal("salted", user.Salt); Assert.Equal("8f5793009fe15c2227e3528d0507413a83dff10635d3a6acf1ba3229a03380d8", user.HashedPassword); }
public void ThrowsIfActingUserIsNotAdmin() { var repository = new InMemoryRepository(); var nonAdmin = new ChatUser { Name = "foo" }; var user = new ChatUser { Name = "foo2" }; repository.Add(nonAdmin); repository.Add(user); var service = new ChatService(new Mock<ICache>().Object, repository); Assert.Throws<HubException>(() => service.AddAdmin(nonAdmin, user)); }
public void ThrowsIfActingUserIsNotAdmin() { var repository = new InMemoryRepository(); var nonAdmin = new ChatUser { Name = "foo" }; var user = new ChatUser { Name = "foo2" }; repository.Add(nonAdmin); repository.Add(user); var service = new ChatService(repository, new Mock<ICryptoService>().Object); Assert.Throws<InvalidOperationException>(() => service.AddAdmin(nonAdmin, user)); }
public void MakesUserAdmin() { var repository = new InMemoryRepository(); var admin = new ChatUser { Name = "foo", IsAdmin = true }; var user = new ChatUser { Name = "foo2", IsAdmin = false }; repository.Add(admin); repository.Add(user); var service = new ChatService(new Mock<ICache>().Object, repository); service.AddAdmin(admin, user); Assert.True(user.IsAdmin); }
public void AddsNewMessageToRepository() { var repository = new InMemoryRepository(); var user = new ChatUser { Name = "foo" }; repository.Add(user); var room = new ChatRoom { Name = "Room" }; repository.Add(room); room.Users.Add(user); user.Rooms.Add(room); var service = new ChatService(repository); ChatMessage message = service.AddMessage(user, room, "Content"); Assert.NotNull(message); Assert.Same(message, room.Messages.First()); Assert.Equal("Content", message.Content); }
public void MarksUserAsOfflineIfNoMoreClients() { var repository = new InMemoryRepository(); var user = new ChatUser { Name = "foo", Status = (int)UserStatus.Inactive }; user.ConnectedClients.Add(new ChatClient { Id = "foo", User = user }); repository.Add(user); var service = new ChatService(repository); service.DisconnectClient("foo"); Assert.Equal(0, user.ConnectedClients.Count); Assert.Equal((int)UserStatus.Offline, user.Status); }
public void UpatesUserPassword() { var repository = new InMemoryRepository(); var user = new ChatUser { Name = "Test", HashedPassword = "******".ToSha256() }; repository.Add(user); var service = new ChatService(repository); service.ChangeUserPassword(user, "password", "password2"); Assert.Equal("password2".ToSha256(), user.HashedPassword); }
private static KernelBase SetupNinject(ApplicationSettings settings) { var kernel = new StandardKernel(new[] { new FactoryModule() }); kernel.Bind<JabbrContext>() .To<JabbrContext>(); kernel.Bind<IJabbrRepository>() .To<PersistedRepository>(); kernel.Bind<IChatService>() .To<ChatService>(); kernel.Bind<IDataProtection>() .To<JabbRDataProtection>(); kernel.Bind<IFormsAuthenticationProvider>() .To<JabbRFormsAuthenticationProvider>(); kernel.Bind<ILogger>() .To<RealtimeLogger>(); // We're doing this manually since we want the chat repository to be shared // between the chat service and the chat hub itself kernel.Bind<Chat>() .ToMethod(context => { var resourceProcessor = context.Kernel.Get<ContentProviderProcessor>(); var repository = context.Kernel.Get<IJabbrRepository>(); var cache = context.Kernel.Get<ICache>(); var service = new ChatService(cache, repository); return new Chat(resourceProcessor, service, repository, cache); }); kernel.Bind<ICryptoService>() .To<CryptoService>() .InSingletonScope(); kernel.Bind<IResourceProcessor>() .To<ResourceProcessor>() .InSingletonScope(); kernel.Bind<IApplicationSettings>() .ToConstant(settings); kernel.Bind<IJavaScriptMinifier>() .To<AjaxMinMinifier>() .InSingletonScope(); kernel.Bind<IMembershipService>() .To<MembershipService>(); kernel.Bind<IAuthenticationService>() .ToConstant(new AuthenticationService()); kernel.Bind<IAuthenticationCallbackProvider>() .To<JabbRAuthenticationCallbackProvider>(); kernel.Bind<ICache>() .To<DefaultCache>() .InSingletonScope(); kernel.Bind<IChatNotificationService>() .To<ChatNotificationService>(); if (String.IsNullOrEmpty(settings.VerificationKey) || String.IsNullOrEmpty(settings.EncryptionKey)) { kernel.Bind<IKeyProvider>() .ToConstant(new FileBasedKeyProvider()); } else { kernel.Bind<IKeyProvider>() .To<AppSettingKeyProvider>() .InSingletonScope(); } var serializer = new JsonNetSerializer(new JsonSerializerSettings() { DateFormatHandling = DateFormatHandling.IsoDateFormat }); kernel.Bind<IJsonSerializer>() .ToConstant(serializer); kernel.Bind<UploadCallbackHandler>() .ToSelf() .InSingletonScope(); kernel.Bind<UploadProcessor>() .ToSelf() .InSingletonScope(); kernel.Bind<ContentProviderProcessor>() .ToConstant(new ContentProviderProcessor(kernel)); return kernel; }
public void ThrowsIfUserIsAlreadyAnOwner() { var repository = new InMemoryRepository(); var user = new ChatUser { Name = "foo" }; repository.Add(user); var room = new ChatRoom { Name = "Room" }; room.Users.Add(user); room.Owners.Add(user); user.OwnedRooms.Add(room); user.Rooms.Add(room); var service = new ChatService(repository); Assert.Throws<InvalidOperationException>(() => service.AddOwner(user, user, room)); }
public void AddsUserToRoom() { var repository = new InMemoryRepository(); var user = new ChatUser { Name = "foo" }; repository.Add(user); var room = new ChatRoom { Name = "Room" }; var service = new ChatService(repository); service.JoinRoom(user, room); Assert.True(user.Rooms.Contains(room)); Assert.True(room.Users.Contains(user)); }
public void ThrowsIfUserPasswordDoesNotMatch() { var repository = new InMemoryRepository(); repository.Add(new ChatUser { Name = "foo", HashedPassword = "******".ToSha256() }); var service = new ChatService(repository); Assert.Throws<InvalidOperationException>(() => service.AuthenticateUser("SomeUser", "foo")); }
public void RemovesClientFromUserClientList() { var repository = new InMemoryRepository(); var user = new ChatUser { Name = "foo", Status = (int)UserStatus.Inactive }; user.ConnectedClients.Add(new ChatClient { Id = "foo", User = user }); user.ConnectedClients.Add(new ChatClient { Id = "bar", User = user }); repository.Add(user); var service = new ChatService(repository); service.DisconnectClient("foo"); Assert.Equal(1, user.ConnectedClients.Count); Assert.Equal("bar", user.ConnectedClients.First().Id); }
public void ReturnsNullIfNoUserForClientId() { var repository = new InMemoryRepository(); var service = new ChatService(repository); ChatUser user = service.DisconnectClient("foo"); Assert.Null(user); }
public void DoesNotThrowIfCreatorKicksOwner() { var repository = new InMemoryRepository(); var user = new ChatUser { Name = "foo" }; var user2 = new ChatUser { Name = "foo2" }; repository.Add(user); repository.Add(user2); var room = new ChatRoom { Name = "Room", Creator = user }; user.OwnedRooms.Add(room); room.Owners.Add(user); user2.OwnedRooms.Add(room); room.Owners.Add(user2); user.Rooms.Add(room); user2.Rooms.Add(room); room.Users.Add(user); room.Users.Add(user2); var service = new ChatService(repository); service.KickUser(user, user2, room); Assert.False(user2.Rooms.Contains(room)); Assert.False(room.Users.Contains(user2)); }
public void ThrowsIfUserPasswordNotSet() { var repository = new InMemoryRepository(); repository.Add(new ChatUser { Name = "foo" }); var service = new ChatService(repository); Assert.Throws<InvalidOperationException>(() => service.AuthenticateUser("SomeUser", null)); }
public void RemovesUserFromRoom() { var repository = new InMemoryRepository(); var user = new ChatUser { Name = "foo" }; repository.Add(user); var room = new ChatRoom { Name = "Room" }; room.Users.Add(user); user.Rooms.Add(room); var service = new ChatService(repository); service.LeaveRoom(user, room); Assert.False(user.Rooms.Contains(room)); Assert.False(room.Users.Contains(user)); }
public void ThrowsIfUserIsNotOwner() { var repository = new InMemoryRepository(); var user = new ChatUser { Name = "foo" }; var user2 = new ChatUser { Name = "foo2" }; repository.Add(user); repository.Add(user2); var room = new ChatRoom { Name = "Room", }; user.Rooms.Add(room); user2.Rooms.Add(room); room.Users.Add(user); room.Users.Add(user2); var service = new ChatService(repository); Assert.Throws<InvalidOperationException>(() => service.KickUser(user, user2, room)); }
public void ThrowsIfUserNameIsSame() { var repository = new InMemoryRepository(); var user = new ChatUser { Name = "Test" }; repository.Add(user); var service = new ChatService(repository); Assert.Throws<InvalidOperationException>(() => service.ChangeUserName(user, "Test")); }
public void UpdatesStatus() { var repository = new InMemoryRepository(); var user = new ChatUser { Name = "foo", Status = (int)UserStatus.Inactive }; repository.Add(user); var service = new ChatService(repository); service.UpdateActivity(user); Assert.Equal((int)UserStatus.Active, user.Status); }
public void UpdatesUserName() { var repository = new InMemoryRepository(); var user = new ChatUser { Name = "Test" }; repository.Add(user); var service = new ChatService(repository); service.ChangeUserName(user, "Test2"); Assert.Equal("Test2", user.Name); }
public void Configuration(IAppBuilder app) { // Perform the required migrations DoMigrations(); var kernel = new StandardKernel(new[] { new FactoryModule() }); kernel.Bind<JabbrContext>() .To<JabbrContext>(); kernel.Bind<IJabbrRepository>() .To<PersistedRepository>(); kernel.Bind<IChatService>() .To<ChatService>(); kernel.Bind<IAuthenticationTokenService>() .To<AuthenticationTokenService>(); // We're doing this manually since we want the chat repository to be shared // between the chat service and the chat hub itself kernel.Bind<Chat>() .ToMethod(context => { var resourceProcessor = context.Kernel.Get<IResourceProcessor>(); var repository = context.Kernel.Get<IJabbrRepository>(); var cache = context.Kernel.Get<ICache>(); var service = new ChatService(cache, repository); return new Chat(resourceProcessor, service, repository, cache); }); kernel.Bind<ICryptoService>() .To<CryptoService>() .InSingletonScope(); kernel.Bind<IResourceProcessor>() .To<ResourceProcessor>() .InSingletonScope(); kernel.Bind<IApplicationSettings>() .To<ApplicationSettings>() .InSingletonScope(); kernel.Bind<IJavaScriptMinifier>() .To<AjaxMinMinifier>() .InSingletonScope(); kernel.Bind<IMembershipService>() .To<MembershipService>(); kernel.Bind<IAuthenticationService>() .ToConstant(new AuthenticationService()); kernel.Bind<IAuthenticationCallbackProvider>() .To<JabbRAuthenticationCallbackProvider>(); kernel.Bind<ICache>() .To<DefaultCache>() .InSingletonScope(); try { if (app.IsRunningUnderSystemWeb()) { BindSystemWebDependencies(kernel); } } catch (Exception ex) { // If we were unable to load the system web specific dependencies don't cry about it ReportError(ex); } var serializer = new JsonNetSerializer(new JsonSerializerSettings { DateFormatHandling = DateFormatHandling.MicrosoftDateFormat }); kernel.Bind<IJsonSerializer>() .ToConstant(serializer); app.Use(typeof(DetectSchemeHandler)); var settings = kernel.Get<IApplicationSettings>(); if (settings.RequireHttps) { app.Use(typeof(RequireHttpsHandler)); } app.UseShowExceptions(); // This needs to run before everything app.Use(typeof(AuthorizationHandler), kernel.Get<IAuthenticationTokenService>()); SetupSignalR(kernel, app); SetupWebApi(kernel, app); SetupMiddleware(app); SetupNancy(kernel, app); SetupErrorHandling(); }
public void ThrowsIfNewPasswordIsNull() { var repository = new InMemoryRepository(); var user = new ChatUser { Name = "Test", HashedPassword = "******".ToSha256() }; repository.Add(user); var service = new ChatService(repository); Assert.Throws<InvalidOperationException>(() => service.ChangeUserPassword(user, "password", null)); }
public static void PreAppStart() { if (HostingEnvironment.InClientBuildManager) { // If we're in the VS app domain then do nothing return; } var kernel = new StandardKernel(); kernel.Bind<JabbrContext>() .To<JabbrContext>(); kernel.Bind<IJabbrRepository>() .To<PersistedRepository>(); kernel.Bind<IChatService>() .To<ChatService>(); kernel.Bind<Chat>() .ToMethod(context => { // We're doing this manually since we want the chat repository to be shared // between the chat service and the chat hub itself var settings = context.Kernel.Get<IApplicationSettings>(); var resourceProcessor = context.Kernel.Get<IResourceProcessor>(); var repository = context.Kernel.Get<IJabbrRepository>(); var cache = context.Kernel.Get<ICache>(); var crypto = context.Kernel.Get<ICryptoService>(); var service = new ChatService(cache, repository, crypto); return new Chat(settings, resourceProcessor, service, repository, cache); }); kernel.Bind<ICryptoService>() .To<CryptoService>() .InSingletonScope(); kernel.Bind<IResourceProcessor>() .To<ResourceProcessor>() .InSingletonScope(); kernel.Bind<IApplicationSettings>() .To<ApplicationSettings>() .InSingletonScope(); kernel.Bind<IVirtualPathUtility>() .To<VirtualPathUtilityWrapper>(); kernel.Bind<IJavaScriptMinifier>() .To<AjaxMinMinifier>() .InSingletonScope(); kernel.Bind<ICache>() .To<AspNetCache>() .InSingletonScope(); var serializer = new JsonNetSerializer(new JsonSerializerSettings { DateFormatHandling = DateFormatHandling.MicrosoftDateFormat }); kernel.Bind<IJsonSerializer>() .ToConstant(serializer); Kernel = kernel; var resolver = new NinjectDependencyResolver(kernel); var host = new Host(resolver); host.Configuration.KeepAlive = TimeSpan.FromSeconds(30); RouteTable.Routes.MapHubs(resolver); // Perform the required migrations DoMigrations(); // Start the sweeper var repositoryFactory = new Func<IJabbrRepository>(() => kernel.Get<IJabbrRepository>()); _timer = new Timer(_ => Sweep(repositoryFactory, resolver), null, _sweepInterval, _sweepInterval); SetupErrorHandling(); ClearConnectedClients(repositoryFactory()); SetupRoutes(kernel); SetupWebApi(kernel); }
public void ThrowsUserPasswordDoesNotMatchOldPassword() { var repository = new InMemoryRepository(); var user = new ChatUser { Name = "Test", HashedPassword = "******".ToSha256() }; repository.Add(user); var service = new ChatService(repository); Assert.Throws<InvalidOperationException>(() => service.ChangeUserPassword(user, "passwor", "foo")); }