예제 #1
0
        public FolderPathHelperTests()
        {
            var settings = new RoadieSettings();
            IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();

            configurationBuilder.AddJsonFile("appsettings.test.json");
            IConfiguration configuration = configurationBuilder.Build();

            configuration.GetSection("RoadieSettings").Bind(settings);
            this.Configuration = settings;
        }
        public ArtistLookupEngineTests()
        {
            this.MessageLogger           = new EventMessageLogger();
            this.MessageLogger.Messages += MessageLogger_Messages;

            var settings = new RoadieSettings();
            IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();

            configurationBuilder.AddJsonFile("appsettings.test.json");
            IConfiguration configuration = configurationBuilder.Build();

            configuration.GetSection("RoadieSettings").Bind(settings);
            this.Configuration = settings;
            this.CacheManager  = new DictionaryCacheManager(this.Logger, new CachePolicy(TimeSpan.FromHours(4)));
            this.HttpEncoder   = new Encoding.DummyHttpEncoder();
        }
예제 #3
0
        public ID3TagsHelperTests()
        {
            this.MessageLogger           = new EventMessageLogger();
            this.MessageLogger.Messages += MessageLogger_Messages;

            var settings = new RoadieSettings();
            IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();

            configurationBuilder.AddJsonFile("appsettings.test.json");
            IConfiguration configuration = configurationBuilder.Build();

            configuration.GetSection("RoadieSettings").Bind(settings);
            settings.ConnectionString = configuration.GetConnectionString("RoadieDatabaseConnection");
            this.Configuration        = settings;
            this.CacheManager         = new DictionaryCacheManager(this.Logger, new CachePolicy(TimeSpan.FromHours(4)));
            this.TagsHelper           = new ID3TagsHelper(this.Configuration, this.CacheManager, this.Logger);
        }
예제 #4
0
        public Inspector()
        {
            Console.WriteLine("Roadie Media Inspector");

            MessageLogger           = new EventMessageLogger();
            MessageLogger.Messages += MessageLogger_Messages;

            var settings = new RoadieSettings();
            IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();

            configurationBuilder.AddJsonFile("appsettings.json", false);
            IConfiguration configuration = configurationBuilder.Build();

            configuration.GetSection("RoadieSettings").Bind(settings);
            settings.ConnectionString = configuration.GetConnectionString("RoadieDatabaseConnection");
            Configuration             = settings;
            CacheManager = new DictionaryCacheManager(Logger, new CachePolicy(TimeSpan.FromHours(4)));
            TagsHelper   = new ID3TagsHelper(Configuration, CacheManager, Logger);
        }
