Skip to content

Commit e6c75d2

Browse files
committed
Test patchwork user agent with regex instead
1 parent b838d80 commit e6c75d2

File tree

3 files changed

+54
-19
lines changed

3 files changed

+54
-19
lines changed

ProjectLighthouse.Servers.GameServer/Controllers/Login/LoginController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ public async Task<IActionResult> Login()
215215

216216
if (ServerConfiguration.Instance.Authentication.RequirePatchworkUserAgent)
217217
{
218-
if (!PatchworkHelper.UserHasValidPatchworkUserAgent(this.Request.Headers.UserAgent.ToString()))
218+
if (!PatchworkHelper.IsValidPatchworkUserAgent(this.Request.Headers.UserAgent.ToString()))
219219
{
220220
return this.Forbid();
221221
}

ProjectLighthouse.Servers.GameServer/Helpers/PatchworkHelper.cs

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,21 @@
11
using LBPUnion.ProjectLighthouse.Configuration;
2+
using System.Text.RegularExpressions;
23

34
namespace LBPUnion.ProjectLighthouse.Servers.GameServer.Helpers;
45

56
public static class PatchworkHelper
67
{
7-
static int patchworkMajorVer = ServerConfiguration.Instance.Authentication.PatchworkMajorVersionMinimum;
8-
static int patchworkMinorVer = ServerConfiguration.Instance.Authentication.PatchworkMinorVersionMinimum;
9-
public static bool UserHasValidPatchworkUserAgent(string userAgent)
8+
static int requiredMajor = ServerConfiguration.Instance.Authentication.PatchworkMajorVersionMinimum;
9+
static int requiredMinor = ServerConfiguration.Instance.Authentication.PatchworkMinorVersionMinimum;
10+
public static bool IsValidPatchworkUserAgent(string userAgent)
1011
{
11-
string userAgentPrefix = "PatchworkLBP";
12-
char gameVersion = userAgent[userAgentPrefix.Length];
12+
Match result = Regex.Match(userAgent, @"^PatchworkLBP[123V] (\d{1,5})\.(\d{1,5})$");
13+
if (!result.Success) return false;
1314

14-
if (!userAgent.StartsWith(userAgentPrefix))
15+
if (!int.TryParse(result.Groups[1].Value, out int major) || !int.TryParse(result.Groups[2].Value, out int minor))
1516
return false;
1617

17-
switch (gameVersion) {
18-
case '1':
19-
case '2':
20-
case '3':
21-
case 'V':
22-
break;
23-
default:
24-
return false;
25-
}
26-
27-
string[] patchworkVer = userAgent.Split(' ')[1].Split('.');
28-
if (int.Parse(patchworkVer[0]) !>= patchworkMajorVer || int.Parse(patchworkVer[1]) !>= patchworkMinorVer)
18+
if (major < requiredMajor || minor < requiredMinor)
2919
return false;
3020

3121
return true;
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using System;
2+
using LBPUnion.ProjectLighthouse.Servers.GameServer.Helpers;
3+
using Xunit;
4+
5+
namespace ProjectLighthouse.Tests.GameApiTests.Unit.Helpers;
6+
7+
[Trait("Category", "Unit")]
8+
public class PatchworkUserAgentTests
9+
{
10+
[Fact]
11+
public void CanValidatePatchworkUserAgents()
12+
{
13+
string[] validUserAgents = {
14+
"PatchworkLBP1 1.0",
15+
"PatchworkLBP2 2.0",
16+
"PatchworkLBP3 3.0",
17+
"PatchworkLBPV 4.0",
18+
"PatchworkLBP1 1.5",
19+
};
20+
21+
string[] invalidUserAgents = {
22+
// Matching
23+
"patchworklbp1 1.0", // Case sensitive
24+
"ptchwrklbp1 1.0", // Misspelled
25+
"PatchworkLBP1 1", // Missing major/minor
26+
"PatchworkLBP1 1.000001", // Major/minor too long
27+
28+
// Data
29+
"PatchworkLBP1 0.5", // Version number too low
30+
"PatchworkLBP1 A.0" // Int cannot be parsed
31+
};
32+
33+
bool result;
34+
for (int i = 0; i < validUserAgents.Length; i++)
35+
{
36+
result = PatchworkHelper.IsValidPatchworkUserAgent(validUserAgents[i]);
37+
Assert.True(result, $"Valid user agent: \"{validUserAgents[i]}\" was evaluated as {result}.");
38+
}
39+
for (int i = 0; i < invalidUserAgents.Length; i++)
40+
{
41+
result = PatchworkHelper.IsValidPatchworkUserAgent(invalidUserAgents[i]);
42+
Assert.False(result, $"Invalid user agent: \"{invalidUserAgents[i]}\" was evaluated as {result}.");
43+
}
44+
}
45+
}

0 commit comments

Comments
 (0)