forked from collabvm/CollabVMAuthServer
add date of birth
This commit is contained in:
parent
788d11f39a
commit
0b1ec748da
4 changed files with 32 additions and 6 deletions
|
@ -30,6 +30,7 @@ public class Database
|
|||
username VARCHAR(20) NOT NULL UNIQUE KEY,
|
||||
password TEXT NOT NULL,
|
||||
email TEXT NOT NULL UNIQUE KEY,
|
||||
date_of_birth DATE NOT NULL,
|
||||
email_verified BOOLEAN NOT NULL DEFAULT 0,
|
||||
email_verification_code CHAR(8) DEFAULT NULL,
|
||||
cvm_rank INT UNSIGNED NOT NULL DEFAULT 1,
|
||||
|
@ -77,6 +78,7 @@ public class Database
|
|||
Username = reader.GetString("username"),
|
||||
Password = reader.GetString("password"),
|
||||
Email = reader.GetString("email"),
|
||||
DateOfBirth = reader.GetDateOnly("date_of_birth"),
|
||||
EmailVerified = reader.GetBoolean("email_verified"),
|
||||
EmailVerificationCode = reader.GetString("email_verification_code"),
|
||||
Rank = (Rank)reader.GetUInt32("cvm_rank"),
|
||||
|
@ -85,7 +87,7 @@ public class Database
|
|||
};
|
||||
}
|
||||
|
||||
public async Task RegisterAccount(string username, string email, string password, bool verified, IPAddress ip,
|
||||
public async Task RegisterAccount(string username, string email, DateOnly dateOfBirth, string password, bool verified, IPAddress ip,
|
||||
string? verificationcode = null)
|
||||
{
|
||||
await using var db = new MySqlConnection(connectionString);
|
||||
|
@ -93,13 +95,14 @@ public class Database
|
|||
await using var cmd = db.CreateCommand();
|
||||
cmd.CommandText = """
|
||||
INSERT INTO users
|
||||
(username, password, email, email_verified, email_verification_code, registration_ip)
|
||||
(username, password, email, date_of_birth, email_verified, email_verification_code, registration_ip)
|
||||
VALUES
|
||||
(@username, @password, @email, @email_verified, @email_verification_code, @registration_ip)
|
||||
(@username, @password, @email @date_of_birth, @email_verified, @email_verification_code, @registration_ip)
|
||||
""";
|
||||
cmd.Parameters.AddWithValue("@username", username);
|
||||
cmd.Parameters.AddWithValue("@password", Argon2.Hash(password));
|
||||
cmd.Parameters.AddWithValue("@email", email);
|
||||
cmd.Parameters.AddWithValue("@date_of_birth", dateOfBirth);
|
||||
cmd.Parameters.AddWithValue("@email_verified", verified);
|
||||
cmd.Parameters.AddWithValue("@email_verification_code", verificationcode);
|
||||
cmd.Parameters.AddWithValue("@registration_ip", ip.GetAddressBytes());
|
||||
|
|
|
@ -6,4 +6,5 @@ public class RegisterPayload
|
|||
public string password { get; set; }
|
||||
public string email { get; set; }
|
||||
public string? captchaToken { get; set; }
|
||||
public string dateOfBirth { get; set; }
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Net;
|
||||
using System.Runtime.InteropServices.JavaScript;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
using Computernewb.CollabVMAuthServer.HTTP.Payloads;
|
||||
|
@ -524,7 +525,7 @@ public static class Routes
|
|||
}, Utilities.JsonSerializerOptions);
|
||||
}
|
||||
var payload = await context.Request.ReadFromJsonAsync<RegisterPayload>();
|
||||
if (payload == null || string.IsNullOrWhiteSpace(payload.username) || string.IsNullOrWhiteSpace(payload.password) || string.IsNullOrWhiteSpace(payload.email))
|
||||
if (payload == null || string.IsNullOrWhiteSpace(payload.username) || string.IsNullOrWhiteSpace(payload.password) || string.IsNullOrWhiteSpace(payload.email) || string.IsNullOrWhiteSpace(payload.dateOfBirth))
|
||||
{
|
||||
context.Response.StatusCode = 400;
|
||||
return Results.Json(new RegisterResponse
|
||||
|
@ -628,11 +629,31 @@ public static class Routes
|
|||
error = "That password is commonly used and is not allowed."
|
||||
}, Utilities.JsonSerializerOptions);
|
||||
}
|
||||
// Validate date of birth
|
||||
if (!DateOnly.TryParseExact(payload.dateOfBirth, "yyyy-MM-dd", out var dob))
|
||||
{
|
||||
context.Response.StatusCode = 400;
|
||||
return Results.Json(new RegisterResponse
|
||||
{
|
||||
success = false,
|
||||
error = "Invalid date of birth"
|
||||
}, Utilities.JsonSerializerOptions);
|
||||
}
|
||||
|
||||
if (dob.AddYears(13) > DateOnly.FromDateTime(DateTime.Now))
|
||||
{
|
||||
context.Response.StatusCode = 400;
|
||||
return Results.Json(new RegisterResponse
|
||||
{
|
||||
success = false,
|
||||
error = "You must be at least 13 years old to register."
|
||||
}, Utilities.JsonSerializerOptions);
|
||||
}
|
||||
// Create the account
|
||||
if (Program.Config.Registration.EmailVerificationRequired)
|
||||
{
|
||||
var code = Program.Random.Next(10000000, 99999999).ToString();
|
||||
await Program.Database.RegisterAccount(payload.username, payload.email, payload.password, false, ip,code);
|
||||
await Program.Database.RegisterAccount(payload.username, payload.email, dob, payload.password, false, ip,code);
|
||||
await Program.Mailer.SendVerificationCode(payload.username, payload.email, code);
|
||||
return Results.Json(new RegisterResponse
|
||||
{
|
||||
|
@ -644,7 +665,7 @@ public static class Routes
|
|||
}
|
||||
else
|
||||
{
|
||||
await Program.Database.RegisterAccount(payload.username, payload.email, payload.password, true, null);
|
||||
await Program.Database.RegisterAccount(payload.username, payload.email, dob, payload.password, true, null);
|
||||
var token = Utilities.RandomString(32);
|
||||
await Program.Database.CreateSession(user.Username, token, ip);
|
||||
return Results.Json(new RegisterResponse
|
||||
|
|
|
@ -8,6 +8,7 @@ public class User
|
|||
public string Username { get; set; }
|
||||
public string Password { get; set; }
|
||||
public string Email { get; set; }
|
||||
public DateOnly DateOfBirth { get; set; }
|
||||
public bool EmailVerified { get; set; }
|
||||
public string EmailVerificationCode { get; set; }
|
||||
public Rank Rank { get; set; }
|
||||
|
|
Loading…
Reference in a new issue