Skip to content

Commit d5be9ab

Browse files
committed
Fix oauth token state lookup
1 parent 33d39cc commit d5be9ab

File tree

6 files changed

+30
-27
lines changed

6 files changed

+30
-27
lines changed

lib/hex/oauth.ex

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,8 @@ defmodule Hex.OAuth do
1010
Returns {:error, :no_auth} if no tokens are available.
1111
1212
Since we now use 2FA for write operations, we use a single token for both read and write.
13-
The permission parameter is kept for backward compatibility but is no longer used.
1413
"""
15-
def get_token(permission) when permission in [:read, :write] do
14+
def get_token do
1615
case get_stored_token() do
1716
nil ->
1817
{:error, :no_auth}
@@ -61,10 +60,8 @@ defmodule Hex.OAuth do
6160

6261
@doc """
6362
Refreshes the stored OAuth token.
64-
65-
The permission parameter is kept for backward compatibility but is no longer used.
6663
"""
67-
def refresh_token(permission) when permission in [:read, :write] do
64+
def refresh_token do
6865
case get_stored_token() do
6966
nil ->
7067
{:error, :no_auth}
@@ -128,7 +125,7 @@ defmodule Hex.OAuth do
128125
end
129126

130127
defp refresh_token_if_possible(token_data) do
131-
case refresh_token(:write) do
128+
case refresh_token() do
132129
{:ok, access_token} ->
133130
{:ok, access_token}
134131

lib/hex/state.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ defmodule Hex.State do
1515
api_otp: %{
1616
env: ["HEX_OTP"]
1717
},
18-
oauth_tokens: %{
19-
config: [:"$oauth_tokens"]
18+
oauth_token: %{
19+
config: [:"$oauth_token"]
2020
},
2121
api_url: %{
2222
env: ["HEX_API_URL", "HEX_API"],

lib/mix/tasks/hex.ex

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -351,12 +351,20 @@ defmodule Mix.Tasks.Hex do
351351
|> String.trim()
352352
end
353353

354-
@doc false
354+
@doc """
355+
Returns authentication info for the given operation type.
356+
357+
The permission parameter determines whether to include OTP for 2FA:
358+
- :write - includes OTP if available (required for write operations with 2FA)
359+
- :read - does not include OTP
360+
361+
Both read and write operations use the same OAuth token.
362+
"""
355363
def auth_info(permission, opts \\ [])
356364

357365
def auth_info(:write, opts) do
358366
# Try OAuth tokens first
359-
case Hex.OAuth.get_token(:write) do
367+
case Hex.OAuth.get_token() do
360368
{:ok, access_token} ->
361369
# Don't prompt for OTP upfront - will be prompted if server requires it
362370
otp = Hex.State.fetch!(:api_otp)
@@ -403,7 +411,7 @@ defmodule Mix.Tasks.Hex do
403411

404412
def auth_info(:read, opts) do
405413
# Try OAuth tokens first
406-
case Hex.OAuth.get_token(:read) do
414+
case Hex.OAuth.get_token() do
407415
{:ok, access_token} ->
408416
[key: access_token, oauth: true]
409417

@@ -448,8 +456,8 @@ defmodule Mix.Tasks.Hex do
448456
if authenticate? do
449457
case auth() do
450458
{:ok, _tokens} ->
451-
# Auth succeeded, try to get write token
452-
case Hex.OAuth.get_token(:write) do
459+
# Auth succeeded, try to get token
460+
case Hex.OAuth.get_token() do
453461
{:ok, access_token} ->
454462
# Don't prompt for OTP upfront - will be prompted if server requires it
455463
otp = Hex.State.fetch!(:api_otp)

test/hex/oauth_test.exs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
defmodule Hex.OAuthTest do
22
use HexTest.IntegrationCase
33

4-
describe "get_token/1" do
4+
describe "get_token/0" do
55
test "returns error when no tokens are stored" do
6-
assert {:error, :no_auth} = Hex.OAuth.get_token(:read)
7-
assert {:error, :no_auth} = Hex.OAuth.get_token(:write)
6+
assert {:error, :no_auth} = Hex.OAuth.get_token()
87
end
98

109
test "returns valid token when available and not expired" do
@@ -18,9 +17,7 @@ defmodule Hex.OAuthTest do
1817

1918
Hex.OAuth.store_token(token_data)
2019

21-
# Same token for both read and write
22-
assert {:ok, "test_token"} = Hex.OAuth.get_token(:read)
23-
assert {:ok, "test_token"} = Hex.OAuth.get_token(:write)
20+
assert {:ok, "test_token"} = Hex.OAuth.get_token()
2421
end
2522

2623
test "returns error when token is expired and no refresh possible" do
@@ -33,7 +30,7 @@ defmodule Hex.OAuthTest do
3330

3431
Hex.OAuth.store_token(token_data)
3532

36-
assert {:error, :token_expired} = Hex.OAuth.get_token(:read)
33+
assert {:error, :token_expired} = Hex.OAuth.get_token()
3734
end
3835

3936
test "returns error when token is expired and refresh fails" do
@@ -48,7 +45,7 @@ defmodule Hex.OAuthTest do
4845
Hex.OAuth.store_token(token_data)
4946

5047
# Should fail to refresh and return error
51-
assert {:error, :refresh_failed} = Hex.OAuth.get_token(:write)
48+
assert {:error, :refresh_failed} = Hex.OAuth.get_token()
5249
end
5350
end
5451

@@ -190,7 +187,7 @@ defmodule Hex.OAuthTest do
190187
end
191188
end
192189

193-
describe "refresh_token/1" do
190+
describe "refresh_token/0" do
194191
test "returns error when no refresh token available" do
195192
token_data = %{
196193
"access_token" => "token_without_refresh",
@@ -199,11 +196,11 @@ defmodule Hex.OAuthTest do
199196

200197
Hex.OAuth.store_token(token_data)
201198

202-
assert {:error, :no_refresh_token} = Hex.OAuth.refresh_token(:write)
199+
assert {:error, :no_refresh_token} = Hex.OAuth.refresh_token()
203200
end
204201

205202
test "returns error when no tokens stored" do
206-
assert {:error, :no_auth} = Hex.OAuth.refresh_token(:read)
203+
assert {:error, :no_auth} = Hex.OAuth.refresh_token()
207204
end
208205
end
209206
end

test/mix/tasks/hex.user_test.exs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -440,8 +440,9 @@ defmodule Mix.Tasks.Hex.UserTest do
440440
assert Hex.OAuth.has_tokens?()
441441

442442
# Retrieve tokens - same token for both read and write
443-
assert {:ok, "write_access"} = Hex.OAuth.get_token(:write)
444-
assert {:ok, "write_access"} = Hex.OAuth.get_token(:read)
443+
# Same token is returned for both read and write operations
444+
assert {:ok, "write_access"} = Hex.OAuth.get_token()
445+
assert {:ok, "write_access"} = Hex.OAuth.get_token()
445446

446447
# Clear tokens
447448
Hex.OAuth.clear_tokens()

test/support/case.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ defmodule HexTest.Case do
254254
Hex.State.put(:data_home, Path.expand("../../tmp/hex_data_home", __DIR__))
255255
Hex.State.put(:api_url, "http://localhost:4043/api")
256256
Hex.State.put(:api_key, nil)
257-
Hex.State.put(:oauth_tokens, nil)
257+
Hex.State.put(:oauth_token, nil)
258258
Hex.State.update!(:repos, &put_in(&1["hexpm"].url, "http://localhost:4043/repo"))
259259
Hex.State.update!(:repos, &put_in(&1["hexpm"].public_key, public_key))
260260
Hex.State.update!(:repos, &put_in(&1["hexpm"].auth_key, nil))

0 commit comments

Comments
 (0)