Replace String.to_integer with safe Integer.parse

Use Integer.parse/1 instead of String.to_integer/1 on user-supplied
and external API input to prevent ArgumentError crashes on non-numeric
values. Adds fallback defaults or nil returns at each call site.
This commit is contained in:
Claudio Ortolina
2026-03-05 14:27:37 +00:00
parent 23c478fe4c
commit eb8a00ab54
6 changed files with 39 additions and 19 deletions
+2 -2
View File
@@ -282,7 +282,7 @@ defmodule MusicLibraryWeb.Components.Release do
def handle_event("scrobble_medium", %{"number" => number}, socket)
when release_loaded?(socket.assigns) do
release_with_tracks = socket.assigns.release_with_tracks.result
number = String.to_integer(number)
{number, ""} = Integer.parse(number)
case ScrobbleActivity.scrobble_medium(number, release_with_tracks,
finished_at: DateTime.utc_now()
@@ -324,7 +324,7 @@ defmodule MusicLibraryWeb.Components.Release do
end
def handle_event("toggle_medium", %{"medium-number" => number}, socket) do
number = String.to_integer(number)
{number, ""} = Integer.parse(number)
selected_tracks = socket.assigns.selected_tracks
release_with_tracks = socket.assigns.release_with_tracks.result
@@ -28,15 +28,8 @@ defmodule MusicLibraryWeb.CollectionController do
end
def index(conn, params) do
limit =
params
|> Map.get("limit", "20")
|> String.to_integer()
offset =
params
|> Map.get("offset", "0")
|> String.to_integer()
limit = parse_int(params["limit"], 20)
offset = parse_int(params["offset"], 0)
total = Collection.search_records_count("")
@@ -44,4 +37,15 @@ defmodule MusicLibraryWeb.CollectionController do
render(conn, :index, total: total, limit: limit, offset: offset, records: records)
end
defp parse_int(nil, default), do: default
defp parse_int(value, default) when is_binary(value) do
case Integer.parse(value) do
{int, ""} -> int
_ -> default
end
end
defp parse_int(_, default), do: default
end
@@ -162,7 +162,7 @@ defmodule MusicLibraryWeb.ScrobbleLive.Show do
end
def handle_event("scrobble_medium", %{"medium_number" => number}, socket) do
number = String.to_integer(number)
{number, ""} = Integer.parse(number)
case ScrobbleActivity.scrobble_medium(number, socket.assigns.release,
finished_at: DateTime.utc_now()