Ability to set user permissionId for registration

This commit is contained in:
quentin 2024-10-29 19:14:58 -05:00
parent 777fb1c4c9
commit cb5c5b6b4f
8 changed files with 67 additions and 20 deletions

View File

@ -6,6 +6,12 @@
<synchronize>true</synchronize> <synchronize>true</synchronize>
<jdbc-driver>com.mysql.cj.jdbc.Driver</jdbc-driver> <jdbc-driver>com.mysql.cj.jdbc.Driver</jdbc-driver>
<jdbc-url>jdbc:mysql://192.168.1.52:5618</jdbc-url> <jdbc-url>jdbc:mysql://192.168.1.52:5618</jdbc-url>
<jdbc-additional-properties>
<property name="com.intellij.clouds.kubernetes.db.host.port" />
<property name="com.intellij.clouds.kubernetes.db.enabled" value="false" />
<property name="com.intellij.clouds.kubernetes.db.resource.type" value="Deployment" />
<property name="com.intellij.clouds.kubernetes.db.container.port" />
</jdbc-additional-properties>
<working-dir>$ProjectFileDir$</working-dir> <working-dir>$ProjectFileDir$</working-dir>
<driver-properties> <driver-properties>
<property name="serverTimezone" value="UTC" /> <property name="serverTimezone" value="UTC" />

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="SqlDialectMappings">
<file url="file://$PROJECT_DIR$/Setup/Filler/Grants.sql" dialect="MySQL" />
<file url="file://$PROJECT_DIR$/Setup/Filler/Permissions.sql" dialect="MySQL" />
</component>
</project>

View File

@ -3,6 +3,7 @@ using API.DTO.Login;
using API.Errors; using API.Errors;
using API.Services; using API.Services;
using API.Services.Interfaces; using API.Services.Interfaces;
using DAL.Models;
using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
@ -48,7 +49,24 @@ namespace API.Controllers
} }
[HttpPost("register")] [HttpPost("register")]
public ActionResult<UserDTO> register(UserRegisterDTO registerDTO) public ActionResult<UserDTO> register(UserRegisterDTO registerDTO, ulong? permissionId = null)
{
if (registerDTO.password == null)
registerDTO.password = registerDTO.phoneNumber;
if (permissionId == null)
{
User? user = getUser(User);
if (user == null)
return Unauthorized();
UserDTO? createdUser = _userManager.registerUser(registerDTO, user, permissionId);
if (createdUser == null)
return Conflict(Strings.UserExists);
return Ok(createdUser);
}
{ {
UserDTO? user = _userManager.registerUser(registerDTO); UserDTO? user = _userManager.registerUser(registerDTO);
@ -60,4 +78,16 @@ namespace API.Controllers
return Ok(user); return Ok(user);
} }
} }
[NonAction]
public User? getUser(ClaimsPrincipal user)
{
Claim? idClaim = user.FindFirst(ClaimTypes.NameIdentifier);
if (idClaim == null)
return null;
return _userService.getNoAuthentication(UInt64.Parse(idClaim.Value));
}
}
} }

View File

@ -14,6 +14,6 @@ namespace API.DTO.Login
public PhoneNumber phoneNumber { get; set; } = null!; public PhoneNumber phoneNumber { get; set; } = null!;
[MaxLength(1000)] [MaxLength(1000)]
public string password { get; set; } = null!; public string? password { get; set; }
} }
} }

View File

@ -1,5 +1,6 @@
using API.DTO.Base; using API.DTO.Base;
using API.DTO.Login; using API.DTO.Login;
using DAL.Models;
namespace API.Services.Interfaces namespace API.Services.Interfaces
{ {
@ -7,6 +8,6 @@ namespace API.Services.Interfaces
{ {
UserDTO? authenticateUser(UserLoginDTO loginDTO); UserDTO? authenticateUser(UserLoginDTO loginDTO);
UserDTO? registerUser(UserRegisterDTO registerDTO); UserDTO? registerUser(UserRegisterDTO registerDTO, User? user = null, ulong? permissionId = null);
} }
} }

