Skip to content

Commit 2854ebd

Browse files
committed
Allow Basic Auth to execute queries
1 parent d5ea973 commit 2854ebd

File tree

4 files changed

+52
-0
lines changed

4 files changed

+52
-0
lines changed

lib/sanbase/queries/authorization.ex

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,15 @@ defmodule Sanbase.Queries.Authorization do
1717
end
1818
end
1919

20+
@doc ~s"""
21+
Returns the dynamic repo whose credentials have the least restrictions.
22+
This is used to execute queries when basic auth is used
23+
"""
24+
@spec max_access_dynamic_repo() :: module()
25+
def max_access_dynamic_repo() do
26+
Sanbase.ClickhouseRepo.BusinessMaxUser
27+
end
28+
2029
@doc ~s"""
2130
Convert the user's plan to a dynamic Clickhouse repo.
2231
"""

lib/sanbase/queries/queries.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,10 @@ defmodule Sanbase.Queries do
119119
Queries.Authorization.user_can_execute_query(user, product_code, plan_name)
120120
end
121121

122+
def max_access_dynamic_repo() do
123+
Queries.Authorization.max_access_dynamic_repo()
124+
end
125+
122126
def user_plan_to_dynamic_repo(product_code, plan_name) do
123127
Queries.Authorization.user_plan_to_dynamic_repo(product_code, plan_name)
124128
end

lib/sanbase_web/graphql/middlewares/user_auth.ex

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ defmodule SanbaseWeb.Graphql.Middlewares.UserAuth do
1414
The user must have accepted the privacy policy in order to access resources.
1515
This allows both API key authentication and JWT authentication
1616
"""
17+
def call(%Resolution{context: %{auth: %{auth_method: :basic}}} = resolution, _opts),
18+
do: resolution
19+
1720
def call(
1821
%Resolution{
1922
context: %{

lib/sanbase_web/graphql/resolvers/queries_resolver.ex

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ defmodule SanbaseWeb.Graphql.Resolvers.QueriesResolver do
33
alias Sanbase.Dashboards
44
alias Sanbase.Queries.QueryMetadata
55
alias Sanbase.Queries.Executor.Result
6+
alias Absinthe.Resolution
67

78
require Logger
89

@@ -59,6 +60,19 @@ defmodule SanbaseWeb.Graphql.Resolvers.QueriesResolver do
5960

6061
# Run query operations
6162

63+
def run_sql_query(
64+
_root,
65+
%{id: query_id},
66+
%Resolution{context: %{auth: %{auth_method: :basic}}} = resolution
67+
) do
68+
with {:ok, query} <- Queries.get_query(query_id, nil) do
69+
Process.put(:queries_dynamic_repo, Queries.max_access_dynamic_repo())
70+
71+
query_metadata = QueryMetadata.from_resolution(resolution)
72+
Queries.run_query(query, %Sanbase.Accounts.User{id: -1}, query_metadata)
73+
end
74+
end
75+
6276
def run_sql_query(
6377
_root,
6478
%{id: query_id},
@@ -77,6 +91,28 @@ defmodule SanbaseWeb.Graphql.Resolvers.QueriesResolver do
7791
end
7892
end
7993

94+
def run_raw_sql_query(
95+
_root,
96+
%{sql_query_text: query_text, sql_query_parameters: query_parameters},
97+
%{context: %{auth: %{auth_method: :basic}}} = resolution
98+
) do
99+
query_parameters = if query_parameters == "{}", do: %{}, else: query_parameters
100+
101+
Process.put(
102+
:queries_dynamic_repo,
103+
Queries.max_access_dynamic_repo()
104+
)
105+
106+
query_metadata = QueryMetadata.from_resolution(resolution)
107+
108+
query =
109+
Queries.get_ephemeral_query_struct(query_text, query_parameters, %Sanbase.Accounts.User{
110+
id: -1
111+
})
112+
113+
Queries.run_query(query, %Sanbase.Accounts.User{id: -1}, query_metadata)
114+
end
115+
80116
def run_raw_sql_query(
81117
_root,
82118
%{sql_query_text: query_text, sql_query_parameters: query_parameters},

0 commit comments

Comments
 (0)