Skip to content

Commit e5fa232

Browse files
committed
Merge branch 'develop' into feature/hub-more-info
2 parents 603d741 + c8406a4 commit e5fa232

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+1940
-150
lines changed

API/Controller/Account/Login.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using Asp.Versioning;
55
using OpenShock.API.Services.Account;
66
using OpenShock.Common;
7+
using OpenShock.Common.Constants;
78
using OpenShock.Common.Errors;
89
using OpenShock.Common.Problems;
910
using OpenShock.Common.Utils;
@@ -41,7 +42,7 @@ public async Task<IActionResult> Login(
4142

4243
HttpContext.Response.Cookies.Append("openShockSession", loginAction.AsT0.Value, new CookieOptions
4344
{
44-
Expires = new DateTimeOffset(DateTime.UtcNow.Add(Constants.LoginSessionLifetime)),
45+
Expires = new DateTimeOffset(DateTime.UtcNow.Add(Duration.LoginSessionLifetime)),
4546
Secure = true,
4647
HttpOnly = true,
4748
SameSite = SameSiteMode.Strict,

API/Controller/Account/LoginV2.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using Asp.Versioning;
55
using OpenShock.API.Services.Account;
66
using OpenShock.Common;
7+
using OpenShock.Common.Constants;
78
using OpenShock.Common.Errors;
89
using OpenShock.Common.Problems;
910
using OpenShock.Common.Services.Turnstile;
@@ -48,7 +49,7 @@ public async Task<IActionResult> LoginV2(
4849

4950
HttpContext.Response.Cookies.Append("openShockSession", loginAction.AsT0.Value, new CookieOptions
5051
{
51-
Expires = new DateTimeOffset(DateTime.UtcNow.Add(Constants.LoginSessionLifetime)),
52+
Expires = new DateTimeOffset(DateTime.UtcNow.Add(Duration.LoginSessionLifetime)),
5253
Secure = true,
5354
HttpOnly = true,
5455
SameSite = SameSiteMode.Strict,

API/Controller/Tokens/TokenController.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using OpenShock.API.Utils;
77
using OpenShock.Common;
88
using OpenShock.Common.Authentication.Attributes;
9+
using OpenShock.Common.Constants;
910
using OpenShock.Common.Errors;
1011
using OpenShock.Common.Models;
1112
using OpenShock.Common.OpenShockDb;
@@ -108,7 +109,7 @@ public async Task<TokenCreatedResponse> CreateToken([FromBody] CreateTokenReques
108109
var token = new ApiToken
109110
{
110111
UserId = CurrentUser.DbUser.Id,
111-
Token = CryptoUtils.RandomString(64),
112+
Token = CryptoUtils.RandomString(HardLimits.ApiKeyTokenMaxLength),
112113
CreatedByIp = HttpContext.GetRemoteIP().ToString(),
113114
Permissions = body.Permissions.Distinct().ToList(),
114115
Id = Guid.NewGuid(),
@@ -150,9 +151,10 @@ public async Task<IActionResult> EditToken([FromRoute] Guid tokenId, [FromBody]
150151

151152
public class EditTokenRequest
152153
{
153-
[StringLength(64, ErrorMessage = "Name must be less than 64 characters")]
154+
[StringLength(HardLimits.ApiKeyTokenMaxLength, MinimumLength = HardLimits.ApiKeyTokenMinLength, ErrorMessage = "API token length must be between {1} and {2}")]
154155
public required string Name { get; set; }
155-
[MaxLength(256, ErrorMessage = "You can only have 256 permissions, this is a hard limit")]
156+
157+
[MaxLength(HardLimits.ApiKeyMaxPermissions, ErrorMessage = "API token permissions must be between {1} and {2}")]
156158
public List<PermissionType> Permissions { get; set; } = [PermissionType.Shockers_Use];
157159
}
158160

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1-
namespace OpenShock.API.Models.Requests;
1+

2+
using OpenShock.Common.DataAnnotations;
3+
4+
namespace OpenShock.API.Models.Requests;
25

36
public sealed class ChangeEmailRequest
47
{
8+
[EmailAddress(true)]
59
public required string Email { get; set; }
610
}
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1-
namespace OpenShock.API.Models.Requests;
1+
using System.ComponentModel.DataAnnotations;
2+
using OpenShock.Common.DataAnnotations;
3+
4+
namespace OpenShock.API.Models.Requests;
25

36
public sealed class ChangePasswordRequest
47
{
8+
[Required(AllowEmptyStrings = false)]
59
public required string OldPassword { get; set; }
10+
11+
[Password(true)]
612
public required string NewPassword { get; set; }
713
}
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1-
namespace OpenShock.API.Models.Requests;
1+
using System.ComponentModel.DataAnnotations;
2+
using OpenShock.Common.Constants;
3+
using OpenShock.Common.DataAnnotations;
4+
5+
namespace OpenShock.API.Models.Requests;
26

37
public sealed class ChangeUsernameRequest
48
{
9+
[Username(true)]
510
public required string Username { get; init; }
611
}

API/Models/Requests/CreateShareRequest.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
using System.ComponentModel.DataAnnotations;
2+
using OpenShock.Common.Constants;
23

34
namespace OpenShock.API.Models.Requests;
45

56
public sealed class CreateShareRequest
67
{
7-
[MaxLength(128)] // Hard limit
8+
[MaxLength(HardLimits.CreateShareRequestMaxShockers)]
89
public required IEnumerable<ShockerPermLimitPairWithId> Shockers { get; set; }
910
public Guid? User { get; set; } = null;
1011
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
using System.ComponentModel.DataAnnotations;
2+
using OpenShock.Common.Constants;
23

34
namespace OpenShock.API.Models.Requests;
45

56
public sealed class HubCreateRequest
67
{
78
[Required(AllowEmptyStrings = false)]
8-
[StringLength(32, MinimumLength = 1)]
9+
[StringLength(HardLimits.HubNameMaxLength, MinimumLength = HardLimits.HubNameMinLength)]
910
public required string Name { get; init; }
1011
}

API/Models/Requests/HubEditRequest.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
using System.ComponentModel.DataAnnotations;
2+
using OpenShock.Common.Constants;
23

34
namespace OpenShock.API.Models.Requests;
45

56
public sealed class HubEditRequest
67
{
78
[Required(AllowEmptyStrings = false)]
8-
[StringLength(32, MinimumLength = 1)]
9+
[StringLength(HardLimits.HubNameMaxLength, MinimumLength = HardLimits.HubNameMinLength)]
910
public required string Name { get; set; }
1011
}

API/Models/Requests/Login.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
using System.ComponentModel.DataAnnotations;
2+
using OpenShock.Common.Constants;
23

34
namespace OpenShock.API.Models.Requests;
45

56
public sealed class Login
67
{
7-
[MinLength(1)]
8+
[Required(AllowEmptyStrings = false)]
89
public required string Password { get; set; }
9-
[MinLength(1)]
10+
11+
[Required(AllowEmptyStrings = false)]
1012
public required string Email { get; set; }
1113
}

API/Models/Requests/LoginV2.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
using System.ComponentModel.DataAnnotations;
2+
using OpenShock.Common.Constants;
23

34
namespace OpenShock.API.Models.Requests;
45

56
public sealed class LoginV2
67
{
7-
[Required(AllowEmptyStrings = false)] public required string Password { get; set; }
8-
[Required(AllowEmptyStrings = false)] public required string Email { get; set; }
9-
[Required(AllowEmptyStrings = false)] public required string TurnstileResponse { get; set; }
8+
[Required(AllowEmptyStrings = false)]
9+
public required string Password { get; set; }
10+
11+
[Required(AllowEmptyStrings = false)]
12+
public required string Email { get; set; }
13+
14+
[Required(AllowEmptyStrings = false)]
15+
public required string TurnstileResponse { get; set; }
1016
}

API/Models/Requests/NewShocker.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
using System.ComponentModel.DataAnnotations;
2+
using OpenShock.Common.Constants;
23
using OpenShock.Common.Models;
34

45
namespace OpenShock.API.Models.Requests;
56

67
public sealed class NewShocker
78
{
8-
[StringLength(48, MinimumLength = 1)] public required string Name { get; set; }
9+
[Required(AllowEmptyStrings = false)]
10+
[StringLength(HardLimits.ShockerNameMaxLength, MinimumLength = HardLimits.ShockerNameMinLength)]
11+
public required string Name { get; set; }
912
public required ushort RfId { get; set; }
1013
public required Guid Device { get; set; }
1114
public required ShockerModelType Model { get; set; }
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1-
namespace OpenShock.API.Models.Requests;
1+
using System.ComponentModel.DataAnnotations;
2+
using OpenShock.Common.Constants;
3+
4+
namespace OpenShock.API.Models.Requests;
25

36
public sealed class ShareLinkCreate
47
{
8+
[Required(AllowEmptyStrings = false)]
9+
[StringLength(HardLimits.ShockerShareLinkNameMaxLength, MinimumLength = HardLimits.ShockerShareLinkNameMinLength)]
510
public required string Name { get; set; }
611
public DateTime? ExpiresOn { get; set; } = null;
712
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.ComponentModel.DataAnnotations;
22
using OpenShock.API.Models.Response;
33
using OpenShock.Common;
4+
using OpenShock.Common.Constants;
45

56
namespace OpenShock.API.Models.Requests;
67

@@ -9,6 +10,6 @@ public sealed class ShareLinkEditShocker
910
public required ShockerPermissions Permissions { get; set; }
1011
public required ShockerLimits Limits { get; set; }
1112

12-
[Range(Constants.MinControlDuration, Constants.MaxControlDuration)]
13+
[Range(HardLimits.MinControlDuration, HardLimits.MaxControlDuration)]
1314
public ushort? Cooldown { get; set; }
1415
}

API/Models/Requests/Signup.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System.ComponentModel.DataAnnotations;
1+
using OpenShock.Common.Constants;
22
using OpenShock.Common.DataAnnotations;
33

44
namespace OpenShock.API.Models.Requests;
@@ -7,8 +7,10 @@ public sealed class SignUp
77
{
88
[Username(true)]
99
public required string Username { get; set; }
10-
[StringLength(256, MinimumLength = 12)]
10+
11+
[Password(true)]
1112
public required string Password { get; set; }
12-
[EmailAddress]
13+
14+
[EmailAddress(true)]
1315
public required string Email { get; set; }
1416
}

API/Models/Requests/SignupV2.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
1-
using System.ComponentModel.DataAnnotations;
2-
using OpenShock.Common.DataAnnotations;
1+
using OpenShock.Common.DataAnnotations;
32

43
namespace OpenShock.API.Models.Requests;
54

65
public sealed class SignUpV2
76
{
87
[Username(true)]
98
public required string Username { get; set; }
10-
[StringLength(256, MinimumLength = 12)]
9+
10+
[Password(true)]
1111
public required string Password { get; set; }
12-
[EmailAddress]
12+
13+
[EmailAddress(true)]
1314
public required string Email { get; set; }
14-
[Required(AllowEmptyStrings = false)] public required string TurnstileResponse { get; set; }
15+
16+
[System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = false)]
17+
public required string TurnstileResponse { get; set; }
1518
}

API/Models/Response/ShockerLimits.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
using OpenShock.Common;
22
using System.ComponentModel.DataAnnotations;
3+
using OpenShock.Common.Constants;
34

45
namespace OpenShock.API.Models.Response;
56

67
public sealed class ShockerLimits
78
{
8-
[Range(Constants.MinControlIntensity, Constants.MaxControlIntensity)]
9+
[Range(HardLimits.MinControlIntensity, HardLimits.MaxControlIntensity)]
910
public required byte? Intensity { get; set; }
1011

11-
[Range(Constants.MinControlDuration, Constants.MaxControlDuration)]
12+
[Range(HardLimits.MinControlDuration, HardLimits.MaxControlDuration)]
1213
public required ushort? Duration { get; set; }
1314
}

API/Services/Account/AccountService.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using OpenShock.API.Services.Email.Mailjet.Mail;
88
using OpenShock.API.Utils;
99
using OpenShock.Common;
10+
using OpenShock.Common.Constants;
1011
using OpenShock.Common.OpenShockDb;
1112
using OpenShock.Common.Redis;
1213
using OpenShock.Common.Utils;
@@ -131,8 +132,8 @@ await _loginSessions.InsertAsync(new LoginSession
131132
Ip = loginContext.Ip,
132133
PublicId = Guid.NewGuid(),
133134
Created = DateTime.UtcNow,
134-
Expires = DateTime.UtcNow.Add(Constants.LoginSessionLifetime),
135-
}, Constants.LoginSessionLifetime);
135+
Expires = DateTime.UtcNow.Add(Duration.LoginSessionLifetime),
136+
}, Duration.LoginSessionLifetime);
136137

137138
return new Success<string>(randomSessionId);
138139
}
@@ -141,7 +142,7 @@ await _loginSessions.InsertAsync(new LoginSession
141142
public async Task<OneOf<Success, NotFound, SecretInvalid>> PasswordResetExists(Guid passwordResetId, string secret,
142143
CancellationToken cancellationToken = default)
143144
{
144-
var validUntil = DateTime.UtcNow.Add(Constants.PasswordResetRequestLifetime);
145+
var validUntil = DateTime.UtcNow.Add(Duration.PasswordResetRequestLifetime);
145146
var reset = await _db.PasswordResets.FirstOrDefaultAsync(x =>
146147
x.Id == passwordResetId && x.UsedOn == null && x.CreatedOn < validUntil,
147148
cancellationToken: cancellationToken);
@@ -154,7 +155,7 @@ public async Task<OneOf<Success, NotFound, SecretInvalid>> PasswordResetExists(G
154155
/// <inheritdoc />
155156
public async Task<OneOf<Success, TooManyPasswordResets, NotFound>> CreatePasswordReset(string email)
156157
{
157-
var validUntil = DateTime.UtcNow.Add(Constants.PasswordResetRequestLifetime);
158+
var validUntil = DateTime.UtcNow.Add(Duration.PasswordResetRequestLifetime);
158159
var lowerCaseEmail = email.ToLowerInvariant();
159160
var user = await _db.Users.Where(x => x.Email == lowerCaseEmail).Select(x => new
160161
{
@@ -185,7 +186,7 @@ await _emailService.PasswordReset(new Contact(user.User.Email, user.User.Name),
185186
public async Task<OneOf<Success, NotFound, SecretInvalid>> PasswordResetComplete(Guid passwordResetId,
186187
string secret, string newPassword)
187188
{
188-
var validUntil = DateTime.UtcNow.Add(Constants.PasswordResetRequestLifetime);
189+
var validUntil = DateTime.UtcNow.Add(Duration.PasswordResetRequestLifetime);
189190

190191
var reset = await _db.PasswordResets.Include(x => x.User).FirstOrDefaultAsync(x =>
191192
x.Id == passwordResetId && x.UsedOn == null && x.CreatedOn < validUntil);
@@ -218,7 +219,7 @@ public async Task<OneOf<Success, Error<OneOf<UsernameTaken, UsernameError, Recen
218219
ChangeUsername(Guid userId,
219220
string username, bool ignoreLimit = false)
220221
{
221-
var cooldownSubtracted = DateTime.UtcNow.Subtract(Constants.NameChangeCooldown);
222+
var cooldownSubtracted = DateTime.UtcNow.Subtract(Duration.NameChangeCooldown);
222223
if (!ignoreLimit && await _db.UsersNameChanges.Where(x => x.UserId == userId && x.CreatedOn >= cooldownSubtracted).AnyAsync())
223224
{
224225
return new Error<OneOf<UsernameTaken, UsernameError, RecentlyChanged>>(new RecentlyChanged());

Common.Tests/Geo/DistanceLookupTests.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using OpenShock.Common.Geo;
1+
using OpenShock.Common.Constants;
2+
using OpenShock.Common.Geo;
23

34
namespace OpenShock.Common.Tests.Geo;
45

@@ -29,6 +30,6 @@ public async Task TryGetDistanceBetween_UnknownCountry(string str1, string str2)
2930

3031
// Assert
3132
await Assert.That(result).IsFalse();
32-
await Assert.That(distance).IsEqualTo(Constants.DistanceToAndromedaGalaxyInKm);
33+
await Assert.That(distance).IsEqualTo(Distance.DistanceToAndromedaGalaxyInKm);
3334
}
3435
}

Common/Authentication/Handlers/LoginSessionAuthentication.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Microsoft.EntityFrameworkCore;
77
using Microsoft.Extensions.Options;
88
using OpenShock.Common.Authentication.Services;
9+
using OpenShock.Common.Constants;
910
using OpenShock.Common.Errors;
1011
using OpenShock.Common.Models;
1112
using OpenShock.Common.OpenShockDb;
@@ -100,14 +101,14 @@ private async Task<AuthenticateResult> SessionAuth(string sessionKey)
100101
// This can be removed at a later point, this is just for upgrade purposes
101102
if(UpdateOlderLoginSessions(session)) await _userSessions.SaveAsync();
102103

103-
if (session.Expires!.Value < DateTime.UtcNow.Subtract(Constants.LoginSessionExpansionAfter))
104+
if (session.Expires!.Value < DateTime.UtcNow.Subtract(Duration.LoginSessionExpansionAfter))
104105
{
105106
#pragma warning disable CS4014
106107
LucTask.Run(async () =>
107108
#pragma warning restore CS4014
108109
{
109-
session.Expires = DateTime.UtcNow.Add(Constants.LoginSessionLifetime);
110-
await _userSessions.UpdateAsync(session, Constants.LoginSessionLifetime);
110+
session.Expires = DateTime.UtcNow.Add(Duration.LoginSessionLifetime);
111+
await _userSessions.UpdateAsync(session, Duration.LoginSessionLifetime);
111112
});
112113
}
113114

0 commit comments

Comments
 (0)