Skip to content

Commit d453c2b

Browse files
Only allow oauth login against current login method (#1353)
1 parent e551c8d commit d453c2b

File tree

7 files changed

+43
-4
lines changed

7 files changed

+43
-4
lines changed

apps/core/lib/core/schema/account.ex

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
defmodule Core.Schema.Account do
22
use Piazza.Ecto.Schema
33
use Arc.Ecto.Schema
4+
import Core.Schema.Validations
45
alias Core.Schema.{User, DomainMapping, PlatformSubscription, Address}
56

67
schema "accounts" do
@@ -64,6 +65,7 @@ defmodule Core.Schema.Account do
6465
|> generate_uuid(:icon_id)
6566
|> cast_attachments(attrs, [:icon], allow_urls: true)
6667
|> set_address_updated()
68+
|> reject_urls(:name)
6769
end
6870

6971

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
defmodule Core.Schema.Validations do
2+
import Ecto.Changeset
3+
4+
@url_regex ~r/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&\/\/=]*)/
5+
6+
def reject_urls(cs, field) do
7+
validate_change(cs, field, fn
8+
_, val when is_binary(val) ->
9+
case String.match?(val, @url_regex) do
10+
true -> [{field, "cannot contain urls"}]
11+
_ -> []
12+
end
13+
_, _ -> [{field, "must be a string"}]
14+
end)
15+
end
16+
end

apps/core/lib/core/services/cloud.ex

+7-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,13 @@ defmodule Core.Services.Cloud do
4343
|> add_operation(:cluster, fn _ -> select_cluster(attrs[:cloud], attrs[:region]) end)
4444
|> add_operation(:postgres, fn _ -> select_roach(attrs[:cloud]) end)
4545
|> add_operation(:sa, fn _ ->
46-
Accounts.create_service_account(%{name: "#{name}-cloud-sa", email: "#{name}[email protected]"}, user)
46+
Accounts.create_service_account(%{
47+
name: "#{name}-cloud-sa",
48+
email: "#{name}[email protected]",
49+
impersonation_policy: %{
50+
bindings: [%{user_id: user.id}]
51+
}
52+
}, user)
4753
end)
4854
|> add_operation(:token, fn %{sa: sa} -> Users.create_persisted_token(sa) end)
4955
|> add_operation(:install, fn %{sa: sa} ->

apps/core/lib/core/services/users.ex

+2-1
Original file line numberDiff line numberDiff line change
@@ -373,8 +373,9 @@ defmodule Core.Services.Users do
373373
|> Map.merge(login_args(service))
374374
|> Map.put(:password, Ecto.UUID.generate())
375375
|> create_user()
376-
%User{} = user ->
376+
%User{login_method: ^service} = user ->
377377
update_user(login_args(service), user)
378+
_ -> {:error, "you don't have login with #{service} enabled"}
378379
end
379380
end
380381

apps/core/test/services/accounts_test.exs

+5-1
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,10 @@ defmodule Core.Services.AccountsTest do
147147
assert account.name == "updated"
148148
end
149149

150+
test "cannot put urls in names", %{user: user} do
151+
{:error, _} = Accounts.update_account(%{name: "https://evil.com"}, user)
152+
end
153+
150154
test "if billing address is updated, it will update the stripe customer", %{user: user, account: account} do
151155
{:ok, _} = update_record(account, %{billing_customer_id: "strp"})
152156
me = self()
@@ -335,7 +339,7 @@ defmodule Core.Services.AccountsTest do
335339
assert invite.user_id == user.id
336340
end
337341

338-
test "nonroot users can create group members", %{account: account} do
342+
test "nonroot users cannot create group members", %{account: account} do
339343
{:error, _} = Accounts.create_invite(%{email: "[email protected]"}, insert(:user, account: account))
340344
end
341345
end

apps/core/test/services/cloud_test.exs

+4
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ defmodule Core.Services.CloudTest do
3232
assert refetch(cluster).count == 1
3333
assert refetch(postgres).count == 1
3434

35+
sa = Core.Services.Users.get_user_by_email("[email protected]")
36+
%{impersonation_policy: %{bindings: [binding]}} = Core.Repo.preload(sa, [impersonation_policy: :bindings])
37+
assert binding.user_id == user.id
38+
3539
assert_receive {:event, %PubSub.ConsoleInstanceCreated{item: ^instance}}
3640
end
3741

apps/core/test/services/users_test.exs

+7-1
Original file line numberDiff line numberDiff line change
@@ -524,13 +524,19 @@ defmodule Core.Services.UsersTest do
524524
end
525525

526526
test "it will update login method for existing users" do
527-
user = insert(:user)
527+
user = insert(:user, login_method: :google)
528528

529529
{:ok, upd} = Users.bootstrap_user(:google, %{email: user.email})
530530

531531
assert upd.id == user.id
532532
assert upd.login_method == :google
533533
end
534+
535+
test "it will not allow logins w/o login method set" do
536+
user = insert(:user)
537+
538+
{:error, _} = Users.bootstrap_user(:google, %{email: user.email})
539+
end
534540
end
535541

536542
describe "#create_trust_relationship" do

0 commit comments

Comments
 (0)