View File

@ -54,7 +54,7 @@ namespace API.Services
return dto; return dto;
} }
public UserDTO? registerUser(UserRegisterDTO registerDTO) public UserDTO? registerUser(UserRegisterDTO registerDTO, User? user = null, ulong? permissionId = null)
{ {
if (_userService.getNoAuthentication(x => if (_userService.getNoAuthentication(x =>
x.phoneNumber.Equals(registerDTO.phoneNumber) || x.phoneNumber.Equals(registerDTO.phoneNumber) ||
@ -74,10 +74,13 @@ namespace API.Services
byte[] salt; byte[] salt;
string hashedPassword = hashingAlgorithm.hash(registerDTO.password, out salt); string hashedPassword = hashingAlgorithm.hash(registerDTO.password, out salt);
User user = _userService.add(registerDTO, hashedPassword, salt); User? createdUser = _userService.add(registerDTO, hashedPassword, salt, user, permissionId);
if (createdUser == null)
return null;
UserDTO dto = new UserDTO(); UserDTO dto = new UserDTO();
dto.adaptFromModel(user); dto.adaptFromModel(createdUser);
return dto; return dto;
} }

View File

@ -17,10 +17,9 @@ namespace API.Services
_defaultUserPermission = defaultUserPermission; _defaultUserPermission = defaultUserPermission;
} }
public User add(UserRegisterDTO registerDTO, string hashedPassword, byte[] salt) public User? add(UserRegisterDTO registerDTO, string hashedPassword, byte[] salt, User? user = null, ulong? permissionId = null)
{ {
Permission? defaultPermission = _permissionService.getNoAuthentication(_defaultUserPermission); Permission? defaultPermission = _permissionService.getNoAuthentication(_defaultUserPermission);
if (defaultPermission == null) if (defaultPermission == null)
throw new InvalidOperationException("defaultUserPermission doesn't exist."); throw new InvalidOperationException("defaultUserPermission doesn't exist.");
@ -33,11 +32,25 @@ namespace API.Services
password = hashedPassword, password = hashedPassword,
salt = salt, salt = salt,
permissionId = defaultPermission.id, permissionId = permissionId ?? defaultPermission.id,
updated = DateTime.Now updated = DateTime.Now
}; };
if (permissionId != null && user != null)
{
model.permissionId = permissionId.Value;
model.updater = user.id;
UserDTO userDTO = new UserDTO();
userDTO.adaptFromModel(user);
if (!_auth.canAdd(userDTO, user))
return null;
Context.Add(model);
Context.SaveChanges();
return model;
}
Context.Add(model); Context.Add(model);
Context.SaveChanges(); Context.SaveChanges();

View File

@ -1,4 +1,5 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADbContext_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002Econfig_003FJetBrains_003FRider2024_002E2_003Fresharper_002Dhost_003FSourcesCache_003F3bd4df5aff92cabbc4d630be64227073db1b8539b3a1e47786b4b189d7cdb7_003FDbContext_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=d51071ba_002D6946_002D464f_002Db1ff_002D8183035b48e5/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" IsActive="True" Name="Test1" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt; <s:String x:Key="/Default/Environment/UnitTesting/UnitTestSessionStore/Sessions/=d51071ba_002D6946_002D464f_002Db1ff_002D8183035b48e5/@EntryIndexedValue">&lt;SessionState ContinuousTestingMode="0" IsActive="True" Name="Test1" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"&gt;
&lt;TestAncestor&gt; &lt;TestAncestor&gt;
&lt;TestId&gt;NUnit3x::089ACCAD-8117-4C24-9429-56A394AC4734::net5.0::unitTests.Tests.Test1&lt;/TestId&gt; &lt;TestId&gt;NUnit3x::089ACCAD-8117-4C24-9429-56A394AC4734::net5.0::unitTests.Tests.Test1&lt;/TestId&gt;