This commit is contained in:
Laura Hausmann 2022-12-15 22:36:15 +01:00
parent ba569ac388
commit 32f191f7e3
Signed by: zotan
GPG Key ID: D044E84C5BE01605
24 changed files with 102 additions and 96 deletions

View File

@ -3,11 +3,11 @@ using System.Linq;
using LinqToDB;
using LinqToDB.Configuration;
using LinqToDB.Data;
using RTMPDash.DataModels.Tables;
using RTMPDash.Backend.Database.Tables;
namespace RTMPDash.DataModels;
namespace RTMPDash.Backend.Database;
public class AppDb {
public class Database {
public class ConnectionStringSettings : IConnectionStringSettings {
public string ConnectionString { get; set; }
public string Name { get; set; }

View File

@ -1,6 +1,6 @@
using LinqToDB.Mapping;
namespace RTMPDash.DataModels.Tables;
namespace RTMPDash.Backend.Database.Tables;
[Table(Name = "DbInfo")]
public class DbInfo {

View File

@ -1,6 +1,6 @@
using LinqToDB.Mapping;
namespace RTMPDash.DataModels.Tables;
namespace RTMPDash.Backend.Database.Tables;
[Table(Name = "Invites")]
public class Invite {

View File

@ -1,6 +1,6 @@
using LinqToDB.Mapping;
namespace RTMPDash.DataModels.Tables;
namespace RTMPDash.Backend.Database.Tables;
[Table(Name = "Users")]
public class User {

View File

@ -3,11 +3,10 @@ using System.Collections.Generic;
using System.Linq;
using LinqToDB;
using LinqToDB.Data;
using RTMPDash.DataModels;
using RTMPDash.DataModels.Tables;
using RTMPDash.Backend.Database.Tables;
using RTMPDash.Pages;
namespace RTMPDash;
namespace RTMPDash.Backend;
public static class Migrations {
private const int DbVer = 2;
@ -20,7 +19,7 @@ public static class Migrations {
};
public static void RunMigrations() {
using var db = new AppDb.DbConn();
using var db = new Database.Database.DbConn();
var ccolor = Console.ForegroundColor;
if (!db.DataProvider.GetSchemaProvider().GetSchema(db).Tables.Any()) {
@ -82,7 +81,7 @@ public static class Migrations {
new Migration(0, "COMMIT TRANSACTION").Run(db);
var newdb = new AppDb.DbConn();
var newdb = new Database.Database.DbConn();
var dbinfo = newdb.DbInfo.First();
dbinfo.DbVer = DbVer;
newdb.Update(dbinfo);

View File

@ -3,9 +3,8 @@ using System.Threading;
using LinqToDB.Data;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using RTMPDash.DataModels;
namespace RTMPDash;
namespace RTMPDash.Backend;
public class Program {
public const string SiteName = "chaos.stream";
@ -25,7 +24,7 @@ public class Program {
"<a href=\"https://t.me/zotan\" target=\"_blank\">Telegram</a>, <a href=\"https://threema.id/S59S9U8J\" target=\"_blank\">Threema</a>, or via <a href=\"mailto:chaosstream-contact@zotan.email\" target=\"_blank\">email</a>.";
public static void Main(string[] args) {
DataConnection.DefaultSettings = new AppDb.Settings();
DataConnection.DefaultSettings = new Database.Database.Settings();
ThreadPool.SetMinThreads(100, 100);
Migrations.RunMigrations();
CreateHostBuilder(args).Build().Run();

View File

@ -5,7 +5,7 @@ using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace RTMPDash;
namespace RTMPDash.Backend;
public class Startup {
public Startup(IConfiguration configuration) => Configuration = configuration;

View File

@ -2,9 +2,8 @@ using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Xml.Serialization;
using RTMPDash.DataModels;
namespace RTMPDash;
namespace RTMPDash.Backend;
public static class StreamUtils {
private static readonly XmlSerializer Serializer = new(typeof(StatsObject));
@ -19,7 +18,7 @@ public static class StreamUtils {
long.Parse(stats.Server.Applications.First(p => p.Name == "ingress").MethodLive.Streams.First(p => p.Name == user).Time);
public static int CountLiveRestreams(string user, StatsObject stats) {
var db = new AppDb.DbConn();
var db = new Database.Database.DbConn();
var dbUser = db.Users.First(p => p.Username == user);
return dbUser.RestreamTargets.Split(",")
.Count(target => stats.Server.Applications.First(p => p.Name == "ingress")
@ -27,7 +26,7 @@ public static class StreamUtils {
}
public static int CountLiveRestreams(string user, string privateAccesskey, StatsObject stats) {
var db = new AppDb.DbConn();
var db = new Database.Database.DbConn();
var dbUser = db.Users.First(p => p.Username == user);
return dbUser.RestreamTargets.Split(",")
.Count(target => stats.Server.Applications.First(p => p.Name == "ingress")

View File

@ -1,6 +1,6 @@
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using RTMPDash.DataModels;
using RTMPDash.Backend.Database;
namespace RTMPDash.Controllers;
@ -8,7 +8,7 @@ namespace RTMPDash.Controllers;
public class RtmpAuthController : ControllerBase {
[HttpGet]
public string Get() {
var db = new AppDb.DbConn();
var db = new Database.DbConn();
if (!db.Users.Any(p => p.StreamKey == Request.Query["name"])) {
Response.StatusCode = 403;
return "unauthorized";

View File

@ -2,14 +2,15 @@
@inject IAntiforgery Antiforgery
@using Microsoft.AspNetCore.Antiforgery
@using Microsoft.AspNetCore.Http
@using RTMPDash.DataModels
@using RTMPDash.Backend
@using RTMPDash.Backend.Database
@model AdminModel
@{
ViewData["Title"] = "Admin";
var db = new AppDb.DbConn();
var db = new Database.DbConn();
var tokenSet = Antiforgery.GetAndStoreTokens(HttpContext);
if (string.IsNullOrEmpty(HttpContext.Session.GetString("authenticatedUser")) || !new AppDb.DbConn().Users.First(p => p.Username == HttpContext.Session.GetString("authenticatedUser")).IsAdmin) {
if (string.IsNullOrEmpty(HttpContext.Session.GetString("authenticatedUser")) || !new Database.DbConn().Users.First(p => p.Username == HttpContext.Session.GetString("authenticatedUser")).IsAdmin) {
Response.Redirect("/");
return;
}

View File

@ -3,8 +3,8 @@ using System.Linq;
using LinqToDB;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.RazorPages;
using RTMPDash.DataModels;
using RTMPDash.DataModels.Tables;
using RTMPDash.Backend.Database;
using RTMPDash.Backend.Database.Tables;
namespace RTMPDash.Pages;
@ -13,13 +13,13 @@ public class AdminModel : PageModel {
public void OnPost() {
if (string.IsNullOrEmpty(HttpContext.Session.GetString("authenticatedUser"))
|| !new AppDb.DbConn().Users.First(p => p.Username == HttpContext.Session.GetString("authenticatedUser")).IsAdmin)
|| !new Database.DbConn().Users.First(p => p.Username == HttpContext.Session.GetString("authenticatedUser")).IsAdmin)
return;
if (!Request.HasFormContentType || string.IsNullOrWhiteSpace(Request.Form["action"]))
return;
var db = new AppDb.DbConn();
var db = new Database.DbConn();
if (Request.Form["action"] == "invite_generate")
db.Insert(new Invite { Code = Guid.NewGuid().ToString() });

View File

@ -1,4 +1,5 @@
@page
@using RTMPDash.Backend
@model ContentModel
@{
ViewData["Title"] = "Content Policy";

View File

@ -1,4 +1,5 @@
@page
@using RTMPDash.Backend
@model CreditsModel
@{
ViewData["Title"] = "Credits";

View File

@ -2,7 +2,8 @@
@inject IAntiforgery _antiforgery
@using Microsoft.AspNetCore.Antiforgery
@using Microsoft.AspNetCore.Http
@using RTMPDash.DataModels
@using RTMPDash.Backend
@using RTMPDash.Backend.Database
@model DashboardModel
@{
ViewData["Title"] = "Dashboard";
@ -16,7 +17,7 @@
</div>
}
else {
var db = new AppDb.DbConn();
var db = new Database.DbConn();
var user = db.Users.First(p => p.Username == HttpContext.Session.GetString("authenticatedUser"));
var stats = StreamUtils.GetStatsObject();
<div class="alert alert-success" role="alert">

View File

@ -3,7 +3,7 @@ using System.Linq;
using LinqToDB;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.RazorPages;
using RTMPDash.DataModels;
using RTMPDash.Backend.Database;
namespace RTMPDash.Pages;
@ -14,7 +14,7 @@ public class DashboardModel : PageModel {
if (!Request.HasFormContentType || string.IsNullOrWhiteSpace(Request.Form["action"]) || string.IsNullOrWhiteSpace(HttpContext.Session.GetString("authenticatedUser")))
return;
using var db = new AppDb.DbConn();
using var db = new Database.DbConn();
var user = db.Users.FirstOrDefault(p => p.Username == HttpContext.Session.GetString("authenticatedUser"));
if (Request.Form["action"] == "password_change") {
@ -69,14 +69,12 @@ public class DashboardModel : PageModel {
}
if (Request.Form["action"] == "pronoun_plural") {
var target = string.IsNullOrWhiteSpace(Request.Form["value"]) ? "their" : Request.Form["value"].ToString();
user!.PronounPlural = true;
db.Update(user);
Response.Redirect("/Dashboard");
}
if (Request.Form["action"] == "pronoun_singular") {
var target = string.IsNullOrWhiteSpace(Request.Form["value"]) ? "their" : Request.Form["value"].ToString();
user!.PronounPlural = false;
db.Update(user);
Response.Redirect("/Dashboard");

View File

@ -1,9 +1,10 @@
@page
@using RTMPDash.DataModels
@using RTMPDash.Backend.Database
@using RTMPDash.Backend
@model IndexModel
@{
ViewData["Title"] = "Home";
var db = new AppDb.DbConn();
var db = new Database.DbConn();
var allStreams = StreamUtils.ListLiveUsers();
var allUsers = db.Users.Where(p => !p.IsPrivate).Select(p => p.Username);
var liveUsers = allStreams.Intersect(allUsers);

View File

@ -6,7 +6,7 @@ using System.Text;
using System.Web;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.RazorPages;
using RTMPDash.DataModels;
using RTMPDash.Backend.Database;
namespace RTMPDash.Pages;
@ -15,7 +15,7 @@ public class LoginModel : PageModel {
if (!Request.HasFormContentType || string.IsNullOrWhiteSpace(Request.Form["user"]) || string.IsNullOrWhiteSpace(Request.Form["pass"]))
return;
using var db = new AppDb.DbConn();
using var db = new Database.DbConn();
var user = db.Users.FirstOrDefault(p => p.Username == Request.Form["user"].ToString());
if (user == null)

View File

@ -1,4 +1,5 @@
@page
@using RTMPDash.Backend
@model PrivacyModel
@{
ViewData["Title"] = "Privacy Policy";

View File

@ -1,9 +1,10 @@
@page "/{user}"
@using RTMPDash.DataModels
@using RTMPDash.Backend.Database
@using RTMPDash.Backend
@model ProfileModel
@{
ViewData["Title"] = Model.User;
var db = new AppDb.DbConn();
var db = new Database.DbConn();
if (!db.Users.Any(p => p.Username == Model.User)) {
Response.Redirect("/");
return;

View File

@ -3,8 +3,8 @@ using System.Linq;
using LinqToDB;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.RazorPages;
using RTMPDash.DataModels;
using RTMPDash.DataModels.Tables;
using RTMPDash.Backend.Database;
using RTMPDash.Backend.Database.Tables;
namespace RTMPDash.Pages;
@ -16,7 +16,7 @@ public class RegisterModel : PageModel {
|| string.IsNullOrWhiteSpace(Request.Form["code"]))
return;
using var db = new AppDb.DbConn();
using var db = new Database.DbConn();
if (!db.Invites.Any(p => p.Code == Request.Form["code"]))
return;

View File

@ -1,5 +1,6 @@
@using Microsoft.AspNetCore.Http
@using RTMPDash.DataModels
@using RTMPDash.Backend
@using RTMPDash.Backend.Database
<!DOCTYPE html>
<html lang="en">
<head>
@ -33,7 +34,7 @@
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Stats">Stats</a>
</li>
@if (!string.IsNullOrEmpty(Context.Session.GetString("authenticatedUser")) && new AppDb.DbConn().Users.First(p => p.Username == Context.Session.GetString("authenticatedUser")).IsAdmin) {
@if (!string.IsNullOrEmpty(Context.Session.GetString("authenticatedUser")) && new Database.DbConn().Users.First(p => p.Username == Context.Session.GetString("authenticatedUser")).IsAdmin) {
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-page="/Admin">Admin</a>
</li>

View File

@ -1,4 +1,5 @@
@page
@using RTMPDash.Backend
@model StatsModel
@{
ViewData["Title"] = "Stats";

View File

@ -1,4 +1,2 @@
@using Microsoft.AspNetCore.Identity
@using RTMPDash
@namespace RTMPDash.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

View File

@ -6,68 +6,72 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="linq2db" Version="3.2.3"/>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="5.0.2"/>
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="5.0.1"/>
<PackageReference Include="System.Data.SQLite.Core" Version="1.0.113.7"/>
<PackageReference Include="linq2db" Version="3.2.3" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="5.0.2" />
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="5.0.1" />
<PackageReference Include="System.Data.SQLite.Core" Version="1.0.113.7" />
</ItemGroup>
<ItemGroup>
<_ContentIncludedByDefault Remove="Areas\Identity\Pages\_ViewStart.cshtml"/>
<_ContentIncludedByDefault Remove="wwwroot\css\dark-mode.css"/>
<_ContentIncludedByDefault Remove="wwwroot\css\site.css"/>
<_ContentIncludedByDefault Remove="wwwroot\favicon.ico"/>
<_ContentIncludedByDefault Remove="wwwroot\js\dark-mode-switch.js"/>
<_ContentIncludedByDefault Remove="wwwroot\js\site.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.css"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.css.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.min.css"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.min.css.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.css"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.css.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.min.css"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.min.css.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.css"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.css.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.min.css"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.min.css.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.js.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.min.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.min.js.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.js.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.min.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.min.js.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\LICENSE"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation-unobtrusive\jquery.validate.unobtrusive.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation-unobtrusive\jquery.validate.unobtrusive.min.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation-unobtrusive\LICENSE.txt"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\additional-methods.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\additional-methods.min.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\jquery.validate.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\jquery.validate.min.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\LICENSE.md"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery\dist\jquery.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery\dist\jquery.min.js"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery\dist\jquery.min.map"/>
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery\LICENSE.txt"/>
<_ContentIncludedByDefault Remove="Areas\Identity\Pages\_ViewStart.cshtml" />
<_ContentIncludedByDefault Remove="wwwroot\css\dark-mode.css" />
<_ContentIncludedByDefault Remove="wwwroot\css\site.css" />
<_ContentIncludedByDefault Remove="wwwroot\favicon.ico" />
<_ContentIncludedByDefault Remove="wwwroot\js\dark-mode-switch.js" />
<_ContentIncludedByDefault Remove="wwwroot\js\site.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.css" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.css.map" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.min.css" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-grid.min.css.map" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.css" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.css.map" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.min.css" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap-reboot.min.css.map" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.css" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.css.map" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.min.css" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\css\bootstrap.min.css.map" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.js.map" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.min.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.bundle.min.js.map" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.js.map" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.min.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\dist\js\bootstrap.min.js.map" />
<_ContentIncludedByDefault Remove="wwwroot\lib\bootstrap\LICENSE" />
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation-unobtrusive\jquery.validate.unobtrusive.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation-unobtrusive\jquery.validate.unobtrusive.min.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation-unobtrusive\LICENSE.txt" />
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\additional-methods.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\additional-methods.min.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\jquery.validate.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\dist\jquery.validate.min.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery-validation\LICENSE.md" />
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery\dist\jquery.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery\dist\jquery.min.js" />
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery\dist\jquery.min.map" />
<_ContentIncludedByDefault Remove="wwwroot\lib\jquery\LICENSE.txt" />
</ItemGroup>
<ItemGroup>
<Compile Remove="wwwroot\**"/>
<Compile Remove="wwwroot\**" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Remove="wwwroot\**"/>
<EmbeddedResource Remove="wwwroot\**" />
</ItemGroup>
<ItemGroup>
<None Remove="wwwroot\**"/>
<None Remove="wwwroot\**" />
<None Remove=".gitignore" />
<None Remove="app.db" />
<None Remove="app.db.bak" />
<None Remove="example.db" />
</ItemGroup>
<ItemGroup>
<Content Remove="wwwroot\**"/>
<Content Remove="wwwroot\**" />
</ItemGroup>
</Project>