Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion src/Messaging/Messages/Server/LoginResponse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ public LoginResponse(bool succeeded, string message, IPAddress ipAddress = null,
public bool IsSupporter { get; }

/// <summary>
/// Gets the reason for a login failure.
/// Gets the MOTD if <see cref="Succeeded"/> is true, or the reason for a login failure if it is false.
/// </summary>
public string Message { get; }

Expand Down Expand Up @@ -108,6 +108,11 @@ public static LoginResponse FromByteArray(byte[] bytes)
hash = reader.ReadString();
isSupporter = reader.ReadByte() == 1;
}
else if (reader.HasMoreData)
{
var detail = reader.ReadString();
msg += string.IsNullOrWhiteSpace(detail) ? string.Empty : ": " + detail;
}

return new LoginResponse(succeeded, msg, ipAddress, hash, isSupporter);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,65 @@ public void Parse_Returns_Expected_Data_On_Failure()
Assert.Equal(str, response.Message);
}

[Trait("Category", "Parse")]
[Fact(DisplayName = "Parse appends rejection detail to message on failure with detail")]
public void Parse_Appends_Rejection_Detail_To_Message_On_Failure_With_Detail()
{
var detail = RandomGuid;

var msg = new MessageBuilder()
.WriteCode(MessageCode.Server.Login)
.WriteByte(0)
.WriteString("INVALIDUSERNAME")
.WriteString(detail)
.Build();

var response = LoginResponse.FromByteArray(msg);

Assert.False(response.Succeeded);
Assert.Equal($"INVALIDUSERNAME: {detail}", response.Message);
}

[Trait("Category", "Parse")]
[Fact(DisplayName = "Parse does not throw on INVALIDUSERNAME failure without detail")]
public void Parse_Does_Not_Throw_On_Invalid_Username_Failure_Without_Detail()
{
var msg = new MessageBuilder()
.WriteCode(MessageCode.Server.Login)
.WriteByte(0)
.WriteString("INVALIDUSERNAME")
.Build();

LoginResponse response = null;

var ex = Record.Exception(() => response = LoginResponse.FromByteArray(msg));

Assert.Null(ex);

Assert.False(response.Succeeded);
Assert.Equal("INVALIDUSERNAME", response.Message);
}

[Trait("Category", "Parse")]
[Theory(DisplayName = "Parse does not append rejection detail to message on failure with blank detail")]
[InlineData("")]
[InlineData(" ")]
[InlineData(" ")]
public void Parse_Does_Not_Append_Rejection_Detail_To_Message_On_Failure_With_Blank_Detail(string detail)
{
var msg = new MessageBuilder()
.WriteCode(MessageCode.Server.Login)
.WriteByte(0)
.WriteString("INVALIDUSERNAME")
.WriteString(detail)
.Build();

var response = LoginResponse.FromByteArray(msg);

Assert.False(response.Succeeded);
Assert.Equal("INVALIDUSERNAME", response.Message);
}

[Trait("Category", "Parse")]
[Fact(DisplayName = "Parse returns expected data on success")]
public void Parse_Returns_Expected_Data_On_Success()
Expand Down
Loading