summaryrefslogtreecommitdiff
path: root/VPNAuth.Server/Program.cs
blob: 6ea0b40ac9e6eeedd1dc89a4b74c608722fa81d4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
using VPNAuth.Server;
using VPNAuth.Server.Database;
using VPNAuth.Server.Responses;

Config.CreateIfNotExists();

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();

app.UseRouting();

app.UseAuthorization();

app.MapGet("/accept-auth/{id}", async (HttpContext context, int id) =>
{
    using var db = new Database();
    var authRequest = db.AuthRequests.Find(id);
    if (authRequest == null || authRequest.Accepted)
    {
        context.Response.StatusCode = StatusCodes.Status404NotFound;
        return;
    }

    authRequest.Accepted = true;
    db.SaveChanges();

    var config = Config.Read();
    context.Response.StatusCode = StatusCodes.Status302Found;
    context.Response.Headers["Location"] = config.FindApp(authRequest.ClientId)!.RedirectUri!
                                           + "?code=" + authRequest.Code
                                           + "&state=" + authRequest.State;
});

app.MapPost("/access-token", async (HttpContext context) =>
{
    var config = Config.Read();
    if (context.Request.Form["grant_type"] != "authorization_code")
    {
        context.Response.StatusCode = StatusCodes.Status400BadRequest;
        return;
    }

    var clientSecret = config.FindApp(context.Request.Form["client_id"]!)!.Secret; // FIXME: null pointer
    if (clientSecret != null && clientSecret != context.Request.Form["client_secret"])
    {
        context.Response.StatusCode = StatusCodes.Status403Forbidden;
        return;
    }

    using var db = new Database();
    var authRequest = db.AuthRequests
        .Where(request => request.Code == context.Request.Form["code"].ToString())
        .ToList()
        .FirstOrDefault();
    if (authRequest == null)
    {
        context.Response.StatusCode = StatusCodes.Status404NotFound;
        return;
    }

    // TODO: validate code verifier -> context.Request.Form["code_verifier"]

    var accessTokenEntry = db.AccessTokens.Add(new AccessToken
    {
        ClientId = authRequest.ClientId,
        Scopes = authRequest.Scopes,
        CreationTime = DateTime.Now,
        Token = PkceUtils.GenerateToken()
    });
    db.SaveChanges();

    await context.Response.WriteAsJsonAsync(new Token
    {
        AccessToken = accessTokenEntry.Entity.Token,
        TokenType = "Bearer",
        Expires = 0 // TODO: change to actual value
    });
});

app.MapStaticAssets();
app.MapRazorPages()
    .WithStaticAssets();

app.Run("http://localhost:8080");