diff options
author | ouwou <26526779+ouwou@users.noreply.github.com> | 2021-12-29 22:15:04 -0500 |
---|---|---|
committer | ouwou <26526779+ouwou@users.noreply.github.com> | 2021-12-29 22:15:04 -0500 |
commit | d6da646d879a1b7f0ea2d09db2b266e3b6d0f3fa (patch) | |
tree | ff116a2f1051da22d779a16d695e488d8b7eeebe | |
parent | 17c1f913df73b43efe49a336dfa46533ceca2203 (diff) | |
download | abaddon-portaudio-d6da646d879a1b7f0ea2d09db2b266e3b6d0f3fa.tar.gz abaddon-portaudio-d6da646d879a1b7f0ea2d09db2b266e3b6d0f3fa.zip |
validate iso8601 when parsing to snowflake
-rw-r--r-- | src/discord/discord.cpp | 6 | ||||
-rw-r--r-- | src/discord/snowflake.cpp | 8 |
2 files changed, 8 insertions, 6 deletions
diff --git a/src/discord/discord.cpp b/src/discord/discord.cpp index 8c5ec93..7b0db38 100644 --- a/src/discord/discord.cpp +++ b/src/discord/discord.cpp @@ -1923,7 +1923,7 @@ void DiscordClient::HandleGatewayUserGuildSettingsUpdate(const GatewayMessage &m if (override.Muted) { if (override.MuteConfig.EndTime.has_value()) { const auto end = Snowflake::FromISO8601(*override.MuteConfig.EndTime); - if (end > now) + if (end.IsValid() && end > now) now_muted_channels.insert(override.ChannelID); } else { now_muted_channels.insert(override.ChannelID); @@ -2325,7 +2325,7 @@ void DiscordClient::HandleReadyGuildSettings(const ReadyEventData &data) { if (entry.Muted) { if (entry.MuteConfig.EndTime.has_value()) { const auto end = Snowflake::FromISO8601(*entry.MuteConfig.EndTime); - if (end > now) + if (end.IsValid() && end > now) m_muted_guilds.insert(entry.GuildID); } else { m_muted_guilds.insert(entry.GuildID); @@ -2335,7 +2335,7 @@ void DiscordClient::HandleReadyGuildSettings(const ReadyEventData &data) { if (override.Muted) { if (override.MuteConfig.EndTime.has_value()) { const auto end = Snowflake::FromISO8601(*override.MuteConfig.EndTime); - if (end > now) + if (end.IsValid() && end > now) m_muted_channels.insert(override.ChannelID); } else { m_muted_channels.insert(override.ChannelID); diff --git a/src/discord/snowflake.cpp b/src/discord/snowflake.cpp index 32f9f4f..8f470a7 100644 --- a/src/discord/snowflake.cpp +++ b/src/discord/snowflake.cpp @@ -42,9 +42,11 @@ Snowflake Snowflake::FromNow() { Snowflake Snowflake::FromISO8601(std::string_view ts) { int yr, mon, day, hr, min, sec, tzhr, tzmin; float milli; - std::sscanf(ts.data(), "%d-%d-%dT%d:%d:%d%f+%d:%d", - &yr, &mon, &day, &hr, &min, &sec, &milli, &tzhr, &tzmin); - return SecondsInterval * (util::TimeToEpoch(yr, mon, day, hr, min, sec) - DiscordEpochSeconds) + static_cast<uint64_t>(milli * static_cast<float>(SecondsInterval)); + if (std::sscanf(ts.data(), "%d-%d-%dT%d:%d:%d%f+%d:%d", + &yr, &mon, &day, &hr, &min, &sec, &milli, &tzhr, &tzmin) != 9) return Snowflake::Invalid; + const auto epoch = util::TimeToEpoch(yr, mon, day, hr, min, sec); + if (epoch < DiscordEpochSeconds) return Snowflake::Invalid; + return SecondsInterval * (epoch - DiscordEpochSeconds) + static_cast<uint64_t>(milli * static_cast<float>(SecondsInterval)); } bool Snowflake::IsValid() const { |