Skip to content

Commit

Permalink
Merge pull request #191 from dgelessus/net_safe_avatar_messages
Browse files Browse the repository at this point in the history
Implement `makeSafeForNet` more thoroughly for avatar-related messages
  • Loading branch information
zrax committed Feb 20, 2024
2 parents 8567357 + afb5959 commit 4d77e32
Show file tree
Hide file tree
Showing 14 changed files with 66 additions and 8 deletions.
2 changes: 2 additions & 0 deletions PlasMOUL/Avatar/ArmatureBrain.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ namespace MOUL
void read(DS::Stream* stream) override;
void write(DS::Stream* stream) const override;

virtual bool makeSafeForNet() { return true; }

protected:
ArmatureBrain(uint16_t type) : Creatable(type) { }
};
Expand Down
12 changes: 12 additions & 0 deletions PlasMOUL/Avatar/AvBrainGeneric.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,3 +89,15 @@ void MOUL::AvBrainGeneric::write(DS::Stream* stream) const
stream->write<uint8_t>(m_bodyUsage);
m_recipient.write(stream);
}

bool MOUL::AvBrainGeneric::makeSafeForNet()
{
// These fields can contain arbitrary messages,
// so we must check them before sending the brain to other clients.
// The client never uses these fields for brains sent over the network though,
// so for simplicity, don't allow them over the network at all.
// If this causes issues, we could specifically allow NotifyMsg
// (the only message type that the client puts in these fields)
// or recursively call makeSafeForNet() on the messages.
return m_startMessage == nullptr && m_endMessage == nullptr;
}
2 changes: 2 additions & 0 deletions PlasMOUL/Avatar/AvBrainGeneric.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ namespace MOUL
void read(DS::Stream* stream) override;
void write(DS::Stream* stream) const override;

bool makeSafeForNet() override;

public:
std::vector<AnimStage*> m_stages;
int32_t m_curStage;
Expand Down
5 changes: 5 additions & 0 deletions PlasMOUL/Avatar/AvTask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,8 @@ void MOUL::AvTaskBrain::write(DS::Stream* stream) const
{
Factory::WriteCreatable(stream, m_brain);
}

bool MOUL::AvTaskBrain::makeSafeForNet()
{
return m_brain == nullptr || m_brain->makeSafeForNet();
}
5 changes: 5 additions & 0 deletions PlasMOUL/Avatar/AvTask.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ namespace MOUL
{
class AvTask : public Creatable
{
public:
virtual bool makeSafeForNet() { return true; }

protected:
AvTask(uint16_t type) : Creatable(type) { }
};
Expand Down Expand Up @@ -84,6 +87,8 @@ namespace MOUL
void read(DS::Stream* stream) override;
void write(DS::Stream* stream) const override;

bool makeSafeForNet() override;

public:
ArmatureBrain* m_brain;

Expand Down
7 changes: 7 additions & 0 deletions PlasMOUL/Avatar/CoopCoordinator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,10 @@ void MOUL::CoopCoordinator::write(DS::Stream* s) const
s->writeSafeString(m_synchBone);
s->write<bool>(m_autoStartGuest);
}

bool MOUL::CoopCoordinator::makeSafeForNet()
{
return (m_hostBrain == nullptr || m_hostBrain->makeSafeForNet())
&& (m_guestBrain == nullptr || m_guestBrain->makeSafeForNet())
&& (m_acceptMsg == nullptr || m_acceptMsg->makeSafeForNet());
}
2 changes: 2 additions & 0 deletions PlasMOUL/Avatar/CoopCoordinator.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ namespace MOUL
void read(DS::Stream* s) override;
void write(DS::Stream* s) const override;

virtual bool makeSafeForNet();

public:
Key m_hostKey, m_guestKey;
AvBrainCoop* m_hostBrain;
Expand Down
11 changes: 11 additions & 0 deletions PlasMOUL/Messages/AvTaskMsg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ void MOUL::AvTaskMsg::write(DS::Stream* stream) const
}
}

bool MOUL::AvTaskMsg::makeSafeForNet()
{
return m_task == nullptr || m_task->makeSafeForNet();
}

void MOUL::AvPushBrainMsg::read(DS::Stream* stream)
{
AvTaskMsg::read(stream);
Expand All @@ -51,3 +56,9 @@ void MOUL::AvPushBrainMsg::write(DS::Stream* stream) const
AvTaskMsg::write(stream);
Factory::WriteCreatable(stream, m_brain);
}

bool MOUL::AvPushBrainMsg::makeSafeForNet()
{
return MOUL::AvTaskMsg::makeSafeForNet()
&& (m_brain == nullptr || m_brain->makeSafeForNet());
}
4 changes: 4 additions & 0 deletions PlasMOUL/Messages/AvTaskMsg.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ namespace MOUL
void read(DS::Stream* stream) override;
void write(DS::Stream* stream) const override;

bool makeSafeForNet() override;

protected:
AvTaskMsg(uint16_t type) : AvatarMsg(type), m_task() { }

Expand All @@ -47,6 +49,8 @@ namespace MOUL
void read(DS::Stream* stream) override;
void write(DS::Stream* stream) const override;

bool makeSafeForNet() override;

protected:
AvPushBrainMsg(uint16_t type) : AvTaskMsg(type), m_brain() { }

Expand Down
9 changes: 1 addition & 8 deletions PlasMOUL/Messages/AvatarMsg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,14 +73,7 @@ void MOUL::AvCoopMsg::write(DS::Stream* s) const

bool MOUL::AvCoopMsg::makeSafeForNet()
{
if (m_coordinator) {
if (m_coordinator->m_acceptMsg) {
// This can only be LinkToAgeMsg.
// Indeed, this will be the only way to send that msg over the wire
return m_coordinator->m_acceptMsg->type() == ID_LinkToAgeMsg;
}
}
return true;
return m_coordinator == nullptr || m_coordinator->makeSafeForNet();
}

void MOUL::AvTaskSeekDoneMsg::read(DS::Stream* stream)
Expand Down
6 changes: 6 additions & 0 deletions PlasMOUL/Messages/LoadAvatarMsg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,9 @@ void MOUL::LoadAvatarMsg::write(DS::Stream* stream) const
}
stream->writeSafeString(m_userString);
}

bool MOUL::LoadAvatarMsg::makeSafeForNet()
{
return MOUL::LoadCloneMsg::makeSafeForNet()
&& (m_initTask == nullptr || m_initTask->makeSafeForNet());
}
2 changes: 2 additions & 0 deletions PlasMOUL/Messages/LoadAvatarMsg.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ namespace MOUL
void read(DS::Stream* stream) override;
void write(DS::Stream* stream) const override;

bool makeSafeForNet() override;

public:
bool m_isPlayer;
Key m_spawnPoint;
Expand Down
5 changes: 5 additions & 0 deletions PlasMOUL/Messages/LoadCloneMsg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,8 @@ void MOUL::LoadCloneMsg::write(DS::Stream* stream) const
stream->write<bool>(m_isLoading);
Factory::WriteCreatable(stream, m_triggerMsg);
}

bool MOUL::LoadCloneMsg::makeSafeForNet()
{
return m_triggerMsg == nullptr || m_triggerMsg->makeSafeForNet();
}
2 changes: 2 additions & 0 deletions PlasMOUL/Messages/LoadCloneMsg.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ namespace MOUL
void read(DS::Stream* stream) override;
void write(DS::Stream* stream) const override;

bool makeSafeForNet() override;

public:
Key m_cloneKey, m_requestorKey;
bool m_validMsg, m_isLoading;
Expand Down

0 comments on commit 4d77e32

Please sign in to comment.