mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-05-24 02:02:36 -04:00
Handle require verification on account creation
This commit is contained in:
parent
78a3ae8aeb
commit
44e7323720
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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));
|
||||||
|
@ -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>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user