예제 #5
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            var settings = new RoadieSettings();

            _configuration.GetSection("RoadieSettings").Bind(settings);

            services.AddSingleton <ITokenService, TokenService>();
            services.AddSingleton <IHttpEncoder, HttpEncoder>();
            services.AddSingleton <IEmailSender, EmailSenderService>();

            services.AddSingleton <ICacheManager>(options =>
            {
                var logger = options.GetService <ILogger <MemoryCacheManager> >();
                return(new MemoryCacheManager(logger, new CachePolicy(TimeSpan.FromHours(4))));
            });

            var dbFolder = new DirectoryInfo(settings.FileDatabaseOptions.DatabaseFolder);

            switch (settings.DbContextToUse)
            {
            case DbContexts.MySQL:
                services.AddDbContextPool <ApplicationUserDbContext>(
                    options => options.UseMySql(_configuration.GetConnectionString("RoadieDatabaseConnection"),
                                                mySqlOptions =>
                {
                    mySqlOptions.EnableRetryOnFailure(
                        10,
                        TimeSpan.FromSeconds(30),
                        null);
                }
                                                ));
                services.AddDbContextPool <IRoadieDbContext, MySQLRoadieDbContext>(
                    options => options.UseMySql(_configuration.GetConnectionString("RoadieDatabaseConnection"),
                                                mySqlOptions =>
                {
                    mySqlOptions.EnableRetryOnFailure(
                        10,
                        TimeSpan.FromSeconds(30),
                        null);
                }
                                                ));
                break;

            case DbContexts.SQLite:
                if (!dbFolder.Exists)
                {
                    dbFolder.Create();
                }
                var builder = new SqliteConnectionStringBuilder()
                {
                    DataSource = Path.Combine(settings.FileDatabaseOptions.DatabaseFolder, $"{ settings.FileDatabaseOptions.DatabaseName }.db"),
                    Mode       = SqliteOpenMode.ReadWriteCreate,
                    Cache      = SqliteCacheMode.Shared
                };
                services.AddDbContext <ApplicationUserDbContext>(
                    options => options.UseSqlite(builder.ConnectionString)
                    );
                services.AddDbContext <IRoadieDbContext, SQLiteRoadieDbContext>(
                    options => options.UseSqlite(builder.ConnectionString)
                    );
                break;

            case DbContexts.File:
                if (!dbFolder.Exists)
                {
                    dbFolder.Create();
                }
                services.AddDbContext <ApplicationUserDbContext>(
                    options => options.UseFileContextDatabase(settings.FileDatabaseOptions.DatabaseFormat.ToString().ToLower(),
                                                              databaseName: settings.FileDatabaseOptions.DatabaseName,
                                                              location: settings.FileDatabaseOptions.DatabaseFolder)
                    );
                services.AddDbContext <IRoadieDbContext, FileRoadieDbContext>(
                    options => options.UseFileContextDatabase(settings.FileDatabaseOptions.DatabaseFormat.ToString().ToLower(),
                                                              databaseName: settings.FileDatabaseOptions.DatabaseName,
                                                              location: settings.FileDatabaseOptions.DatabaseFolder)
                    );
                break;

            default:
                throw new NotImplementedException("Unknown DbContext Type");
            }

            services.AddIdentity <User, UserRole>()
            .AddRoles <UserRole>()
            .AddEntityFrameworkStores <ApplicationUserDbContext>()
            .AddDefaultTokenProviders();

            services.AddAuthorization(options =>
            {
                options.AddPolicy("Admin", policy => policy.RequireRole("Admin"));
                options.AddPolicy("Editor", policy => policy.RequireRole("Admin", "Editor"));
            });

            services.Configure <IConfiguration>(_configuration);
            var corsOrigins = (_configuration["CORSOrigins"] ?? "http://localhost:8080").Split('|');

            Trace.WriteLine($"Setting Up CORS Policy [{string.Join(", ", corsOrigins)}]");

            services.AddCors(options => options.AddPolicy("CORSPolicy", builder =>
            {
                builder
                .WithOrigins(corsOrigins)
                .AllowAnyHeader()
                .AllowAnyMethod()
                .AllowCredentials();
            }));

            services.AddSingleton <IRoadieSettings, RoadieSettings>(ctx =>
            {
                var settings      = new RoadieSettings();
                var configuration = ctx.GetService <IConfiguration>();
                configuration.GetSection("RoadieSettings").Bind(settings);
                var hostingEnvironment    = ctx.GetService <IWebHostEnvironment>();
                settings.ContentPath      = hostingEnvironment.WebRootPath;
                settings.ConnectionString = _configuration.GetConnectionString("RoadieDatabaseConnection");

                // This is so 'User Secrets' can be used in Debugging
                var integrationKeys = _configuration.GetSection("IntegrationKeys").Get <IntegrationKey>();
                if (integrationKeys != null)
                {
                    settings.Integrations.ApiKeys = new List <ApiKey>
                    {
                        new ApiKey
                        {
                            ApiName   = "LastFMApiKey",
                            Key       = integrationKeys.LastFMApiKey,
                            KeySecret = integrationKeys.LastFMSecret
                        },
                        new ApiKey
                        {
                            ApiName   = "DiscogsConsumerKey",
                            Key       = integrationKeys.DiscogsConsumerKey,
                            KeySecret = integrationKeys.DiscogsConsumerSecret
                        },
                        new ApiKey
                        {
                            ApiName = "BingImageSearch",
                            Key     = integrationKeys.BingImageSearch
                        }
                    }
                }
                ;
                return(settings);
            });

            services.AddSingleton <IActionContextAccessor, ActionContextAccessor>();
            services.AddSingleton <IDefaultNotFoundImages, DefaultNotFoundImages>();
            services.AddSingleton <IImageSearchManager, ImageSearchManager>();
            services.AddSingleton <IITunesSearchEngine, ITunesSearchEngine>();
            services.AddSingleton <IBingImageSearchEngine, BingImageSearchEngine>();
            services.AddSingleton <IMusicBrainzProvider, MusicBrainzProvider>();
            services.AddSingleton <ISpotifyHelper, SpotifyHelper>();
            services.AddSingleton <IDiscogsHelper, DiscogsHelper>();
            services.AddSingleton <IWikipediaHelper, WikipediaHelper>();
            services.AddSingleton <IFileNameHelper, FileNameHelper>();
            services.AddSingleton <IID3TagsHelper, ID3TagsHelper>();

            services.AddScoped <ILastFmHelper, LastFmHelper>();
            services.AddScoped <IRoadieScrobbler, RoadieScrobbler>();
            services.AddScoped <ILastFMScrobbler, LastFMScrobbler>();
            services.AddScoped <IStatisticsService, StatisticsService>();
            services.AddScoped <ICollectionService, CollectionService>();
            services.AddScoped <IPlaylistService, PlaylistService>();
            services.AddScoped <IBookmarkService, BookmarkService>();
            services.AddScoped <IArtistLookupEngine, ArtistLookupEngine>();
            services.AddScoped <IReleaseLookupEngine, ReleaseLookupEngine>();
            services.AddScoped <ILabelLookupEngine, LabelLookupEngine>();
            services.AddScoped <IAudioMetaDataHelper, AudioMetaDataHelper>();
            services.AddScoped <IFileProcessor, FileProcessor>();
            services.AddScoped <IFileDirectoryProcessorService, FileDirectoryProcessorService>();
            services.AddScoped <IArtistService, ArtistService>();
            services.AddScoped <IImageService, ImageService>();
            services.AddScoped <IReleaseService, ReleaseService>();
            services.AddScoped <ITrackService, TrackService>();
            services.AddScoped <ILabelService, LabelService>();
            services.AddScoped <IPlaylistService, PlaylistService>();
            services.AddScoped <IPlayActivityService, PlayActivityService>();
            services.AddScoped <IScrobbleHandler, ScrobbleHandler>();
            services.AddScoped <IGenreService, GenreService>();
            services.AddScoped <ISubsonicService, SubsonicService>();
            services.AddScoped <IUserService, UserService>();
            services.AddScoped <IAdminService, AdminService>();
            services.AddScoped <ILookupService, LookupService>();
            services.AddScoped <ICommentService, CommentService>();

            services.AddSingleton <Microsoft.Extensions.Hosting.IHostedService, DlnaHostService>();

            var securityKey = new SymmetricSecurityKey(Encoding.Default.GetBytes(_configuration["Tokens:PrivateKey"]));

            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme    = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(config =>
            {
                config.RequireHttpsMetadata      = false;
                config.SaveToken                 = true;
                config.TokenValidationParameters = new TokenValidationParameters
                {
                    IssuerSigningKey = securityKey,

                    ValidateAudience         = true,
                    ValidAudience            = _configuration["Tokens:Audience"],
                    ValidateIssuer           = true,
                    ValidIssuer              = _configuration["Tokens:Issuer"],
                    ValidateLifetime         = true,
                    ValidateIssuerSigningKey = true
                };
            });

            //services.AddSwaggerGen(c =>
            //{
            //    c.SwaggerDoc("v1", new Info
            //    {
            //        Title = "Roadie API",
            //        Version = "v1"
            //    });
            //});

            services.AddSignalR();

            services.AddMvc(options =>
            {
                options.RespectBrowserAcceptHeader = true;     // false by default
                options.ModelBinderProviders.Insert(0, new SubsonicRequestBinderProvider());
            })
            .AddNewtonsoftJson(options =>
            {
                options.SerializerSettings.NullValueHandling     = NullValueHandling.Ignore;
                options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            })
            .AddXmlSerializerFormatters();

            services.Configure <IdentityOptions>(options =>
            {
                options.Password.RequireDigit           = true;
                options.Password.RequireLowercase       = true;
                options.Password.RequireNonAlphanumeric = true;
                options.Password.RequireUppercase       = true;
                options.Password.RequiredLength         = 6;
                options.Password.RequiredUniqueChars    = 1;
            });

            services.AddHttpContextAccessor();
            services.AddScoped <IHttpContext>(factory =>
            {
                var actionContext = factory.GetService <IActionContextAccessor>().ActionContext;
                if (actionContext == null)
                {
                    return(null);
                }
                return(new HttpContext(factory.GetService <IRoadieSettings>(), new UrlHelper(actionContext)));
            });

            var sp           = services.BuildServiceProvider();
            var adminService = sp.GetService <IAdminService>();

            adminService.PerformStartUpTasks();
        }
