credo fixes
This commit is contained in:
parent
e94cae3435
commit
124d68d28d
5 changed files with 87 additions and 74 deletions
|
|
@ -159,17 +159,7 @@ defmodule SnmpKit.SnmpLib.HostParser do
|
|||
# Keyword list input: [host: ..., port: ...]
|
||||
def parse([_ | _] = input, default_port) when is_list(input) do
|
||||
if Keyword.keyword?(input) do
|
||||
host = Keyword.get(input, :host)
|
||||
port = Keyword.get(input, :port, default_port)
|
||||
|
||||
if host do
|
||||
with {:ok, {ip_tuple, _}} <- parse(host, default_port),
|
||||
:ok <- validate_port(port) do
|
||||
{:ok, {ip_tuple, port}}
|
||||
end
|
||||
else
|
||||
{:error, :missing_host}
|
||||
end
|
||||
parse_keyword(input, default_port)
|
||||
else
|
||||
# Try as charlist
|
||||
parse_charlist(input, default_port)
|
||||
|
|
@ -186,6 +176,20 @@ defmodule SnmpKit.SnmpLib.HostParser do
|
|||
{:error, :unsupported_format}
|
||||
end
|
||||
|
||||
defp parse_keyword(input, default_port) do
|
||||
host = Keyword.get(input, :host)
|
||||
port = Keyword.get(input, :port, default_port)
|
||||
|
||||
if host do
|
||||
with {:ok, {ip_tuple, _}} <- parse(host, default_port),
|
||||
:ok <- validate_port(port) do
|
||||
{:ok, {ip_tuple, port}}
|
||||
end
|
||||
else
|
||||
{:error, :missing_host}
|
||||
end
|
||||
end
|
||||
|
||||
# Private helper functions
|
||||
|
||||
defp parse_string(input, default_port) do
|
||||
|
|
@ -238,18 +242,7 @@ defmodule SnmpKit.SnmpLib.HostParser do
|
|||
length(parts) == 2 ->
|
||||
# Likely IPv4:port
|
||||
[host_part, port_part] = parts
|
||||
|
||||
case Integer.parse(port_part) do
|
||||
{port, ""} ->
|
||||
with {:ok, ip_tuple} <- parse_ipv4_address(host_part),
|
||||
:ok <- validate_port(port) do
|
||||
{:ok, {ip_tuple, port}}
|
||||
end
|
||||
|
||||
_ ->
|
||||
# Port part is not a number, might be IPv6
|
||||
parse_ip_without_port(input, default_port)
|
||||
end
|
||||
parse_host_with_port(host_part, port_part, input, default_port)
|
||||
|
||||
length(parts) > 2 ->
|
||||
# Definitely IPv6
|
||||
|
|
@ -260,6 +253,20 @@ defmodule SnmpKit.SnmpLib.HostParser do
|
|||
end
|
||||
end
|
||||
|
||||
defp parse_host_with_port(host_part, port_part, input, default_port) do
|
||||
case Integer.parse(port_part) do
|
||||
{port, ""} ->
|
||||
with {:ok, ip_tuple} <- parse_ipv4_address(host_part),
|
||||
:ok <- validate_port(port) do
|
||||
{:ok, {ip_tuple, port}}
|
||||
end
|
||||
|
||||
_ ->
|
||||
# Port part is not a number, might be IPv6
|
||||
parse_ip_without_port(input, default_port)
|
||||
end
|
||||
end
|
||||
|
||||
defp parse_ip_without_port(input, default_port) do
|
||||
parser =
|
||||
cond do
|
||||
|
|
|
|||
|
|
@ -337,12 +337,7 @@ defmodule SnmpKit.SnmpLib.Manager do
|
|||
with {:ok, socket} <- create_socket(opts) do
|
||||
results = get_multi_with_socket(socket, host, normalized_oids, opts)
|
||||
:ok = close_socket(socket)
|
||||
|
||||
# Check if all operations failed due to network issues
|
||||
case check_for_global_failure(results) do
|
||||
{:global_failure, reason} -> {:error, reason}
|
||||
:mixed_results -> {:ok, results}
|
||||
end
|
||||
process_multi_results(results)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -948,7 +943,7 @@ defmodule SnmpKit.SnmpLib.Manager do
|
|||
end
|
||||
|
||||
# Check if all results failed with the same network-related error
|
||||
defp check_for_global_failure(results) do
|
||||
defp process_multi_results(results) do
|
||||
errors =
|
||||
Enum.filter(results, fn
|
||||
{_oid, {:error, _}} -> true
|
||||
|
|
@ -969,14 +964,14 @@ defmodule SnmpKit.SnmpLib.Manager do
|
|||
^same ->
|
||||
# All errors are network errors, return the first one as global failure
|
||||
{_oid, {:error, reason}} = hd(errors)
|
||||
{:global_failure, reason}
|
||||
{:error, reason}
|
||||
|
||||
_ ->
|
||||
:mixed_results
|
||||
{:ok, results}
|
||||
end
|
||||
|
||||
_ ->
|
||||
:mixed_results
|
||||
{:ok, results}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -101,29 +101,36 @@ defmodule ToweropsWeb.Api.V1.MibController do
|
|||
def delete(conn, %{"vendor" => vendor}) do
|
||||
with :ok <- require_superuser(conn) do
|
||||
vendor_dir = Path.join(@mib_dir, vendor)
|
||||
delete_vendor_mibs(conn, vendor, vendor_dir)
|
||||
end
|
||||
end
|
||||
|
||||
if File.exists?(vendor_dir) do
|
||||
case File.rm_rf(vendor_dir) do
|
||||
{:ok, _files} ->
|
||||
Logger.info("Deleted MIB files for vendor: #{vendor}")
|
||||
defp delete_vendor_mibs(conn, vendor, vendor_dir) do
|
||||
if File.exists?(vendor_dir) do
|
||||
remove_vendor_directory(conn, vendor, vendor_dir)
|
||||
else
|
||||
conn
|
||||
|> put_status(:not_found)
|
||||
|> json(%{error: "Vendor not found: #{vendor}"})
|
||||
end
|
||||
end
|
||||
|
||||
json(conn, %{
|
||||
status: "ok",
|
||||
message: "Deleted MIB files for vendor: #{vendor}"
|
||||
})
|
||||
defp remove_vendor_directory(conn, vendor, vendor_dir) do
|
||||
case File.rm_rf(vendor_dir) do
|
||||
{:ok, _files} ->
|
||||
Logger.info("Deleted MIB files for vendor: #{vendor}")
|
||||
|
||||
{:error, reason, file} ->
|
||||
Logger.error("Failed to delete MIB files for #{vendor}: #{file} - #{inspect(reason)}")
|
||||
json(conn, %{
|
||||
status: "ok",
|
||||
message: "Deleted MIB files for vendor: #{vendor}"
|
||||
})
|
||||
|
||||
{:error, reason, file} ->
|
||||
Logger.error("Failed to delete MIB files for #{vendor}: #{file} - #{inspect(reason)}")
|
||||
|
||||
conn
|
||||
|> put_status(:internal_server_error)
|
||||
|> json(%{error: "Failed to delete MIB files"})
|
||||
end
|
||||
else
|
||||
conn
|
||||
|> put_status(:not_found)
|
||||
|> json(%{error: "Vendor not found: #{vendor}"})
|
||||
end
|
||||
|> put_status(:internal_server_error)
|
||||
|> json(%{error: "Failed to delete MIB files"})
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -86,28 +86,7 @@ defmodule ToweropsWeb.UserAuth do
|
|||
superuser_id = get_session(conn, :superuser_id)
|
||||
target_user_id = get_session(conn, :target_user_id)
|
||||
|
||||
# Validate we have both IDs before attempting to fetch users
|
||||
if superuser_id && target_user_id do
|
||||
with superuser when not is_nil(superuser) <- Accounts.get_user(superuser_id),
|
||||
target_user when not is_nil(target_user) <- Accounts.get_user(target_user_id) do
|
||||
assign(conn, :current_scope, Scope.for_impersonation(superuser, target_user))
|
||||
else
|
||||
_ ->
|
||||
# Impersonation invalid, clear it
|
||||
conn
|
||||
|> delete_session(:superuser_id)
|
||||
|> delete_session(:target_user_id)
|
||||
|> delete_session(:impersonating)
|
||||
|> assign(:current_scope, Scope.for_user(nil))
|
||||
end
|
||||
else
|
||||
# Missing IDs, clear invalid impersonation state
|
||||
conn
|
||||
|> delete_session(:superuser_id)
|
||||
|> delete_session(:target_user_id)
|
||||
|> delete_session(:impersonating)
|
||||
|> assign(:current_scope, Scope.for_user(nil))
|
||||
end
|
||||
fetch_impersonation_scope(conn, superuser_id, target_user_id)
|
||||
else
|
||||
# Normal authentication flow
|
||||
with {token, conn} <- ensure_user_token(conn),
|
||||
|
|
@ -121,6 +100,31 @@ defmodule ToweropsWeb.UserAuth do
|
|||
end
|
||||
end
|
||||
|
||||
defp fetch_impersonation_scope(conn, superuser_id, target_user_id)
|
||||
when is_binary(superuser_id) and is_binary(target_user_id) do
|
||||
with superuser when not is_nil(superuser) <- Accounts.get_user(superuser_id),
|
||||
target_user when not is_nil(target_user) <- Accounts.get_user(target_user_id) do
|
||||
assign(conn, :current_scope, Scope.for_impersonation(superuser, target_user))
|
||||
else
|
||||
_ ->
|
||||
# Impersonation invalid, clear it
|
||||
clear_impersonation_session(conn)
|
||||
end
|
||||
end
|
||||
|
||||
defp fetch_impersonation_scope(conn, _superuser_id, _target_user_id) do
|
||||
# Missing IDs, clear invalid impersonation state
|
||||
clear_impersonation_session(conn)
|
||||
end
|
||||
|
||||
defp clear_impersonation_session(conn) do
|
||||
conn
|
||||
|> delete_session(:superuser_id)
|
||||
|> delete_session(:target_user_id)
|
||||
|> delete_session(:impersonating)
|
||||
|> assign(:current_scope, Scope.for_user(nil))
|
||||
end
|
||||
|
||||
defp ensure_user_token(conn) do
|
||||
if token = get_session(conn, :user_token) do
|
||||
{token, conn}
|
||||
|
|
|
|||
2
mix.lock
2
mix.lock
|
|
@ -5,7 +5,7 @@
|
|||
"cbor": {:hex, :cbor, "1.0.1", "39511158e8ea5a57c1fcb9639aaa7efde67129678fee49ebbda780f6f24959b0", [:mix], [], "hexpm", "5431acbe7a7908f17f6a9cd43311002836a34a8ab01876918d8cfb709cd8b6a2"},
|
||||
"cc_precompiler": {:hex, :cc_precompiler, "0.1.11", "8c844d0b9fb98a3edea067f94f616b3f6b29b959b6b3bf25fee94ffe34364768", [:mix], [{:elixir_make, "~> 0.7", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "3427232caf0835f94680e5bcf082408a70b48ad68a5f5c0b02a3bea9f3a075b9"},
|
||||
"comeonin": {:hex, :comeonin, "5.5.1", "5113e5f3800799787de08a6e0db307133850e635d34e9fab23c70b6501669510", [:mix], [], "hexpm", "65aac8f19938145377cee73973f192c5645873dcf550a8a6b18187d17c13ccdb"},
|
||||
"credo": {:hex, :credo, "1.7.15", "283da72eeb2fd3ccf7248f4941a0527efb97afa224bcdef30b4b580bc8258e1c", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "291e8645ea3fea7481829f1e1eb0881b8395db212821338e577a90bf225c5607"},
|
||||
"credo": {:hex, :credo, "1.7.16", "a9f1389d13d19c631cb123c77a813dbf16449a2aebf602f590defa08953309d4", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "d0562af33756b21f248f066a9119e3890722031b6d199f22e3cf95550e4f1579"},
|
||||
"db_connection": {:hex, :db_connection, "2.9.0", "a6a97c5c958a2d7091a58a9be40caf41ab496b0701d21e1d1abff3fa27a7f371", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "17d502eacaf61829db98facf6f20808ed33da6ccf495354a41e64fe42f9c509c"},
|
||||
"decimal": {:hex, :decimal, "2.3.0", "3ad6255aa77b4a3c4f818171b12d237500e63525c2fd056699967a3e7ea20f62", [:mix], [], "hexpm", "a4d66355cb29cb47c3cf30e71329e58361cfcb37c34235ef3bf1d7bf3773aeac"},
|
||||
"dialyxir": {:hex, :dialyxir, "1.4.7", "dda948fcee52962e4b6c5b4b16b2d8fa7d50d8645bbae8b8685c3f9ecb7f5f4d", [:mix], [{:erlex, ">= 0.2.8", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "b34527202e6eb8cee198efec110996c25c5898f43a4094df157f8d28f27d9efe"},
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue