using Microsoft.AspNetCore.Authentication.Cookies; using BoredCareers.Controllers.Payment; using BoredCareers.Services; using BoredCareers.Services.DatabaseService; using System.Threading.RateLimiting; using Stripe; using System.Security.Claims; var builder = WebApplication.CreateBuilder(args); // Disable null warnings becuse string.IsNullOrEmpty checks for NULL or Empty #pragma warning disable CS8600 #pragma warning disable CS8604 //////////////////////////////// /////// Database Service /////// //////////////////////////////// // Address string? _dbserver = Environment.GetEnvironmentVariable("MySQLServer"); string dbserver = !string.IsNullOrEmpty(_dbserver) ? _dbserver : "localhost"; // Database string? _dbdatabase = Environment.GetEnvironmentVariable("MySQLDatabase"); string dbdatabase = !string.IsNullOrEmpty(_dbdatabase) ? _dbdatabase : "boredcareers"; // UserName string? _dbuser = Environment.GetEnvironmentVariable("MySQLUser"); string dbUser = !string.IsNullOrEmpty(_dbuser) ? _dbuser : "root"; // Password string? _dbpass = Environment.GetEnvironmentVariable("MySQLPass"); string dbPass = !string.IsNullOrEmpty(_dbpass) ? _dbpass : "oasv34$8gpv023dd"; // Create the database serivice DatabaseService databaseService = new DatabaseService(connectionString: "server=" + dbserver + ";user=" + dbUser + ";database=" + dbdatabase + ";password=" + dbPass + ";port=3306;"); builder.Services.Add( new ServiceDescriptor( typeof( DatabaseService ), databaseService ) ); //////////////////////////////// ///////// Email Service //////// //////////////////////////////// // Address string? _eServer = Environment.GetEnvironmentVariable("EmailServer"); string EmailServer = !string.IsNullOrEmpty(_eServer) ? _eServer : "mail.mistox.com"; // Port string? _ePort = Environment.GetEnvironmentVariable("EmailPort"); int EmailPort = !string.IsNullOrEmpty(_ePort) ? Convert.ToInt32(_ePort) : 587; // User string? _eAddress = Environment.GetEnvironmentVariable("EmailAddress"); string EmailAddress = !string.IsNullOrEmpty(_eAddress) ? _eAddress : "no-reply@mistox.com"; // Password string? _ePassword = Environment.GetEnvironmentVariable("EmailPassword"); string EmailPassword = !string.IsNullOrEmpty(_ePassword) ? _ePassword : ""; // Create the email service EmailService Emailservice = new EmailService( EmailServer, EmailPort, EmailAddress, EmailPassword ); builder.Services.Add( new ServiceDescriptor( typeof( EmailService ), Emailservice )); //////////////////////////////// /////// Payment Service //////// //////////////////////////////// // Payment service name -> must be name of PaymentType enum string? PaymentService = Environment.GetEnvironmentVariable("PaymentService"); IPayment._PaymentType = (PaymentType)Enum.Parse(typeof(PaymentType), PaymentService, true); if (IPayment._PaymentType == PaymentType.StripeIntent) { // Get PublicKey string? StripePublicKey = Environment.GetEnvironmentVariable("StripePublicKey"); IPayment._PublicKey = string.IsNullOrEmpty(StripePublicKey) ? "" : StripePublicKey; // Get PrivateKey string? StripeAPIKey = Environment.GetEnvironmentVariable("StripeApiKey"); StripeConfiguration.ApiKey = StripeAPIKey; // Get Endpoint secret string? StripeEndpointKey = Environment.GetEnvironmentVariable("StripeEndpointSecret"); IPayment._EndpointSecret = string.IsNullOrEmpty(StripeEndpointKey) ? "" : StripeEndpointKey; } // Authentication Service builder.Services.AddAuthentication( options => { options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; } ).AddCookie(options => { options.Cookie.HttpOnly = true; options.Cookie.SecurePolicy = CookieSecurePolicy.Always; options.Cookie.SameSite = SameSiteMode.Strict; options.LoginPath = "/account/login"; options.LogoutPath = "/account/logout"; options.SlidingExpiration = true; }); builder.Services.AddCors(o => o.AddDefaultPolicy(builder => { builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader(); // No CORS })); builder.Services.AddRateLimiter(options => { options.AddPolicy("PerUserPolicy", httpContext => { var userId = httpContext.User.FindFirst(ClaimTypes.NameIdentifier)?.Value ?? httpContext.User.Identity?.Name ?? httpContext.Connection.RemoteIpAddress?.ToString(); return RateLimitPartition.GetTokenBucketLimiter(userId, key => new TokenBucketRateLimiterOptions { TokenLimit = 10, // max 10 requests QueueProcessingOrder = QueueProcessingOrder.OldestFirst, QueueLimit = 0, ReplenishmentPeriod = TimeSpan.FromSeconds(15), TokensPerPeriod = 2, AutoReplenishment = true }); }); }); // Pages Service builder.Services.AddControllers(); builder.Services.AddRazorPages(); var app = builder.Build(); // Configure the HTTP request pipeline. if( !app.Environment.IsDevelopment() ) { app.UseHsts(); } app.UseDefaultFiles(); app.UseStaticFiles(); app.UseCors(); app.UseRouting(); app.UseAuthentication(); app.MapControllers().RequireRateLimiting("perUserPolicy"); app.MapFallbackToFile("index.html"); app.Run();