Handle require verification on account creation

This commit is contained in:
Zoe Roux 2024-03-09 14:08:00 +01:00
parent 78a3ae8aeb
commit 44e7323720
6 changed files with 28 additions and 26 deletions

View File

@ -261,4 +261,11 @@ namespace Kyoo.Abstractions.Controllers
/// </summary> /// </summary>
Type RepositoryType { get; } Type RepositoryType { get; }
} }
public interface IUserRepository : IRepository<User>
{
Task<User?> GetByExternalId(string provider, string id);
Task<User> AddExternalToken(Guid userId, string provider, ExternalToken token);
Task<User> DeleteExternalToken(Guid userId, string provider);
}
} }

View File

@ -23,15 +23,15 @@ using System.Net.Http;
using System.Net.Http.Json; using System.Net.Http.Json;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Kyoo.Abstractions.Controllers;
using Kyoo.Abstractions.Models; using Kyoo.Abstractions.Models;
using Kyoo.Authentication.Models; using Kyoo.Authentication.Models;
using Kyoo.Authentication.Models.DTO; using Kyoo.Authentication.Models.DTO;
using Kyoo.Core.Controllers;
namespace Kyoo.Authentication; namespace Kyoo.Authentication;
public class OidcController( public class OidcController(
UserRepository users, IUserRepository users,
IHttpClientFactory clientFactory, IHttpClientFactory clientFactory,
PermissionOption options PermissionOption options
) )
@ -89,7 +89,6 @@ public class OidcController(
newUser.Username = username; newUser.Username = username;
newUser.Slug = Utils.Utility.ToSlug(newUser.Username); newUser.Slug = Utils.Utility.ToSlug(newUser.Username);
newUser.ExternalId.Add(provider, extToken); newUser.ExternalId.Add(provider, extToken);
newUser.Permissions = options.NewUser;
return (newUser, extToken); return (newUser, extToken);
} }

View File

@ -10,7 +10,6 @@
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<ProjectReference Include="../Kyoo.Abstractions/Kyoo.Abstractions.csproj" /> <ProjectReference Include="../Kyoo.Abstractions/Kyoo.Abstractions.csproj" />
<ProjectReference Include="../Kyoo.Core/Kyoo.Core.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -28,7 +28,6 @@ using Kyoo.Abstractions.Models.Permissions;
using Kyoo.Abstractions.Models.Utils; using Kyoo.Abstractions.Models.Utils;
using Kyoo.Authentication.Models; using Kyoo.Authentication.Models;
using Kyoo.Authentication.Models.DTO; using Kyoo.Authentication.Models.DTO;
using Kyoo.Core.Controllers;
using Kyoo.Models; using Kyoo.Models;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
@ -45,7 +44,7 @@ namespace Kyoo.Authentication.Views
[Route("auth")] [Route("auth")]
[ApiDefinition("Authentication", Group = UsersGroup)] [ApiDefinition("Authentication", Group = UsersGroup)]
public class AuthApi( public class AuthApi(
UserRepository users, IUserRepository users,
OidcController oidc, OidcController oidc,
ITokenController tokenController, ITokenController tokenController,
IThumbnailsManager thumbs, IThumbnailsManager thumbs,
@ -243,22 +242,19 @@ namespace Kyoo.Authentication.Views
[ProducesResponseType(StatusCodes.Status409Conflict, Type = typeof(RequestError))] [ProducesResponseType(StatusCodes.Status409Conflict, Type = typeof(RequestError))]
public async Task<ActionResult<JwtToken>> Register([FromBody] RegisterRequest request) public async Task<ActionResult<JwtToken>> Register([FromBody] RegisterRequest request)
{ {
User user = request.ToUser();
user.Permissions = options.NewUser;
try try
{ {
await users.Create(user); User user = await users.Create(request.ToUser());
return new JwtToken(
tokenController.CreateAccessToken(user, out TimeSpan expireIn),
await tokenController.CreateRefreshToken(user),
expireIn
);
} }
catch (DuplicatedItemException) catch (DuplicatedItemException)
{ {
return Conflict(new RequestError("A user already exists with this username.")); return Conflict(new RequestError("A user already exists with this username."));
} }
return new JwtToken(
tokenController.CreateAccessToken(user, out TimeSpan expireIn),
await tokenController.CreateRefreshToken(user),
expireIn
);
} }
/// <summary> /// <summary>

View File

@ -23,8 +23,8 @@ using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Kyoo.Abstractions.Controllers; using Kyoo.Abstractions.Controllers;
using Kyoo.Abstractions.Models; using Kyoo.Abstractions.Models;
using Kyoo.Abstractions.Models.Permissions;
using Kyoo.Abstractions.Models.Utils; using Kyoo.Abstractions.Models.Utils;
using Kyoo.Authentication.Models;
using Kyoo.Postgresql; using Kyoo.Postgresql;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
@ -40,8 +40,9 @@ public class UserRepository(
DatabaseContext database, DatabaseContext database,
DbConnection db, DbConnection db,
SqlVariableContext context, SqlVariableContext context,
IThumbnailsManager thumbs IThumbnailsManager thumbs,
) : LocalRepository<User>(database, thumbs) PermissionOption options
) : LocalRepository<User>(database, thumbs), IUserRepository
{ {
/// <inheritdoc /> /// <inheritdoc />
public override async Task<ICollection<User>> Search( public override async Task<ICollection<User>> Search(
@ -60,14 +61,13 @@ public class UserRepository(
{ {
// If no users exists, the new one will be an admin. Give it every permissions. // If no users exists, the new one will be an admin. Give it every permissions.
if (!await database.Users.AnyAsync()) if (!await database.Users.AnyAsync())
{
obj.Permissions = Enum.GetNames<Group>() obj.Permissions = PermissionOption.Admin;
.Where(x => x != nameof(Group.None)) else if (!options.RequireVerification)
.SelectMany(group => obj.Permissions = options.NewUser;
Enum.GetNames<Kind>().Select(kind => $"{group}.{kind}".ToLowerInvariant()) else
) obj.Permissions = Array.Empty<string>();
.ToArray();
}
await base.Create(obj); await base.Create(obj);
database.Entry(obj).State = EntityState.Added; database.Entry(obj).State = EntityState.Added;
await database.SaveChangesAsync(() => Get(obj.Slug)); await database.SaveChangesAsync(() => Get(obj.Slug));

View File

@ -21,5 +21,6 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="../Kyoo.Abstractions/Kyoo.Abstractions.csproj" /> <ProjectReference Include="../Kyoo.Abstractions/Kyoo.Abstractions.csproj" />
<ProjectReference Include="../Kyoo.Postgresql/Kyoo.Postgresql.csproj" /> <ProjectReference Include="../Kyoo.Postgresql/Kyoo.Postgresql.csproj" />
<ProjectReference Include="../Kyoo.Authentication/Kyoo.Authentication.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>