Use actual ISO8601 timestamps for masto API (#425)
Some checks are pending
ci/woodpecker/push/woodpecker Pipeline is pending
Some checks are pending
ci/woodpecker/push/woodpecker Pipeline is pending
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: #425 Co-authored-by: darkkirb <lotte@chir.rs> Co-committed-by: darkkirb <lotte@chir.rs>
This commit is contained in:
parent
0d56adc16b
commit
a8cd859ef9
2 changed files with 22 additions and 7 deletions
|
@ -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