summaryrefslogtreecommitdiffstats
path: root/BlobBin
diff options
context:
space:
mode:
Diffstat (limited to 'BlobBin')
-rw-r--r--BlobBin/BlobBin.csproj21
-rw-r--r--BlobBin/Dockerfile20
-rw-r--r--BlobBin/Program.cs46
-rw-r--r--BlobBin/Properties/launchSettings.json15
-rw-r--r--BlobBin/appsettings.Development.json8
-rw-r--r--BlobBin/appsettings.json9
-rw-r--r--BlobBin/wwwroot/index.html80
7 files changed, 199 insertions, 0 deletions
diff --git a/BlobBin/BlobBin.csproj b/BlobBin/BlobBin.csproj
new file mode 100644
index 0000000..cd8d47d
--- /dev/null
+++ b/BlobBin/BlobBin.csproj
@@ -0,0 +1,21 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+ <PropertyGroup>
+ <TargetFramework>net7.0</TargetFramework>
+ <Nullable>enable</Nullable>
+ <ImplicitUsings>enable</ImplicitUsings>
+ <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.0" />
+ <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <Content Include="..\.dockerignore">
+ <Link>.dockerignore</Link>
+ </Content>
+ </ItemGroup>
+
+</Project>
diff --git a/BlobBin/Dockerfile b/BlobBin/Dockerfile
new file mode 100644
index 0000000..9b1f38e
--- /dev/null
+++ b/BlobBin/Dockerfile
@@ -0,0 +1,20 @@
+FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
+WORKDIR /app
+EXPOSE 80
+EXPOSE 443
+
+FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
+WORKDIR /src
+COPY ["BlobBin/BlobBin.csproj", "BlobBin/"]
+RUN dotnet restore "BlobBin/BlobBin.csproj"
+COPY . .
+WORKDIR "/src/BlobBin"
+RUN dotnet build "BlobBin.csproj" -c Release -o /app/build
+
+FROM build AS publish
+RUN dotnet publish "BlobBin.csproj" -c Release -o /app/publish
+
+FROM base AS final
+WORKDIR /app
+COPY --from=publish /app/publish .
+ENTRYPOINT ["dotnet", "BlobBin.dll"]
diff --git a/BlobBin/Program.cs b/BlobBin/Program.cs
new file mode 100644
index 0000000..085bd6e
--- /dev/null
+++ b/BlobBin/Program.cs
@@ -0,0 +1,46 @@
+var builder = WebApplication.CreateBuilder(args);
+
+var app = builder.Build();
+
+app.UseFileServer();
+app.UseStatusCodePages();
+app.MapPost("/upload", Upload);
+app.MapPost("/text", UploadText);
+app.MapGet("/b/{id}", GetBlob);
+app.Run();
+
+IResult Upload(HttpContext context) {
+ var request = new UploadRequest() {
+ Singleton = context.Request.Form["singleton"] == "on",
+ File = context.Request.Form.Files.FirstOrDefault(),
+ Password = context.Request.Form["password"],
+ AutoDeleteAfter = context.Request.Form["autoDeleteAfter"]
+ };
+ return Results.Ok();
+}
+
+IResult UploadText(PasteRequest request) {
+ return Results.Ok();
+}
+
+IResult GetBlob(string id) {
+ return Results.Ok();
+}
+
+class BlobBase
+{
+ public string Password { get; set; }
+ public bool Singleton { get; set; }
+ public string AutoDeleteAfter { get; set; }
+}
+
+class PasteRequest : BlobBase
+{
+ public string Text { get; set; }
+ public string Mime { get; set; }
+}
+
+class UploadRequest : BlobBase
+{
+ public IFormFile? File { get; set; }
+} \ No newline at end of file
diff --git a/BlobBin/Properties/launchSettings.json b/BlobBin/Properties/launchSettings.json
new file mode 100644
index 0000000..e19510b
--- /dev/null
+++ b/BlobBin/Properties/launchSettings.json
@@ -0,0 +1,15 @@
+{
+ "$schema": "https://json.schemastore.org/launchsettings.json",
+ "profiles": {
+ "http": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": false,
+ "launchUrl": "",
+ "applicationUrl": "http://localhost:5033",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/BlobBin/appsettings.Development.json b/BlobBin/appsettings.Development.json
new file mode 100644
index 0000000..0c208ae
--- /dev/null
+++ b/BlobBin/appsettings.Development.json
@@ -0,0 +1,8 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ }
+}
diff --git a/BlobBin/appsettings.json b/BlobBin/appsettings.json
new file mode 100644
index 0000000..10f68b8
--- /dev/null
+++ b/BlobBin/appsettings.json
@@ -0,0 +1,9 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ },
+ "AllowedHosts": "*"
+}
diff --git a/BlobBin/wwwroot/index.html b/BlobBin/wwwroot/index.html
new file mode 100644
index 0000000..f252fe3
--- /dev/null
+++ b/BlobBin/wwwroot/index.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8">
+ <style>
+ body {
+ font-family: sans-serif;
+ }
+
+ form {
+ width: 100%;
+ max-width: 300px;
+ display: flex;
+ flex-direction: column;
+ gap: 5px;
+ }
+
+ #forms {
+ display: flex;
+ flex-direction: row;
+ gap: 15px;
+ flex-wrap: wrap;
+ }
+
+ #forms summary {
+ width: 300px;
+ cursor: pointer;
+ }
+ </style>
+ <title>Blobbin</title>
+</head>
+<body>
+<h1>Blobbin</h1>
+<p>This is a web service you can upload files and texts to.</p>
+<main id="forms">
+ <details>
+ <summary>Upload a file</summary>
+ <form action="/upload" method="post">
+ <input type="file" id="file" name="files" required>
+ <label for="file-password">Password (optional)</label>
+ <input type="password" name="password" id="file-password">
+ <label for="file-auto-delete">
+ Automatically delete after (optional)
+ <span class="label-description"
+ title="blank=never, <number><unit>, unit can be d=day,w=week,h=hour,m=minute">?</span>
+ </label>
+ <input type="text"
+ id="file-auto-delete"
+ name="autoDeleteAfter">
+ <label for="file-singleton">
+ <input type="checkbox" name="singleton" id="file-singleton">
+ Delete after first open</label>
+ <input type="submit">
+ </form>
+ </details>
+ <details>
+ <summary>Upload some text</summary>
+ <form action="/text" method="post">
+ <textarea id="text" name="text" required></textarea>
+ <label for="text-password">Mimetype (default: text/plain)</label>
+ <input type="password" name="mime" id="text-mimetype">
+ <label for="text-password">Password (optional)</label>
+ <input type="password" name="password" id="text-password">
+ <label for="text-auto-delete">
+ Automatically delete after (optional)
+ <span class="label-description"
+ title="blank=never, <number><unit>, unit can be d=day,w=week,h=hour,m=minute">?</span>
+ </label>
+ <input type="text"
+ id="text-auto-delete"
+ name="autoDeleteAfter">
+ <label for="text-singleton">
+ <input type="checkbox" id="text-singleton" name="singleton">
+ Delete after first open</label>
+ <input type="submit">
+ </form>
+ </details>
+</main>
+</body>
+</html> \ No newline at end of file