예제 #6
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton <ITokenService, TokenService>();
            services.AddSingleton <IHttpEncoder, HttpEncoder>();
            services.AddSingleton <IEmailSender, EmailSenderService>();

            var cacheManager = new DictionaryCacheManager(this._loggerFactory.CreateLogger <DictionaryCacheManager>(), new CachePolicy(TimeSpan.FromHours(4)));

            services.AddSingleton <ICacheManager>(cacheManager);

            services.AddDbContextPool <ApplicationUserDbContext>(
                options => options.UseMySql(this._configuration.GetConnectionString("RoadieDatabaseConnection"),
                                            mySqlOptions =>
            {
                mySqlOptions.ServerVersion(new Version(5, 5), Pomelo.EntityFrameworkCore.MySql.Infrastructure.ServerType.MariaDb);
                mySqlOptions.EnableRetryOnFailure(
                    maxRetryCount: 10,
                    maxRetryDelay: TimeSpan.FromSeconds(30),
                    errorNumbersToAdd: null);
            }
                                            ));

            services.AddDbContextPool <IRoadieDbContext, RoadieDbContext>(
                options => options.UseMySql(this._configuration.GetConnectionString("RoadieDatabaseConnection"),
                                            mySqlOptions =>
            {
                mySqlOptions.ServerVersion(new Version(5, 5), Pomelo.EntityFrameworkCore.MySql.Infrastructure.ServerType.MariaDb);
                mySqlOptions.EnableRetryOnFailure(
                    maxRetryCount: 10,
                    maxRetryDelay: TimeSpan.FromSeconds(30),
                    errorNumbersToAdd: null);
            }
                                            ));

            services.AddIdentity <ApplicationUser, ApplicationRole>()
            .AddRoles <ApplicationRole>()
            .AddEntityFrameworkStores <ApplicationUserDbContext>()
            .AddDefaultTokenProviders();

            services.AddAuthorization(options =>
            {
                options.AddPolicy("Admin", policy => policy.RequireRole("Admin"));
                options.AddPolicy("Editor", policy => policy.RequireRole("Admin", "Editor"));
            });

            services.Configure <IConfiguration>(this._configuration);
            var corsOrigins = (this._configuration["CORSOrigins"] ?? "http://localhost:8080").Split('|');

            this.Logger.LogDebug("Setting Up CORS Policy [{0}]", string.Join(", ", corsOrigins));

            services.AddCors(options => options.AddPolicy("CORSPolicy", builder =>
            {
                builder
                .WithOrigins(corsOrigins)
                .AllowAnyHeader()
                .AllowAnyMethod()
                .AllowCredentials();
            }));

            services.AddSingleton <IRoadieSettings, RoadieSettings>(ctx =>
            {
                var settings      = new RoadieSettings();
                var configuration = ctx.GetService <IConfiguration>();
                configuration.GetSection("RoadieSettings").Bind(settings);
                var hostingEnvironment    = ctx.GetService <IHostingEnvironment>();
                settings.ContentPath      = hostingEnvironment.WebRootPath;
                settings.ConnectionString = this._configuration.GetConnectionString("RoadieDatabaseConnection");

                // This is so 'User Secrets' can be used in Debugging
                var integrationKeys = this._configuration.GetSection("IntegrationKeys")
                                      .Get <IntegrationKey>();
                if (integrationKeys != null)
                {
                    settings.Integrations.ApiKeys = new System.Collections.Generic.List <ApiKey>
                    {
                        new ApiKey
                        {
                            ApiName   = "LastFMApiKey",
                            Key       = integrationKeys.LastFMApiKey,
                            KeySecret = integrationKeys.LastFMSecret
                        },
                        new ApiKey
                        {
                            ApiName   = "DiscogsConsumerKey",
                            Key       = integrationKeys.DiscogsConsumerKey,
                            KeySecret = integrationKeys.DiscogsConsumerSecret
                        },
                        new ApiKey
                        {
                            ApiName = "BingImageSearch",
                            Key     = integrationKeys.BingImageSearch
                        }
                    };
                }
                return(settings);
            });
            services.AddSingleton <IActionContextAccessor, ActionContextAccessor>();
            services.AddSingleton <IDefaultNotFoundImages, DefaultNotFoundImages>();
            services.AddScoped <IStatisticsService, StatisticsService>();
            services.AddScoped <ICollectionService, CollectionService>();
            services.AddScoped <IPlaylistService, PlaylistService>();
            services.AddScoped <IBookmarkService, BookmarkService>();
            services.AddScoped <IArtistService, ArtistService>();
            services.AddScoped <IImageService, ImageService>();
            services.AddScoped <IReleaseService, ReleaseService>();
            services.AddScoped <ITrackService, TrackService>();
            services.AddScoped <ILabelService, LabelService>();
            services.AddScoped <IPlaylistService, PlaylistService>();
            services.AddScoped <IPlayActivityService, PlayActivityService>();
            services.AddScoped <IGenreService, GenreService>();
            services.AddScoped <ISubsonicService, SubsonicService>();
            services.AddScoped <IUserService, UserService>();
            services.AddScoped <IAdminService, AdminService>();
            services.AddScoped <ILookupService, LookupService>();

            var securityKey = new SymmetricSecurityKey(System.Text.Encoding.Default.GetBytes(this._configuration["Tokens:PrivateKey"]));

            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme    = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(config =>
            {
                config.RequireHttpsMetadata      = false;
                config.SaveToken                 = true;
                config.TokenValidationParameters = new TokenValidationParameters()
                {
                    IssuerSigningKey = securityKey,

                    ValidateAudience         = true,
                    ValidAudience            = this._configuration["Tokens:Audience"],
                    ValidateIssuer           = true,
                    ValidIssuer              = this._configuration["Tokens:Issuer"],
                    ValidateLifetime         = true,
                    ValidateIssuerSigningKey = true
                };
            });

            //services.AddSwaggerGen(c =>
            //{
            //    c.SwaggerDoc("v1", new Info
            //    {
            //        Title = "Roadie API",
            //        Version = "v1"
            //    });
            //});

            services.AddSignalR();

            services.AddMvc(options =>
            {
                options.RespectBrowserAcceptHeader = true; // false by default
                options.ModelBinderProviders.Insert(0, new SubsonicRequestBinderProvider());
            })
            .AddJsonOptions(options =>
            {
                options.SerializerSettings.NullValueHandling     = NullValueHandling.Ignore;
                options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            })
            .AddXmlSerializerFormatters()
            .SetCompatibilityVersion(CompatibilityVersion.Latest);

            services.Configure <IdentityOptions>(options =>
            {
                options.Password.RequireDigit           = true;
                options.Password.RequireLowercase       = true;
                options.Password.RequireNonAlphanumeric = true;
                options.Password.RequireUppercase       = true;
                options.Password.RequiredLength         = 6;
                options.Password.RequiredUniqueChars    = 1;
            });

            services.AddHttpContextAccessor();
            services.AddScoped <IHttpContext>(factory =>
            {
                var actionContext = factory.GetService <IActionContextAccessor>()
                                    .ActionContext;

                return(new HttpContext(factory.GetService <IRoadieSettings>(), new UrlHelper(actionContext)));
            });
        }