Commit c2b101cc authored by Ash McKenzie's avatar Ash McKenzie

Provide expires_in for LFS if available

parent 1fcb56f4
...@@ -2,29 +2,42 @@ require 'base64' ...@@ -2,29 +2,42 @@ require 'base64'
require 'json' require 'json'
class GitlabLfsAuthentication class GitlabLfsAuthentication
# TODO: These don't need to be public
attr_accessor :username, :lfs_token, :repository_http_path attr_accessor :username, :lfs_token, :repository_http_path
def initialize(username, lfs_token, repository_http_path) def initialize(username, lfs_token, repository_http_path, expires_in = nil)
@username = username @username = username
@lfs_token = lfs_token @lfs_token = lfs_token
@repository_http_path = repository_http_path @repository_http_path = repository_http_path
@expires_in = expires_in
end end
def self.build_from_json(json) def self.build_from_json(json)
values = JSON.parse(json) values = JSON.parse(json)
new(values['username'], values['lfs_token'], values['repository_http_path']) new(values['username'],
values['lfs_token'],
values['repository_http_path'],
values['expires_in'])
rescue rescue
nil nil
end end
# Source: https://github.com/git-lfs/git-lfs/blob/master/docs/api/server-discovery.md#ssh
#
def authentication_payload def authentication_payload
authorization = { payload = { header: { Authorization: authorization }, href: href }
header: { payload[:expires_in] = @expires_in if @expires_in
Authorization: "Basic #{Base64.strict_encode64("#{username}:#{lfs_token}")}"
}, JSON.generate(payload)
href: "#{repository_http_path}/info/lfs/" end
}
private
JSON.generate(authorization)
def authorization
"Basic #{Base64.strict_encode64("#{username}:#{lfs_token}")}"
end
def href
"#{repository_http_path}/info/lfs"
end end
end end
...@@ -3,15 +3,17 @@ require 'gitlab_lfs_authentication' ...@@ -3,15 +3,17 @@ require 'gitlab_lfs_authentication'
require 'json' require 'json'
describe GitlabLfsAuthentication do describe GitlabLfsAuthentication do
let(:payload_from_gitlab_api) do
{
username: 'dzaporozhets',
lfs_token: 'wsnys8Zm8Jn7zyhHTAAK',
repository_http_path: 'http://gitlab.dev/repo'
}
end
subject do subject do
GitlabLfsAuthentication.build_from_json( GitlabLfsAuthentication.build_from_json(
JSON.generate( JSON.generate(payload_from_gitlab_api)
{
username: 'dzaporozhets',
lfs_token: 'wsnys8Zm8Jn7zyhHTAAK',
repository_http_path: 'http://gitlab.dev/repo'
}
)
) )
end end
...@@ -22,16 +24,34 @@ describe GitlabLfsAuthentication do ...@@ -22,16 +24,34 @@ describe GitlabLfsAuthentication do
end end
describe '#authentication_payload' do describe '#authentication_payload' do
result = "{\"header\":{\"Authorization\":\"Basic ZHphcG9yb3poZXRzOndzbnlzOFptOEpuN3p5aEhUQUFL\"},\"href\":\"http://gitlab.dev/repo/info/lfs/\"}" shared_examples 'a valid payload' do
it 'should be proper JSON' do
payload = subject.authentication_payload
json_payload = JSON.parse(payload)
expect(json_payload['header']['Authorization']).to eq('Basic ZHphcG9yb3poZXRzOndzbnlzOFptOEpuN3p5aEhUQUFL')
expect(json_payload['href']).to eq('http://gitlab.dev/repo/info/lfs')
end
end
context 'without expires_in' do
let(:result) { { 'header' => { 'Authorization' => 'Basic ZHphcG9yb3poZXRzOndzbnlzOFptOEpuN3p5aEhUQUFL' }, 'href' => 'http://gitlab.dev/repo/info/lfs' }.to_json }
it { expect(subject.authentication_payload).to eq(result) }
it_behaves_like 'a valid payload'
end
context 'with expires_in' do
let(:result) { { 'header' => { 'Authorization' => 'Basic ZHphcG9yb3poZXRzOndzbnlzOFptOEpuN3p5aEhUQUFL' }, 'href' => 'http://gitlab.dev/repo/info/lfs', 'expires_in' => 1800 }.to_json }
it { expect(subject.authentication_payload).to eq(result) } before do
payload_from_gitlab_api[:expires_in] = 1800
end
it 'should be a proper JSON' do it { expect(subject.authentication_payload).to eq(result) }
payload = subject.authentication_payload
json_payload = JSON.parse(payload)
expect(json_payload['header']['Authorization']).to eq('Basic ZHphcG9yb3poZXRzOndzbnlzOFptOEpuN3p5aEhUQUFL') it_behaves_like 'a valid payload'
expect(json_payload['href']).to eq('http://gitlab.dev/repo/info/lfs/')
end end
end end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment