validate iso8601 when parsing to snowflake

This commit is contained in:
ouwou 2021-12-29 22:15:04 -05:00
parent 17c1f913df
commit d6da646d87
2 changed files with 8 additions and 6 deletions

View File

@ -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);

View File

@ -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 {