Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions front/lib/front_web/controllers/settings_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,39 @@ defmodule FrontWeb.SettingsController do
)
end

def confirm_enforce_workflow(conn, _params) do
org_id = conn.assigns.organization_id
permissions = conn.assigns.permissions || %{}

if Map.get(permissions, "organization.general_settings.manage", false) do
case Models.OrganizationSettings.modify(org_id, %{"enforce_whitelist" => "true"}) do
{:ok, _updated_settings} ->
conn
|> put_flash(:notice, "Whitelist enforcement applied successfully.")
|> redirect(to: settings_path(conn, :show))

{:error, %Ecto.Changeset{} = changeset} ->
errors =
changeset.errors |> Enum.map(fn {field, {message, _}} -> "#{field}: #{message}" end)

conn
|> put_flash(:errors, errors)
|> put_flash(:alert, "Failed to apply whitelist enforcement.")
|> redirect(to: settings_path(conn, :show))

{:error, reason} ->
conn
|> put_flash(:errors, ["#{inspect(reason)}"])
|> put_flash(:alert, "Failed to apply whitelist enforcement.")
|> redirect(to: settings_path(conn, :show))
end
else
conn
|> put_flash(:alert, "Insufficient permissions.")
|> redirect(to: settings_path(conn, :show))
end
end

def confirm_delete(conn, _params) do
org_id = conn.assigns.organization_id

Expand Down
2 changes: 2 additions & 0 deletions front/lib/front_web/router.ex
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,8 @@ defmodule FrontWeb.Router do

get("/settings/confirm_delete", SettingsController, :confirm_delete)

post("/settings/confirm_enforce", SettingsController, :confirm_enforce_workflow)

delete("/settings", SettingsController, :destroy)

get("/jwt_config", OrganizationJWTConfigController, :show)
Expand Down
10 changes: 10 additions & 0 deletions front/lib/front_web/templates/settings/show.html.eex
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,16 @@
</div>
<% end %>
</div>
<div class="pv3 bt b--lighter-gray">
<div class="db b">Whitelist Enforcement</div>
<p class="measure mb2">Applies new Whitelist rules to old tags and branches</p>
<div>
<%= link "Enforce Whitelist",
to: settings_path(@conn, :confirm_enforce_workflow),
method: :post,
class: "btn btn-secondary danger" %>
</div>
</div>
<%= if FeatureProvider.feature_enabled?(:multiple_organizations, param: @conn.assigns[:organization_id]) do %>
<%= if @permissions["organization.delete"] do %>
<div class="pt3 bt b--lighter-gray">
Expand Down
82 changes: 82 additions & 0 deletions front/test/front_web/controllers/settings_controller_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ defmodule FrontWeb.SettingsControllerTest do
use FrontWeb.ConnCase
alias Support.Stubs.DB

import Mock

setup %{conn: conn} do
Cacheman.clear(:front)

Expand Down Expand Up @@ -201,6 +203,86 @@ defmodule FrontWeb.SettingsControllerTest do
end
end

describe "POST confirm_enforce_workflow" do
test "when the user lacks manage permissions => denies the request", %{
conn: conn,
organization_id: organization_id
} do
with_mock Front.Models.OrganizationSettings,
modify: fn ^organization_id, _ ->
send(self(), :modify_called)
{:ok, %{}}
end do
conn =
conn
|> post("/settings/confirm_enforce")

assert redirected_to(conn) =~ "/settings"
assert get_flash(conn, :alert) == "Insufficient permissions."
refute_received :modify_called
end
end

test "when the user can manage general settings => applies the enforcement", %{
conn: conn,
user_id: user_id,
organization_id: organization_id
} do
Support.Stubs.PermissionPatrol.add_permissions(
organization_id,
user_id,
["organization.view", "organization.general_settings.manage"]
)

with_mock Front.Models.OrganizationSettings,
modify: fn ^organization_id, %{"enforce_whitelist" => "true"} ->
send(self(), :modify_called)
{:ok, %{}}
end do
conn =
conn
|> post("/settings/confirm_enforce")

assert redirected_to(conn) == "/settings"
assert get_flash(conn, :notice) == "Whitelist enforcement applied successfully."
assert_received :modify_called
end
end

test "when enforcing fails => shows the error", %{
conn: conn,
user_id: user_id,
organization_id: organization_id
} do
Support.Stubs.PermissionPatrol.add_permissions(
organization_id,
user_id,
["organization.view", "organization.general_settings.manage"]
)

changeset = %Ecto.Changeset{
valid?: false,
changes: %{},
errors: [enforce_whitelist: {"boom", []}],
data: %{},
types: %{}
}

with_mock Front.Models.OrganizationSettings,
modify: fn ^organization_id, %{"enforce_whitelist" => "true"} ->
{:error, changeset}
end do
conn =
conn
|> post("/settings/confirm_enforce")

assert redirected_to(conn) == "/settings"
assert get_flash(conn, :alert) == "Failed to apply whitelist enforcement."
assert get_flash(conn, :errors) == ["enforce_whitelist: boom"]
end
end
end

describe "DELETE destroy" do
test "when everything works => redirects to me page", %{
conn: conn,
Expand Down