Use actual ISO8601 timestamps for masto API (#425)
Some users post posts with spoofed timestamp, and some clients will have issues with certain dates. Tusky for example crashes if the date is any sooner than 1 BCE (“year zero” in the representation). I limited the range of what is considered a valid date to be somewhere between the years 1583 and 9999 (inclusive). The numbers have been chosen because: - ISO 8601 only allows years before 1583 with “mutual agreement” - Years after 9999 could cause issues with certain clients as well Co-authored-by: Charlotte 🦝 Delenk <lotte@chir.rs> Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma/pulls/425 Co-authored-by: darkkirb <lotte@chir.rs> Co-committed-by: darkkirb <lotte@chir.rs>
This commit is contained in:
parent
0d56adc16b
commit
a8cd859ef9
|
@ -328,20 +328,27 @@ def date_to_asctime(date) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def to_masto_date(%NaiveDateTime{} = date) do
|
def to_masto_date(%NaiveDateTime{} = date) do
|
||||||
date
|
# NOTE: Elixir’s ISO 8601 format is a superset of the real standard
|
||||||
|> NaiveDateTime.to_iso8601()
|
# It supports negative years for example.
|
||||||
|> String.replace(~r/(\.\d+)?$/, ".000Z", global: false)
|
# ISO8601 only supports years before 1583 with mutual agreement
|
||||||
|
if date.year < 1583 do
|
||||||
|
"1970-01-01T00:00:00Z"
|
||||||
|
else
|
||||||
|
date
|
||||||
|
|> NaiveDateTime.to_iso8601()
|
||||||
|
|> String.replace(~r/(\.\d+)?$/, ".000Z", global: false)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def to_masto_date(date) when is_binary(date) do
|
def to_masto_date(date) when is_binary(date) do
|
||||||
with {:ok, date} <- NaiveDateTime.from_iso8601(date) do
|
with {:ok, date} <- NaiveDateTime.from_iso8601(date) do
|
||||||
to_masto_date(date)
|
to_masto_date(date)
|
||||||
else
|
else
|
||||||
_ -> ""
|
_ -> "1970-01-01T00:00:00Z"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def to_masto_date(_), do: ""
|
def to_masto_date(_), do: "1970-01-01T00:00:00Z"
|
||||||
|
|
||||||
defp shortname(name) do
|
defp shortname(name) do
|
||||||
with max_length when max_length > 0 <-
|
with max_length when max_length > 0 <-
|
||||||
|
|
|
@ -495,8 +495,16 @@ test "removes microseconds from date (String)" do
|
||||||
assert Utils.to_masto_date("2015-01-23T23:50:07.123Z") == "2015-01-23T23:50:07.000Z"
|
assert Utils.to_masto_date("2015-01-23T23:50:07.123Z") == "2015-01-23T23:50:07.000Z"
|
||||||
end
|
end
|
||||||
|
|
||||||
test "returns empty string when date invalid" do
|
test "returns unix epoch when date invalid" do
|
||||||
assert Utils.to_masto_date("2015-01?23T23:50:07.123Z") == ""
|
assert Utils.to_masto_date("2015-01?23T23:50:07.123Z") == "1970-01-01T00:00:00Z"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "returns unix epoch when date is before the introduction of the Gregorian Calendar" do
|
||||||
|
assert Utils.to_masto_date("0621-01-01T00:00:00Z") == "1970-01-01T00:00:00Z"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "returns unix epoch when date is BCE" do
|
||||||
|
assert Utils.to_masto_date("-0420-01-01T00:00:00Z") == "1970-01-01T00:00:00Z"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue