Skip to content

Commit ce59128

Browse files
committed
Add permissions to access tokens
1 parent 474e1ec commit ce59128

File tree

7 files changed

+75
-2
lines changed

7 files changed

+75
-2
lines changed

app/controllers/api/v1/access_tokens_controller.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def caller_identity
3232
private
3333

3434
def token_params
35-
params.permit(:owner, :description)
35+
params.permit(:owner, :description, :permissions)
3636
end
3737

3838
def token_deactivate_params

app/models/access_token.rb

+5
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ class AccessToken < ApplicationRecord
33

44
scope :active, -> { where(deactivated_at: nil) }
55

6+
enum :permissions, {
7+
all: "all",
8+
readonly: "readonly",
9+
}, suffix: true, validate: true
10+
611
def generate_token
712
users_token = SecureRandom.uuid
813
self.token_digest = Digest::SHA256.hexdigest(users_token)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class AddPermissionsToAccessTokens < ActiveRecord::Migration[7.1]
2+
def change
3+
add_column :access_tokens, :permissions, :string, default: "all"
4+
end
5+
end

db/schema.rb

+2-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

spec/factories/access_tokens.rb

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
factory :access_token do
33
token_digest { Faker::Crypto.sha256 }
44
owner { Faker::Name.first_name.underscore }
5+
permissions { :all }
56
deactivated_at { nil }
67
description { nil }
78
last_accessed_at { nil }

spec/models/access_token_spec.rb

+29
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,35 @@
4646
end
4747
end
4848

49+
describe "permissions" do
50+
let(:access_token) do
51+
described_class.new(owner: "test")
52+
.tap(&:generate_token)
53+
end
54+
55+
it "defaults to all permissions" do
56+
expect(access_token.all_permissions?).to be true
57+
end
58+
59+
it "allows readonly permissions" do
60+
access_token.permissions = :readonly
61+
62+
expect(access_token).to be_valid(:permissions)
63+
end
64+
65+
it "validates the permissions are set" do
66+
access_token.permissions = nil
67+
68+
expect(access_token).not_to be_valid(:permissions)
69+
end
70+
71+
it "validates the permissions are valid" do
72+
access_token.permissions = :foobar
73+
74+
expect(access_token).not_to be_valid(:permissions)
75+
end
76+
end
77+
4978
describe "#generate_token" do
5079
let(:result) { access_token.generate_token }
5180

spec/request/api/v1/access_tokens_controller_spec.rb

+32
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
expect(token.keys).to contain_exactly(
1616
:id,
1717
:owner,
18+
:permissions,
1819
:deactivated_at,
1920
:description,
2021
:created_at,
@@ -63,6 +64,36 @@
6364
expect(AccessToken.last.description).to eq "This is one key to rule them all."
6465
end
6566
end
67+
68+
context "when specific permissions are requested" do
69+
before do
70+
allow(AccessToken).to receive(:new).and_call_original
71+
post access_tokens_path, params: { owner: "testing user", permissions: :all }, as: :json
72+
end
73+
74+
it "returns 201 if its saved" do
75+
expect(response).to have_http_status(:created)
76+
end
77+
78+
it "returns json" do
79+
expect(response.headers["Content-Type"]).to eq("application/json")
80+
end
81+
82+
it "sets the description" do
83+
expect(AccessToken.last.permissions).to eq "all"
84+
end
85+
end
86+
87+
context "when invalid permissions are requested" do
88+
before do
89+
allow(AccessToken).to receive(:new).and_call_original
90+
post access_tokens_path, params: { owner: "testing user", permissions: :foobar }, as: :json
91+
end
92+
93+
it "returns an error code" do
94+
expect(response).to have_http_status(:bad_request)
95+
end
96+
end
6697
end
6798

6899
describe "#deactivate" do
@@ -117,6 +148,7 @@
117148
id: access_token.id,
118149
token_digest: access_token.token_digest,
119150
owner: access_token.owner,
151+
permissions: access_token.permissions,
120152
description: nil,
121153
deactivated_at: nil,
122154
created_at: access_token.created_at.as_json,

0 commit comments

Comments
 (0)